Commit d4cfc6afa27c0d75481fd3b1ff82035cb9cd9b0b

Authored by perry.werneck@gmail.com
1 parent f4e6dc59

Implementando novo mecanismo de conexão

@@ -59,6 +59,7 @@ @@ -59,6 +59,7 @@
59 #include "hostc.h" 59 #include "hostc.h"
60 #include "trace_dsc.h" 60 #include "trace_dsc.h"
61 #include "utilc.h" 61 #include "utilc.h"
  62 +#include "telnetc.h"
62 #include <lib3270/internals.h> 63 #include <lib3270/internals.h>
63 64
64 /*---[ Implement ]-------------------------------------------------------------------------------*/ 65 /*---[ Implement ]-------------------------------------------------------------------------------*/
@@ -66,7 +67,30 @@ @@ -66,7 +67,30 @@
66 67
67 static void net_connected(H3270 *hSession) 68 static void net_connected(H3270 *hSession)
68 { 69 {
69 - trace("***************** %s",__FUNCTION__); 70 + RemoveSource(hSession->ns_write_id);
  71 + hSession->ns_write_id = NULL;
  72 +
  73 +#ifdef _WIN32
  74 + hSession->ns_exception_id = AddExcept(hSession->sockEvent, hSession, net_exception);
  75 + hSession->ns_read_id = AddInput(hSession->sockEvent, hSession, net_input);
  76 +#else
  77 + hSession->ns_exception_id = AddExcept(hSession->sock, hSession, net_exception);
  78 + hSession->ns_read_id = AddInput(hSession->sock, hSession, net_input);
  79 +#endif // WIN32
  80 + hSession->excepting = 1;
  81 + hSession->reading = 1;
  82 +
  83 +/*
  84 +#if defined(HAVE_LIBSSL)
  85 + if(hSession->ssl_con && hSession->secure == LIB3270_SSL_UNDEFINED)
  86 + {
  87 + if(ssl_negotiate(hSession))
  88 + return;
  89 + }
  90 +#endif
  91 +*/
  92 +
  93 + lib3270_setup_session(hSession);
70 94
71 } 95 }
72 96
@@ -120,7 +144,6 @@ static void net_connected(H3270 *hSession) @@ -120,7 +144,6 @@ static void net_connected(H3270 *hSession)
120 LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, const char *srvc) 144 LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, const char *srvc)
121 { 145 {
122 int s; 146 int s;
123 - int sock = -1;  
124 struct addrinfo hints; 147 struct addrinfo hints;
125 struct addrinfo * result = NULL; 148 struct addrinfo * result = NULL;
126 struct addrinfo * rp = NULL; 149 struct addrinfo * rp = NULL;
@@ -138,7 +161,7 @@ static void net_connected(H3270 *hSession) @@ -138,7 +161,7 @@ static void net_connected(H3270 *hSession)
138 if(hSession->auto_reconnect_inprogress) 161 if(hSession->auto_reconnect_inprogress)
139 return EAGAIN; 162 return EAGAIN;
140 163
141 - if(PCONNECTED) 164 + if(hSession->sock > 0)
142 return EBUSY; 165 return EBUSY;
143 166
144 #if defined(_WIN32) 167 #if defined(_WIN32)
@@ -194,7 +217,7 @@ static void net_connected(H3270 *hSession) @@ -194,7 +217,7 @@ static void net_connected(H3270 *hSession)
194 217
195 status_changed(hSession,LIB3270_STATUS_CONNECTING); 218 status_changed(hSession,LIB3270_STATUS_CONNECTING);
196 219
197 - for(rp = result; sock < 0 && rp != NULL; rp = rp->ai_next) 220 + for(rp = result; hSession->sock < 0 && rp != NULL; rp = rp->ai_next)
198 { 221 {
199 hSession->sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); 222 hSession->sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
200 if(hSession->sock < 0) 223 if(hSession->sock < 0)
@@ -204,6 +227,36 @@ static void net_connected(H3270 *hSession) @@ -204,6 +227,36 @@ static void net_connected(H3270 *hSession)
204 u_long block; 227 u_long block;
205 u_int len = sizeof(int); 228 u_int len = sizeof(int);
206 229
  230 + if(session->sockEvent == NULL)
  231 + {
  232 + char ename[256];
  233 +
  234 + snprintf(ename, 255, "%s-%d", PACKAGE_NAME, getpid());
  235 +
  236 + session->sockEvent = CreateEvent(NULL, TRUE, FALSE, ename);
  237 + if(session->sockEvent == NULL)
  238 + {
  239 + lib3270_popup_dialog( session,
  240 + LIB3270_NOTIFY_CRITICAL,
  241 + N_( "Network startup error" ),
  242 + N_( "Cannot create socket handle" ),
  243 + "%s", win32_strerror(GetLastError()) );
  244 + _exit(1);
  245 + }
  246 + }
  247 +
  248 + if (WSAEventSelect(session->sock, session->sockEvent, FD_READ | FD_CONNECT | FD_CLOSE) != 0)
  249 + {
  250 + lib3270_popup_dialog( session,
  251 + LIB3270_NOTIFY_CRITICAL,
  252 + N_( "Network startup error" ),
  253 + N_( "WSAEventSelect failed" ),
  254 + "%s", win32_strerror(GetLastError()) );
  255 + _exit(1);
  256 + }
  257 +
  258 +
  259 +
207 WSASetLastError(0); 260 WSASetLastError(0);
208 block = 0; 261 block = 0;
209 262
@@ -213,8 +266,7 @@ static void net_connected(H3270 *hSession) @@ -213,8 +266,7 @@ static void net_connected(H3270 *hSession)
213 LIB3270_NOTIFY_ERROR, 266 LIB3270_NOTIFY_ERROR,
214 _( "Connection error" ), 267 _( "Connection error" ),
215 _( "ioctlsocket(FIONBIO) failed." ), 268 _( "ioctlsocket(FIONBIO) failed." ),
216 - "Windows error %d",  
217 - WSAGetLastError() ); 269 + "%s", win32_strerror(GetLastError()));
218 270
219 SOCK_CLOSE(hSession); 271 SOCK_CLOSE(hSession);
220 } 272 }
@@ -227,14 +279,13 @@ static void net_connected(H3270 *hSession) @@ -227,14 +279,13 @@ static void net_connected(H3270 *hSession)
227 LIB3270_NOTIFY_ERROR, 279 LIB3270_NOTIFY_ERROR,
228 _( "Connection error" ), 280 _( "Connection error" ),
229 _( "Can't connect to host." ), 281 _( "Can't connect to host." ),
230 - "Windows error %d",  
231 - WSAGetLastError() ); 282 + "%s", win32_strerror(GetLastError()));
232 SOCK_CLOSE(hSession); 283 SOCK_CLOSE(hSession);
233 } 284 }
234 } 285 }
235 286
236 #else 287 #else
237 - fcntl(hSession->sock, F_SETFL,fcntl(sock,F_GETFL,0)|O_NONBLOCK); 288 + fcntl(hSession->sock, F_SETFL,fcntl(hSession->sock,F_GETFL,0)|O_NONBLOCK);
238 289
239 errno = 0; 290 errno = 0;
240 if(connect(hSession->sock, rp->ai_addr, rp->ai_addrlen)) 291 if(connect(hSession->sock, rp->ai_addr, rp->ai_addrlen))
@@ -288,11 +339,13 @@ static void net_connected(H3270 *hSession) @@ -288,11 +339,13 @@ static void net_connected(H3270 *hSession)
288 #endif 339 #endif
289 340
290 // Connecting, set callbacks, wait for connection 341 // Connecting, set callbacks, wait for connection
291 - trace_dsn(hSession,"Half-connected.\n");  
292 -  
293 lib3270_st_changed(hSession, LIB3270_STATE_HALF_CONNECT, True); 342 lib3270_st_changed(hSession, LIB3270_STATE_HALF_CONNECT, True);
294 343
  344 +#ifdef _WIN32
  345 + hSession->ns_write_id = AddOutput(hSession->sockEvent, hSession, net_connected);
  346 +#else
