Commit 0f98ce19fe66a4af2b6b4faa1cbfcf874d777ff9

Authored by Perry Werneck
1 parent 699d861e

SSL networking is now modular.

@@ -337,7 +337,7 @@ @@ -337,7 +337,7 @@
337 <Unit filename="src/network_modules/state.c"> 337 <Unit filename="src/network_modules/state.c">
338 <Option compilerVar="CC" /> 338 <Option compilerVar="CC" />
339 </Unit> 339 </Unit>
340 - <Unit filename="src/network_modules/translate.c"> 340 + <Unit filename="src/network_modules/tools.c">
341 <Option compilerVar="CC" /> 341 <Option compilerVar="CC" />
342 </Unit> 342 </Unit>
343 <Unit filename="src/selection/actions.c"> 343 <Unit filename="src/selection/actions.c">
src/core/host.c
@@ -388,13 +388,14 @@ LIB3270_EXPORT int lib3270_set_url(H3270 *h, const char *n) @@ -388,13 +388,14 @@ LIB3270_EXPORT int lib3270_set_url(H3270 *h, const char *n)
388 { 0, "telnet://", "telnet" } 388 { 0, "telnet://", "telnet" }
389 389
390 }; 390 };
  391 + int f;
391 */ 392 */
  393 +
392 lib3270_autoptr(char) str = strdup(n); 394 lib3270_autoptr(char) str = strdup(n);
393 char * hostname = lib3270_set_network_module_from_url(h,str); 395 char * hostname = lib3270_set_network_module_from_url(h,str);
394 const char * srvc; 396 const char * srvc;
395 char * ptr; 397 char * ptr;
396 char * query = ""; 398 char * query = "";
397 - int f;  
398 399
399 trace("%s(%s)",__FUNCTION__,str); 400 trace("%s(%s)",__FUNCTION__,str);
400 401
src/include/networking.h
@@ -177,7 +177,7 @@ @@ -177,7 +177,7 @@
177 * @retval -EAGAIN Try again. 177 * @retval -EAGAIN Try again.
178 * 178 *
179 */ 179 */
180 - LIB3270_INTERNAL int lib3270_network_recv_failed(H3270 *hSession); 180 + LIB3270_INTERNAL int lib3270_socket_recv_failed(H3270 *hSession);
181 181
182 /** 182 /**
183 * @brief Translate system socket send error codes, show popup if needed. 183 * @brief Translate system socket send error codes, show popup if needed.
@@ -187,7 +187,9 @@ @@ -187,7 +187,9 @@
187 * @return Translated error code. 187 * @return Translated error code.
188 * 188 *
189 */ 189 */
190 - LIB3270_INTERNAL int lib3270_network_send_failed(H3270 *hSession); 190 + LIB3270_INTERNAL int lib3270_socket_send_failed(H3270 *hSession);
  191 +
  192 + LIB3270_INTERNAL int lib3270_socket_set_non_blocking(H3270 *hSession, int sock, const unsigned char on);
191 193
192 /** 194 /**
193 * @breif Select the network context from URL. 195 * @breif Select the network context from URL.
@@ -195,7 +197,8 @@ @@ -195,7 +197,8 @@
195 * @return Pointer to the hostname or NULL if failed (sets errno). 197 * @return Pointer to the hostname or NULL if failed (sets errno).
196 * 198 *
197 */ 199 */
198 - LIB3270_INTERNAL const char * lib3270_set_network_module_from_url(H3270 *hSession, const char *url); 200 + LIB3270_INTERNAL char * lib3270_set_network_module_from_url(H3270 *hSession, const char *url);
  201 +
199 202
200 /** 203 /**
201 * @brief Select the default (unsecure) network context. 204 * @brief Select the default (unsecure) network context.
@@ -205,6 +208,10 @@ @@ -205,6 +208,10 @@
205 */ 208 */
206 LIB3270_INTERNAL void lib3270_set_default_network_module(H3270 *hSession); 209 LIB3270_INTERNAL void lib3270_set_default_network_module(H3270 *hSession);
207 210
  211 +#ifdef HAVE_LIBSSL
  212 + LIB3270_INTERNAL void lib3270_set_libssl_network_module(H3270 *hSession);
  213 +#endif // HAVE_LIBSSL
  214 +
