Commit 76612edf670312af09306df5b028a4f2632145e2

Authored by Perry Werneck
1 parent 5b8675fe

Improving "auto-reconnect" toggle.

src/include/ansic.h
... ... @@ -12,9 +12,8 @@
12 12 * for more details.
13 13 */
14 14  
15   -/*
16   - * ansic.h
17   - * Global declarations for ansi.c.
  15 +/**
  16 + * @brief Global declarations for ansi.c.
18 17 */
19 18  
20 19 #if defined(X3270_ANSI) /*[*/
... ...
src/include/lib3270.h
... ... @@ -167,7 +167,7 @@
167 167 } LIB3270_DIRECTION;
168 168  
169 169 /**
170   - * Toggle types.
  170 + * @brief Toggle types.
171 171 *
172 172 */
173 173 typedef enum _LIB3270_TOGGLE_TYPE
... ... @@ -751,7 +751,7 @@
751 751 * @param ix Toggle id.
752 752 * @param value New toggle state (non zero for true).
753 753 *
754   - * @returns 0 if the toggle is already at the state, 1 if the toggle was changed; < 0 on invalid toggle id
  754 + * @returns 0 if the toggle is already at the state, 1 if the toggle was changed; < 0 on error (sets errno).
755 755 */
756 756 LIB3270_EXPORT int lib3270_set_toggle(H3270 *h, LIB3270_TOGGLE ix, int value);
757 757  
... ...
src/lib3270/host.c
... ... @@ -55,19 +55,14 @@
55 55 #include <lib3270/internals.h>
56 56 #include <lib3270/properties.h>
57 57  
58   -#define RECONNECT_MS 2000 /* 2 sec before reconnecting to host */
59   -#define RECONNECT_ERR_MS 5000 /* 5 sec before reconnecting to host */
60   -
61   -static void try_reconnect(H3270 *session);
62   -
63   -/*
64   - * Called from timer to attempt an automatic reconnection.
  58 +/**
  59 + * @brief Called from timer to attempt an automatic reconnection.
65 60 */
66   -static void try_reconnect(H3270 *session)
  61 +void lib3270_reconnect(H3270 *hSession)
67 62 {
68   - lib3270_write_log(session,"3270","Starting auto-reconnect (Host: %s)",session->host.full ? session->host.full : "-");
69   - session->auto_reconnect_inprogress = 0;
70   - lib3270_connect(session,0);
  63 + lib3270_write_log(hSession,"3270","Starting auto-reconnect on %s",lib3270_get_url(hSession));
  64 + hSession->auto_reconnect_inprogress = 0;
  65 + lib3270_connect(hSession,0);
71 66 }
72 67  
73 68 LIB3270_EXPORT int lib3270_disconnect(H3270 *h)
... ... @@ -90,7 +85,7 @@ int host_disconnect(H3270 *hSession, int failed)
90 85 {
91 86 /* Schedule an automatic reconnection. */
92 87 hSession->auto_reconnect_inprogress = 1;
93   - (void) AddTimeOut(failed ? RECONNECT_ERR_MS: RECONNECT_MS, hSession, try_reconnect);
  88 + (void) AddTimeOut(failed ? RECONNECT_ERR_MS : RECONNECT_MS, hSession, lib3270_reconnect);
94 89 }
95 90  
96 91 /*
... ...
src/lib3270/linux/connect.c
... ... @@ -229,7 +229,6 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u
229 229 struct resolver host;
230 230  
231 231 CHECK_SESSION_HANDLE(hSession);
232   -
233 232 memset(&host,0,sizeof(host));
234 233  
235 234 lib3270_main_iterate(hSession,0);
... ... @@ -240,6 +239,16 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u
240 239 if(hSession->sock > 0)
241 240 return errno = EBUSY;
242 241  
  242 + if(!(hSession->host.current && hSession->host.srvc))
  243 + {
  244 + // No host info, try the default one.
  245 + lib3270_set_url(hSession,NULL);
  246 + if(!(hSession->host.current && hSession->host.srvc))
  247 + {
  248 + return errno = ENOENT;
  249 + }
  250 + }
  251 +
243 252 #if defined(HAVE_LIBSSL)
244 253 set_ssl_state(hSession,LIB3270_SSL_UNSECURE);
245 254 #endif // HAVE_LIBSSL
... ...
src/lib3270/private.h
... ... @@ -119,6 +119,9 @@
119 119 #undef X3270_MENUS
120 120 #endif /*]*/
121 121  
  122 +#define RECONNECT_MS 2000 /**< @brief 2 sec before reconnecting to host. */
  123 +#define RECONNECT_ERR_MS 5000 /**< @brief 5 sec before reconnecting to host when failed */
  124 +
122 125 /* types of internal actions */
123 126 enum iaction {
124 127 IA_STRING, IA_PASTE, IA_REDRAW,
... ... @@ -641,6 +644,11 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession);
641 644  
642 645 LIB3270_INTERNAL int lib3270_default_event_dispatcher(H3270 *hSession, int block);
643 646  
  647 +/**
  648 + * @brief Called from timer to attempt an automatic reconnection.
  649 + */
  650 +LIB3270_INTERNAL void lib3270_reconnect(H3270 *hSession);
  651 +
