Commit 76612edf670312af09306df5b028a4f2632145e2

Authored by Perry Werneck
1 parent 5b8675fe

Improving "auto-reconnect" toggle.

src/include/ansic.h
@@ -12,9 +12,8 @@ @@ -12,9 +12,8 @@
12 * for more details. 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 #if defined(X3270_ANSI) /*[*/ 19 #if defined(X3270_ANSI) /*[*/
src/include/lib3270.h
@@ -167,7 +167,7 @@ @@ -167,7 +167,7 @@
167 } LIB3270_DIRECTION; 167 } LIB3270_DIRECTION;
168 168
169 /** 169 /**
170 - * Toggle types. 170 + * @brief Toggle types.
171 * 171 *
172 */ 172 */
173 typedef enum _LIB3270_TOGGLE_TYPE 173 typedef enum _LIB3270_TOGGLE_TYPE
@@ -751,7 +751,7 @@ @@ -751,7 +751,7 @@
751 * @param ix Toggle id. 751 * @param ix Toggle id.
752 * @param value New toggle state (non zero for true). 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 LIB3270_EXPORT int lib3270_set_toggle(H3270 *h, LIB3270_TOGGLE ix, int value); 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,19 +55,14 @@
55 #include <lib3270/internals.h> 55 #include <lib3270/internals.h>
56 #include <lib3270/properties.h> 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 LIB3270_EXPORT int lib3270_disconnect(H3270 *h) 68 LIB3270_EXPORT int lib3270_disconnect(H3270 *h)
@@ -90,7 +85,7 @@ int host_disconnect(H3270 *hSession, int failed) @@ -90,7 +85,7 @@ int host_disconnect(H3270 *hSession, int failed)
90 { 85 {
91 /* Schedule an automatic reconnection. */ 86 /* Schedule an automatic reconnection. */
92 hSession->auto_reconnect_inprogress = 1; 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,7 +229,6 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u
229 struct resolver host; 229 struct resolver host;
230 230
231 CHECK_SESSION_HANDLE(hSession); 231 CHECK_SESSION_HANDLE(hSession);
232 -  
233 memset(&host,0,sizeof(host)); 232 memset(&host,0,sizeof(host));
234 233
235 lib3270_main_iterate(hSession,0); 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,6 +239,16 @@ static void net_connected(H3270 *hSession, int fd unused, LIB3270_IO_FLAG flag u
240 if(hSession->sock > 0) 239 if(hSession->sock > 0)
241 return errno = EBUSY; 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 #if defined(HAVE_LIBSSL) 252 #if defined(HAVE_LIBSSL)
244 set_ssl_state(hSession,LIB3270_SSL_UNSECURE); 253 set_ssl_state(hSession,LIB3270_SSL_UNSECURE);
245 #endif // HAVE_LIBSSL 254 #endif // HAVE_LIBSSL
src/lib3270/private.h
@@ -119,6 +119,9 @@ @@ -119,6 +119,9 @@
119 #undef X3270_MENUS 119 #undef X3270_MENUS
120 #endif /*]*/ 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 /* types of internal actions */ 125 /* types of internal actions */
123 enum iaction { 126 enum iaction {
124 IA_STRING, IA_PASTE, IA_REDRAW, 127 IA_STRING, IA_PASTE, IA_REDRAW,
@@ -641,6 +644,11 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession); @@ -641,6 +644,11 @@ LIB3270_INTERNAL void lib3270_sock_disconnect(H3270 *hSession);
641 644
642 LIB3270_INTERNAL int lib3270_default_event_dispatcher(H3270 *hSession, int block); 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 #if defined(DEBUG) 652 #if defined(DEBUG)
645 #define CHECK_SESSION_HANDLE(x) check_session_handle(&x,__FUNCTION__); 653 #define CHECK_SESSION_HANDLE(x) check_session_handle(&x,__FUNCTION__);
646 LIB3270_INTERNAL void check_session_handle(H3270 **hSession, const char *fname); 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,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 lib3270_set_toggle(h,LIB3270_TOGGLE_SSL_TRACE,1); 51 lib3270_set_toggle(h,LIB3270_TOGGLE_SSL_TRACE,1);
52 52
53 rc = lib3270_connect(h,120); 53 rc = lib3270_connect(h,120);
54 -  
55 printf("\nConnect %s exits with rc=%d\n",lib3270_get_url(h),rc); 54 printf("\nConnect %s exits with rc=%d\n",lib3270_get_url(h),rc);
56 55
57 lib3270_wait_for_ready(h,10); 56 lib3270_wait_for_ready(h,10);
src/lib3270/toggles.c
@@ -57,7 +57,8 @@ @@ -57,7 +57,8 @@
57 #include "screenc.h" 57 #include "screenc.h"
58 #include "trace_dsc.h" 58 #include "trace_dsc.h"
59 #include "togglesc.h" 59 #include "togglesc.h"
60 -#include "api.h" 60 +//#include "api.h"
  61 +#include "utilc.h"
61 62
62 static const struct _toggle_info 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,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 LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int value) 268 LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int value)
259 { 269 {
260 char v = value ? True : False; 270 char v = value ? True : False;
@@ -263,7 +273,7 @@ LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int val @@ -263,7 +273,7 @@ LIB3270_EXPORT int lib3270_set_toggle(H3270 *session, LIB3270_TOGGLE ix, int val
263 CHECK_SESSION_HANDLE(session); 273 CHECK_SESSION_HANDLE(session);
264 274
265 if(ix < 0 || ix >= LIB3270_TOGGLE_COUNT) 275 if(ix < 0 || ix >= LIB3270_TOGGLE_COUNT)
266 - return -EINVAL; 276 + return -(errno = EINVAL);
267 277
268 t = &session->toggle[ix]; 278 t = &session->toggle[ix];
269 279
@@ -330,6 +340,23 @@ static void toggle_keepalive(H3270 *session, struct lib3270_toggle *t unused, LI @@ -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 * @brief Called from system initialization code to handle initial toggle settings. 361 * @brief Called from system initialization code to handle initial toggle settings.
335 */ 362 */
@@ -345,6 +372,7 @@ void initialize_toggles(H3270 *session) @@ -345,6 +372,7 @@ void initialize_toggles(H3270 *session)
345 session->toggle[LIB3270_TOGGLE_UNDERLINE].upcall = toggle_redraw; 372 session->toggle[LIB3270_TOGGLE_UNDERLINE].upcall = toggle_redraw;
346 session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen; 373 session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen;
347 session->toggle[LIB3270_TOGGLE_KEEP_ALIVE].upcall = toggle_keepalive; 374 session->toggle[LIB3270_TOGGLE_KEEP_ALIVE].upcall = toggle_keepalive;
  375 + session->toggle[LIB3270_TOGGLE_RECONNECT].upcall = toggle_reconnect;
348 376
349 for(f=0;f<LIB3270_TOGGLE_COUNT;f++) 377 for(f=0;f<LIB3270_TOGGLE_COUNT;f++)
350 { 378 {
@@ -355,8 +383,8 @@ void initialize_toggles(H3270 *session) @@ -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 void shutdown_toggles(H3270 *session) 389 void shutdown_toggles(H3270 *session)
362 { 390 {