#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 */
static void BosserverDoExitEvent(pid_t cpid,
BOOL *doWait,
BOOL *doRestart,
- char **restartArgv,
DWORD *stopStatus,
BOOL *isWin32Code);
BosserverDoExitEvent(pid_t cpid,
BOOL *doWait,
BOOL *doRestart,
- char **restartArgv,
DWORD *stopStatus,
BOOL *isWin32Code)
{
/* 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;
}
}
/* 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 */
/* exit event signaled; see function comment for outcomes */
BosserverDoExitEvent(cpid,
&doWait,
- &doRestart, spawn_argv,
+ &doRestart,
stopStatus, isWin32Code);
} else {
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;
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);
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 */
}
}
#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;