Description: Save session state in file Author: Oleksandr Shneyder --- 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 + +/* + * 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);