Commit 5fe43403f68d186369618d1a88d6339b79b8f66d
1 parent
62771f9d
Exists in
master
and in
3 other branches
Incluindo mecanismo que permita a jni android substituir todo o I/O de rede por funções próprias
Showing
3 changed files
with
76 additions
and
113 deletions
Show diff stats
globals.h
... | ... | @@ -352,5 +352,6 @@ LIB3270_INTERNAL int cursor_move(H3270 *session, int baddr); |
352 | 352 | // LIB3270_INTERNAL void add_input_calls(H3270 *, void (*)(H3270 *), void (*)(H3270 *)); |
353 | 353 | |
354 | 354 | LIB3270_INTERNAL void toggle_rectselect(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt); |
355 | - | |
356 | 355 | LIB3270_INTERNAL void remove_input_calls(H3270 *session); |
356 | + | |
357 | +LIB3270_INTERNAL int lib3270_send(H3270 *hSession, unsigned const char *buf, int len); | ... | ... |
session.c
... | ... | @@ -167,6 +167,7 @@ static void lib3270_session_init(H3270 *hSession, const char *model) |
167 | 167 | hSession->sz = sizeof(H3270); |
168 | 168 | |
169 | 169 | // Default calls |
170 | + hSession->write = lib3270_send; | |
170 | 171 | hSession->update = update_char; |
171 | 172 | hSession->update_model = update_model; |
172 | 173 | hSession->update_cursor = update_cursor; | ... | ... |
telnet.c
... | ... | @@ -102,6 +102,8 @@ |
102 | 102 | #include "xioc.h" |
103 | 103 | #include "screen.h" |
104 | 104 | |
105 | +#include <lib3270/internals.h> | |
106 | + | |
105 | 107 | #if !defined(TELOPT_NAWS) /*[*/ |
106 | 108 | #define TELOPT_NAWS 31 |
107 | 109 | #endif /*]*/ |
... | ... | @@ -519,8 +521,8 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo |
519 | 521 | sockstart(session); |
520 | 522 | #endif |
521 | 523 | |
522 | - if (session->netrbuf == (unsigned char *)NULL) | |
523 | - session->netrbuf = (unsigned char *)lib3270_malloc(BUFSZ); | |
524 | +// if (session->netrbuf == (unsigned char *)NULL) | |
525 | +// session->netrbuf = (unsigned char *)lib3270_malloc(BUFSZ); | |
524 | 526 | |
525 | 527 | #if defined(X3270_ANSI) /*[*/ |
526 | 528 | if (!t_valid) |
... | ... | @@ -965,7 +967,6 @@ void net_disconnect(H3270 *session) |
965 | 967 | |
966 | 968 | } |
967 | 969 | |
968 | - | |
969 | 970 | LIB3270_EXPORT void lib3270_data_recv(H3270 *hSession, size_t nr, const unsigned char *netrbuf) |
970 | 971 | { |
971 | 972 | register const unsigned char * cp; |
... | ... | @@ -1989,131 +1990,91 @@ void net_exception(H3270 *session) |
1989 | 1990 | * |
1990 | 1991 | */ |
1991 | 1992 | |
1992 | - | |
1993 | -/* | |
1994 | - * net_rawout | |
1995 | - * Send out raw telnet data. We assume that there will always be enough | |
1996 | - * space to buffer what we want to transmit, so we don't handle EAGAIN or | |
1997 | - * EWOULDBLOCK. | |
1998 | - */ | |
1999 | -static void | |
2000 | -net_rawout(H3270 *session, unsigned const char *buf, int len) | |
1993 | +LIB3270_INTERNAL int lib3270_send(H3270 *hSession, unsigned const char *buf, int len) | |
2001 | 1994 | { |
2002 | - int nw; | |
1995 | + int rc; | |
2003 | 1996 | |
2004 | - trace_netdata('>', buf, len); | |
1997 | +#if defined(HAVE_LIBSSL) | |
1998 | + if(hSession->ssl_con != NULL) | |
1999 | + rc = SSL_write(hSession->ssl_con, (const char *) buf, len); | |
2000 | + else | |
2001 | + rc = send(hSession->sock, (const char *) buf, len, 0); | |
2002 | +#else | |
2003 | + rc = send(hSession->sock, (const char *) buf, len, 0); | |
2004 | +#endif // HAVE_LIBSSL | |
2005 | 2005 | |
2006 | - while (len) { | |
2007 | -#if defined(OMTU) /*[*/ | |
2008 | - int n2w = len; | |
2009 | - int pause = 0; | |
2006 | + if(rc > 0) | |
2007 | + return rc; | |
2010 | 2008 | |
2011 | - if (n2w > OMTU) { | |
2012 | - n2w = OMTU; | |
2013 | - pause = 1; | |
2014 | - } | |
2015 | -#else | |
2016 | -# define n2w len | |
2017 | -#endif | |
2018 | -#if defined(HAVE_LIBSSL) /*[*/ | |
2019 | - if(session->ssl_con != NULL) | |
2020 | - nw = SSL_write(session->ssl_con, (const char *) buf, n2w); | |
2021 | - else | |
2022 | -#endif /*]*/ | |
2009 | + // Recv error, notify | |
2023 | 2010 | |
2024 | -/* | |
2025 | -#if defined(LOCAL_PROCESS) | |
2026 | - if (local_process) | |
2027 | - nw = write(sock, (const char *) buf, n2w); | |
2028 | - else | |
2029 | -#endif | |
2030 | -*/ | |
2031 | - nw = send(session->sock, (const char *) buf, n2w, 0); | |
2032 | - if (nw < 0) { | |
2033 | -#if defined(HAVE_LIBSSL) /*[*/ | |
2034 | - if (session->ssl_con != NULL) | |
2035 | - { | |
2036 | - unsigned long e; | |
2037 | - char err_buf[120]; | |
2011 | +#if defined(HAVE_LIBSSL) | |
2012 | + if(hSession->ssl_con != NULL) | |
2013 | + { | |
2014 | + unsigned long e; | |
2015 | + char err_buf[120]; | |
2038 | 2016 | |
2039 | - e = ERR_get_error(); | |
2040 | - (void) ERR_error_string(e, err_buf); | |
2041 | - trace_dsn("RCVD SSL_write error %ld (%s)\n", e,err_buf); | |
2042 | - popup_an_error(NULL,"SSL_write:\n%s", err_buf); | |
2043 | - host_disconnect(session,False); | |
2044 | - return; | |
2045 | - } | |
2046 | -#endif /*]*/ | |
2047 | - trace_dsn("RCVD socket error %d\n", errno); | |
2048 | - if (socket_errno() == SE_EPIPE || socket_errno() == SE_ECONNRESET) { | |
2049 | - host_disconnect(session,False); | |
2050 | - return; | |
2051 | - } else if (socket_errno() == SE_EINTR) { | |
2052 | - goto bot; | |
2053 | - } else { | |
2054 | - popup_a_sockerr(NULL, N_( "Socket write error" ) ); | |
2055 | - host_disconnect(session,True); | |
2056 | - return; | |
2057 | - } | |
2058 | - } | |
2059 | - session->ns_bsent += nw; | |
2060 | - len -= nw; | |
2061 | - buf += nw; | |
2062 | - bot: | |
2063 | -#if defined(OMTU) | |
2064 | - if (pause) | |
2065 | - sleep(1); | |
2066 | -#endif | |
2067 | - ; | |
2017 | + e = ERR_get_error(); | |
2018 | + (void) ERR_error_string(e, err_buf); | |
2019 | + trace_dsn("RCVD SSL_write error %ld (%s)\n", e,err_buf); | |
2020 | + popup_an_error(hSession,_( "SSL_write:\n%s" ), err_buf); | |
2021 | + return -1; | |
2068 | 2022 | } |
2069 | -} | |
2023 | +#endif // HAVE_LIBSSL | |
2070 | 2024 | |
2071 | - | |
2072 | -#if defined(X3270_ANSI) /*[*/ | |
2073 | -/* | |
2074 | - * net_hexansi_out | |
2075 | - * Send uncontrolled user data to the host in ANSI mode, performing IAC | |
2076 | - * and CR quoting as necessary. | |
2077 | - */ /* | |
2078 | -void | |
2079 | -net_hexansi_out(unsigned char *buf, int len) | |
2080 | -{ | |
2081 | - unsigned char *tbuf; | |
2082 | - unsigned char *xbuf; | |
2025 | + trace_dsn("RCVD socket error %d\n", socket_errno()); | |
2083 | 2026 | |
2084 | - if (!len) | |
2085 | - return; | |
2027 | + switch(socket_errno()) | |
2028 | + { | |
2029 | + case SE_EPIPE: | |
2030 | + popup_an_error(hSession, "%s", N_( "Broken pipe" )); | |
2031 | + break; | |
2086 | 2032 | |
2087 | -#if defined(X3270_TRACE) | |
2088 | - // Trace the data. | |
2089 | - if (lib3270_get_toggle(&h3270,LIB3270_TOGGLE_DS_TRACE)) { | |
2090 | - int i; | |
2033 | + case SE_ECONNRESET: | |
2034 | + popup_an_error(hSession, "%s", N_( "Connection reset by peer" )); | |
2035 | + break; | |
2091 | 2036 | |
2092 | - trace_dsn(">"); | |
2093 | - for (i = 0; i < len; i++) | |
2094 | - trace_dsn(" %s", ctl_see((int) *(buf+i))); | |
2095 | - trace_dsn("\n"); | |
2096 | - } | |
2097 | -#endif | |
2037 | + case SE_EINTR: | |
2038 | + return 0; | |
2098 | 2039 | |
2099 | - // Expand it | |
2100 | - tbuf = xbuf = (unsigned char *)lib3270_malloc(2*len); | |
2101 | - while (len) { | |
2102 | - unsigned char c = *buf++; | |
2040 | + default: | |
2041 | + popup_a_sockerr(NULL, "%s", N_( "Socket write error" ) ); | |
2103 | 2042 | |
2104 | - *tbuf++ = c; | |
2105 | - len--; | |
2106 | - if (c == IAC) | |
2107 | - *tbuf++ = IAC; | |
2108 | - else if (c == '\r' && (!len || *buf != '\n')) | |
2109 | - *tbuf++ = '\0'; | |
2110 | 2043 | } |
2111 | 2044 | |
2112 | - // Send it to the host | |
2113 | - net_rawout(&h3270,xbuf, tbuf - xbuf); | |
2114 | - lib3270_free(xbuf); | |
2045 | + return -1; | |
2115 | 2046 | } |
2116 | -*/ | |
2047 | + | |
2048 | +/* | |
2049 | + * net_rawout | |
2050 | + * Send out raw telnet data. We assume that there will always be enough | |
2051 | + * space to buffer what we want to transmit, so we don't handle EAGAIN or | |
2052 | + * EWOULDBLOCK. | |
2053 | + */ | |
2054 | +static void net_rawout(H3270 *hSession, unsigned const char *buf, int len) | |
2055 | +{ | |
2056 | + trace_netdata('>', buf, len); | |
2057 | + | |
2058 | + while (len) | |
2059 | + { | |
2060 | + int nw = hSession->write(hSession,buf,len); | |
2061 | + | |
2062 | + if (nw > 0) | |
2063 | + { | |
2064 | + // Data received | |
2065 | + hSession->ns_bsent += nw; | |
2066 | + len -= nw; | |
2067 | + buf += nw; | |
2068 | + } | |
2069 | + else if(nw < 0) | |
2070 | + { | |
2071 | + host_disconnect(hSession,True); | |
2072 | + return; | |
2073 | + } | |
2074 | + } | |
2075 | +} | |
2076 | + | |
2077 | +#if defined(X3270_ANSI) | |
2117 | 2078 | |
2118 | 2079 | /* |
2119 | 2080 | * net_cookedout | ... | ... |