644 652 #if defined(DEBUG)
645 653 #define CHECK_SESSION_HANDLE(x) check_session_handle(&x,__FUNCTION__);
646 654 LIB3270_INTERNAL void check_session_handle(H3270 **hSession, const char *fname);
... ...
src/lib3270/testprogram/testprogram.c
... ... @@ -42,16 +42,15 @@ int main(int argc, char *argv[])
42 42  
43 43 }
44 44  
45   - printf("HOST URL: %s\HOST CRL: %s\n",lib3270_get_url(h),lib3270_get_crl_url(h));
  45 +// printf("HOST URL: %s\HOST CRL: %s\n",lib3270_get_url(h),lib3270_get_crl_url(h));
46 46  
47   - if(lib3270_set_url(h,NULL))
48   - lib3270_set_url(h,"tn3270://fandezhi.efglobe.com");
  47 +// if(lib3270_set_url(h,NULL))
  48 +// lib3270_set_url(h,"tn3270://fandezhi.efglobe.com");
49 49  
50   -// lib3270_set_toggle(h,LIB3270_TOGGLE_DS_TRACE,1);
  50 + //lib3270_set_toggle(h,LIB3270_TOGGLE_DS_TRACE,1);
51 51 lib3270_set_toggle(h,LIB3270_TOGGLE_SSL_TRACE,1);
52 52  
53 53 rc = lib3270_connect(h,120);
54   -
55 54 printf("\nConnect %s exits with rc=%d\n",lib3270_get_url(h),rc);
56 55  
57 56 lib3270_wait_for_ready(h,10);
... ...
src/lib3270/toggles.c
... ... @@ -57,7 +57,8 @@
57 57 #include "screenc.h"
58 58 #include "trace_dsc.h"
59 59 #include "togglesc.h"
60   -#include "api.h"
  60 +//#include "api.h"
  61 +#include "utilc.h"
61 62  
62 63 static const struct _toggle_info
63 64 {
... ... @@ -255,6 +256,15 @@ static void toggle_notify(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGG
255 256  
256 257 }
257 258  
  259 +/**
  260 + * @brief Set toggle state.
  261 + *
  262 + * @param h Session handle.
  263 + * @param ix Toggle id.
  264 + * @param value New toggle state (non zero for true).
  265 + *
  266 + * @returns 0 if the toggle is already at the state, 1 if the toggle was changed; < 0 on error (sets errno).
  267 + */
258 268 LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int value)
259 269 {
260 270 char v = value ? True : False;
... ... @@ -263,7 +273,7 @@ LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int val
263 273 CHECK_SESSION_HANDLE(session);
264 274  
265 275 if(ix < 0 || ix >= LIB3270_TOGGLE_COUNT)
266   - return -EINVAL;
  276 + return -(errno = EINVAL);
267 277  
268 278 t = &session->toggle[ix];
269 279  
... ... @@ -330,6 +340,23 @@ static void toggle_keepalive(H3270 *session, struct lib3270_toggle *t unused, LI
330 340 }
331 341 }
332 342  
  343 +static void toggle_reconnect(H3270 *hSession, struct lib3270_toggle *t unused, LIB3270_TOGGLE_TYPE type )
  344 +{
  345 +
  346 + // If already connected or not interactive returns.
  347 + if(hSession->sock > 0 || type != TT_INTERACTIVE)
  348 + return;
  349 +
  350 + if(t->value && !hSession->auto_reconnect_inprogress)
  351 + {
  352 + /* Schedule an automatic reconnection. */
  353 + lib3270_write_log(hSession,"toggle","Auto-reconnect toggle was activated when offline, reconnecting");
  354 + hSession->auto_reconnect_inprogress = 1;
  355 + (void) AddTimeOut(RECONNECT_MS, hSession, lib3270_reconnect);
  356 + }
  357 +
  358 +}
  359 +
333 360 /**
334 361 * @brief Called from system initialization code to handle initial toggle settings.
335 362 */
... ... @@ -345,6 +372,7 @@ void initialize_toggles(H3270 *session)
345 372 session->toggle[LIB3270_TOGGLE_UNDERLINE].upcall = toggle_redraw;
346 373 session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen;
347 374 session->toggle[LIB3270_TOGGLE_KEEP_ALIVE].upcall = toggle_keepalive;
  375 + session->toggle[LIB3270_TOGGLE_RECONNECT].upcall = toggle_reconnect;
348 376  
349 377 for(f=0;f<LIB3270_TOGGLE_COUNT;f++)
350 378 {
... ... @@ -355,8 +383,8 @@ void initialize_toggles(H3270 *session)
355 383  
356 384 }
357 385  
358   -/*
359   - * Called from system exit code to handle toggles.
  386 +/**
  387 + * @brief Called from system exit code to handle toggles.
360 388 */
361 389 void shutdown_toggles(H3270 *session)
362 390 {
... ...