Commit b20e58395785cc1cc872b8926c601816dc3cdfc5

Authored by perry.werneck@gmail.com
1 parent 886d59dd

Simplificando código, reincluindo semaforo windows

Showing 5 changed files with 84 additions and 37 deletions   Show diff stats
@@ -547,7 +547,7 @@ static int do_connect(H3270 *hSession, const char *n) @@ -547,7 +547,7 @@ static int do_connect(H3270 *hSession, const char *n)
547 /* Attempt contact. */ 547 /* Attempt contact. */
548 hSession->ever_3270 = False; 548 hSession->ever_3270 = False;
549 549
550 - if(net_connect(hSession, chost, port, 0, &resolving,&pending) < 0 && !resolving) 550 + if(net_connect(hSession, chost, port, 0, &resolving,&pending) != 0 && !resolving)
551 { 551 {
552 /* Redundantly signal a disconnect. */ 552 /* Redundantly signal a disconnect. */
553 host_disconnected(hSession); 553 host_disconnected(hSession);
@@ -572,7 +572,17 @@ static int do_connect(H3270 *hSession, const char *n) @@ -572,7 +572,17 @@ static int do_connect(H3270 *hSession, const char *n)
572 // login_macro(ps); 572 // login_macro(ps);
573 573
574 /* Prepare Xt for I/O. */ 574 /* Prepare Xt for I/O. */
575 - x_add_input(hSession,hSession->sock); 575 +// x_add_input(hSession);
  576 +#ifdef _WIN32
  577 + hSession->ns_exception_id = AddExcept(hSession->sockEvent, hSession, net_exception);
  578 + hSession->ns_read_id = AddInput(hSession->sockEvent, hSession, net_input);
  579 +#else
  580 + hSession->ns_exception_id = AddExcept(hSession->sock, hSession, net_exception);
  581 + hSession->ns_read_id = AddInput(hSession->sock, hSession, net_input);
  582 +#endif // WIN32
  583 +
  584 + hSession->excepting = True;
  585 + hSession->reading = True;
576 586
577 /* Set state and tell the world. */ 587 /* Set state and tell the world. */
578 if (pending) 588 if (pending)
@@ -660,7 +670,19 @@ void host_disconnect(H3270 *h, int failed) @@ -660,7 +670,19 @@ void host_disconnect(H3270 *h, int failed)
660 670
661 if (CONNECTED || HALF_CONNECTED) 671 if (CONNECTED || HALF_CONNECTED)
662 { 672 {
663 - x_remove_input(h); 673 + // Disconecting, disable input
  674 + if(h->reading)
  675 + {
  676 + RemoveInput(h->ns_read_id);
  677 + h->reading = False;
  678 + }
  679 + if(h->excepting)
  680 + {
  681 + RemoveInput(h->ns_exception_id);
  682 + h->excepting = False;
  683 + }
  684 +// x_remove_input(h);
  685 +
664 net_disconnect(h); 686 net_disconnect(h);
665 687
666 Trace("Disconnected (Failed: %d Reconnect: %d in_progress: %d)",failed,toggled(RECONNECT),h->auto_reconnect_inprogress); 688 Trace("Disconnected (Failed: %d Reconnect: %d in_progress: %d)",failed,toggled(RECONNECT),h->auto_reconnect_inprogress);
@@ -149,8 +149,12 @@ static void lib3270_session_init(H3270 *hSession, const char *model) @@ -149,8 +149,12 @@ static void lib3270_session_init(H3270 *hSession, const char *model)
149 hSession->cursor = set_cursor; 149 hSession->cursor = set_cursor;
150 hSession->message = message; 150 hSession->message = message;
151 hSession->update_ssl = update_ssl; 151 hSession->update_ssl = update_ssl;
  152 + hSession->sock = -1;
  153 +
  154 +#ifdef _WIN32
  155 + hSession->sockEvent = NULL;
  156 +#endif // _WIN32
152 157
153 - hSession->sock = -1;  
154 hSession->model_num = -1; 158 hSession->model_num = -1;
155 hSession->cstate = NOT_CONNECTED; 159 hSession->cstate = NOT_CONNECTED;
156 hSession->oia_status = -1; 160 hSession->oia_status = -1;
@@ -38,8 +38,8 @@ @@ -38,8 +38,8 @@
38 */ 38 */
39 39
40 #if defined(_WIN32) 40 #if defined(_WIN32)
41 - #include <winsock2.h>  
42 - #include <windows.h> 41 + #include <winsock2.h>
  42 + #include <windows.h>
43 #endif 43 #endif
44 44
45 #include <lib3270/config.h> 45 #include <lib3270/config.h>
@@ -485,7 +485,7 @@ static int connect_sock(H3270 *hSession, int sockfd, const struct sockaddr *addr @@ -485,7 +485,7 @@ static int connect_sock(H3270 *hSession, int sockfd, const struct sockaddr *addr
485 * 485 *
486 * @param session Handle to the session descriptor. 486 * @param session Handle to the session descriptor.
487 * 487 *
488 - * @return The file descriptor of the connected socket. 488 + * @return 0 if ok, non zero if failed
489 */ 489 */
490 int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Boolean *resolving, Boolean *pending) 490 int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Boolean *resolving, Boolean *pending)
491 { 491 {
@@ -676,27 +676,27 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo @@ -676,27 +676,27 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo
676 } 676 }
677 677
678 /* all done */ 678 /* all done */
679 -/*  
680 #if defined(_WIN32) 679 #if defined(_WIN32)
681 - if (session->sock_handle == NULL) { 680 +
  681 + if(session->sockEvent == NULL)
  682 + {
682 char ename[256]; 683 char ename[256];
683 684
684 - sprintf(ename, "wc3270-%d", getpid()); 685 + snprintf(ename, 255, "%s-%d", PACKAGE_NAME, getpid());
685 686
686 - session->sock_handle = CreateEvent(NULL, TRUE, FALSE, ename);  
687 - if (session->sock_handle == NULL) 687 + session->sockEvent = CreateEvent(NULL, TRUE, FALSE, ename);
  688 + if(session->sockEvent == NULL)
688 { 689 {
689 lib3270_popup_dialog( session, 690 lib3270_popup_dialog( session,
690 LIB3270_NOTIFY_CRITICAL, 691 LIB3270_NOTIFY_CRITICAL,
691 N_( "Network startup error" ), 692 N_( "Network startup error" ),
692 N_( "Cannot create socket handle" ), 693 N_( "Cannot create socket handle" ),
693 "%s", win32_strerror(GetLastError()) ); 694 "%s", win32_strerror(GetLastError()) );
694 -  
695 _exit(1); 695 _exit(1);
696 } 696 }
697 } 697 }
698 698
699 - if (WSAEventSelect(session->sock, session->sock_handle, FD_READ | FD_CONNECT | FD_CLOSE) != 0) 699 + if (WSAEventSelect(session->sock, session->sockEvent, FD_READ | FD_CONNECT | FD_CLOSE) != 0)
700 { 700 {
701 lib3270_popup_dialog( session, 701 lib3270_popup_dialog( session,
702 LIB3270_NOTIFY_CRITICAL, 702 LIB3270_NOTIFY_CRITICAL,
@@ -706,13 +706,9 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo @@ -706,13 +706,9 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo
706 _exit(1); 706 _exit(1);
707 } 707 }
708 708
709 - return (int) session->sock_handle;  
710 -#else  
711 - return session->sock;  
712 -#endif  
713 -*/ 709 +#endif // WIN32
714 710
715 - return session->sock; 711 + return 0;
716 } 712 }
717 #undef close_fail 713 #undef close_fail
718 714
@@ -1272,9 +1268,10 @@ telnet_fsm(unsigned char c) @@ -1272,9 +1268,10 @@ telnet_fsm(unsigned char c)
1272 break; 1268 break;
1273 case DM: 1269 case DM:
1274 trace_dsn("\n"); 1270 trace_dsn("\n");
1275 - if (syncing) { 1271 + if (syncing)
  1272 + {
1276 syncing = 0; 1273 syncing = 0;
1277 - x_except_on(&h3270,h3270.sock); 1274 + x_except_on(&h3270);
1278 } 1275 }
1279 telnet_state = TNS_DATA; 1276 telnet_state = TNS_DATA;
1280 break; 1277 break;
@@ -1944,7 +1941,13 @@ void net_exception(H3270 *session) @@ -1944,7 +1941,13 @@ void net_exception(H3270 *session)
1944 if (!syncing) 1941 if (!syncing)
1945 { 1942 {
1946 syncing = 1; 1943 syncing = 1;
1947 - x_except_off(session); 1944 +
  1945 + if(session->excepting)
  1946 + {
  1947 + RemoveInput(session->ns_exception_id);
  1948 + session->excepting = False;
  1949 + }
  1950 +// x_except_off(session);
1948 } 1951 }
1949 } 1952 }
1950 1953
@@ -3173,7 +3176,7 @@ static int non_blocking(H3270 *session, Boolean on) @@ -3173,7 +3176,7 @@ static int non_blocking(H3270 *session, Boolean on)
3173 3176
3174 if (SOCK_IOCTL(session->sock, FIONBIO, (int *) &i) < 0) 3177 if (SOCK_IOCTL(session->sock, FIONBIO, (int *) &i) < 0)
3175 { 3178 {
3176 - popup_a_sockerr(session, N_( "ioctl(%s)" ), "FIONBIO"); 3179 + popup_a_sockerr(session,N_( "ioctl(%s)" ), "FIONBIO");
3177 return -1; 3180 return -1;
3178 } 3181 }
3179 3182
@@ -3183,7 +3186,7 @@ static int non_blocking(H3270 *session, Boolean on) @@ -3183,7 +3186,7 @@ static int non_blocking(H3270 *session, Boolean on)
3183 3186
3184 if ((f = fcntl(session->sock, F_GETFL, 0)) == -1) 3187 if ((f = fcntl(session->sock, F_GETFL, 0)) == -1)
3185 { 3188 {
3186 - popup_an_errno(NULL,errno, N_( "fcntl(%s)" ), "F_GETFL" ); 3189 + popup_an_errno(session,errno, N_( "fcntl(%s)" ), "F_GETFL" );
3187 return -1; 3190 return -1;
3188 } 3191 }
3189 3192
@@ -3194,7 +3197,7 @@ static int non_blocking(H3270 *session, Boolean on) @@ -3194,7 +3197,7 @@ static int non_blocking(H3270 *session, Boolean on)
3194 3197
3195 if (fcntl(session->sock, F_SETFL, f) < 0) 3198 if (fcntl(session->sock, F_SETFL, f) < 0)
3196 { 3199 {
3197 - popup_an_errno(NULL,errno, N_( "fcntl(%s)" ), "F_GETFL"); 3200 + popup_an_errno(session,errno, N_( "fcntl(%s)" ), "F_GETFL");
3198 return -1; 3201 return -1;
3199 } 3202 }
3200 3203
@@ -53,17 +53,25 @@ @@ -53,17 +53,25 @@
53 /* 53 /*
54 * Called to set up input on a new network connection. 54 * Called to set up input on a new network connection.
55 */ 55 */
56 -void x_add_input(H3270 *h,int net_sock) 56 +/*
  57 +void x_add_input(H3270 *h)
57 { 58 {
58 - h->ns_exception_id = AddExcept(net_sock, h, net_exception); 59 +#ifdef _WIN32
  60 + h->ns_exception_id = AddExcept(h->sockEvent, h, net_exception);
  61 + h->excepting = True;
  62 + h->ns_read_id = AddInput(h->sockEvent, h, net_input);
  63 + h->reading = True;
  64 +#else
  65 + h->ns_exception_id = AddExcept(h->sock, h, net_exception);
59 h->excepting = True; 66 h->excepting = True;
60 - h->ns_read_id = AddInput(net_sock, h, net_input); 67 + h->ns_read_id = AddInput(h->sock, h, net_input);
61 h->reading = True; 68 h->reading = True;
  69 +#endif // WIN32
62 } 70 }
63 - 71 +*/
64 /* 72 /*
65 * Called when an exception is received to disable further exceptions. 73 * Called when an exception is received to disable further exceptions.
66 - */ 74 + */ /*
67 void x_except_off(H3270 *h) 75 void x_except_off(H3270 *h)
68 { 76 {
69 CHECK_SESSION_HANDLE(h); 77 CHECK_SESSION_HANDLE(h);
@@ -74,13 +82,14 @@ void x_except_off(H3270 *h) @@ -74,13 +82,14 @@ void x_except_off(H3270 *h)
74 h->excepting = False; 82 h->excepting = False;
75 } 83 }
76 } 84 }
  85 +*/
