From 76ce623abfd61c71912585a3c24d36cdc1d0a7b4 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Sat, 18 Nov 2017 22:15:50 +0100 Subject: Fix options parsing on reconnect Commit 3f7b3001988bf921e6cd860f03a6256b1451ee3d was incomplete: the options parameter was not parsed as a string on reconnect. It was always assumed to be a filename. --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 74 ++++++++++++++------------ nx-X11/programs/Xserver/hw/nxagent/Args.h | 1 + nx-X11/programs/Xserver/hw/nxagent/Reconnect.c | 4 +- 3 files changed, 43 insertions(+), 36 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index e4fa350bc..effb3f746 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -135,7 +135,7 @@ char nxagentShadowDisplayName[1024] = {0}; char nxagentWindowName[256]; char nxagentDialogName[256]; char nxagentSessionId[256] = {0}; -char *nxagentOptionsFilename; +char *nxagentOptionsFilenameOrString; Bool nxagentFullGeneration = False; int nxagentDefaultClass = TrueColor; @@ -259,18 +259,18 @@ int ddxProcessArgument(int argc, char *argv[], int i) { if ((!strcmp(argv[j], "-options") || !strcmp(argv[j], "-option")) && j + 1 < argc) { - if (nxagentOptionsFilename) + if (nxagentOptionsFilenameOrString) { - nxagentOptionsFilename = (char *) realloc(nxagentOptionsFilename, strlen(argv[j + 1]) + 1); + nxagentOptionsFilenameOrString = (char *) realloc(nxagentOptionsFilenameOrString, strlen(argv[j + 1]) + 1); } else { - nxagentOptionsFilename = (char *) malloc(strlen(argv[j + 1]) +1); + nxagentOptionsFilenameOrString = (char *) malloc(strlen(argv[j + 1]) +1); } - if (nxagentOptionsFilename != NULL) + if (nxagentOptionsFilenameOrString != NULL) { - nxagentOptionsFilename = strcpy(nxagentOptionsFilename, argv[j + 1]); + nxagentOptionsFilenameOrString = strcpy(nxagentOptionsFilenameOrString, argv[j + 1]); } #ifdef WARNING else @@ -283,25 +283,7 @@ int ddxProcessArgument(int argc, char *argv[], int i) } } - if (nxagentOptionsFilename) - { - /* if the "filename" starts with an nx marker treat it - as an option _string_ instead of a filename */ - if (strncasecmp(nxagentOptionsFilename, "nx/nx,", 6) == 0 || - strncasecmp(nxagentOptionsFilename, "nx/nx:", 6) == 0) - { - nxagentParseOptionString(nxagentOptionsFilename + 6); - } - else if (strncasecmp(nxagentOptionsFilename, "nx,", 3) == 0 || - strncasecmp(nxagentOptionsFilename, "nx:", 3) == 0) - { - nxagentParseOptionString(nxagentOptionsFilename + 3); - } - else - { - nxagentProcessOptionsFile(nxagentOptionsFilename); - } - } + nxagentProcessOptions(nxagentOptionsFilenameOrString); } if (!strcmp(argv[i], "-B")) @@ -380,23 +362,19 @@ int ddxProcessArgument(int argc, char *argv[], int i) { int size; - if (nxagentOptionsFilename != NULL) - { - free(nxagentOptionsFilename); - - nxagentOptionsFilename = NULL; - } + free(nxagentOptionsFilenameOrString); + nxagentOptionsFilenameOrString = NULL; if ((size = strlen(argv[i])) < 1024) { - if ((nxagentOptionsFilename = malloc(size + 1)) == NULL) + if ((nxagentOptionsFilenameOrString = malloc(size + 1)) == NULL) { FatalError("malloc failed"); } - strncpy(nxagentOptionsFilename, argv[i], size); + strncpy(nxagentOptionsFilenameOrString, argv[i], size); - nxagentOptionsFilename[size] = '\0'; + nxagentOptionsFilenameOrString[size] = '\0'; } else { @@ -1584,6 +1562,34 @@ static void nxagentParseOptionString(char *string) } } +void nxagentProcessOptions(char * string) +{ + if (!string) + return; + + #ifdef DEBUG + fprintf(stderr, "%s: Going to process option string/filename [%s].\n", + __func__, validateString(string)); + #endif + + /* if the "filename" starts with an nx marker treat it + as an option _string_ instead of a filename */ + if (strncasecmp(string, "nx/nx,", 6) == 0 || + strncasecmp(string, "nx/nx:", 6) == 0) + { + nxagentParseOptionString(string + 6); + } + else if (strncasecmp(string, "nx,", 3) == 0 || + strncasecmp(string, "nx:", 3) == 0) + { + nxagentParseOptionString(string + 3); + } + else + { + nxagentProcessOptionsFile(string); + } +} + void nxagentProcessOptionsFile(char * filename) { FILE *file; diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.h b/nx-X11/programs/Xserver/hw/nxagent/Args.h index 4c736ea9f..d60488c0d 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.h +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.h @@ -81,6 +81,7 @@ extern Bool nxagentIpaq; extern int nxagentLockDeferLevel; Bool nxagentPostProcessArgs(char *name, Display *dpy, Screen *scr); +void nxagentProcessOptions(char * string); void nxagentProcessOptionsFile(char * filename); void nxagentSetPackMethod(void); diff --git a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c index 902fe36be..cae0a397b 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Reconnect.c @@ -103,7 +103,7 @@ extern Bool nxagentRenderEnable; extern char *nxagentKeyboard; -extern char *nxagentOptionsFilename; +extern char *nxagentOptionsFilenameOrString; enum SESSION_STATE nxagentSessionState = SESSION_STARTING; @@ -456,7 +456,7 @@ Bool nxagentReconnectSession(void) nxagentResetOptions(); - nxagentProcessOptionsFile(nxagentOptionsFilename); + nxagentProcessOptions(nxagentOptionsFilenameOrString); if (nxagentReconnectDisplay(reconnectLossyLevel[DISPLAY_STEP]) == 0) { -- cgit v1.2.3 From 6c9622963e156ead83e49ac4df5c227dc07ce00c Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Sat, 18 Nov 2017 22:18:26 +0100 Subject: Args.c: Fix compile bug with DEBUG enabled --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index effb3f746..72926fd60 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -1603,7 +1603,7 @@ void nxagentProcessOptionsFile(char * filename) #ifdef DEBUG fprintf(stderr, "nxagentProcessOptionsFile: Going to process option file [%s].\n", - validateString(filename); + validateString(filename)); #endif /* -- cgit v1.2.3 From 4ef4fbf16eca01b40176a830bfa6a8ada95e357b Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Sat, 18 Nov 2017 22:32:21 +0100 Subject: Args.c: simplify nxagentProcessOptionsFile() --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 36 ++++++++++++++----------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index 72926fd60..2b8d44388 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -1592,8 +1592,8 @@ void nxagentProcessOptions(char * string) void nxagentProcessOptionsFile(char * filename) { - FILE *file; - char *data; + FILE *file = NULL; + char *data = NULL; int offset; int size; @@ -1629,7 +1629,7 @@ void nxagentProcessOptionsFile(char * filename) fprintf(stderr, "Warning: Couldn't position inside option file '%s'. Error is '%s'.\n", validateString(filename), strerror(errno)); - goto nxagentProcessOptionsFileClose; + goto nxagentProcessOptionsFileExit; } if ((sizeOfFile = ftell(file)) == -1) @@ -1637,7 +1637,7 @@ void nxagentProcessOptionsFile(char * filename) fprintf(stderr, "Warning: Couldn't get the size of option file '%s'. Error is '%s'.\n", validateString(filename), strerror(errno)); - goto nxagentProcessOptionsFileClose; + goto nxagentProcessOptionsFileExit; } #ifdef DEBUG @@ -1652,7 +1652,7 @@ void nxagentProcessOptionsFile(char * filename) fprintf(stderr, "Warning: Maximum file size exceeded for options '%s'.\n", validateString(filename)); - goto nxagentProcessOptionsFileClose; + goto nxagentProcessOptionsFileExit; } if ((data = malloc(sizeOfFile + 1)) == NULL) @@ -1660,7 +1660,7 @@ void nxagentProcessOptionsFile(char * filename) fprintf(stderr, "Warning: Memory allocation failed processing file '%s'.\n", validateString(filename)); - goto nxagentProcessOptionsFileClose; + goto nxagentProcessOptionsFileExit; } offset = 0; @@ -1675,7 +1675,7 @@ void nxagentProcessOptionsFile(char * filename) fprintf(stderr, "Warning: Error reading the option file '%s'.\n", validateString(filename)); - goto nxagentProcessOptionsFileFree; + goto nxagentProcessOptionsFileExit; } size += result; @@ -1692,7 +1692,7 @@ void nxagentProcessOptionsFile(char * filename) fprintf(stderr, "Warning: Premature end of option file '%s' while reading.\n", validateString(filename)); - goto nxagentProcessOptionsFileFree; + goto nxagentProcessOptionsFileExit; } /* @@ -1705,23 +1705,19 @@ void nxagentProcessOptionsFile(char * filename) nxagentParseOptionString(data); -nxagentProcessOptionsFileFree: - - if (data != NULL) - { - free(data); - } +nxagentProcessOptionsFileExit: -nxagentProcessOptionsFileClose: + free(data); - if (fclose(file) != 0) + if (file) { - fprintf(stderr, "Warning: Couldn't close option file '%s'. Error is '%s'.\n", - validateString(filename), strerror(errno)); + if (fclose(file) != 0) + { + fprintf(stderr, "Warning: Couldn't close option file '%s'. Error is '%s'.\n", + validateString(filename), strerror(errno)); + } } -nxagentProcessOptionsFileExit: - return; } -- cgit v1.2.3