Commit 62dff8b4750ca9f993c642d0af2dae6c349a3426

Authored by perry.werneck@gmail.com
1 parent faf92292

Incluindo toggle para ativar/desativar a utilizacao do keep-alive da rede

Showing 2 changed files with 39 additions and 13 deletions   Show diff stats
@@ -488,6 +488,7 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo @@ -488,6 +488,7 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo
488 int passthru_len = 0; 488 int passthru_len = 0;
489 unsigned short passthru_port = 0; 489 unsigned short passthru_port = 0;
490 int on = 1; 490 int on = 1;
  491 + int optval;
491 char errmsg[1024]; 492 char errmsg[1024];
492 int rc; 493 int rc;
493 #if defined(OMTU) /*[*/ 494 #if defined(OMTU) /*[*/
@@ -630,12 +631,6 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo @@ -630,12 +631,6 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo
630 close_fail; 631 close_fail;
631 } 632 }
632 633
633 - if (setsockopt(session->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0)  
634 - {  
635 - popup_a_sockerr(session, N_( "setsockopt(%s)" ), "SO_KEEPALIVE");  
636 - close_fail;  
637 - }  
638 -  
639 #if defined(OMTU) 634 #if defined(OMTU)
640 if (setsockopt(session->sock, SOL_SOCKET, SO_SNDBUF, (char *)&mtu,sizeof(mtu)) < 0) 635 if (setsockopt(session->sock, SOL_SOCKET, SO_SNDBUF, (char *)&mtu,sizeof(mtu)) < 0)
641 { 636 {
@@ -666,8 +661,22 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo @@ -666,8 +661,22 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo
666 if(!rc) 661 if(!rc)
667 { 662 {
668 trace_dsn(session,"Connected.\n"); 663 trace_dsn(session,"Connected.\n");
  664 +
  665 + optval = lib3270_get_toggle(session,LIB3270_TOGGLE_KEEP_ALIVE) ? 1 : 0;
  666 +
  667 + if (setsockopt(session->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0)
  668 + {
  669 + popup_a_sockerr(session, N_( "Can´t %s network keep-alive" ), optval ? _( "enable" ) : _( "disable" ));
  670 + close_fail;
  671 + }
  672 + else
  673 + {
  674 + trace_dsn(session,"Network keep-alive is %s\n",optval ? "enabled" : "disabled" );
  675 + }
  676 +
669 if(net_connected(session)) 677 if(net_connected(session))
670 return -1; 678 return -1;
  679 +
671 } 680 }
672 else 681 else
673 { 682 {
@@ -51,8 +51,6 @@ @@ -51,8 +51,6 @@
51 #include "togglesc.h" 51 #include "togglesc.h"
52 #include "api.h" 52 #include "api.h"
53 53
54 -  
55 -  
56 static const char *toggle_names[LIB3270_TOGGLE_COUNT] = 54 static const char *toggle_names[LIB3270_TOGGLE_COUNT] =
57 { 55 {
58 "monocase", 56 "monocase",
@@ -79,6 +77,7 @@ static const char *toggle_names[LIB3270_TOGGLE_COUNT] = @@ -79,6 +77,7 @@ static const char *toggle_names[LIB3270_TOGGLE_COUNT] =
79 "beep", /**< Beep on errors */ 77 "beep", /**< Beep on errors */
80 "fieldattr", /**< View Field attribute */ 78 "fieldattr", /**< View Field attribute */
81 "altscreen", /**< auto resize on altscreen */ 79 "altscreen", /**< auto resize on altscreen */
  80 + "keepalive", /**< Enable network keep-alive with SO_KEEPALIVE */
82 81
83 82
84 }; 83 };
@@ -158,10 +157,29 @@ static void toggle_redraw(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGG @@ -158,10 +157,29 @@ static void toggle_redraw(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGG
158 /* 157 /*
159 * No-op toggle. 158 * No-op toggle.
160 */ 159 */
161 -static void toggle_nop(H3270 *session, struct lib3270_toggle *t unused, LIB3270_TOGGLE_TYPE tt unused) 160 +static void toggle_nop(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt unused)
162 { 161 {
163 } 162 }
164 163
  164 +static void toggle_keepalive(H3270 *session, struct lib3270_toggle *t unused, LIB3270_TOGGLE_TYPE tt unused)
  165 +{
  166 + if(session->sock > 0)
  167 + {
  168 + // Update keep-alive option
  169 + int optval = t->value ? 1 : 0;
  170 +
  171 + if (setsockopt(session->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0)
  172 + {
  173 + popup_a_sockerr(session, N_( "Can´t %s network keep-alive" ), optval ? _( "enable" ) : _( "disable" ));
  174 + }
  175 + else
  176 + {
  177 + trace_dsn(session,"Network keep-alive is %s\n",optval ? "enabled" : "disabled" );
  178 + }
  179 +
  180 + }
  181 +}
  182 +
165 /* 183 /*
166 * Called from system initialization code to handle initial toggle settings. 184 * Called from system initialization code to handle initial toggle settings.
167 */ 185 */
@@ -176,10 +194,8 @@ void initialize_toggles(H3270 *session) @@ -176,10 +194,8 @@ void initialize_toggles(H3270 *session)
176 session->toggle[LIB3270_TOGGLE_MONOCASE].upcall = toggle_redraw; 194 session->toggle[LIB3270_TOGGLE_MONOCASE].upcall = toggle_redraw;
177 session->toggle[LIB3270_TOGGLE_UNDERLINE].upcall = toggle_redraw; 195 session->toggle[LIB3270_TOGGLE_UNDERLINE].upcall = toggle_redraw;
178 session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen; 196 session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen;
179 -  
180 -#if defined(X3270_ANSI)  
181 - session->toggle[LIB3270_TOGGLE_LINE_WRAP].upcall = toggle_lineWrap;  
182 -#endif 197 + session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen;
  198 + session->toggle[LIB3270_TOGGLE_KEEP_ALIVE].upcall = toggle_keepalive;
183 199
184 static const LIB3270_TOGGLE active_by_default[] = 200 static const LIB3270_TOGGLE active_by_default[] =
185 { 201 {
@@ -187,6 +203,7 @@ void initialize_toggles(H3270 *session) @@ -187,6 +203,7 @@ void initialize_toggles(H3270 *session)
187 LIB3270_TOGGLE_CURSOR_POS, 203 LIB3270_TOGGLE_CURSOR_POS,
188 LIB3270_TOGGLE_BEEP, 204 LIB3270_TOGGLE_BEEP,
189 LIB3270_TOGGLE_ALTSCREEN, 205 LIB3270_TOGGLE_ALTSCREEN,
  206 + LIB3270_TOGGLE_KEEP_ALIVE
190 }; 207 };
191 208
192 for(f=0;f< (sizeof(active_by_default)/sizeof(active_by_default[0])); f++) 209 for(f=0;f< (sizeof(active_by_default)/sizeof(active_by_default[0])); f++)