From 62dff8b4750ca9f993c642d0af2dae6c349a3426 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Wed, 9 Oct 2013 21:07:10 +0000 Subject: [PATCH] Incluindo toggle para ativar/desativar a utilizacao do keep-alive da rede --- telnet.c | 21 +++++++++++++++------ toggles.c | 31 ++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/telnet.c b/telnet.c index 2b7fbfc..09c9221 100644 --- a/telnet.c +++ b/telnet.c @@ -488,6 +488,7 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo int passthru_len = 0; unsigned short passthru_port = 0; int on = 1; + int optval; char errmsg[1024]; int rc; #if defined(OMTU) /*[*/ @@ -630,12 +631,6 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo close_fail; } - if (setsockopt(session->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)) < 0) - { - popup_a_sockerr(session, N_( "setsockopt(%s)" ), "SO_KEEPALIVE"); - close_fail; - } - #if defined(OMTU) if (setsockopt(session->sock, SOL_SOCKET, SO_SNDBUF, (char *)&mtu,sizeof(mtu)) < 0) { @@ -666,8 +661,22 @@ int net_connect(H3270 *session, const char *host, char *portname, Boolean ls, Bo if(!rc) { trace_dsn(session,"Connected.\n"); + + optval = lib3270_get_toggle(session,LIB3270_TOGGLE_KEEP_ALIVE) ? 1 : 0; + + if (setsockopt(session->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0) + { + popup_a_sockerr(session, N_( "Can´t %s network keep-alive" ), optval ? _( "enable" ) : _( "disable" )); + close_fail; + } + else + { + trace_dsn(session,"Network keep-alive is %s\n",optval ? "enabled" : "disabled" ); + } + if(net_connected(session)) return -1; + } else { diff --git a/toggles.c b/toggles.c index 8e34990..85ef023 100644 --- a/toggles.c +++ b/toggles.c @@ -51,8 +51,6 @@ #include "togglesc.h" #include "api.h" - - static const char *toggle_names[LIB3270_TOGGLE_COUNT] = { "monocase", @@ -79,6 +77,7 @@ static const char *toggle_names[LIB3270_TOGGLE_COUNT] = "beep", /**< Beep on errors */ "fieldattr", /**< View Field attribute */ "altscreen", /**< auto resize on altscreen */ + "keepalive", /**< Enable network keep-alive with SO_KEEPALIVE */ }; @@ -158,10 +157,29 @@ static void toggle_redraw(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGG /* * No-op toggle. */ -static void toggle_nop(H3270 *session, struct lib3270_toggle *t unused, LIB3270_TOGGLE_TYPE tt unused) +static void toggle_nop(H3270 *session, struct lib3270_toggle *t, LIB3270_TOGGLE_TYPE tt unused) { } +static void toggle_keepalive(H3270 *session, struct lib3270_toggle *t unused, LIB3270_TOGGLE_TYPE tt unused) +{ + if(session->sock > 0) + { + // Update keep-alive option + int optval = t->value ? 1 : 0; + + if (setsockopt(session->sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&optval, sizeof(optval)) < 0) + { + popup_a_sockerr(session, N_( "Can´t %s network keep-alive" ), optval ? _( "enable" ) : _( "disable" )); + } + else + { + trace_dsn(session,"Network keep-alive is %s\n",optval ? "enabled" : "disabled" ); + } + + } +} + /* * Called from system initialization code to handle initial toggle settings. */ @@ -176,10 +194,8 @@ void initialize_toggles(H3270 *session) session->toggle[LIB3270_TOGGLE_MONOCASE].upcall = toggle_redraw; session->toggle[LIB3270_TOGGLE_UNDERLINE].upcall = toggle_redraw; session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen; - -#if defined(X3270_ANSI) - session->toggle[LIB3270_TOGGLE_LINE_WRAP].upcall = toggle_lineWrap; -#endif + session->toggle[LIB3270_TOGGLE_ALTSCREEN].upcall = toggle_altscreen; + session->toggle[LIB3270_TOGGLE_KEEP_ALIVE].upcall = toggle_keepalive; static const LIB3270_TOGGLE active_by_default[] = { @@ -187,6 +203,7 @@ void initialize_toggles(H3270 *session) LIB3270_TOGGLE_CURSOR_POS, LIB3270_TOGGLE_BEEP, LIB3270_TOGGLE_ALTSCREEN, + LIB3270_TOGGLE_KEEP_ALIVE }; for(f=0;f< (sizeof(active_by_default)/sizeof(active_by_default[0])); f++) -- libgit2 0.21.2