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