Commit 64d1f0f80c78651a966ab301e29435b118b58bff
1 parent
71d02eec
Exists in
master
and in
3 other branches
Adding status "resolving", reorganizing auto-reconnect methods to avoid
"popup hangs".
Showing
11 changed files
with
168 additions
and
149 deletions
Show diff stats
lib3270.cbp
| @@ -127,6 +127,9 @@ | @@ -127,6 +127,9 @@ | ||
| 127 | <Unit filename="src/lib3270/charset.c"> | 127 | <Unit filename="src/lib3270/charset.c"> |
| 128 | <Option compilerVar="CC" /> | 128 | <Option compilerVar="CC" /> |
| 129 | </Unit> | 129 | </Unit> |
| 130 | + <Unit filename="src/lib3270/connect.c"> | ||
| 131 | + <Option compilerVar="CC" /> | ||
| 132 | + </Unit> | ||
| 130 | <Unit filename="src/lib3270/ctlr.c"> | 133 | <Unit filename="src/lib3270/ctlr.c"> |
| 131 | <Option compilerVar="CC" /> | 134 | <Option compilerVar="CC" /> |
| 132 | </Unit> | 135 | </Unit> |
src/include/lib3270.h
| @@ -381,7 +381,8 @@ | @@ -381,7 +381,8 @@ | ||
| 381 | */ | 381 | */ |
| 382 | typedef enum _lib3270_state | 382 | typedef enum _lib3270_state |
| 383 | { | 383 | { |
| 384 | - LIB3270_STATE_RESOLVING, | 384 | + LIB3270_STATE_RESOLVING, ///< @brief Resolving DNS. |
| 385 | + LIB3270_STATE_CONNECTING, ///< @brief Connecting to host. | ||
| 385 | LIB3270_STATE_HALF_CONNECT, | 386 | LIB3270_STATE_HALF_CONNECT, |
| 386 | LIB3270_STATE_CONNECT, | 387 | LIB3270_STATE_CONNECT, |
| 387 | LIB3270_STATE_3270_MODE, | 388 | LIB3270_STATE_3270_MODE, |
src/include/screen.h
| @@ -18,5 +18,6 @@ | @@ -18,5 +18,6 @@ | ||
| 18 | LIB3270_INTERNAL int *char_width, *char_height; | 18 | LIB3270_INTERNAL int *char_width, *char_height; |
| 19 | 19 | ||
| 20 | LIB3270_INTERNAL void screen_update(H3270 *session, int bstart, int bend); | 20 | LIB3270_INTERNAL void screen_update(H3270 *session, int bstart, int bend); |
| 21 | -LIB3270_INTERNAL void status_connecting(H3270 *session, Boolean on); | 21 | +LIB3270_INTERNAL void status_connecting(H3270 *session); |
| 22 | +LIB3270_INTERNAL void status_resolving(H3270 *session); | ||
| 22 | 23 |
src/include/telnetc.h
| 1 | /* | 1 | /* |
| 2 | - * Copyright 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, | ||
| 3 | - * 2007 by Paul Mattes. | ||
| 4 | - * RPQNAMES modifications Copyright 2004 by Don Russell. | ||
| 5 | - * Permission to use, copy, modify, and distribute this software and its | ||
| 6 | - * documentation for any purpose and without fee is hereby granted, | ||
| 7 | - * provided that the above copyright notice appear in all copies and that | ||
| 8 | - * both that copyright notice and this permission notice appear in | ||
| 9 | - * supporting documentation. | ||
| 10 | - * | ||
| 11 | - * x3270, c3270, s3270 and tcl3270 are distributed in the hope that they will | ||
| 12 | - * be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the file LICENSE | ||
| 14 | - * for more details. | 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 GNU, 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 - 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 Mendonça) | ||
| 27 | + * | ||
| 15 | */ | 28 | */ |
| 16 | 29 | ||
| 17 | -/* | ||
| 18 | - * telnetc.h | ||
| 19 | - * Global declarations for telnet.c. | 30 | +/** |
| 31 | + * @brief Global declarations for telnet.c. | ||
| 20 | */ | 32 | */ |
| 21 | 33 | ||
| 22 | -/* Output buffer. */ | ||
| 23 | -// extern unsigned char *obuf; | ||
| 24 | -// extern unsigned char *obptr; | ||
| 25 | - | ||
| 26 | /* Spelled-out tty control character. */ | 34 | /* Spelled-out tty control character. */ |
| 27 | struct ctl_char { | 35 | struct ctl_char { |
| 28 | const char *name; | 36 | const char *name; |
| @@ -32,7 +40,10 @@ struct ctl_char { | @@ -32,7 +40,10 @@ struct ctl_char { | ||
| 32 | LIB3270_INTERNAL void net_abort(H3270 *hSession); | 40 | LIB3270_INTERNAL void net_abort(H3270 *hSession); |
| 33 | LIB3270_INTERNAL void net_add_eor(unsigned char *buf, int len); | 41 | LIB3270_INTERNAL void net_add_eor(unsigned char *buf, int len); |
| 34 | LIB3270_INTERNAL void net_break(H3270 *hSession); | 42 | LIB3270_INTERNAL void net_break(H3270 *hSession); |
| 43 | + | ||
| 35 | LIB3270_INTERNAL int net_connect(H3270 *session, const char *, char *, Boolean, Boolean *, Boolean *); | 44 | LIB3270_INTERNAL int net_connect(H3270 *session, const char *, char *, Boolean, Boolean *, Boolean *); |
| 45 | +LIB3270_INTERNAL int net_reconnect(H3270 *hSession, int seconds); | ||
| 46 | + | ||
| 36 | LIB3270_INTERNAL void net_disconnect(H3270 *session); | 47 | LIB3270_INTERNAL void net_disconnect(H3270 *session); |
| 37 | LIB3270_INTERNAL void net_exception(H3270 *session, int fd, LIB3270_IO_FLAG flag, void *dunno); | 48 | LIB3270_INTERNAL void net_exception(H3270 *session, int fd, LIB3270_IO_FLAG flag, void *dunno); |
| 38 | LIB3270_INTERNAL void net_input(H3270 *session, int fd, LIB3270_IO_FLAG flag, void *dunno); | 49 | LIB3270_INTERNAL void net_input(H3270 *session, int fd, LIB3270_IO_FLAG flag, void *dunno); |
| @@ -51,5 +62,4 @@ LIB3270_INTERNAL void space3270out(H3270 *hSession, int n); | @@ -51,5 +62,4 @@ LIB3270_INTERNAL void space3270out(H3270 *hSession, int n); | ||
| 51 | #define trace_netdata(direction, buf, len) /* */ | 62 | #define trace_netdata(direction, buf, len) /* */ |
| 52 | #endif // X3270_TRACE | 63 | #endif // X3270_TRACE |
| 53 | 64 | ||
| 54 | - | ||
| 55 | LIB3270_INTERNAL int net_getsockname(const H3270 *h3270, void *buf, int *len); | 65 | LIB3270_INTERNAL int net_getsockname(const H3270 *h3270, void *buf, int *len); |
| @@ -0,0 +1,95 @@ | @@ -0,0 +1,95 @@ | ||
| 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 GNU, 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 - 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 Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | +#include <config.h> | ||
| 31 | +#include "private.h" | ||
| 32 | +#include "telnetc.h" | ||
| 33 | +#include <errno.h> | ||
| 34 | +#include <lib3270/trace.h> | ||
| 35 | + | ||
| 36 | +/*---[ Implement ]-------------------------------------------------------------------------------*/ | ||
| 37 | + | ||
| 38 | + LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wait) | ||
| 39 | + { | ||
| 40 | + CHECK_SESSION_HANDLE(hSession); | ||
| 41 | + | ||
| 42 | + if(url && *url) | ||
| 43 | + { | ||
| 44 | + lib3270_set_url(hSession,url); | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + return lib3270_reconnect(hSession, wait); | ||
| 48 | + | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + int lib3270_reconnect(H3270 *hSession, int seconds) | ||
| 52 | + { | ||
| 53 | + FAIL_IF_ONLINE(hSession); | ||
| 54 | + | ||
| 55 | + // | ||
| 56 | + // Can't reconnect if already reconnecting *OR* there's an open popup | ||
| 57 | + // (to avoid open more than one connect error popup. | ||
| 58 | + // | ||
| 59 | + if(hSession->auto_reconnect_inprogress || hSession->popups) | ||
| 60 | + return errno = EAGAIN; | ||
| 61 | + | ||
| 62 | + if(hSession->sock > 0) | ||
| 63 | + return errno = EBUSY; | ||
| 64 | + | ||
| 65 | + if(!(hSession->host.current && hSession->host.srvc)) | ||
| 66 | + { | ||
| 67 | + // No host info, try the default one. | ||
| 68 | + if(lib3270_set_url(hSession,NULL)) | ||
| 69 | + { | ||
| 70 | + int err = errno; | ||
| 71 | + lib3270_trace_event(hSession,"Can't set default URL (%s)\n",strerror(err)); | ||
| 72 | + return errno = err; | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + if(!(hSession->host.current && hSession->host.srvc)) | ||
| 76 | + { | ||
| 77 | + return errno = EINVAL; | ||
| 78 | + } | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | +#if defined(HAVE_LIBSSL) | ||
| 82 | + set_ssl_state(hSession,LIB3270_SSL_UNSECURE); | ||
| 83 | +#endif // HAVE_LIBSSL | ||
| 84 | + | ||
| 85 | + snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); | ||
| 86 | + | ||
| 87 | + lib3270_trace_event(hSession,"Reconnecting to %s\n",lib3270_get_url(hSession)); | ||
| 88 | + | ||
| 89 | + hSession->ever_3270 = False; | ||
| 90 | + hSession->ssl.host = 0; | ||
| 91 | + | ||
| 92 | + return net_reconnect(hSession,seconds); | ||
| 93 | + | ||
| 94 | + } | ||
| 95 | + |
src/lib3270/host.c
| @@ -193,10 +193,10 @@ LIB3270_EXPORT void lib3270_register_schange(H3270 *h, LIB3270_STATE tx, void (* | @@ -193,10 +193,10 @@ LIB3270_EXPORT void lib3270_register_schange(H3270 *h, LIB3270_STATE tx, void (* | ||
| 193 | void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) | 193 | void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) |
| 194 | { | 194 | { |
| 195 | #if defined(DEBUG) | 195 | #if defined(DEBUG) |
| 196 | - | ||
| 197 | static const char * state_name[LIB3270_STATE_USER] = | 196 | static const char * state_name[LIB3270_STATE_USER] = |
| 198 | { | 197 | { |
| 199 | "LIB3270_STATE_RESOLVING", | 198 | "LIB3270_STATE_RESOLVING", |
| 199 | + "LIB3270_STATE_CONNECTING", | ||
| 200 | "LIB3270_STATE_HALF_CONNECT", | 200 | "LIB3270_STATE_HALF_CONNECT", |
| 201 | "LIB3270_STATE_CONNECT", | 201 | "LIB3270_STATE_CONNECT", |
| 202 | "LIB3270_STATE_3270_MODE", | 202 | "LIB3270_STATE_3270_MODE", |
| @@ -204,10 +204,8 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) | @@ -204,10 +204,8 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) | ||
| 204 | "LIB3270_STATE_REMODEL", | 204 | "LIB3270_STATE_REMODEL", |
| 205 | "LIB3270_STATE_PRINTER", | 205 | "LIB3270_STATE_PRINTER", |
| 206 | "LIB3270_STATE_EXITING", | 206 | "LIB3270_STATE_EXITING", |
| 207 | - "LIB3270_STATE_CHARSET", | ||
| 208 | - | 207 | + "LIB3270_STATE_CHARSET" |
| 209 | }; | 208 | }; |
| 210 | - | ||
| 211 | #endif // DEBUG | 209 | #endif // DEBUG |
| 212 | 210 | ||
| 213 | struct lib3270_state_callback *st; | 211 | struct lib3270_state_callback *st; |
| @@ -218,7 +216,6 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) | @@ -218,7 +216,6 @@ void lib3270_st_changed(H3270 *h, LIB3270_STATE tx, int mode) | ||
| 218 | 216 | ||
| 219 | for (st = h->st_callbacks[tx];st;st = st->next) | 217 | for (st = h->st_callbacks[tx];st;st = st->next) |
| 220 | { | 218 | { |
| 221 | -// trace("st=%p func=%p",st,st->func); | ||
| 222 | st->func(h,mode,st->data); | 219 | st->func(h,mode,st->data); |
| 223 | } | 220 | } |
| 224 | 221 |
src/lib3270/linux/connect.c
| @@ -48,10 +48,8 @@ | @@ -48,10 +48,8 @@ | ||
| 48 | 48 | ||
| 49 | #include <stdlib.h> | 49 | #include <stdlib.h> |
| 50 | 50 | ||
| 51 | -//#include "statusc.h" | ||
| 52 | #include "hostc.h" | 51 | #include "hostc.h" |
| 53 | #include "trace_dsc.h" | 52 | #include "trace_dsc.h" |
| 54 | -//#include "utilc.h" | ||
| 55 | #include "telnetc.h" | 53 | #include "telnetc.h" |
| 56 | #include "screen.h" | 54 | #include "screen.h" |
| 57 | 55 | ||
| @@ -117,19 +115,6 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -117,19 +115,6 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
| 117 | 115 | ||
| 118 | } | 116 | } |
| 119 | 117 | ||
| 120 | - LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wait) | ||
| 121 | - { | ||
| 122 | - CHECK_SESSION_HANDLE(hSession); | ||
| 123 | - | ||
| 124 | - if(url && *url) | ||
| 125 | - { | ||
| 126 | - lib3270_set_url(hSession,url); | ||
| 127 | - } | ||
| 128 | - | ||
| 129 | - return lib3270_reconnect(hSession, wait); | ||
| 130 | - | ||
| 131 | - } | ||
| 132 | - | ||
| 133 | struct resolver | 118 | struct resolver |
| 134 | { | 119 | { |
| 135 | const char * message; | 120 | const char * message; |
| @@ -147,6 +132,8 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -147,6 +132,8 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
| 147 | hints.ai_flags = AI_PASSIVE; // For wildcard IP address | 132 | hints.ai_flags = AI_PASSIVE; // For wildcard IP address |
| 148 | hints.ai_protocol = 0; // Any protocol | 133 | hints.ai_protocol = 0; // Any protocol |
| 149 | 134 | ||
| 135 | + status_resolving(hSession); | ||
| 136 | + | ||
| 150 | int rc = getaddrinfo(hSession->host.current, hSession->host.srvc, &hints, &result); | 137 | int rc = getaddrinfo(hSession->host.current, hSession->host.srvc, &hints, &result); |
| 151 | if(rc != 0) | 138 | if(rc != 0) |
| 152 | { | 139 | { |
| @@ -154,7 +141,7 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -154,7 +141,7 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
| 154 | return -1; | 141 | return -1; |
| 155 | } | 142 | } |
| 156 | 143 | ||
| 157 | - status_connecting(hSession,1); | 144 | + status_connecting(hSession); |
| 158 | 145 | ||
| 159 | for(rp = result; hSession->sock < 0 && rp != NULL; rp = rp->ai_next) | 146 | for(rp = result; hSession->sock < 0 && rp != NULL; rp = rp->ai_next) |
| 160 | { | 147 | { |
| @@ -181,50 +168,11 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -181,50 +168,11 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
| 181 | 168 | ||
| 182 | } | 169 | } |
| 183 | 170 | ||
| 184 | - int lib3270_reconnect(H3270 *hSession, int seconds) | 171 | + int net_reconnect(H3270 *hSession, int seconds) |
| 185 | { | 172 | { |
| 186 | - int optval; | ||
| 187 | struct resolver host; | 173 | struct resolver host; |
| 188 | - | ||
| 189 | - CHECK_SESSION_HANDLE(hSession); | ||
| 190 | memset(&host,0,sizeof(host)); | 174 | memset(&host,0,sizeof(host)); |
| 191 | 175 | ||
| 192 | - if(hSession->auto_reconnect_inprogress) | ||
| 193 | - return errno = EAGAIN; | ||
| 194 | - | ||
| 195 | - if(hSession->sock > 0) | ||
| 196 | - return errno = EBUSY; | ||
| 197 | - | ||
| 198 | - if(!(hSession->host.current && hSession->host.srvc)) | ||
| 199 | - { | ||
| 200 | - // No host info, try the default one. | ||
| 201 | - if(lib3270_set_url(hSession,NULL)) | ||
| 202 | - { | ||
| 203 | - int err = errno; | ||
| 204 | - lib3270_trace_event(hSession,"Can't set default URL (%s)\n",strerror(err)); | ||
| 205 | - return errno = err; | ||
| 206 | - } | ||
| 207 | - | ||
| 208 | - if(!(hSession->host.current && hSession->host.srvc)) | ||
| 209 | - { | ||
| 210 | - return errno = ENOENT; | ||
| 211 | - } | ||
| 212 | - } | ||
| 213 | - | ||
| 214 | -#if defined(HAVE_LIBSSL) | ||
| 215 | - set_ssl_state(hSession,LIB3270_SSL_UNSECURE); | ||
| 216 | -#endif // HAVE_LIBSSL | ||
| 217 | - | ||
| 218 | - snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); | ||
| 219 | - | ||
| 220 | - lib3270_trace_event(hSession,"Reconnecting to %s\n",lib3270_get_url(hSession)); | ||
| 221 | - | ||
| 222 | - hSession->ever_3270 = False; | ||
| 223 | - hSession->cstate = LIB3270_RESOLVING; | ||
| 224 | - | ||
| 225 | - lib3270_st_changed(hSession, LIB3270_STATE_RESOLVING, True); | ||
| 226 | - | ||
| 227 | - // s = getaddrinfo(hSession->host.current, hSession->host.srvc, &hints, &result); | ||
| 228 | if(lib3270_run_task(hSession, background_connect, &host) || hSession->sock < 0) | 176 | if(lib3270_run_task(hSession, background_connect, &host) || hSession->sock < 0) |
| 229 | { | 177 | { |
| 230 | char buffer[4096]; | 178 | char buffer[4096]; |
| @@ -245,10 +193,8 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -245,10 +193,8 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
| 245 | (void) fcntl(hSession->sock, F_SETFD, 1); | 193 | (void) fcntl(hSession->sock, F_SETFD, 1); |
| 246 | 194 | ||
| 247 | hSession->ever_3270 = False; | 195 | hSession->ever_3270 = False; |
| 248 | - hSession->ssl.host = 0; | ||
| 249 | 196 | ||
| 250 | #if defined(HAVE_LIBSSL) | 197 | #if defined(HAVE_LIBSSL) |
| 251 | - debug("** SSL init %s","begins"); | ||
| 252 | if(hSession->ssl.enabled) | 198 | if(hSession->ssl.enabled) |
| 253 | { | 199 | { |
| 254 | hSession->ssl.host = 1; | 200 | hSession->ssl.host = 1; |
| @@ -257,11 +203,10 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | @@ -257,11 +203,10 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u | ||
| 257 | return errno = ENOTCONN; | 203 | return errno = ENOTCONN; |
| 258 | 204 | ||
| 259 | } | 205 | } |
| 260 | - debug("** SSL init %s","ends"); | ||
| 261 | #endif // HAVE_LIBSSL | 206 | #endif // HAVE_LIBSSL |
| 262 | 207 | ||
| 263 | // set options for inline out-of-band data and keepalives | 208 | // set options for inline out-of-band data and keepalives |
| 264 | - optval = 1; | 209 | + int optval = 1; |
| 265 | if (setsockopt(hSession->sock, SOL_SOCKET, SO_OOBINLINE, (char *)&optval,sizeof(optval)) < 0) | 210 | if (setsockopt(hSession->sock, SOL_SOCKET, SO_OOBINLINE, (char *)&optval,sizeof(optval)) < 0) |
| 266 | { | 211 | { |
| 267 | int rc = errno; | 212 | int rc = errno; |
src/lib3270/screen.c
| @@ -556,10 +556,26 @@ void status_oerr(H3270 *session, int error_type) | @@ -556,10 +556,26 @@ void status_oerr(H3270 *session, int error_type) | ||
| 556 | 556 | ||
| 557 | } | 557 | } |
| 558 | 558 | ||
| 559 | -void status_connecting(H3270 *session, Boolean on) | 559 | +/** |
| 560 | + * @brief Resolving DNS name. | ||
| 561 | + * | ||
| 562 | + */ | ||
| 563 | +void status_resolving(H3270 *hSession) | ||
| 564 | +{ | ||
| 565 | + hSession->cstate = LIB3270_RESOLVING; | ||
| 566 | + lib3270_st_changed(hSession, LIB3270_STATE_RESOLVING, True); | ||
| 567 | + | ||
| 568 | + mcursor_set(hSession,LIB3270_POINTER_LOCKED); | ||
| 569 | + status_changed(hSession, LIB3270_MESSAGE_RESOLVING); | ||
| 570 | +} | ||
| 571 | + | ||
| 572 | +void status_connecting(H3270 *hSession) | ||
| 560 | { | 573 | { |
| 561 | - mcursor_set(session,on ? LIB3270_POINTER_LOCKED : LIB3270_POINTER_UNLOCKED); | ||
| 562 | - status_changed(session, on ? LIB3270_MESSAGE_CONNECTING : LIB3270_MESSAGE_NONE); | 574 | + hSession->cstate = LIB3270_RESOLVING; |
| 575 | + lib3270_st_changed(hSession, LIB3270_STATE_CONNECTING, True); | ||
| 576 | + | ||
| 577 | + mcursor_set(hSession,LIB3270_POINTER_LOCKED); | ||
| 578 | + status_changed(hSession, LIB3270_MESSAGE_CONNECTING); | ||
| 563 | } | 579 | } |
| 564 | 580 | ||
| 565 | void status_reset(H3270 *session) | 581 | void status_reset(H3270 *session) |
src/lib3270/session.c
| @@ -86,6 +86,7 @@ void lib3270_session_free(H3270 *h) | @@ -86,6 +86,7 @@ void lib3270_session_free(H3270 *h) | ||
| 86 | X509_CRL_free(h->ssl.crl.cert); | 86 | X509_CRL_free(h->ssl.crl.cert); |
| 87 | h->ssl.crl.cert = NULL; | 87 | h->ssl.crl.cert = NULL; |
| 88 | } | 88 | } |
| 89 | +#endif // SSL_ENABLE_CRL_CHECK | ||
| 89 | 90 | ||
| 90 | // Release state change callbacks | 91 | // Release state change callbacks |
| 91 | for(f=0;f<LIB3270_STATE_USER;f++) | 92 | for(f=0;f<LIB3270_STATE_USER;f++) |
| @@ -97,7 +98,6 @@ void lib3270_session_free(H3270 *h) | @@ -97,7 +98,6 @@ void lib3270_session_free(H3270 *h) | ||
| 97 | h->st_callbacks[f] = next; | 98 | h->st_callbacks[f] = next; |
| 98 | } | 99 | } |
| 99 | } | 100 | } |
| 100 | -#endif // SSL_ENABLE_CRL_CHECK | ||
| 101 | 101 | ||
| 102 | // Release memory | 102 | // Release memory |
| 103 | #define release_pointer(x) lib3270_free(x); x = NULL; | 103 | #define release_pointer(x) lib3270_free(x); x = NULL; |
src/lib3270/ssl/ctx_init.c
| @@ -147,7 +147,7 @@ int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE * message) | @@ -147,7 +147,7 @@ int ssl_ctx_init(H3270 *hSession, SSL_ERROR_MESSAGE * message) | ||
| 147 | if(hSession->ssl.crl.cert) | 147 | if(hSession->ssl.crl.cert) |
| 148 | { | 148 | { |
| 149 | X509_STORE_add_crl(store, hSession->ssl.crl.cert); | 149 | X509_STORE_add_crl(store, hSession->ssl.crl.cert); |
| 150 | - trace_ssl(hSession,"CRL was added to cert store"); | 150 | + trace_ssl(hSession,"CRL was added to cert store\n"); |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); | 153 | X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new(); |
src/lib3270/windows/connect.c
| @@ -39,8 +39,7 @@ | @@ -39,8 +39,7 @@ | ||
| 39 | 39 | ||
| 40 | #include "../private.h" | 40 | #include "../private.h" |
| 41 | #include <errno.h> | 41 | #include <errno.h> |
| 42 | - | ||
| 43 | -#include <ws2tcpip.h> | 42 | +#include <lib3270/trace.h> |
| 44 | 43 | ||
| 45 | #ifdef HAVE_ICONV | 44 | #ifdef HAVE_ICONV |
| 46 | #include <iconv.h> | 45 | #include <iconv.h> |
| @@ -150,19 +149,6 @@ static void sockstart(H3270 *session) | @@ -150,19 +149,6 @@ static void sockstart(H3270 *session) | ||
| 150 | } | 149 | } |
| 151 | } | 150 | } |
| 152 | 151 | ||
| 153 | -LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wait) | ||
| 154 | -{ | ||
| 155 | - CHECK_SESSION_HANDLE(hSession); | ||
| 156 | - | ||
| 157 | - if(url && *url) | ||
| 158 | - { | ||
| 159 | - lib3270_set_url(hSession,url); | ||
| 160 | - } | ||
| 161 | - | ||
| 162 | - return lib3270_reconnect(hSession, wait); | ||
| 163 | - | ||
| 164 | -} | ||
| 165 | - | ||
| 166 | struct resolver | 152 | struct resolver |
| 167 | { | 153 | { |
| 168 | int convert; | 154 | int convert; |
| @@ -186,6 +172,8 @@ LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wai | @@ -186,6 +172,8 @@ LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wai | ||
| 186 | 172 | ||
| 187 | debug("%s(%s,%s)",__FUNCTION__,hSession->host.current, hSession->host.srvc); | 173 | debug("%s(%s,%s)",__FUNCTION__,hSession->host.current, hSession->host.srvc); |
| 188 | 174 | ||
| 175 | + status_resolving(hSession); | ||
| 176 | + | ||
| 189 | int rc = getaddrinfo(hSession->host.current, hSession->host.srvc, &hints, &result); | 177 | int rc = getaddrinfo(hSession->host.current, hSession->host.srvc, &hints, &result); |
| 190 | if(rc != 0) | 178 | if(rc != 0) |
| 191 | { | 179 | { |
| @@ -194,7 +182,7 @@ LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wai | @@ -194,7 +182,7 @@ LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wai | ||
| 194 | return -1; | 182 | return -1; |
| 195 | } | 183 | } |
| 196 | 184 | ||
| 197 | - status_connecting(hSession,1); | 185 | + status_connecting(hSession); |
| 198 | 186 | ||
| 199 | for(rp = result; hSession->sock < 0 && rp != NULL; rp = rp->ai_next) | 187 | for(rp = result; hSession->sock < 0 && rp != NULL; rp = rp->ai_next) |
| 200 | { | 188 | { |
| @@ -221,50 +209,14 @@ LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wai | @@ -221,50 +209,14 @@ LIB3270_EXPORT int lib3270_connect_url(H3270 *hSession, const char *url, int wai | ||
| 221 | 209 | ||
| 222 | } | 210 | } |
| 223 | 211 | ||
| 224 | -int lib3270_reconnect(H3270 *hSession, int seconds) | 212 | +int net_reconnect(H3270 *hSession, int seconds) |
| 225 | { | 213 | { |
| 226 | - int optval; | ||
| 227 | - struct resolver host; | ||
| 228 | - | ||
| 229 | - CHECK_SESSION_HANDLE(hSession); | 214 | + struct resolver host; |
| 230 | 215 | ||
| 231 | memset(&host,0,sizeof(host)); | 216 | memset(&host,0,sizeof(host)); |
| 232 | 217 | ||
| 233 | - if(hSession->auto_reconnect_inprogress) | ||
| 234 | - return errno = EAGAIN; | ||
| 235 | - | ||
| 236 | - if(hSession->sock > 0) | ||
| 237 | - return errno = EBUSY; | ||
| 238 | - | ||
| 239 | - if(!(hSession->host.current && hSession->host.srvc)) | ||
| 240 | - { | ||
| 241 | - // No host info, try the default one. | ||
| 242 | - if(lib3270_set_url(hSession,NULL)) | ||
| 243 | - { | ||
| 244 | - int err = errno; | ||
| 245 | - lib3270_trace_event(hSession,"Can't set default URL (%s)\n",strerror(err)); | ||
| 246 | - return errno = err; | ||
| 247 | - } | ||
| 248 | - | ||
| 249 | - if(!(hSession->host.current && hSession->host.srvc)) | ||
| 250 | - { | ||
| 251 | - return errno = ENOENT; | ||
| 252 | - } | ||
| 253 | - } | ||
| 254 | - | ||
| 255 | sockstart(hSession); | 218 | sockstart(hSession); |
| 256 | 219 | ||
| 257 | -#if defined(HAVE_LIBSSL) | ||
| 258 | - set_ssl_state(hSession,LIB3270_SSL_UNSECURE); | ||
| 259 | -#endif // HAVE_LIBSSL | ||
| 260 | - | ||
| 261 | - snprintf(hSession->full_model_name,LIB3270_FULL_MODEL_NAME_LENGTH,"IBM-327%c-%d",hSession->m3279 ? '9' : '8', hSession->model_num); | ||
| 262 | - | ||
| 263 | - hSession->ever_3270 = False; | ||
| 264 | - hSession->cstate = LIB3270_RESOLVING; | ||
| 265 | - | ||
| 266 | - lib3270_st_changed(hSession, LIB3270_STATE_RESOLVING, True); | ||
| 267 | - | ||
| 268 | if(lib3270_run_task(hSession, background_connect, &host) || hSession->sock < 0) | 220 | if(lib3270_run_task(hSession, background_connect, &host) || hSession->sock < 0) |
| 269 | { | 221 | { |
| 270 | lib3270_autoptr(char) message = lib3270_strdup_printf(_( "Can't connect to %s"), lib3270_get_url(hSession)); | 222 | lib3270_autoptr(char) message = lib3270_strdup_printf(_( "Can't connect to %s"), lib3270_get_url(hSession)); |
| @@ -333,9 +285,8 @@ int lib3270_reconnect(H3270 *hSession, int seconds) | @@ -333,9 +285,8 @@ int lib3270_reconnect(H3270 *hSession, int seconds) | ||
| 333 | /* connect */ | 285 | /* connect */ |
| 334 | 286 | ||
| 335 | WSASetLastError(0); | 287 | WSASetLastError(0); |
| 336 | - // u_long iMode=1; | ||
| 337 | 288 | ||
| 338 | - optval = lib3270_get_toggle(hSession,LIB3270_TOGGLE_KEEP_ALIVE) ? 1 : 0; | 289 | + int optval = lib3270_get_toggle(hSession,LIB3270_TOGGLE_KEEP_ALIVE) ? 1 : 0; |
| 339 | if (setsockopt(hSession->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0) | 290 | if (setsockopt(hSession->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0) |
| 340 | { | 291 | { |
| 341 | char buffer[4096]; | 292 | char buffer[4096]; |