From: Michael Meffie Date: Fri, 30 Sep 2011 16:22:27 +0000 (-0400) Subject: bozo: preserve all options over restart X-Git-Tag: upstream/1.6.2_pre2^2~188 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=d88edd8dbd54baf3860787eae164167c5f8b8d29;p=packages%2Fo%2Fopenafs.git bozo: preserve all options over restart On unix, save all the bosserver command-line options and reuse them on bosserver restarts. On Windows, the SCM integrator saves the argument list, just use them. Reviewed-on: http://gerrit.openafs.org/5532 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear (cherry picked from commit db472e730e3989dac1d49b54d7371b54b24cd63c) Change-Id: Ic6a8534f84f31f94e69c18fd970ecd368f7ee39e Reviewed-on: http://gerrit.openafs.org/7395 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- diff --git a/src/WINNT/bosctlsvc/bosctlsvc.c b/src/WINNT/bosctlsvc/bosctlsvc.c index 475d7acc7..0a93e6bf9 100644 --- a/src/WINNT/bosctlsvc/bosctlsvc.c +++ b/src/WINNT/bosctlsvc/bosctlsvc.c @@ -35,7 +35,6 @@ #define BOSSERVER_STARTMSG_EXE "afslegal.exe" -#define BOSSERVER_RESTART_ARG_MAX 3 /* "-noauth", "-log", "-rxbind" */ #define BOSSERVER_WAIT_TIME_HINT 60 /* seconds */ #define BOSSERVER_STOP_TIME_MAX (FSSDTIME + 60) /* seconds */ @@ -76,7 +75,6 @@ static void BosserverDoStopEvent(pid_t cpid, static void BosserverDoExitEvent(pid_t cpid, BOOL *doWait, BOOL *doRestart, - char **restartArgv, DWORD *stopStatus, BOOL *isWin32Code); @@ -382,7 +380,6 @@ static void BosserverDoExitEvent(pid_t cpid, BOOL *doWait, BOOL *doRestart, - char **restartArgv, DWORD *stopStatus, BOOL *isWin32Code) { @@ -402,27 +399,6 @@ BosserverDoExitEvent(pid_t cpid, /* bosserver requests restart */ int i; *doRestart = TRUE; - - /* set up bosserver argument list */ - restartArgv[0] = (char *)AFSDIR_SERVER_BOSVR_FILEPATH; - i = 1; - - if (exitCode & BOSEXIT_NOAUTH_FLAG) { - /* pass "-noauth" to new bosserver */ - restartArgv[i] = "-noauth"; - i++; - } - if (exitCode & BOSEXIT_LOGGING_FLAG) { - /* pass "-log" to new bosserver */ - restartArgv[i] = "-log"; - i++; - } - if (exitCode & BOSEXIT_RXBIND_FLAG) { - /* pass "-rxbind" to new bosserver */ - restartArgv[i] = "-rxbind"; - i++; - } - restartArgv[i] = NULL; } } @@ -464,9 +440,8 @@ BosserverRun(DWORD argc, /* Set env variable forcing process mgmt lib to spawn processes detached */ (void)putenv(PMGT_SPAWN_DETACHED_ENV_NAME "=1"); - /* Alloc block with room for at least BOSSERVER_RESTART_ARG_MAX args */ - i = max((argc + 1), (BOSSERVER_RESTART_ARG_MAX + 2)); - spawn_argv = (char **)malloc(i * sizeof(char *)); + /* Alloc block with room for arguments plus a terminator */ + spawn_argv = (char **)malloc((argc + 1) * sizeof(char *)); if (spawn_argv == NULL) { /* failed to malloc required space; can not continue */ @@ -536,7 +511,7 @@ BosserverRun(DWORD argc, /* exit event signaled; see function comment for outcomes */ BosserverDoExitEvent(cpid, &doWait, - &doRestart, spawn_argv, + &doRestart, stopStatus, isWin32Code); } else { diff --git a/src/bozo/bnode.p.h b/src/bozo/bnode.p.h index 971d27219..d4b6da27b 100644 --- a/src/bozo/bnode.p.h +++ b/src/bozo/bnode.p.h @@ -124,9 +124,6 @@ struct bozo_bosEntryStats { #ifdef AFS_NT40_ENV #define BOSEXIT_RESTART 0xA0 #define BOSEXIT_DORESTART(code) (((code) & ~(0xF)) == BOSEXIT_RESTART) -#define BOSEXIT_NOAUTH_FLAG 0x01 -#define BOSEXIT_LOGGING_FLAG 0x02 -#define BOSEXIT_RXBIND_FLAG 0x04 #endif /* max time to wait for fileserver shutdown */ diff --git a/src/bozo/bosserver.c b/src/bozo/bosserver.c index 632e6ada3..562e3b799 100644 --- a/src/bozo/bosserver.c +++ b/src/bozo/bosserver.c @@ -66,6 +66,10 @@ struct afsconf_dir *bozo_confdir = 0; /* bozo configuration dir */ static PROCESS bozo_pid; const char *bozo_fileName; FILE *bozo_logFile; +#ifndef AFS_NT40_ENV +static int bozo_argc = 0; +static char** bozo_argv = NULL; +#endif const char *DoCore; int DoLogging = 0; @@ -112,62 +116,13 @@ int bozo_ReBozo(void) { #ifdef AFS_NT40_ENV - /* exit with restart code; SCM integrator process will restart bosserver */ - int status = BOSEXIT_RESTART; - - /* if noauth flag is set, pass "-noauth" to new bosserver */ - if (afsconf_GetNoAuthFlag(bozo_confdir)) { - status |= BOSEXIT_NOAUTH_FLAG; - } - /* if logging is on, pass "-log" to new bosserver */ - if (DoLogging) { - status |= BOSEXIT_LOGGING_FLAG; - } - /* if rxbind is set, pass "-rxbind" to new bosserver */ - if (rxBind) { - status |= BOSEXIT_RXBIND_FLAG; - } - exit(status); + /* exit with restart code; SCM integrator process will restart bosserver with + the same arguments */ + exit(BOSEXIT_RESTART); #else /* exec new bosserver process */ - char *argv[4]; int i = 0; - argv[i] = (char *)AFSDIR_SERVER_BOSVR_FILEPATH; - i++; - - /* if noauth flag is set, pass "-noauth" to new bosserver */ - if (afsconf_GetNoAuthFlag(bozo_confdir)) { - argv[i] = "-noauth"; - i++; - } - /* if logging is on, pass "-log" to new bosserver */ - if (DoLogging) { - argv[i] = "-log"; - i++; - } - /* if rxbind is set, pass "-rxbind" to new bosserver */ - if (rxBind) { - argv[i] = "-rxbind"; - i++; - } -#ifndef AFS_NT40_ENV - /* if syslog logging is on, pass "-syslog" to new bosserver */ - if (DoSyslog) { - char *arg = (char *)malloc(40); /* enough for -syslog=# */ - if (DoSyslogFacility != LOG_DAEMON) { - snprintf(arg, 40, "-syslog=%d", DoSyslogFacility); - } else { - strcpy(arg, "-syslog"); - } - argv[i] = arg; - i++; - } -#endif - - /* null-terminate argument list */ - argv[i] = NULL; - /* close random fd's */ for (i = 3; i < 64; i++) { close(i); @@ -175,7 +130,7 @@ bozo_ReBozo(void) unlink(AFSDIR_SERVER_BOZRXBIND_FILEPATH); - execv(argv[0], argv); /* should not return */ + execv(bozo_argv[0], bozo_argv); /* should not return */ _exit(1); #endif /* AFS_NT40_ENV */ } @@ -923,8 +878,23 @@ main(int argc, char **argv, char **envp) } #endif +#ifndef AFS_NT40_ENV + /* save args for restart */ + bozo_argc = argc; + bozo_argv = malloc((argc+1) * sizeof(char*)); + if (!bozo_argv) { + fprintf(stderr, "%s: Failed to allocate argument list.\n", argv[0]); + exit(1); + } + bozo_argv[0] = (char*)AFSDIR_SERVER_BOSVR_FILEPATH; /* expected path */ + bozo_argv[bozo_argc] = NULL; /* null terminate list */ +#endif /* AFS_NT40_ENV */ + /* parse cmd line */ for (code = 1; code < argc; code++) { +#ifndef AFS_NT40_ENV + bozo_argv[code] = argv[code]; +#endif /* AFS_NT40_ENV */ if (strcmp(argv[code], "-noauth") == 0) { /* set noauth flag */ noAuth = 1;