208 LIB3270_INTERNAL int lib3270_activate_ssl_network_module(H3270 *hSession, int sock); 215 LIB3270_INTERNAL int lib3270_activate_ssl_network_module(H3270 *hSession, int sock);
209 216
210 #endif // LIB3270_NETWORKING_H_INCLUDED 217 #endif // LIB3270_NETWORKING_H_INCLUDED
src/network_modules/default/main.c
@@ -33,7 +33,6 @@ @@ -33,7 +33,6 @@
33 */ 33 */
34 34
35 #include "private.h" 35 #include "private.h"
36 - #include <fcntl.h>  
37 36
38 static void unsecure_network_finalize(H3270 *hSession) { 37 static void unsecure_network_finalize(H3270 *hSession) {
39 38
@@ -70,7 +69,7 @@ @@ -70,7 +69,7 @@
70 if(bytes >= 0) 69 if(bytes >= 0)
71 return bytes; 70 return bytes;
72 71
73 - return lib3270_network_send_failed(hSession); 72 + return lib3270_socket_send_failed(hSession);
74 73
75 } 74 }
76 75
@@ -82,7 +81,7 @@ @@ -82,7 +81,7 @@
82 return bytes; 81 return bytes;
83 } 82 }
84 83
85 - return lib3270_network_recv_failed(hSession); 84 + return lib3270_socket_recv_failed(hSession);
86 85
87 } 86 }
88 87
@@ -95,62 +94,7 @@ static void * unsecure_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, v @@ -95,62 +94,7 @@ static void * unsecure_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, v
95 } 94 }
96 95
97 static int unsecure_network_non_blocking(H3270 *hSession, const unsigned char on) { 96 static int unsecure_network_non_blocking(H3270 *hSession, const unsigned char on) {
98 -  
99 - if(hSession->network.context->sock < 0)  
100 - return 0;  
101 -  
102 -#ifdef WIN32  
103 -  
104 - WSASetLastError(0);  
105 - u_long iMode= on ? 1 : 0;  
106 -  
107 - if(ioctlsocket(hSession->network.context->sock,FIONBIO,&iMode))  
108 - {  
109 - lib3270_popup_dialog( hSession,  
110 - LIB3270_NOTIFY_ERROR,  
111 - _( "Connection error" ),  
112 - _( "ioctlsocket(FIONBIO) failed." ),  
113 - "%s", lib3270_win32_strerror(GetLastError()));  
114 - return -1;  
115 - }  
116 -  
117 -#else  
118 -  
119 - int f;  
120 -  
121 - if ((f = fcntl(hSession->network.context->sock, F_GETFL, 0)) == -1)  
122 - {  
123 - lib3270_popup_dialog( hSession,  
124 - LIB3270_NOTIFY_ERROR,  
125 - _( "Socket error" ),  
126 - _( "fcntl() error when getting socket state." ),  
127 - _( "%s" ), strerror(errno)  
128 - );  
129 -  
130 - return -1;  
131 - }  
132 -  
133 - if (on)  
134 - f |= O_NDELAY;  
135 - else  
136 - f &= ~O_NDELAY;  
137 -  
138 - if (fcntl(hSession->network.context->sock, F_SETFL, f) < 0)  
139 - {  
140 - lib3270_popup_dialog( hSession,  
141 - LIB3270_NOTIFY_ERROR,  
142 - _( "Socket error" ),  
143 - on ? _( "Can't set socket to blocking mode." ) : _( "Can't set socket to non blocking mode" ),  
144 - _( "%s" ), strerror(errno)  
145 - );  
146 - return -1;  
147 - }  
148 -  
149 -#endif  
150 -  
151 - debug("Socket %d is now %s",hSession->network.context->sock,(on ? "Non Blocking" : "Blocking"));  
152 -  
153 - return 0; 97 + return lib3270_socket_set_non_blocking(hSession, hSession->network.context->sock, on);
154 } 98 }
155 99
156 static int unsecure_network_is_connected(const H3270 *hSession) { 100 static int unsecure_network_is_connected(const H3270 *hSession) {
src/network_modules/openssl/main.c
@@ -79,45 +79,102 @@ static int openssl_network_disconnect(H3270 *hSession) { @@ -79,45 +79,102 @@ static int openssl_network_disconnect(H3270 *hSession) {
79 79
80 ssize_t openssl_network_send(H3270 *hSession, const void *buffer, size_t length) { 80 ssize_t openssl_network_send(H3270 *hSession, const void *buffer, size_t length) {
81 81
82 -/*  
83 - if(hSession->network.context->sock < 0) {  
84 - return -(errno = ENOTCONN); 82 + int rc = SSL_write(hSession->network.context->con, (const char *) buffer, length);
  83 + if(rc > 0)
  84 + return rc;
  85 +
  86 + // https://www.openssl.org/docs/man1.0.2/man3/SSL_get_error.html
  87 + int ssl_error = SSL_get_error(hSession->network.context->con, rc);
  88 + switch(ssl_error) {
  89 + case SSL_ERROR_ZERO_RETURN:
  90 +
  91 + trace_ssl(hSession,"%s","The secure connection has been closed cleanly");
  92 +
  93 + lib3270_popup_dialog(
  94 + hSession,
  95 + LIB3270_NOTIFY_ERROR,
  96 + NULL,
  97 + _("Disconnected from host"),
  98 + "%s",
  99 + _("The secure connection has been closed cleanly.")
  100 + );
  101 + return 0;
  102 +
  103 + case SSL_ERROR_WANT_READ:
  104 + case SSL_ERROR_WANT_X509_LOOKUP:
  105 + return -EWOULDBLOCK; // Force a new loop.
  106 +
  107 + case SSL_ERROR_SYSCALL:
  108 + return lib3270_socket_send_failed(hSession);
  109 +
85 } 110 }
86 111
87 - ssize_t bytes = SSL_write(hSession->network.context->con, (const char *) buffer, length); 112 + // Build error message.
  113 + char err_buf[120];
  114 + (void) ERR_error_string(ssl_error, err_buf);
  115 + trace_dsn(hSession,"RCVD SSL_write error %d (%s)\n", ssl_error, err_buf);
88 116
89 - debug("%s bytes=%d",__FUNCTION__,(int) bytes); 117 + lib3270_autoptr(char) body = lib3270_strdup_printf(_("The SSL error message was %s"), err_buf);
90 118
91 - if(bytes >= 0)  
92 - return bytes; 119 + LIB3270_POPUP popup = {
  120 + .summary = _("Error writing to host"),
  121 + .body = body
  122 + };
93 123
94 - // SSL Write has failed, using SSL_get_error to identify what has happened.  
95 - int error = SSL_get_error(hSession->network.context->con,(int) bytes); 124 + lib3270_popup(hSession,&popup,0);
96 125
97 - if(error == SSL_ERROR_SYSCALL) { 126 + return -1;
98 127
99 - #error Use errno! 128 +}
100 129
101 - return -1; 130 +static ssize_t openssl_network_recv(H3270 *hSession, void *buf, size_t len) {
  131 +
  132 + int rc = SSL_read(hSession->network.context->con, (char *) buf, len);
  133 + if(rc > 0) {
  134 + return rc;
102 } 135 }
103 136
104 - // Not a system error, inspects the result. 137 + // https://www.openssl.org/docs/man1.0.2/man3/SSL_get_error.html
  138 + int ssl_error = SSL_get_error(hSession->network.context->con, rc);
  139 + switch(ssl_error) {
  140 + case SSL_ERROR_ZERO_RETURN:
105 141
  142 + trace_ssl(hSession,"%s","The secure connection has been closed cleanly");
106 143
  144 + lib3270_popup_dialog(
  145 + hSession,
  146 + LIB3270_NOTIFY_ERROR,
  147 + NULL,
  148 + _("Disconnected from host"),
  149 + "%s",
  150 + _("The secure connection has been closed cleanly.")
  151 + );
  152 + return 0;
107 153
108 - lib3270_popup(hSession,&popup,0); 154 + case SSL_ERROR_WANT_READ:
  155 + case SSL_ERROR_WANT_X509_LOOKUP:
  156 + return -EWOULDBLOCK; // Force a new loop.
109 157
110 - return -1;  
111 -*/ 158 + case SSL_ERROR_SYSCALL:
  159 + return lib3270_socket_recv_failed(hSession);
112 160
113 -} 161 + }
114 162
115 -static ssize_t openssl_network_recv(H3270 *hSession, void *buf, size_t len) { 163 + // Build error message.
  164 + char err_buf[120];
  165 + (void) ERR_error_string(ssl_error, err_buf);
  166 + trace_dsn(hSession,"RCVD SSL_read error %d (%s)\n", ssl_error, err_buf);
116 167
117 -// return SSL_read(hSession->network.context->con, (char *) buf, len); 168 + lib3270_autoptr(char) body = lib3270_strdup_printf(_("The SSL error message was %s"), err_buf);
118 169
  170 + LIB3270_POPUP popup = {
  171 + .summary = _("Error reading from host"),
  172 + .body = body
  173 + };
119 174
  175 + lib3270_popup(hSession,&popup,0);
120 176
  177 + return -1;
121 } 178 }
122 179
123 static int openssl_network_getsockname(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) { 180 static int openssl_network_getsockname(const H3270 *hSession, struct sockaddr *addr, socklen_t *addrlen) {
@@ -125,22 +182,23 @@ static int openssl_network_getsockname(const H3270 *hSession, struct sockaddr *a @@ -125,22 +182,23 @@ static int openssl_network_getsockname(const H3270 *hSession, struct sockaddr *a
125 } 182 }
126 183
127 static void * openssl_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) { 184 static void * openssl_network_add_poll(H3270 *hSession, LIB3270_IO_FLAG flag, void(*call)(H3270 *, int, LIB3270_IO_FLAG, void *), void *userdata) {
128 - 185 + return lib3270_add_poll_fd(hSession,hSession->network.context->sock,flag,call,userdata);
129 } 186 }
130 187
131 static int openssl_network_non_blocking(H3270 *hSession, const unsigned char on) { 188 static int openssl_network_non_blocking(H3270 *hSession, const unsigned char on) {
132 - 189 + return lib3270_socket_set_non_blocking(hSession, hSession->network.context->sock, on);
133 } 190 }
134 191
135 -static int openssl_network_is_connected(H3270 *hSession) {  
136 - 192 +static int openssl_network_is_connected(const H3270 *hSession) {
  193 + return hSession->network.context->sock > 0;
137 } 194 }
138 195
139 static int openssl_network_setsockopt(H3270 *hSession, int level, int optname, const void *optval, size_t optlen) { 196 static int openssl_network_setsockopt(H3270 *hSession, int level, int optname, const void *optval, size_t optlen) {
140 - 197 + return setsockopt(hSession->network.context->sock, level, optname, optval, optlen);
141 } 198 }
142 199
143 static int openssl_network_getsockopt(H3270 *hSession, int level, int optname, void *optval, socklen_t *optlen) { 200 static int openssl_network_getsockopt(H3270 *hSession, int level, int optname, void *optval, socklen_t *optlen) {
  201 + return getsockopt(hSession->network.context->sock, level, optname, optval, optlen);
144 } 202 }
145 203
146 static int openssl_network_init(H3270 *hSession) { 204 static int openssl_network_init(H3270 *hSession) {
@@ -151,8 +209,6 @@ static int openssl_network_init(H3270 *hSession) { @@ -151,8 +209,6 @@ static int openssl_network_init(H3270 *hSession) {
151 if(!ctx_context) 209 if(!ctx_context)
152 return -1; 210 return -1;
153 211
154 - LIB3270_NET_CONTEXT * context = hSession->network.context;  
155 -  
156 return 0; 212 return 0;
157 } 213 }
158 214
@@ -202,11 +258,13 @@ static int openssl_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *state @@ -202,11 +258,13 @@ static int openssl_network_connect(H3270 *hSession, LIB3270_NETWORK_STATE *state
202 hSession->ssl.host = 1; 258 hSession->ssl.host = 1;
203 context->sock = lib3270_network_connect(hSession, state); 259 context->sock = lib3270_network_connect(hSession, state);
204 260
  261 + debug("%s: sock=%d",__FUNCTION__,context->sock);
  262 +
205 return (context->sock < 0 ? -1 : 0); 263 return (context->sock < 0 ? -1 : 0);
206 264
207 } 265 }
208 266
209 -void lib3270_set_openssl_network_module(H3270 *hSession) { 267 +void lib3270_set_libssl_network_module(H3270 *hSession) {
210 268
211 static const LIB3270_NET_MODULE module = { 269 static const LIB3270_NET_MODULE module = {
212 .name = "tn3270s", 270 .name = "tn3270s",
@@ -244,7 +302,7 @@ void lib3270_set_openssl_network_module(H3270 *hSession) { @@ -244,7 +302,7 @@ void lib3270_set_openssl_network_module(H3270 *hSession) {
244 302
245 int lib3270_activate_ssl_network_module(H3270 *hSession, int sock) { 303 int lib3270_activate_ssl_network_module(H3270 *hSession, int sock) {
246 304
247 - lib3270_set_openssl_network_module(hSession); 305 + lib3270_set_libssl_network_module(hSession);
248 306
249 int rc = openssl_network_init(hSession); 307 int rc = openssl_network_init(hSession);
250 308
@@ -261,3 +319,5 @@ void lib3270_openssl_crl_free(LIB3270_NET_CONTEXT *context) { @@ -261,3 +319,5 @@ void lib3270_openssl_crl_free(LIB3270_NET_CONTEXT *context) {
261 } 319 }
262 } 320 }
263 321
  322 +
  323 +
src/network_modules/select.c
@@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin 18 * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
19 * St, Fifth Floor, Boston, MA 02110-1301 USA 19 * St, Fifth Floor, Boston, MA 02110-1301 USA
20 * 20 *
21 - * Este programa está nomeado como unsecure.c e possui - linhas de código. 21 + * Este programa está nomeado como - e possui - linhas de código.
22 * 22 *
23 * Contatos: 23 * Contatos:
24 * 24 *
@@ -41,14 +41,24 @@ @@ -41,14 +41,24 @@
41 41
42 /*--[ Implement ]------------------------------------------------------------------------------------*/ 42 /*--[ Implement ]------------------------------------------------------------------------------------*/
43 43
44 - const char * lib3270_set_network_module_from_url(H3270 *hSession, const char *url) { 44 + char * lib3270_set_network_module_from_url(H3270 *hSession, const char *url) {
45 45
46 static const struct { 46 static const struct {
47 const char *scheme; ///< @brief URL scheme for module. 47 const char *scheme; ///< @brief URL scheme for module.
48 void (*activate)(H3270 *hSession); ///< @brief Selection method. 48 void (*activate)(H3270 *hSession); ///< @brief Selection method.
49 } modules[] = { 49 } modules[] = {
50 50
51 - { "tn3270://", lib3270_set_default_network_module }, 51 + { "tn3270://", lib3270_set_default_network_module },
  52 +
  53 +#ifdef HAVE_LIBSSL
  54 +
  55 + { "tn3270s://", lib3270_set_libssl_network_module },
  56 +
  57 + // Compatibility schemes.
  58 + { "L://", lib3270_set_libssl_network_module },
  59 + { "L:", lib3270_set_libssl_network_module },
  60 +
  61 +#endif // HAVE_LIBSSL
52 62
53 }; 63 };
54 64
src/network_modules/tools.c 0 → 100644
@@ -0,0 +1,214 @@ @@ -0,0 +1,214 @@
  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.
  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 ', 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 unsecure.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 de Mendonça)
  27 + *
  28 + */
  29 +
  30 + /**
  31 + * @brief Common methods for send/recv errors.
  32 + *
  33 + */
  34 +
  35 + #include <config.h>
  36 + #include <lib3270.h>
  37 + #include <lib3270/log.h>
  38 + #include <internals.h>
  39 + #include <networking.h>
  40 + #include <fcntl.h>
  41 +
  42 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  43 +
  44 + int lib3270_socket_recv_failed(H3270 *hSession) {
  45 +
  46 +#ifdef _WIN32
  47 +
  48 + int wsaError = WSAGetLastError();
  49 +
  50 + // EWOULDBLOCK & EAGAIN should return directly.
  51 + if(wsaError == WSAEWOULDBLOCK)
  52 + return -EWOULDBLOCK;
  53 +
  54 + if(wsaError == WSAEINPROGRESS)
  55 + return -EAGAIN;
  56 +
  57 + int rc = -wsaError;
  58 +
  59 + LIB3270_POPUP popup = {
  60 + .name = "RecvFailed",
  61 + .type = LIB3270_NOTIFY_ERROR,
  62 + .summary = _("Error receiving data from host"),
  63 + }
  64 +
  65 + // TODO: Translate WSA Error, update message body.
  66 +
  67 + lib3270_popup(hSession,&popup,0);
  68 +
  69 +#else
  70 +
  71 + // EWOULDBLOCK & EAGAIN should return directly.
  72 + if(errno == EWOULDBLOCK || errno == EAGAIN)
  73 + return -errno;
  74 +
  75 + // Network error, notify user
  76 + int rc = -errno;
  77 +
  78 + lib3270_autoptr(char) body = lib3270_strdup_printf(
  79 + _("The system error code was %d (%s)"),
  80 + errno,
  81 + strerror(errno)
  82 + );
  83 +
  84 + LIB3270_POPUP popup = {
  85 + .name = "RecvFailed",
  86 + .type = LIB3270_NOTIFY_ERROR,
  87 + .summary = _("Error receiving data from host"),
  88 + .body = body
  89 + };
  90 +
  91 + lib3270_popup(hSession,&popup,0);
  92 +
  93 +#endif // _WIN32
  94 +
  95 + return rc;
  96 +
  97 + }
  98 +
  99 + int lib3270_socket_send_failed(H3270 *hSession) {
  100 +
  101 + #ifdef _WIN32
  102 +
  103 + int rc = WSAGetLastError();
  104 +
  105 + #error Have work to do.
  106 +
  107 + #else
  108 +
  109 + int rc = errno;
  110 +
  111 + switch(rc) {
  112 + case EPIPE:
  113 + lib3270_popup_dialog(
  114 + hSession,
  115 + LIB3270_NOTIFY_ERROR,
  116 + NULL,
  117 + _("Broken pipe"),
  118 + _("The system error code was %d"),
  119 + rc
  120 + );
  121 + break;
  122 +
  123 + case ECONNRESET:
  124 + lib3270_popup_dialog(
  125 + hSession,
  126 + LIB3270_NOTIFY_ERROR,
  127 + NULL,
  128 + _("Connection reset by peer"),
  129 + _("The system error code was %d"),
  130 + rc
  131 + );
  132 + break;
  133 +
  134 + case EINTR:
  135 + return 0;
  136 +
  137 + default:
  138 + lib3270_popup_dialog(
  139 + hSession,
  140 + LIB3270_NOTIFY_ERROR,
  141 + NULL,
  142 + _("Unexpected error writing to network socket"),
  143 + _("The system error code was %d (%s)"),
  144 + rc, strerror(rc)
  145 + );
  146 +
  147 + }
  148 +
  149 +
  150 + #endif // _WIN32
  151 +
  152 + return -1;
  153 +
  154 + }
  155 +
  156 +int lib3270_socket_set_non_blocking(H3270 *hSession, int sock, const unsigned char on) {
  157 +
  158 + if(sock < 0)
  159 + return 0;
  160 +
  161 +#ifdef WIN32
  162 +
  163 + WSASetLastError(0);
  164 + u_long iMode= on ? 1 : 0;
  165 +
  166 + if(ioctlsocket(sock,FIONBIO,&iMode))
  167 + {
  168 + lib3270_popup_dialog( hSession,
  169 + LIB3270_NOTIFY_ERROR,
  170 + _( "Connection error" ),
  171 + _( "ioctlsocket(FIONBIO) failed." ),
  172 + "%s", lib3270_win32_strerror(GetLastError()));
  173 + return -1;
  174 + }
  175 +
  176 +#else
  177 +
  178 + int f;
  179 +
  180 + if ((f = fcntl(sock, F_GETFL, 0)) == -1)
  181 + {
  182 + lib3270_popup_dialog( hSession,
  183 + LIB3270_NOTIFY_ERROR,
  184 + _( "Socket error" ),
  185 + _( "fcntl() error when getting socket state." ),
  186 + _( "%s" ), strerror(errno)
  187 + );
  188 +
  189 + return -1;
  190 + }
  191 +
  192 + if (on)
  193 + f |= O_NDELAY;
  194 + else
  195 + f &= ~O_NDELAY;
  196 +
  197 + if (fcntl(sock, F_SETFL, f) < 0)
  198 + {
  199 + lib3270_popup_dialog( hSession,
  200 + LIB3270_NOTIFY_ERROR,
  201 + _( "Socket error" ),
  202 + on ? _( "Can't set socket to blocking mode." ) : _( "Can't set socket to non blocking mode" ),
  203 + _( "%s" ), strerror(errno)
  204 + );
  205 + return -1;
  206 + }
  207 +
  208 +#endif
  209 +
  210 + debug("Socket %d is now %s",sock,(on ? "Non Blocking" : "Blocking"));
  211 +
  212 + return 0;
  213 +
  214 +}
src/network_modules/translate.c
@@ -1,151 +0,0 @@ @@ -1,151 +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.  
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 ', 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 unsecure.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 de Mendonça)  
27 - *  
28 - */  
29 -  
30 - /**  
31 - * @brief Common methods for send/recv errors.  
32 - *  
33 - */  
34 -  
35 - #include <config.h>  
36 - #include <lib3270.h>  
37 - #include <lib3270/log.h>  
38 - #include <internals.h>  
39 - #include <networking.h>  
40 -  
41 -/*--[ Implement ]------------------------------------------------------------------------------------*/  
42 -  
43 - int lib3270_network_recv_failed(H3270 *hSession) {  
44 -  
45 -#ifdef _WIN32  
46 -  
47 - int wsaError = WSAGetLastError();  
48 -  
49 - // EWOULDBLOCK & EAGAIN should return directly.  
50 - if(wsaError == WSAEWOULDBLOCK)  
51 - return -EWOULDBLOCK;  
52 -  
53 - if(wsaError == WSAEINPROGRESS)  
54 - return -EAGAIN;  
55 -  
56 - int rc = -wsaError;  
57 -  
58 - LIB3270_POPUP popup = {  
59 - .name = "RecvFailed",  
60 - .type = LIB3270_NOTIFY_ERROR,  
61 - .summary = _("Error receiving data from host"),  
62 - }  
63 -  
64 - // TODO: Translate WSA Error, update message body.  
65 -  
66 - lib3270_popup(hSession,&popup,0);  
67 -  
68 -#else  
69 -  
70 - // EWOULDBLOCK & EAGAIN should return directly.  
71 - if(errno == EWOULDBLOCK || errno == EAGAIN)  
72 - return -errno;  
73 -  
74 - // Network error, notify user  
75 - int rc = -errno;  
76 -  
77 - lib3270_autoptr(char) body = lib3270_strdup_printf(  
78 - _("The system error code was %d (%s)"),  
79 - errno,  
80 - strerror(errno)  
81 - );  
82 -  
83 - LIB3270_POPUP popup = {  
84 - .name = "RecvFailed",  
85 - .type = LIB3270_NOTIFY_ERROR,  
86 - .summary = _("Error receiving data from host"),  
87 - .body = body  
88 - };  
89 -  
90 - lib3270_popup(hSession,&popup,0);  
91 -  
92 -#endif // _WIN32  
93 -  
94 - return rc;  
95 -  
96 - }  
97 -  
98 - int lib3270_network_send_failed(H3270 *hSession) {  
99 -  
100 - #ifdef _WIN32  
101 -  
102 - int rc = WSAGetLastError();  
103 -  
104 - #error Have work to do.  
105 -  
106 - #else  
107 -  
108 - int rc = errno;  
109 -  
110 - switch(rc) {  
111 - case EPIPE:  
112 - lib3270_popup_dialog(  
113 - hSession,  
114 - LIB3270_NOTIFY_ERROR,  
115 - NULL,  
116 - _("Broken pipe"),  
117 - _("The system error code was %d"),  
118 - rc  
119 - );  
120 - break;  
121 -  
122 - case ECONNRESET:  
123 - lib3270_popup_dialog(  
124 - hSession,  
125 - LIB3270_NOTIFY_ERROR,  
126 - NULL,  
127 - _("Connection reset by peer"),  
128 - _("The system error code was %d"),  
129 - rc  
130 - );  
131 - break;  
132 -  
133 - case EINTR:  
134 - return 0;  
135 -  
136 - default:  
137 - lib3270_popup_dialog(  
138 - hSession,  
139 - LIB3270_NOTIFY_ERROR,  
140 - NULL,  
141 - _("Unexpected error writing to network socket"),  
142 - _("The system error code was %d (%s)"),  
143 - rc, strerror(rc)  
144 - );  
145 -  
146 - }  
147 -  
148 -  
149 - #endif // _WIN32  
150 -  
151 - }