From c949a338b81b7da27090a2f655e7ec5072888040 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 --- src/include/lib3270.h | 1 + src/lib3270/telnet.c | 21 +++++++++++++++------ src/lib3270/toggles.c | 31 ++++++++++++++++++++++++------- src/plugins/rx3270/rexx_methods.cc | 3 ++- src/pw3270/common/config.c | 2 +- ui/00default.xml | 1 + 6 files changed, 44 insertions(+), 15 deletions(-) diff --git a/src/include/lib3270.h b/src/include/lib3270.h index 60a6ab0..2be444f 100644 --- a/src/include/lib3270.h +++ b/src/include/lib3270.h @@ -116,6 +116,7 @@ LIB3270_TOGGLE_BEEP, /**< Beep on errors */ LIB3270_TOGGLE_VIEW_FIELD, /**< View Field attribute */ LIB3270_TOGGLE_ALTSCREEN, /**< auto resize on altscreen */ + LIB3270_TOGGLE_KEEP_ALIVE, /**< Enable network keep-alive with SO_KEEPALIVE */ // LIB3270_TOGGLE_ALT_CURSOR, // LIB3270_TOGGLE_AID_WAIT, diff --git a/src/lib3270/telnet.c b/src/lib3270/telnet.c index 2b7fbfc..09c9221 100644 --- a/src/lib3270/telnet.c +++ b/src/lib3270/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/src/lib3270/toggles.c b/src/lib3270/toggles.c index 8e34990..85ef023 100644 --- a/src/lib3270/toggles.c +++ b/src/lib3270/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++) diff --git a/src/plugins/rx3270/rexx_methods.cc b/src/plugins/rx3270/rexx_methods.cc index 2518f63..e81ae54 100644 --- a/src/plugins/rx3270/rexx_methods.cc +++ b/src/plugins/rx3270/rexx_methods.cc @@ -328,7 +328,8 @@ RexxMethod3(int, rx3270_method_set_option, CSELF, sessionPtr, CSTRING, name, int { "kpalternative", LIB3270_TOGGLE_KP_ALTERNATIVE }, { "beep", LIB3270_TOGGLE_BEEP }, { "fieldattr", LIB3270_TOGGLE_VIEW_FIELD }, - { "altscreen", LIB3270_TOGGLE_ALTSCREEN } + { "altscreen", LIB3270_TOGGLE_ALTSCREEN }, + { "keepalive", LIB3270_TOGGLE_KEEP_ALIVE }, }; session *hSession = (session *) sessionPtr; diff --git a/src/pw3270/common/config.c b/src/pw3270/common/config.c index 8f3efdc..01dab64 100644 --- a/src/pw3270/common/config.c +++ b/src/pw3270/common/config.c @@ -439,7 +439,7 @@ void set_boolean_to_config(const gchar *group, const gchar *key, gboolean val) DWORD disp; gchar * path = g_strdup_printf("%s\\%s\\%s",registry_path,g_get_application_name(),group); - trace("Creating key %s",path); +// trace("Creating key %s",path); if(RegCreateKeyEx(HKEY_CURRENT_USER,path,0,NULL,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,&hKey,&disp) == ERROR_SUCCESS) { DWORD value = val ? 1 : 0; diff --git a/ui/00default.xml b/ui/00default.xml index 510a8f4..4453506 100644 --- a/ui/00default.xml +++ b/ui/00default.xml @@ -131,6 +131,7 @@ + -- libgit2 0.21.2