295 hSession->ns_write_id = AddOutput(hSession->sock, hSession, net_connected); 347 hSession->ns_write_id = AddOutput(hSession->sock, hSession, net_connected);
  348 +#endif // WIN32
296 349
297 return 0; 350 return 0;
298 351
@@ -357,3 +357,4 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession); @@ -357,3 +357,4 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession);
357 LIB3270_INTERNAL void check_session_handle(H3270 **hSession); 357 LIB3270_INTERNAL void check_session_handle(H3270 **hSession);
358 #endif // DEBUG 358 #endif // DEBUG
359 359
  360 +LIB3270_EXPORT int lib3270_connect_host(H3270 *hSession, const char *hostname, const char *srvc);
@@ -269,7 +269,7 @@ static void * internal_add_input(int source, H3270 *session, void (*fn)(H3270 *s @@ -269,7 +269,7 @@ static void * internal_add_input(int source, H3270 *session, void (*fn)(H3270 *s
269 { 269 {
270 input_t *ip = (input_t *) lib3270_malloc(sizeof(input_t)); 270 input_t *ip = (input_t *) lib3270_malloc(sizeof(input_t));
271 271
272 - trace("%s session=%p proc=%p",__FUNCTION__,session,fn); 272 + trace("%s session=%p proc=%p handle=%p",__FUNCTION__,session,fn,ip);
273 273
274 ip->source = source; 274 ip->source = source;
275 ip->condition = InputReadMask; 275 ip->condition = InputReadMask;
@@ -290,7 +290,7 @@ static void * internal_add_output(int source, H3270 *session, void (*fn)(H3270 * @@ -290,7 +290,7 @@ static void * internal_add_output(int source, H3270 *session, void (*fn)(H3270 *
290 { 290 {
291 input_t *ip = (input_t *) lib3270_malloc(sizeof(input_t)); 291 input_t *ip = (input_t *) lib3270_malloc(sizeof(input_t));
292 292
293 - trace("%s session=%p proc=%p",__FUNCTION__,session,fn); 293 + trace("%s session=%p proc=%p handle=%p",__FUNCTION__,session,fn,ip);
294 294
295 ip->source = source; 295 ip->source = source;
296 ip->condition = InputWriteMask; 296 ip->condition = InputWriteMask;
@@ -346,7 +346,10 @@ static void internal_remove_source(void *id) @@ -346,7 +346,10 @@ static void internal_remove_source(void *id)
346 } 346 }
347 347
348 if (ip == (input_t *)NULL) 348 if (ip == (input_t *)NULL)
  349 + {
  350 + lib3270_write_log(NULL,"lib3270","Double removal on %s: Input %p wasnt found in the list",__FUNCTION__,id);
349 return; 351 return;
  352 + }
350 353
351 if (prev != (input_t *)NULL) 354 if (prev != (input_t *)NULL)
352 prev->next = ip->next; 355 prev->next = ip->next;
@@ -782,6 +785,12 @@ void remove_input_calls(H3270 *session) @@ -782,6 +785,12 @@ void remove_input_calls(H3270 *session)
782 session->ns_exception_id = NULL; 785 session->ns_exception_id = NULL;
783 session->excepting = 0; 786 session->excepting = 0;
784 } 787 }
  788 + if(session->ns_write_id)
  789 + {
  790 + RemoveSource(session->ns_write_id);
  791 + session->ns_write_id = NULL;
  792 + session->writing = 0;
  793 + }
785 } 794 }
786 795
787 LIB3270_EXPORT void lib3270_register_time_handlers(void * (*add)(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)), void (*rm)(void *timer)) 796 LIB3270_EXPORT void lib3270_register_time_handlers(void * (*add)(unsigned long interval_ms, H3270 *session, void (*proc)(H3270 *session)), void (*rm)(void *timer))
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 <Option compiler="gcc" /> 7 <Option compiler="gcc" />
8 <Build> 8 <Build>
9 <Target title="Debug"> 9 <Target title="Debug">
10 - <Option output=".bin/Debug/lib3270" prefix_auto="1" extension_auto="1" /> 10 + <Option output=".bin/Debug/3270" prefix_auto="1" extension_auto="1" />
11 <Option object_output=".obj/Debug/" /> 11 <Option object_output=".obj/Debug/" />
12 <Option type="3" /> 12 <Option type="3" />
13 <Option compiler="gcc" /> 13 <Option compiler="gcc" />
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 </Linker> 20 </Linker>
21 </Target> 21 </Target>
22 <Target title="Release"> 22 <Target title="Release">
23 - <Option output=".bin/Release/lib3270" prefix_auto="1" extension_auto="1" /> 23 + <Option output=".bin/Release/3270" prefix_auto="1" extension_auto="1" />
24 <Option object_output=".obj/Release/" /> 24 <Option object_output=".obj/Release/" />
25 <Option type="3" /> 25 <Option type="3" />
26 <Option compiler="gcc" /> 26 <Option compiler="gcc" />
@@ -58,6 +58,8 @@ @@ -58,6 +58,8 @@
58 </Compiler> 58 </Compiler>
59 <Linker> 59 <Linker>
60 <Add option="-pthread" /> 60 <Add option="-pthread" />
  61 + <Add option="-lssl" />
  62 + <Add option="-lcrypto" />
61 </Linker> 63 </Linker>
62 <Unit filename="../include/lib3270.h" /> 64 <Unit filename="../include/lib3270.h" />
63 <Unit filename="../include/lib3270/action_table.h" /> 65 <Unit filename="../include/lib3270/action_table.h" />
@@ -87,14 +89,14 @@ @@ -87,14 +89,14 @@
87 <Unit filename="charset.c"> 89 <Unit filename="charset.c">
88 <Option compilerVar="CC" /> 90 <Option compilerVar="CC" />
89 </Unit> 91 </Unit>
90 - <Unit filename="charsetc.h" />  
91 <Unit filename="childc.h" /> 92 <Unit filename="childc.h" />
  93 + <Unit filename="connect.c">
  94 + <Option compilerVar="CC" />
  95 + </Unit>
92 <Unit filename="ctlr.c"> 96 <Unit filename="ctlr.c">
93 <Option compilerVar="CC" /> 97 <Option compilerVar="CC" />
94 </Unit> 98 </Unit>
95 - <Unit filename="ctlr.h" />  
96 <Unit filename="ctlrc.h" /> 99 <Unit filename="ctlrc.h" />
97 - <Unit filename="dialogc.h" />  
98 <Unit filename="fallbacks.c"> 100 <Unit filename="fallbacks.c">
99 <Option compilerVar="CC" /> 101 <Option compilerVar="CC" />
100 </Unit> 102 </Unit>
@@ -192,9 +194,6 @@ @@ -192,9 +194,6 @@
192 <Option compilerVar="CC" /> 194 <Option compilerVar="CC" />
193 </Unit> 195 </Unit>
194 <Unit filename="statusc.h" /> 196 <Unit filename="statusc.h" />
195 - <Unit filename="tables.c">  
196 - <Option compilerVar="CC" />  
197 - </Unit>  
198 <Unit filename="tablesc.h" /> 197 <Unit filename="tablesc.h" />
199 <Unit filename="telnet.c"> 198 <Unit filename="telnet.c">
200 <Option compilerVar="CC" /> 199 <Option compilerVar="CC" />
tablesc.h
@@ -1,45 +0,0 @@ @@ -1,45 +0,0 @@
1 -/*  
2 - * Copyright 1995, 1999, 2000, 2002, 2001, 2002, 2005, 2006 by Paul Mattes.  
3 - * Permission to use, copy, modify, and distribute this software and its  
4 - * documentation for any purpose and without fee is hereby granted,  
5 - * provided that the above copyright notice appear in all copies and that  
6 - * both that copyright notice and this permission notice appear in  
7 - * supporting documentation.  
8 - *  
9 - * x3270, c3270, s3270, tcl3270 and pr3287 are distributed in the hope that  
10 - * they will be useful, but WITHOUT ANY WARRANTY; without even the implied  
11 - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the  
12 - * file LICENSE for more details.  
13 - */  
14 -  
15 -/*  
16 - * tablesc.h  
17 - * Global declarations for tables.c.  
18 - */  
19 -  
20 -#error Deprecated, replace for charset.h  
21 -  
22 -// LIB3270_INTERNAL void initialize_tables(H3270 *hSession);  
23 -// LIB3270_INTERNAL void charset_defaults(H3270 *hSession);  
24 -  
25 -// LIB3270_INTERNAL unsigned short ebc2cg[256];  
26 -// LIB3270_INTERNAL unsigned short cg2ebc[256];  
27 -// LIB3270_INTERNAL unsigned short ebc2asc[256];  
28 -// LIB3270_INTERNAL unsigned short asc2ebc[256];  
29 -// LIB3270_INTERNAL unsigned short ft2asc[256];  
30 -// LIB3270_INTERNAL unsigned short asc2ft[256];  
31 -  
32 -#ifdef EXTENDED_TABLES  
33 -// LIB3270_INTERNAL unsigned short ebc2asc7[256];  
34 -// LIB3270_INTERNAL const unsigned short ebc2asc70[256];  
35 -// LIB3270_INTERNAL const unsigned short ge2asc[256];  
36 -#endif // EXTENDED_TABLES  
37 -  
38 -// LIB3270_INTERNAL const unsigned short asc2cg[256];  
39 -// LIB3270_INTERNAL const unsigned short cg2asc[256];  
40 -// LIB3270_INTERNAL const unsigned short ebc2cg0[256];  
41 -// LIB3270_INTERNAL const unsigned short cg2ebc0[256];  
42 -// LIB3270_INTERNAL const unsigned short asc2ebc0[256];  
43 -// LIB3270_INTERNAL const unsigned short asc2uc[256];  
44 -// LIB3270_INTERNAL const unsigned short ebc2uc[256];  
45 -// LIB3270_INTERNAL const unsigned short ft2asc0[256];  
@@ -1016,24 +1016,30 @@ static void connection_complete(H3270 *session) @@ -1016,24 +1016,30 @@ static void connection_complete(H3270 *session)
1016 } 1016 }
1017 1017
1018 1018
1019 -LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *session) 1019 +LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession)
1020 { 1020 {
1021 trace("%s",__FUNCTION__); 1021 trace("%s",__FUNCTION__);
1022 1022
1023 #if defined(HAVE_LIBSSL) 1023 #if defined(HAVE_LIBSSL)
1024 - if(session->ssl_con != NULL) 1024 + if(hSession->ssl_con != NULL)
1025 { 1025 {
1026 - SSL_shutdown(session->ssl_con);  
1027 - SSL_free(session->ssl_con);  
1028 - session->ssl_con = NULL; 1026 + SSL_shutdown(hSession->ssl_con);
  1027 + SSL_free(hSession->ssl_con);
  1028 + hSession->ssl_con = NULL;
1029 } 1029 }
1030 #endif 1030 #endif
1031 1031
1032 - if(session->sock >= 0) 1032 + if(hSession->ns_write_id)
  1033 + {
  1034 + RemoveSource(hSession->ns_write_id);
  1035 + hSession->ns_write_id = 0;
  1036 + }
  1037 +
  1038 + if(hSession->sock >= 0)
1033 { 1039 {
1034 - shutdown(session->sock, 2);  
1035 - SOCK_CLOSE(session->sock);  
1036 - session->sock = -1; 1040 + shutdown(hSession->sock, 2);
  1041 + SOCK_CLOSE(hSession->sock);
  1042 + hSession->sock = -1;
1037 } 1043 }
1038 } 1044 }
1039 1045
@@ -35,6 +35,8 @@ int main(int numpar, char *param[]) @@ -35,6 +35,8 @@ int main(int numpar, char *param[])
35 pthread_create(&thread, NULL, mainloop, NULL); 35 pthread_create(&thread, NULL, mainloop, NULL);
36 pthread_detach(thread); 36 pthread_detach(thread);
37 37
  38 + lib3270_connect_host(h, "127.0.0.1", "80");
  39 +
38 while(fgets(line,4095,stdin)) 40 while(fgets(line,4095,stdin))
39 { 41 {
40 // const LIB3270_MACRO_LIST *cmd = get_3270_calls(); 42 // const LIB3270_MACRO_LIST *cmd = get_3270_calls();