Commit 4d0840afcb6900ae282ada74e49082591a834862

Authored by Perry Werneck
1 parent 4aa7a83f

Corrigindo problemas encontrados durante teste do sub-módulo.

Makefile.in
... ... @@ -39,6 +39,9 @@ CC=@CC@
39 39 LD=@CC@
40 40 LN_S=@LN_S@
41 41 MKDIR=@MKDIR_P@
  42 +INSTALL=@INSTALL@
  43 +INSTALL_DATA=@INSTALL_DATA@
  44 +INSTALL_PROGRAM=@INSTALL_PROGRAM@
42 45  
43 46 #---[ Paths ]----------------------------------------------------------------------------
44 47  
... ... @@ -148,6 +151,15 @@ $(BINRLS)/@DLLPREFIX@$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_V
148 151 $(LDFLAGS) \
149 152 $(LIBS)
150 153  
  154 +#---[ Misc Targets ]---------------------------------------------------------------------
  155 +
  156 +src/lib3270/version.c: \
  157 + Makefile
  158 +
  159 + @echo $(basename $@) ...
  160 + @chmod +x src/lib3270/mkversion.sh
  161 + @./src/lib3270/mkversion.sh
  162 +
151 163 #---[ Install Targets ]------------------------------------------------------------------
152 164  
153 165  
... ... @@ -182,6 +194,7 @@ $(BINDBG)/@DLLPREFIX@$(LIBNAME)@DLLEXT@.@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_V
182 194 -shared -Wl,-soname,$(@F) \
183 195 -o $@ \
184 196 $(LDFLAGS) \
  197 + $(foreach SRC, $(basename $(SOURCES)), $(OBJDBG)/$(SRC).o) \
185 198 $(LIBS)
186 199  
187 200 #---[ Clean Targets ]--------------------------------------------------------------------
... ...
configure.ac
... ... @@ -146,6 +146,19 @@ AC_SUBST(PACKAGE_RELEASE,$app_cv_release)
146 146 AC_SUBST(PACKAGE_MAJOR_RELEASE,$app_rls_major)
147 147 AC_SUBST(PACKAGE_MINOR_RELEASE,$app_rls_minor)
148 148  
  149 +rpq_build_date=`LANG=C date`
  150 +rpq_timestamp=`date +%Y%m%d%H%M%S`
  151 +rpq_revision=`date +"%Y%m%d"`
  152 +sccs_date=`date +%Y/%m/%d`
  153 +sccs_user=$USER
  154 +
  155 +AC_SUBST(RPQ_BUILD_DATE,$rpq_build_date)
  156 +AC_SUBST(RPQ_TIMESTAMP,$rpq_timestamp)
  157 +AC_SUBST(RPQ_REVISION,$rpq_revision)
  158 +
  159 +AC_SUBST(SCCS_USER,$USER)
  160 +AC_SUBST(SCCS_DATE,$sccs_date)
  161 +
149 162 dnl ---------------------------------------------------------------------------
150 163 dnl Check for libintl
151 164 dnl ---------------------------------------------------------------------------
... ... @@ -368,6 +381,7 @@ dnl Configure which files to generate.
368 381 dnl ---------------------------------------------------------------------------
369 382  
370 383 AC_CONFIG_FILES(sdk/lib3270.pc)
  384 +AC_CONFIG_FILES(src/lib3270/version.c)
