From db472e730e3989dac1d49b54d7371b54b24cd63c Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Fri, 30 Sep 2011 12:22:27 -0400 Subject: [PATCH] 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. Change-Id: Ib54d1b0c9430946cce666d09f5ed923016d5ac8b Reviewed-on: http://gerrit.openafs.org/5532 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/WINNT/bosctlsvc/bosctlsvc.c | 31 ++------------ src/bozo/bnode.p.h | 3 -- src/bozo/bosserver.c | 76 ++++++++++----------------------- 3 files changed, 26 insertions(+), 84 deletions(-) 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 ff701f461..2b8d88de8 100644 --- a/src/bozo/bosserver.c +++ b/src/bozo/bosserver.c @@ -54,6 +54,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; @@ -100,62 +104,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); @@ -163,7 +118,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 */ } @@ -910,8 +865,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; -- 2.39.5