diff options
author | Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> | 2015-02-10 19:43:41 +0100 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2015-02-10 19:43:41 +0100 |
commit | 8c1b852abf692af4898368132292eb8c7278a7c2 (patch) | |
tree | 71be8528bc49423444534c510f9c4e1e23a7eff7 | |
parent | 4a6ccd5037c8410f24dc177c9286272c2f47cd9d (diff) | |
download | nx-libs-8c1b852abf692af4898368132292eb8c7278a7c2.tar.gz nx-libs-8c1b852abf692af4898368132292eb8c7278a7c2.tar.bz2 nx-libs-8c1b852abf692af4898368132292eb8c7278a7c2.zip |
Save session state in file.
210_nxagent_save_session_state.full.patch
210_nxcomp_save_session_state.full+lite.patch
This patch adds a "state" option to NX (agent) which
allows one to specify a file where nxagent will write
its session state into.
-rw-r--r-- | debian/patches/210_nxagent_save_session_state.full.patch | 176 | ||||
-rw-r--r-- | debian/patches/210_nxcomp_save_session_state.full+lite.patch | 15 | ||||
-rw-r--r-- | debian/patches/series | 2 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Args.c | 11 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Init.c | 3 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Reconnect.c | 33 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/Reconnect.h | 2 | ||||
-rw-r--r-- | nx-X11/programs/Xserver/hw/nxagent/X/NXdispatch.c | 3 | ||||
-rw-r--r-- | nxcomp/Loop.cpp | 3 |
9 files changed, 53 insertions, 195 deletions
diff --git a/debian/patches/210_nxagent_save_session_state.full.patch b/debian/patches/210_nxagent_save_session_state.full.patch deleted file mode 100644 index 223d0bc7a..000000000 --- a/debian/patches/210_nxagent_save_session_state.full.patch +++ /dev/null @@ -1,176 +0,0 @@ -Description: Save session state in file -Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> - ---- a/nx-X11/programs/Xserver/hw/nxagent/Args.c -+++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c -@@ -60,6 +60,7 @@ - #endif - #include "Handlers.h" - #include "Error.h" -+#include "Reconnect.h" - - /* - * NX includes and definitions. -@@ -1090,6 +1091,11 @@ - - return; - } -+ else if (!strcmp(name, "state")) -+ { -+ setStatePath(value); -+ return; -+ } - else if (!strcmp(name, "fullscreen")) - { - if (nxagentReconnectTrap == True) -@@ -1369,6 +1375,11 @@ - validateString(nxagentOptionFile)); - #endif - -+ /* -+ * Init statePath -+ */ -+ setStatePath(""); -+ - if (nxagentOptionFile == NULL) - { - return; ---- a/nx-X11/programs/Xserver/hw/nxagent/Init.c -+++ b/nx-X11/programs/Xserver/hw/nxagent/Init.c -@@ -63,7 +63,7 @@ - - #include "NX.h" - #include "NXlib.h" -- -+#include "Reconnect.h" - /* - * Set here the required log level. - */ -@@ -233,6 +233,7 @@ - fprintf(stderr, "Info: Agent running with pid '%d'.\n", getpid()); - - fprintf(stderr, "Session: Starting session at '%s'.\n", GetTimeAsString()); -+ saveAgentState("STARTING"); - } - - /* ---- a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c -+++ b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c -@@ -118,6 +118,33 @@ - - static enum RECONNECTION_STEP failedStep; - -+#include <limits.h> -+ -+/* -+ * Path of state File -+ */ -+char stateFile[PATH_MAX]; -+ -+ -+void setStatePath(char* path) -+{ -+ strncpy(stateFile, path, PATH_MAX-1); -+} -+ -+void saveAgentState(char* state) -+{ -+ FILE* fptr; -+ if(strlen(stateFile)) -+ { -+ fptr=fopen(stateFile, "w"); -+ if(!fptr) -+ return; -+ fprintf(fptr,"%s", state); -+ fclose(fptr); -+ } -+} -+ -+ - int nxagentHandleConnectionStates(void) - { - #ifdef TEST -@@ -211,6 +238,7 @@ - fprintf(stderr, "Session: Display failure detected at '%s'.\n", GetTimeAsString()); - - fprintf(stderr, "Session: Suspending session at '%s'.\n", GetTimeAsString()); -+ saveAgentState("SUSPENDING"); - } - - nxagentDisconnectSession(); -@@ -265,6 +293,7 @@ - fprintf(stderr, "Session: Session suspended at '%s'.\n", GetTimeAsString()); - #endif - } -+ saveAgentState("SUSPENDED"); - - nxagentResetDisplayHandlers(); - -@@ -622,6 +651,7 @@ - #else - fprintf(stderr, "Session: Session resumed at '%s'.\n", GetTimeAsString()); - #endif -+ saveAgentState("RUNNING"); - - nxagentRemoveSplashWindow(NULL); - -@@ -785,12 +815,14 @@ - if (nxagentSessionState == SESSION_GOING_DOWN) - { - fprintf(stderr, "Session: Suspending session at '%s'.\n", GetTimeAsString()); -+ saveAgentState("SUSPENDING"); - - nxagentDisconnectSession(); - } - else if (nxagentSessionState == SESSION_GOING_UP) - { - fprintf(stderr, "Session: Resuming session at '%s'.\n", GetTimeAsString()); -+ saveAgentState("RESUMING"); - - if (nxagentReconnectSession()) - { -@@ -803,6 +835,7 @@ - fprintf(stderr, "Session: Display failure detected at '%s'.\n", GetTimeAsString()); - - fprintf(stderr, "Session: Suspending session at '%s'.\n", GetTimeAsString()); -+ saveAgentState("SUSPENDING"); - - nxagentDisconnectSession(); - } ---- a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.h -+++ b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.h -@@ -34,6 +34,8 @@ - Bool nxagentReconnectSession(void); - int nxagentHandleConnectionStates(void); - void nxagentHandleConnectionChanges(void); -+void setStatePath(char*); -+void saveAgentState(char*); - - enum SESSION_STATE - { ---- a/nx-X11/programs/Xserver/hw/nxagent/X/NXdispatch.c -+++ b/nx-X11/programs/Xserver/hw/nxagent/X/NXdispatch.c -@@ -609,6 +609,7 @@ - #endif - - nxagentSessionState = SESSION_UP; -+ saveAgentState("RUNNING"); - } - - #ifdef BLOCKS -@@ -823,6 +824,7 @@ - */ - - fprintf(stderr, "Session: Terminating session at '%s'.\n", GetTimeAsString()); -+ saveAgentState("TERMINATING"); - - nxagentWaitDisplay(); - -@@ -833,6 +835,7 @@ - { - NXShadowDestroy(); - } -+ saveAgentState("TERMINATED"); - - KillAllClients(); - DEALLOCATE_LOCAL(clientReady); diff --git a/debian/patches/210_nxcomp_save_session_state.full+lite.patch b/debian/patches/210_nxcomp_save_session_state.full+lite.patch deleted file mode 100644 index 1ef4440d8..000000000 --- a/debian/patches/210_nxcomp_save_session_state.full+lite.patch +++ /dev/null @@ -1,15 +0,0 @@ -Description: Ignore state=<statefile> option in nxproxy/nxcomp -Author: Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> - ---- a/nxcomp/Loop.cpp -+++ b/nxcomp/Loop.cpp -@@ -8872,7 +8872,8 @@ - } - else if (strcasecmp(name, "defer") == 0 || - strcasecmp(name, "tile") == 0 || -- strcasecmp(name, "menu") == 0) -+ strcasecmp(name, "menu") == 0 || -+ strcasecmp(name, "state") == 0 ) - { - #ifdef DEBUG - *logofs << "Loop: Ignoring agent option '" << name diff --git a/debian/patches/series b/debian/patches/series index 48b9abddc..9e0e64701 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,5 +1,3 @@ -210_nxagent_save_session_state.full.patch -210_nxcomp_save_session_state.full+lite.patch 211_nxcomp_set_default_options.full+lite.patch 212_nxcomp_build-on-Android.full+lite.patch 220_nxproxy_bind-loopback-only.full+lite.patch diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index c72b9c4e8..7074a1818 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -60,6 +60,7 @@ is" without express or implied warranty. #endif #include "Handlers.h" #include "Error.h" +#include "Reconnect.h" /* * NX includes and definitions. @@ -1090,6 +1091,11 @@ static void nxagentParseOptions(char *name, char *value) return; } + else if (!strcmp(name, "state")) + { + setStatePath(value); + return; + } else if (!strcmp(name, "fullscreen")) { if (nxagentReconnectTrap == True) @@ -1369,6 +1375,11 @@ void nxagentProcessOptionsFile() validateString(nxagentOptionFile)); #endif + /* + * Init statePath + */ + setStatePath(""); + if (nxagentOptionFile == NULL) { return; diff --git a/nx-X11/programs/Xserver/hw/nxagent/Init.c b/nx-X11/programs/Xserver/hw/nxagent/Init.c index 1794f1551..8d4eed2b6 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Init.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Init.c @@ -63,7 +63,7 @@ is" without express or implied warranty. #include "NX.h" #include "NXlib.h" - +#include "Reconnect.h" /* * Set here the required log level. */ @@ -233,6 +233,7 @@ void InitOutput(ScreenInfo *screenInfo, int argc, char *argv[]) fprintf(stderr, "Info: Agent running with pid '%d'.\n", getpid()); fprintf(stderr, "Session: Starting session at '%s'.\n", GetTimeAsString()); + saveAgentState("STARTING"); } /* diff --git a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c index 3c576c6e0..b26fa9cfe 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c @@ -118,6 +118,33 @@ void *reconnectLossyLevel[STEP_NONE]; static enum RECONNECTION_STEP failedStep; +#include <limits.h> + +/* + * Path of state File + */ +char stateFile[PATH_MAX]; + + +void setStatePath(char* path) +{ + strncpy(stateFile, path, PATH_MAX-1); +} + +void saveAgentState(char* state) +{ + FILE* fptr; + if(strlen(stateFile)) + { + fptr=fopen(stateFile, "w"); + if(!fptr) + return; + fprintf(fptr,"%s", state); + fclose(fptr); + } +} + + int nxagentHandleConnectionStates(void) { #ifdef TEST @@ -211,6 +238,7 @@ TODO: This should be reset only when fprintf(stderr, "Session: Display failure detected at '%s'.\n", GetTimeAsString()); fprintf(stderr, "Session: Suspending session at '%s'.\n", GetTimeAsString()); + saveAgentState("SUSPENDING"); } nxagentDisconnectSession(); @@ -265,6 +293,7 @@ TODO: This should be reset only when fprintf(stderr, "Session: Session suspended at '%s'.\n", GetTimeAsString()); #endif } + saveAgentState("SUSPENDED"); nxagentResetDisplayHandlers(); @@ -622,6 +651,7 @@ Bool nxagentReconnectSession(void) #else fprintf(stderr, "Session: Session resumed at '%s'.\n", GetTimeAsString()); #endif + saveAgentState("RUNNING"); nxagentRemoveSplashWindow(NULL); @@ -785,12 +815,14 @@ void nxagentHandleConnectionChanges() if (nxagentSessionState == SESSION_GOING_DOWN) { fprintf(stderr, "Session: Suspending session at '%s'.\n", GetTimeAsString()); + saveAgentState("SUSPENDING"); nxagentDisconnectSession(); } else if (nxagentSessionState == SESSION_GOING_UP) { fprintf(stderr, "Session: Resuming session at '%s'.\n", GetTimeAsString()); + saveAgentState("RESUMING"); if (nxagentReconnectSession()) { @@ -803,6 +835,7 @@ void nxagentHandleConnectionChanges() fprintf(stderr, "Session: Display failure detected at '%s'.\n", GetTimeAsString()); fprintf(stderr, "Session: Suspending session at '%s'.\n", GetTimeAsString()); + saveAgentState("SUSPENDING"); nxagentDisconnectSession(); } diff --git a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.h b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.h index c321bfada..5be2928b8 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.h +++ b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.h @@ -34,6 +34,8 @@ void nxagentInitReconnector(void); Bool nxagentReconnectSession(void); int nxagentHandleConnectionStates(void); void nxagentHandleConnectionChanges(void); +void setStatePath(char*); +void saveAgentState(char*); enum SESSION_STATE { diff --git a/nx-X11/programs/Xserver/hw/nxagent/X/NXdispatch.c b/nx-X11/programs/Xserver/hw/nxagent/X/NXdispatch.c index 69ad30d2d..f18c09fe4 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/X/NXdispatch.c +++ b/nx-X11/programs/Xserver/hw/nxagent/X/NXdispatch.c @@ -609,6 +609,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio #endif nxagentSessionState = SESSION_UP; + saveAgentState("RUNNING"); } #ifdef BLOCKS @@ -823,6 +824,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio */ fprintf(stderr, "Session: Terminating session at '%s'.\n", GetTimeAsString()); + saveAgentState("TERMINATING"); nxagentWaitDisplay(); @@ -833,6 +835,7 @@ Reply Total Cached Bits In Bits Out Bits/Reply Ratio { NXShadowDestroy(); } + saveAgentState("TERMINATED"); KillAllClients(); DEALLOCATE_LOCAL(clientReady); diff --git a/nxcomp/Loop.cpp b/nxcomp/Loop.cpp index 7e2b990de..12a858b0f 100644 --- a/nxcomp/Loop.cpp +++ b/nxcomp/Loop.cpp @@ -8872,7 +8872,8 @@ int ParseEnvironmentOptions(const char *env, int force) } else if (strcasecmp(name, "defer") == 0 || strcasecmp(name, "tile") == 0 || - strcasecmp(name, "menu") == 0) + strcasecmp(name, "menu") == 0 || + strcasecmp(name, "state") == 0 ) { #ifdef DEBUG *logofs << "Loop: Ignoring agent option '" << name |