371 385 AC_CONFIG_FILES(Makefile)
372 386  
373 387 dnl ---------------------------------------------------------------------------
... ...
src/lib3270/proxy.c
... ... @@ -1,1037 +0,0 @@
1   -/*
2   - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
3   - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
4   - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270.
5   - *
6   - * Copyright (C) <2008> <Banco do Brasil S.A.>
7   - *
8   - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
9   - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
10   - * Free Software Foundation.
11   - *
12   - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
13   - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
14   - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
15   - * obter mais detalhes.
16   - *
17   - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
18   - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
19   - * St, Fifth Floor, Boston, MA 02110-1301 USA
20   - *
21   - * Este programa está nomeado como proxy.c e possui - linhas de código.
22   - *
23   - * Contatos:
24   - *
25   - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26   - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27   - * licinio@bb.com.br (Licínio Luis Branco)
28   - * kraucer@bb.com.br (Kraucer Fernandes Mazuco)
29   - *
30   - */
31   -
32   -
33   -/**
34   - * @file proxy.c
35   - *
36   - * This module implements various kinds of proxies.
37   - *
38   - */
39   -
40   -#ifdef _WIN32
41   - #include <winsock2.h>
42   - #include <windows.h>
43   -#endif // _WIN32
44   -
45   -#include "private.h"
46   -#include "utilc.h"
47   -
48   -//#include "appres.h"
49   -#include "resources.h"
50   -
51   -#ifndef ANDROID
52   - #include <stdlib.h>
53   -#endif
54   -
55   -#if defined(_WIN32)
56   - #include <ws2tcpip.h>
57   - #include "w3miscc.h"
58   -#else
59   -
60   - #include <sys/socket.h>
61   - #include <sys/ioctl.h>
62   - #include <netinet/in.h>
63   - #include <netdb.h>
64   - #include <arpa/inet.h>
65   -
66   -// #if defined(HAVE_SYS_SELECT_H)
67   -// #include <sys/select.h>
68   -// #endif
69   -
70   -#endif
71   -
72   -#include "api.h"
73   -
74   -#include "3270ds.h"
75   -#include "popupsc.h"
76   -#include "proxyc.h"
77   -#include "resolverc.h"
78   -#include "telnetc.h"
79   -#include "trace_dsc.h"
80   -#include "w3miscc.h"
81   -#include "screen.h"
82   -
83   -// #if defined(PR3287)
84   -// extern char *proxy_spec;
85   -// #endif
86   -
87   -/*
88   - * Supported proxy types.
89   - *
90   - * At some point we will add SOCKS.
91   - */
92   -enum
93   -{
94   - PT_NONE,
95   - PT_PASSTHRU, /**< Sun telnet-passthru */
96   - PT_HTTP, /**< RFC 2817 CONNECT tunnel */
97   - PT_TELNET, /**< 'connect host port' proxy */
98   - PT_SOCKS4, /**< SOCKS version 4 (or 4A if necessary) */
99   - PT_SOCKS4A, /**< SOCKS version 4A (force remote name resolution) */
100   - PT_SOCKS5, /**< SOCKS version 5 (RFC 1928) */
101   - PT_SOCKS5D, /**< SOCKS version 5 (force remote name resolution) */
102   - PT_MAX
103   -} proxytype_t;
104   -
105   -#define PROXY_PASSTHRU "passthru"
106   -#define PORT_PASSTHRU "3514"
107   -
108   -#define PROXY_HTTP "http"
109   -#define PORT_HTTP "3128"
110   -
111   -#define PROXY_TELNET "telnet"
112   -
113   -#define PROXY_SOCKS4 "socks4"
114   -#define PORT_SOCKS4 "1080"
115   -
116   -#define PROXY_SOCKS4A "socks4a"
117   -#define PORT_SOCKS4A "1080"
118   -
119   -#define PROXY_SOCKS5 "socks5"
120   -#define PORT_SOCKS5 "1080"
121   -
122   -#define PROXY_SOCKS5D "socks5d"
123   -#define PORT_SOCKS5D "1080"
124   -
125   -static int parse_host_port(H3270 *hSession, char *s, char **phost, char **pport);
126   -
127   -static int proxy_passthru(H3270 *hSession, int fd, char *host, unsigned short port);
128   -static int proxy_http(H3270 *hSession, int fd, char *host, unsigned short port);
129   -static int proxy_telnet(H3270 *hSession, int fd, char *host, unsigned short port);
130   -static int proxy_socks4(H3270 *hSession, int fd, char *host, unsigned short port, int force_a);
131   -static int proxy_socks5(H3270 *hSession, int fd, char *host, unsigned short port, int force_d);
132   -
133   -
134   -const char * proxy_type_name(int type)
135   -{
136   - /* proxy type names -- keep these in sync with proxytype_t! */
137   - const char *type_name[] =
138   - {
139   - "unknown",
140   - "passthru",
141   - "HTTP",
142   - "TELNET",
143   - "SOCKS4",
144   - "SOCKS4A",
145   - "SOCKS5",
146   - "SOCKS5D"
147   - };
148   -
149   -
150   - if (type < 1 || type >= PT_MAX)
151   - return "unknown";
152   - else
153   - return type_name[type];
154   -}
155   -
156   -/**
157   - * Resolve the type, hostname and port for a proxy.
158   - *
159   - * @return -1 for failure, 0 for no proxy, >0 (the proxy type) for success.
160   - */
161   -int proxy_setup(H3270 *hSession, char **phost, char **pport)
162   -{
163   - char * proxy = hSession->proxy;
164   - char * colon;
165   - int sl;
166   -
167   - if(!proxy)
168   - return PT_NONE;
169   -
170   - if ((colon = strchr(proxy, ':')) == CN || (colon == proxy))
171   - {
172   - popup_an_error(hSession,_( "Invalid proxy syntax" ) );
173   - return -1;
174   - }
175   -
176   - sl = colon - proxy;
177   - if (sl == strlen(PROXY_PASSTHRU) && !strncasecmp(proxy, PROXY_PASSTHRU, sl))
178   - {
179   - if (parse_host_port(hSession, colon + 1, phost, pport) < 0)
180   - return -1;
181   -
182   - if (*pport == CN)
183   - *pport = NewString(PORT_PASSTHRU);
184   -
185   - return PT_PASSTHRU;
186   - }
187   -
188   - if (sl == strlen(PROXY_HTTP) && !strncasecmp(proxy, PROXY_HTTP, sl))
189   - {
190   -
191   - if (parse_host_port(hSession, colon + 1, phost, pport) < 0)
192   - return -1;
193   - if (*pport == CN)
194   - *pport = NewString(PORT_HTTP);
195   - return PT_HTTP;
196   - }
197   -
198   - if (sl == strlen(PROXY_TELNET) && !strncasecmp(proxy, PROXY_TELNET, sl))
199   - {
200   -
201   - if (parse_host_port(hSession, colon + 1, phost, pport) < 0)
202   - return -1;
203   - if (*pport == CN)
204   - {
205   - popup_an_error(hSession,_( "Must specify port for telnet proxy" ) );
206   - return -1;
207   - }
208   - return PT_TELNET;
209   - }
210   -
211   - if (sl == strlen(PROXY_SOCKS4) && !strncasecmp(proxy, PROXY_SOCKS4, sl))
212   - {
213   - if (parse_host_port(hSession, colon + 1, phost, pport) < 0)
214   - return -1;
215   -
216   - if (*pport == CN)
217   - *pport = NewString(PORT_SOCKS4);
218   -
219   - return PT_SOCKS4;
220   - }
221   -
222   - if (sl == strlen(PROXY_SOCKS4A) && !strncasecmp(proxy, PROXY_SOCKS4A, sl))
223   - {
224   - if (parse_host_port(hSession, colon + 1, phost, pport) < 0)
225   - return -1;
226   -
227   - if (*pport == CN)
228   - *pport = NewString(PORT_SOCKS4A);
229   -
230   - return PT_SOCKS4A;
231   - }
232   -
233   - if (sl == strlen(PROXY_SOCKS5) && !strncasecmp(proxy, PROXY_SOCKS5, sl))
234   - {
235   - if (parse_host_port(hSession, colon + 1, phost, pport) < 0)
236   - return -1;
237   -
238   - if (*pport == CN)
239   - *pport = NewString(PORT_SOCKS5);
240   -
241   - return PT_SOCKS5;
242   - }
243   -
244   - if (sl == strlen(PROXY_SOCKS5D) && !strncasecmp(proxy, PROXY_SOCKS5D, sl))
245   - {
246   - if (parse_host_port(hSession, colon + 1, phost, pport) < 0)
247   - return -1;
248   -
249   - if (*pport == CN)
250   - *pport = NewString(PORT_SOCKS5D);
251   -
252   - return PT_SOCKS5D;
253   - }
254   -
255   - popup_an_error(hSession,_( "Invalid proxy type '%.*s'" ), sl, proxy);
256   -
257   - return -1;
258   -}
259   -
260   -/**
261   - * Parse host[:port] from a string.
262   - *
263   - * 'host' can be in square brackets to allow numeric IPv6 addresses.
264   - * Returns the host name and port name in heap memory.
265   - *
266   - * @return -1 for failure, 0 for success.
267   - */
268   -static int parse_host_port(H3270 *hSession, char *s, char **phost, char **pport)
269   -{
270   - char *colon;
271   - char *hstart;
272   - int hlen;
273   -
274   - if (*s == '[') {
275   - char *rbrack;
276   -
277   - /* Hostname in square brackets. */
278   - hstart = s + 1;
279   - rbrack = strchr(s, ']');
280   - if (rbrack == CN ||
281   - rbrack == s + 1 ||
282   - (*(rbrack + 1) != '\0' && *(rbrack + 1) != ':')) {
283   -
284   - popup_an_error(hSession,_( "Invalid proxy hostname syntax"));
285   - return -1;
286   - }
287   - if (*(rbrack + 1) == ':')
288   - colon = rbrack + 1;
289   - else
290   - colon = NULL;
291   - hlen = rbrack - (s + 1);
292   - } else {
293   - hstart = s;
294   - colon = strchr(s, ':');
295   - if (colon == s) {
296   - popup_an_error(hSession,_("Invalid proxy hostname syntax"));
297   - return -1;
298   - }
299   - if (colon == NULL)
300   - hlen = strlen(s);
301   - else
302   - hlen = colon - s;
303   - }
304   -
305   - /* Parse the port. */
306   - if (colon == CN || !*(colon + 1))
307   - *pport = CN;
308   - else
309   - *pport = NewString(colon + 1);
310   -
311   - /* Copy out the hostname. */
312   - *phost = lib3270_malloc(hlen + 1);
313   - strncpy(*phost, hstart, hlen);
314   - (*phost)[hlen] = '\0';
315   - return 0;
316   -}
317   -
318   -/**
319   - * Negotiate with the proxy server.
320   - *
321   - * @return -1 for failure, 0 for success.
322   - */
323   -int proxy_negotiate(H3270 *hSession, int type, int fd, char *host, unsigned short port)
324   -{
325   - switch (type)
326   - {
327   - case PT_NONE:
328   - return 0;
329   - case PT_PASSTHRU:
330   - return proxy_passthru(hSession, fd, host, port);
331   - case PT_HTTP:
332   - return proxy_http(hSession, fd, host, port);
333   - case PT_TELNET:
334   - return proxy_telnet(hSession, fd, host, port);
335   - case PT_SOCKS4:
336   - return proxy_socks4(hSession, fd, host, port, 0);
337   - case PT_SOCKS4A:
338   - return proxy_socks4(hSession, fd, host, port, 1);
339   - case PT_SOCKS5:
340   - return proxy_socks5(hSession, fd, host, port, 0);
341   - case PT_SOCKS5D:
342   - return proxy_socks5(hSession, fd, host, port, 1);
343   - default:
344   - return -1;
345   - }
346   -}
347   -
348   -/* Sun PASSTHRU proxy. */
349   -static int proxy_passthru(H3270 *hSession, int fd, char *host, unsigned short port)
350   -{
351   - char *buf;
352   -
353   - buf = lib3270_malloc(strlen(host) + 32);
354   - (void) sprintf(buf, "%s %u\r\n", host, port);
355   -
356   -#if defined(X3270_TRACE) /*[*/
357   - trace_dsn(hSession,"Passthru Proxy: xmit '%.*s'", (int) (strlen(buf) - 2), buf);
358   - trace_netdata(hSession,'>', (unsigned char *)buf, (int) strlen(buf));
359   -#endif /*]*/
360   -
361   - if (send(fd, buf, strlen(buf), 0) < 0)
362   - {
363   - popup_a_sockerr(hSession,_( "Passthru Proxy: send error" ));
364   - lib3270_free(buf);
365   - return -1;
366   - }
367   - lib3270_free(buf);
368   -
369   - return 0;
370   -}
371   -
372   -/* HTTP (RFC 2817 CONNECT tunnel) proxy. */
373   -static int
374   -proxy_http(H3270 *hSession, int fd, char *host, unsigned short port)
375   -{
376   - char *buf;
377   - char *colon;
378   - char rbuf[1024];
379   - int nr;
380   - int nread = 0;
381   - char *space;
382   -
383   - /* Send the CONNECT request. */
384   - buf = lib3270_malloc(64 + strlen(host));
385   - colon = strchr(host, ':');
386   - sprintf(buf, "CONNECT %s%s%s:%u HTTP/1.1\r\n",
387   - (colon? "[": ""),
388   - host,
389   - (colon? "]": ""),
390   - port);
391   -
392   -#if defined(X3270_TRACE) /*[*/
393   - trace_dsn(hSession,"HTTP Proxy: xmit '%.*s'\n", (int) (strlen(buf) - 2), buf);
394   - trace_netdata(hSession, '>', (unsigned char *)buf, (int) strlen(buf));
395   -#endif /*]*/
396   -
397   - if (send(fd, buf, strlen(buf), 0) < 0)
398   - {
399   - popup_a_sockerr(hSession,_( "HTTP Proxy: send error" ));
400   - lib3270_free(buf);
401   - return -1;
402   - }
403   -
404   - sprintf(buf, "Host: %s%s%s:%u\r\n",
405   - (colon? "[": ""),
406   - host,
407   - (colon? "]": ""),
408   - port);
409   -
410   -#if defined(X3270_TRACE) /*[*/
411   - trace_dsn(hSession,"HTTP Proxy: xmit '%.*s'\n", (int) (strlen(buf) - 2), buf);
412   - trace_netdata(hSession, '>', (unsigned char *)buf, (int) strlen(buf));
413   -#endif /*]*/
414   -
415   - if (send(fd, buf, strlen(buf), 0) < 0)
416   - {
417   - popup_a_sockerr(hSession,_( "HTTP Proxy: send error"));
418   - lib3270_free(buf);
419   - return -1;
420   - }
421   -
422   - strcpy(buf, "\r\n");
423   -#if defined(X3270_TRACE) /*[*/
424   - trace_dsn(hSession,"HTTP Proxy: xmit ''\n");
425   - trace_netdata(hSession, '>', (unsigned char *)buf, strlen(buf));
426   -#endif /*]*/
427   -
428   - if (send(fd, buf, strlen(buf), 0) < 0)
429   - {
430   - popup_a_sockerr(hSession,_( "HTTP Proxy: send error" ));
431   - lib3270_free(buf);
432   - return -1;
433   - }
434   - lib3270_free(buf);
435   -
436   - /*
437   - * Process the reply.
438   - * Read a byte at a time until \n or EOF.
439   - */
440   - for (;;)
441   - {
442   - fd_set rfds;
443   - struct timeval tv;
444   -
445   - FD_ZERO(&rfds);
446   - FD_SET(fd, &rfds);
447   - tv.tv_sec = 15;
448   - tv.tv_usec = 0;
449   - if (select(fd + 1, &rfds, NULL, NULL, &tv) < 0) {
450   - popup_an_error(hSession,_( "HTTP Proxy: server timeout" ));
451   -#if defined(X3270_TRACE) /*[*/
452   - if (nread)
453   - trace_netdata(hSession, '<', (unsigned char *)rbuf, nread);
454   -#endif /*]*/
455   - return -1;
456   - }
457   -
458   - nr = recv(fd, &rbuf[nread], 1, 0);
459   - if (nr < 0) {
460   - popup_a_sockerr(hSession,_( "HTTP Proxy: receive error" ));
461   -#if defined(X3270_TRACE) /*[*/
462   - if (nread)
463   - trace_netdata(hSession, '<', (unsigned char *)rbuf, nread);
464   -#endif /*]*/
465   - return -1;
466   - }
467   - if (nr == 0)
468   - {
469   -#if defined(X3270_TRACE) /*[*/
470   - if (nread)
471   - trace_netdata(hSession, '<', (unsigned char *)rbuf, nread);
472   -#endif /*]*/
473   - popup_an_error(hSession,_( "HTTP Proxy: unexpected EOF" ));
474   - return -1;
475   - }
476   - if (rbuf[nread] == '\r')
477   - continue;
478   - if (rbuf[nread] == '\n')
479   - break;
480   - if (++nread >= sizeof(rbuf)) {
481   - nread = sizeof(rbuf) - 1;
482   - break;
483   - }
484   - }
485   - rbuf[nread] = '\0';
486   -
487   -#if defined(X3270_TRACE) /*[*/
488   - trace_netdata(hSession, '<', (unsigned char *)rbuf, nread);
489   - trace_dsn(hSession,"HTTP Proxy: recv '%s'\n", rbuf);
490   -#endif /*]*/
491   -
492   - if (strncmp(rbuf, "HTTP/", 5) || (space = strchr(rbuf, ' ')) == CN)
493   - {
494   - popup_an_error(hSession,_( "HTTP Proxy: unrecognized reply" ));
495   - return -1;
496   - }
497   - if (*(space + 1) != '2')
498   - {
499   - popup_an_error(hSession,_( "HTTP Proxy: CONNECT failed:\n%s"), rbuf);
500   - return -1;
501   - }
502   -
503   - return 0;
504   -}
505   -
506   -/* TELNET proxy. */
507   -static int
508   -proxy_telnet(H3270 *hSession, int fd, char *host, unsigned short port)
509   -{
510   - char *buf;
511   -
512   - buf = lib3270_malloc(strlen(host) + 32);
513   - (void) sprintf(buf, "connect %s %u\r\n", host, port);
514   -
515   -#if defined(X3270_TRACE) /*[*/
516   - trace_dsn(hSession,"TELNET Proxy: xmit '%.*s'", (int) (strlen(buf) - 2), buf);
517   - trace_netdata(hSession, '>', (unsigned char *)buf, (int) strlen(buf));
518   -#endif /*]*/
519   -
520   - if (send(fd, buf, strlen(buf), 0) < 0)
521   - {
522   - popup_a_sockerr(hSession,_( "TELNET Proxy: send error"));
523   - lib3270_free(buf);
524   - return -1;
525   - }
526   - lib3270_free(buf);
527   -
528   - return 0;
529   -}
530   -
531   -/* SOCKS version 4 proxy. */
532   -#if defined(HAVE_GETADDRINFO)
533   -static int proxy_socks4(H3270 *hSession, int fd, char *host, unsigned short port, int force_a)
534   -{
535   - popup_an_error(hSession,"%s", _( "Unsupported socks 4 proxy" ) );
536   - return 0;
537   -}
538   -#else
539   -static int proxy_socks4(H3270 *hSession, int fd, char *host, unsigned short port, int force_a)
540   -{
541   - struct hostent *hp;
542   - struct in_addr ipaddr;
543   - int use_4a = 0;
544   - char *user;
545   - char *buf;
546   - char *s;
547   - char rbuf[8];
548   - int nr;
549   - int nread = 0;
550   -#if defined(X3270_TRACE) /*[*/
551   - unsigned short rport;
552   -#endif
553   -
554   - /* Resolve the hostname to an IPv4 address. */
555   - if (force_a)
556   - use_4a = 1;
557   - else {
558   - hp = gethostbyname(host);
559   - if (hp != NULL) {
560   - memcpy(&ipaddr, hp->h_addr, hp->h_length);
561   - } else {
562   - ipaddr.s_addr = inet_addr(host);
563   - if (ipaddr.s_addr == -1)
564   - use_4a = 1;
565   - }
566   - }
567   -
568   - /* Resolve the username. */
569   -#ifdef ANDROID
570   - user = "android";
571   -#else
572   - user = getenv("USER");
573   - if (user == CN)
574   - user = "nobody";
575   -#endif // ANDROID
576   -
577   - /* Send the request to the server. */
578   - if (use_4a) {
579   - buf = lib3270_malloc(32 + strlen(user) + strlen(host));
580   - s = buf;
581   - *s++ = 0x04;
582   - *s++ = 0x01;
583   - SET16(s, port);
584   - SET32(s, 0x00000001);
585   - strcpy(s, user);
586   - s += strlen(user) + 1;
587   - strcpy(s, host);
588   - s += strlen(host) + 1;
589   -
590   -#if defined(X3270_TRACE) /*[*/
591   - trace_dsn(hSession,"SOCKS4 Proxy: version 4 connect port %u address 0.0.0.1 user '%s' host '%s'\n",port, user, host);
592   - trace_netdata(hSession,'>', (unsigned char *)buf, s - buf);
593   -#endif /*]*/
594   -
595   - if (send(fd, buf, s - buf, 0) < 0)
596   - {
597   - popup_a_sockerr(hSession,_( "SOCKS4 Proxy: send error" ));
598   - lib3270_free(buf);
599   - return -1;
600   - }
601   - lib3270_free(buf);
602   - } else {
603   - unsigned long u;
604   -
605   - buf = lib3270_malloc(32 + strlen(user));
606   - s = buf;
607   - *s++ = 0x04;
608   - *s++ = 0x01;
609   - SET16(s, port);
610   - u = ntohl(ipaddr.s_addr);
611   - SET32(s, u);
612   - strcpy(s, user);
613   - s += strlen(user) + 1;
614   -
615   -#if defined(X3270_TRACE) /*[*/
616   - trace_dsn(hSession,_( "SOCKS4 Proxy: xmit version 4 connect port %u address %s user '%s'\n"),port, inet_ntoa(ipaddr), user);
617   - trace_netdata(hSession,'>', (unsigned char *)buf, s - buf);
618   -#endif /*]*/
619   -
620   - if (send(fd, buf, s - buf, 0) < 0)
621   - {
622   - lib3270_free(buf);
623   - popup_a_sockerr(hSession,_("SOCKS4 Proxy: send error"));
624   - return -1;
625   - }
626   - lib3270_free(buf);
627   - }
628   -
629   - /*
630   - * Process the reply.
631   - * Read 8 bytes of response.
632   - */
633   - for (;;) {
634   - fd_set rfds;
635   - struct timeval tv;
636   -
637   - FD_ZERO(&rfds);
638   - FD_SET(fd, &rfds);
639   - tv.tv_sec = 15;
640   - tv.tv_usec = 0;
641   - if (select(fd + 1, &rfds, NULL, NULL, &tv) < 0)
642   - {
643   - popup_an_error(hSession,_("SOCKS4 Proxy: server timeout"));
644   - return -1;
645   - }
646   -
647   - nr = recv(fd, &rbuf[nread], 1, 0);
648   -
649   - if (nr < 0)
650   - {
651   - popup_a_sockerr(hSession,_("SOCKS4 Proxy: receive error"));
652   - return -1;
653   - }
654   - if (nr == 0)
655   - break;
656   -
657   - if (++nread >= sizeof(rbuf))
658   - break;
659   - }
660   -
661   -#if defined(X3270_TRACE) /*[*/
662   - trace_netdata(hSession,'<', (unsigned char *)rbuf, nread);
663   - if (use_4a)
664   - {
665   - struct in_addr a;
666   -
667   - rport = (rbuf[2] << 8) | rbuf[3];
668   - memcpy(&a, &rbuf[4], 4);
669   - trace_dsn(hSession,_("SOCKS4 Proxy: recv status 0x%02x port %u address %s\n"),rbuf[1],rport,inet_ntoa(a));
670   -
671   - } else
672   - trace_dsn(hSession,_("SOCKS4 Proxy: recv status 0x%02x\n"), rbuf[1]);
673   -#endif /*]*/
674   -
675   - switch (rbuf[1])
676   - {
677   - case 0x5a:
678   - break;
679   - case 0x5b:
680   - popup_an_error(hSession,_("SOCKS4 Proxy: request rejected or failed"));
681   - return -1;
682   - case 0x5c:
683   - popup_an_error(hSession,_("SOCKS4 Proxy: client is not reachable"));
684   - return -1;
685   - case 0x5d:
686   - popup_an_error(hSession,_("SOCKS4 Proxy: userid error"));
687   - return -1;
688   - default:
689   - popup_an_error(hSession,_("SOCKS4 Proxy: unknown status 0x%02x"),rbuf[1]);
690   - return -1;
691   - }
692   -
693   - return 0;
694   -}
695   -#endif // HAVE_GETADDRINFO
696   -
697   -/* SOCKS version 5 (RFC 1928) proxy. */ /*
698   -static int proxy_socks5(H3270 *hSession, int fd, char *host, unsigned short port, int force_d)
699   -{
700   - union {
701   - struct sockaddr sa;
702   - struct sockaddr_in sin;
703   -#if defined(AF_INET6)
704   - struct sockaddr_in6 sin6;
705   -#endif
706   - } ha;
707   - socklen_t ha_len = 0;
708   - int use_name = 0;
709   - char *buf;
710   - char *s;
711   - unsigned char rbuf[8];
712   - int nr;
713   - int nread = 0;
714   - int n2read = 0;
715   - char nbuf[256];
716   - int done = 0;
717   -
718   -#if defined(X3270_TRACE)
719   - const char *atype_name[] =
720   - {
721   - "",
722   - "IPv4",
723   - "",
724   - "domainname",
725   - "IPv6"
726   - };
727   - unsigned char *portp;
728   -#endif
729   - unsigned short rport;
730   -
731   - if (force_d)
732   - use_name = 1;
733   - else {
734   - char errmsg[1024];
735   - int rv;
736   -
737   - // Resolve the hostname.
738   - rv = resolve_host_and_port(hSession,host, CN, &rport, &ha.sa, &ha_len,errmsg, sizeof(errmsg));
739   - if (rv == -2)
740   - use_name = 1;
741   - else if (rv < 0) {
742   - popup_an_error(hSession,_("SOCKS5 proxy: %s/%u: %s"), host, port,errmsg);
743   - return -1;
744   - }
745   - }
746   -
747   - // Send the authentication request to the server.
748   - strcpy((char *)rbuf, "\005\001\000");
749   -#if defined(X3270_TRACE)
750   - trace_dsn(hSession,_("SOCKS5 Proxy: xmit version 5 nmethods 1 (no auth)\n"));
751   - trace_netdata(hSession, '>', rbuf, 3);
752   -#endif
753   - if (send(fd, (const char *) rbuf, 3, 0) < 0)
754   - {
755   - popup_a_sockerr(hSession,_("SOCKS5 Proxy: send error"));
756   - return -1;
757   - }
758   -
759   - //
760   - // Wait for the server reply.
761   - // Read 2 bytes of response.
762   - //
763   - nread = 0;
764   - for (;;) {
765   - fd_set rfds;
766   - struct timeval tv;
767   -
768   - FD_ZERO(&rfds);
769   - FD_SET(fd, &rfds);
770   - tv.tv_sec = 15;
771   - tv.tv_usec = 0;
772   - if (select(fd + 1, &rfds, NULL, NULL, &tv) < 0)
773   - {
774   - popup_an_error(hSession,_("SOCKS5 Proxy: server timeout"));
775   -#if defined(X3270_TRACE)
776   - if (nread)
777   - trace_netdata(hSession, '<', rbuf, nread);
778   -#endif
779   - return -1;
780   - }
781   -
782   - nr = recv(fd, (char *) &rbuf[nread], 1, 0);
783   - if (nr < 0)
784   - {
785   - popup_a_sockerr(hSession,_("SOCKS5 Proxy: receive error"));
786   -#if defined(X3270_TRACE)
787   - if (nread)
788   - trace_netdata(hSession, '<', rbuf, nread);
789   -#endif
790   - return -1;
791   - }
792   - if (nr == 0)
793   - {
794   - popup_a_sockerr(hSession,_("SOCKS5 Proxy: unexpected EOF"));
795   -#if defined(X3270_TRACE)
796   - if (nread)
797   - trace_netdata(hSession, '<', rbuf, nread);
798   -#endif
799   - return -1;
800   - }
801   - if (++nread >= 2)
802   - break;
803   - }
804   -
805   -#if defined(X3270_TRACE)
806   - trace_netdata(hSession, '<', rbuf, nread);
807   -#endif
808   -
809   - if (rbuf[0] != 0x05 || (rbuf[1] != 0 && rbuf[1] != 0xff))
810   - {
811   - popup_an_error(hSession,_("SOCKS5 Proxy: bad authentication response"));
812   - return -1;
813   - }
814   -
815   -#if defined(X3270_TRACE)
816   - trace_dsn(hSession,"SOCKS5 Proxy: recv version %d method %d\n", rbuf[0],rbuf[1]);
817   -#endif
818   -
819   - if (rbuf[1] == 0xff)
820   - {
821   - popup_an_error(hSession,_("SOCKS5 Proxy: authentication failure"));
822   - return -1;
823   - }
824   -
825   - // Send the request to the server.
826   - buf = lib3270_malloc(32 + strlen(host));
827   - s = buf;
828   - *s++ = 0x05; // protocol version 5
829   - *s++ = 0x01; // CONNECT
830   - *s++ = 0x00; // reserved
831   - if (use_name) {
832   - *s++ = 0x03; // domain name
833   - *s++ = strlen(host);
834   - strcpy(s, host);
835   - s += strlen(host);
836   - } else if (ha.sa.sa_family == AF_INET) {
837   - *s++ = 0x01; // IPv4
838   - memcpy(s, &ha.sin.sin_addr, 4);
839   - s += 4;
840   - strcpy(nbuf, inet_ntoa(ha.sin.sin_addr));
841   -#if defined(AF_INET6)
842   - } else {
843   - *s++ = 0x04; // IPv6
844   - memcpy(s, &ha.sin6.sin6_addr, sizeof(struct in6_addr));
845   - s += sizeof(struct in6_addr);
846   - (void) inet_ntop(AF_INET6, &ha.sin6.sin6_addr, nbuf, sizeof(nbuf));
847   -#endif
848   - }
849   - SET16(s, port);
850   -
851   -#if defined(X3270_TRACE)
852   - trace_dsn(hSession,"SOCKS5 Proxy: xmit version 5 connect %s %s port %u\n",
853   - use_name? "domainname":
854   - ((ha.sa.sa_family == AF_INET)? "IPv4": "IPv6"),
855   - use_name? host: nbuf,
856   - port);
857   - trace_netdata(hSession, '>', (unsigned char *)buf, s - buf);
858   -#endif
859   -
860   - if (send(fd, buf, s - buf, 0) < 0) {
861   - popup_a_sockerr(hSession,_("SOCKS5 Proxy: send error"));
862   - lib3270_free(buf);
863   - return -1;
864   - }
865   - lib3270_free(buf);
866   -
867   - //
868   - // Process the reply.
869   - // Only the first two bytes of the response are interesting;
870   - // skip the rest.
871   - //
872   - nread = 0;
873   - done = 0;
874   - buf = NULL;
875   - while (!done)
876   - {
877   - fd_set rfds;
878   - struct timeval tv;
879   - unsigned char r;
880   -
881   - FD_ZERO(&rfds);
882   - FD_SET(fd, &rfds);
883   - tv.tv_sec = 15;
884   - tv.tv_usec = 0;
885   - if (select(fd + 1, &rfds, NULL, NULL, &tv) < 0)
886   - {
887   - popup_an_error(hSession,_("SOCKS5 Proxy: server timeout"));
888   - return -1;
889   - }
890   -
891   - nr = recv(fd, (char *) &r, 1, 0);
892   - if (nr < 0)
893   - {
894   - popup_a_sockerr(hSession,_("SOCKS5 Proxy: receive error"));
895   -#if defined(X3270_TRACE)
896   - if (nread)
897   - trace_netdata(hSession, '<', (unsigned char *)buf, nread);
898   -#endif
899   - return -1;
900   - }
901   - if (nr == 0)
902   - {
903   - popup_an_error(hSession, _("SOCKS5 Proxy: unexpected EOF"));
904   -#if defined(X3270_TRACE)
905   - if (nread)
906   - trace_netdata(hSession, '<', (unsigned char *)buf, nread);
907   -#endif
908   - return -1;
909   - }
910   -
911   - buf = Realloc(buf, nread + 1);
912   - buf[nread] = r;
913   -
914   - switch (nread++) {
915   - case 0:
916   - if (r != 0x05)
917   - {
918   - popup_an_error(hSession, _("SOCKS5 Proxy: incorrect reply version 0x%02x"), r);
919   -#if defined(X3270_TRACE)
920   - if (nread)
921   - trace_netdata(hSession, '<', (unsigned char *)buf, nread);
922   -#endif
923   - return -1;
924   - }
925   - break;
926   - case 1:
927   -#if defined(X3270_TRACE)
928   - if (r != 0x00)
929   - trace_netdata(hSession, '<', (unsigned char *)buf, nread);
930   -#endif
931   - switch (r)
932   - {
933   - case 0x00:
934   - break;
935   - case 0x01:
936   - popup_an_error(hSession, _("SOCKS5 Proxy: server failure"));
937   - return -1;
938   - case 0x02:
939   - popup_an_error(hSession, _("SOCKS5 Proxy: connection not allowed"));
940   - return -1;
941   - case 0x03:
942   - popup_an_error(hSession, _("SOCKS5 Proxy: network unreachable"));
943   - return -1;
944   - case 0x04:
945   - popup_an_error(hSession, _("SOCKS5 Proxy: host unreachable"));
946   - return -1;
947   - case 0x05:
948   - popup_an_error(hSession, _("SOCKS5 Proxy: connection refused"));
949   - return -1;
950   - case 0x06:
951   - popup_an_error(hSession, _("SOCKS5 Proxy: ttl expired"));
952   - return -1;
953   - case 0x07:
954   - popup_an_error(hSession, _("SOCKS5 Proxy: command not supported"));
955   - return -1;
956   - case 0x08:
957   - popup_an_error(hSession, _("SOCKS5 Proxy: address type not supported"));
958   - return -1;
959   - default:
960   - popup_an_error(hSession, _("SOCKS5 Proxy: unknown server error 0x%02x"), r);
961   - return -1;
962   - }
963   - break;
964   -
965   - case 2:
966   - break;
967   - case 3:
968   - switch (r)
969   - {
970   - case 0x01:
971   - n2read = 6;
972   - break;
973   - case 0x03:
974   - n2read = -1;
975   - break;
976   -#if defined(AF_INET6)
977   - case 0x04:
978   - n2read = sizeof(struct in6_addr) + 2;
979   - break;
980   -#endif
981   - default:
982   - popup_an_error(hSession, _("SOCKS5 Proxy: unknown server address type 0x%02x"), r);
983   -#if defined(X3270_TRACE)
984   - if (nread)
985   - trace_netdata(hSession, '<', (unsigned char *)buf, nread);
986   -#endif
987   - return -1;
988   - }
989   - break;
990   - default:
991   - if (n2read == -1)
992   - n2read = r + 2;
993   - else if (!--n2read)
994   - done = 1;
995   - break;
996   - }
997   - }
998   -
999   -#if defined(X3270_TRACE)
1000   - trace_netdata(hSession, '<', (unsigned char *)buf, nread);
1001   - switch (buf[3]) {
1002   - case 0x01: // IPv4
1003   - memcpy(&ha.sin.sin_addr, &buf[4], 4);
1004   - strcpy(nbuf, inet_ntoa(ha.sin.sin_addr));
1005   - portp = (unsigned char *)&buf[4 + 4];
1006   - break;
1007   - case 0x03: // domainname
1008   - strncpy(nbuf, &buf[5], buf[4]);
1009   - nbuf[(unsigned char)buf[4]] = '\0';
1010   - portp = (unsigned char *)&buf[5 + (unsigned char)buf[4]];
1011   - break;
1012   -#if defined(AF_INET6)
1013   - case 0x04: // IPv6
1014   - memcpy(&ha.sin6.sin6_addr, &buf[4], sizeof(struct in6_addr));
1015   - (void) inet_ntop(AF_INET6, &ha.sin6.sin6_addr, nbuf,
1016   - sizeof(nbuf));
1017   - portp = (unsigned char *)&buf[4 + sizeof(struct in6_addr)];
1018   - break;
1019   -#endif
1020   - default:
1021   - // can't happen
1022   - nbuf[0] = '\0';
1023   - portp = (unsigned char *)buf;
1024   - break;
1025   - }
1026   - rport = (*portp << 8) + *(portp + 1);
1027   - trace_dsn(hSession,"SOCKS5 Proxy: recv version %d status 0x%02x address %s %s port %u\n",
1028   - buf[0], buf[1],
1029   - atype_name[(unsigned char)buf[3]],
1030   - nbuf,
1031   - rport);
1032   -#endif
1033   - lib3270_free(buf);
1034   -
1035   - return 0;
1036   -}
1037   -*/
src/lib3270/version.c.in 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +char *build = "@PACKAGE_TARNAME@ v@PACKAGE_VERSION@ @RPQ_BUILD_DATE@ @SCCS_USER@";
  2 +char *app_defaults_version = "@PACKAGE_VERSION@";
  3 +char *sccsid = "@(#)@PACKAGE_TARNAME@ v@PACKAGE_VERSION@ @SCCS_DATE@ @SCCS_USER@";
  4 +
  5 +const char *build_rpq_timestamp = "@RPQ_TIMESTAMP@";
  6 +const char *build_rpq_version = "@PACKAGE_VERSION@";
  7 +const char *build_rpq_revision = "@RPQ_REVISION@";
  8 +
... ...