Commit 76612edf670312af09306df5b028a4f2632145e2
1 parent
5b8675fe
Exists in
master
and in
3 other branches
Improving "auto-reconnect" toggle.
Showing
7 changed files
with
65 additions
and
27 deletions
Show diff stats
src/include/ansic.h
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 | { |