Commit d4cfc6afa27c0d75481fd3b1ff82035cb9cd9b0b
1 parent
f4e6dc59
Exists in
master
and in
3 other branches
Implementando novo mecanismo de conexão
Showing
7 changed files
with
100 additions
and
75 deletions
Show diff stats
connect.c
@@ -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 |
globals.h
@@ -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); |
iocalls.c
@@ -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)) |
lib3270.cbp
@@ -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]; |
telnet.c
@@ -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 |
testprogram.c
@@ -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(); |