bozo: preserve all options over restart
authorMichael Meffie <mmeffie@sinenomine.net>
Fri, 30 Sep 2011 16:22:27 +0000 (12:22 -0400)
committerDerrick Brashear <shadow@dementix.org>
Wed, 14 Dec 2011 17:10:46 +0000 (09:10 -0800)
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 <shadow@dementix.org>
Tested-by: Derrick Brashear <shadow@dementix.org>

src/WINNT/bosctlsvc/bosctlsvc.c
src/bozo/bnode.p.h
src/bozo/bosserver.c

index 475d7ac..0a93e6b 100644 (file)
@@ -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 {
index 971d272..d4b6da2 100644 (file)
@@ -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 */
index ff701f4..2b8d88d 100644 (file)
@@ -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;