77 86
78 /* 87 /*
79 * Called when exception processing is complete to re-enable exceptions. 88 * Called when exception processing is complete to re-enable exceptions.
80 * This includes removing and restoring reading, so the exceptions are always 89 * This includes removing and restoring reading, so the exceptions are always
81 * processed first. 90 * processed first.
82 */ 91 */
83 -void x_except_on(H3270 *h,int net_sock) 92 +void x_except_on(H3270 *h)
84 { 93 {
85 if(h->excepting) 94 if(h->excepting)
86 return; 95 return;
@@ -88,16 +97,24 @@ void x_except_on(H3270 *h,int net_sock) @@ -88,16 +97,24 @@ void x_except_on(H3270 *h,int net_sock)
88 if(h->reading) 97 if(h->reading)
89 RemoveInput(h->ns_read_id); 98 RemoveInput(h->ns_read_id);
90 99
91 - h->ns_exception_id = AddExcept(net_sock, h, net_exception); 100 +#ifdef WIN32
  101 + h->ns_exception_id = AddExcept(h->sockEvent, h, net_exception);
92 h->excepting = True; 102 h->excepting = True;
93 103
94 if(h->reading) 104 if(h->reading)
95 - h->ns_read_id = AddInput(net_sock, h, net_input); 105 + h->ns_read_id = AddInput(h->sockEvent, h, net_input);
  106 +#else
  107 + h->ns_exception_id = AddExcept(h->sock, h, net_exception);
  108 + h->excepting = True;
  109 +
  110 + if(h->reading)
  111 + h->ns_read_id = AddInput(h->sock, h, net_input);
  112 +#endif // WIN32
96 } 113 }
97 114
98 /* 115 /*
99 * Called to disable input on a closing network connection. 116 * Called to disable input on a closing network connection.
100 - */ 117 + */ /*
101 void x_remove_input(H3270 *h) 118 void x_remove_input(H3270 *h)
102 { 119 {
103 if(h->reading) 120 if(h->reading)
@@ -111,3 +128,4 @@ void x_remove_input(H3270 *h) @@ -111,3 +128,4 @@ void x_remove_input(H3270 *h)
111 h->excepting = False; 128 h->excepting = False;
112 } 129 }
113 } 130 }
  131 +*/
@@ -35,8 +35,8 @@ @@ -35,8 +35,8 @@
35 * Global declarations for xio.c. 35 * Global declarations for xio.c.
36 */ 36 */
37 37
38 -LIB3270_INTERNAL void x_add_input(H3270 *h,int net_sock); 38 +LIB3270_INTERNAL void x_add_input(H3270 *h);
39 LIB3270_INTERNAL void x_except_off(H3270 *h); 39 LIB3270_INTERNAL void x_except_off(H3270 *h);
40 -LIB3270_INTERNAL void x_except_on(H3270 *h,int net_sock); 40 +LIB3270_INTERNAL void x_except_on(H3270 *h);
41 LIB3270_INTERNAL void x_remove_input(H3270 *h); 41 LIB3270_INTERNAL void x_remove_input(H3270 *h);
42 42