From 3affea8f990e70e79b8a8582e7f9c4b011c0fa7c Mon Sep 17 00:00:00 2001 From: Rebecca Cran Date: Tue, 17 Aug 2010 09:39:06 +0000 Subject: [PATCH] To restart, sysinstall calls execl. Since it will create a new process, we can't check to see if sysinstall is running as init just by checking if the PID is 0. Introduce a new option that sets the RunningAsInit flag, and update the code to check RunningAsInit intstead of getpid(). PR: bin/38854 Submitted by: Peter Sedeffow Approved by: rrs (mentor) MFC after: 1 month --- usr.sbin/sysinstall/globals.c | 3 -- usr.sbin/sysinstall/install.c | 2 +- usr.sbin/sysinstall/main.c | 58 +++++++++++++++++++++++------------ usr.sbin/sysinstall/msg.c | 2 +- usr.sbin/sysinstall/system.c | 12 ++++++-- usr.sbin/sysinstall/termcap.c | 2 +- 6 files changed, 51 insertions(+), 28 deletions(-) diff --git a/usr.sbin/sysinstall/globals.c b/usr.sbin/sysinstall/globals.c index 9119c15b2494..6c98b069454c 100644 --- a/usr.sbin/sysinstall/globals.c +++ b/usr.sbin/sysinstall/globals.c @@ -76,13 +76,10 @@ globalsInit(void) { DebugFD = -1; ColorDisplay = FALSE; - Fake = FALSE; - Restarting = FALSE; OnVTY = FALSE; DialogActive = FALSE; VarHead = NULL; mediaDevice = NULL; - RunningAsInit = FALSE; HomeChunk = NULL; RootChunk = NULL; diff --git a/usr.sbin/sysinstall/install.c b/usr.sbin/sysinstall/install.c index cd43e94ff7c8..07a16d17dd62 100644 --- a/usr.sbin/sysinstall/install.c +++ b/usr.sbin/sysinstall/install.c @@ -1274,7 +1274,7 @@ installVarDefaults(dialogMenuItem *self) variable_set2(VAR_FIXIT_TTY, "serial", 0); variable_set2(VAR_PKG_TMPDIR, "/var/tmp", 0); variable_set2(VAR_MEDIA_TIMEOUT, itoa(MEDIA_TIMEOUT), 0); - if (getpid() != 1) + if (!RunningAsInit) variable_set2(SYSTEM_STATE, "update", 0); else variable_set2(SYSTEM_STATE, "init", 0); diff --git a/usr.sbin/sysinstall/main.c b/usr.sbin/sysinstall/main.c index 47cbbcd2bc1b..3f9164a0d693 100644 --- a/usr.sbin/sysinstall/main.c +++ b/usr.sbin/sysinstall/main.c @@ -56,12 +56,42 @@ main(int argc, char **argv) int choice, scroll, curr, max, status; char titlestr[80], *arch, *osrel, *ostype; struct rlimit rlim; - + char *arg; + int i; + int optionArgs = 0; + /* Record name to be able to restart */ StartName = argv[0]; + Restarting = FALSE; + RunningAsInit = FALSE; + Fake = FALSE; + + for (i = 1; i < argc; i++) { + arg = argv[i]; + + if (arg[0] != '-') + break; + + optionArgs++; + + if (!strcmp(arg, "-fake")) { + variable_set2(VAR_DEBUG, "YES", 0); + Fake = TRUE; + } else if (!strcmp(arg, "-restart")) { + Restarting = TRUE; + } else if (!strcmp(arg, "-fakeInit")) { + RunningAsInit = TRUE; + } + + arg = argv[optionArgs+1]; + } + + if (getpid() == 1) + RunningAsInit = TRUE; + /* Catch fatal signals and complain about them if running as init */ - if (getpid() == 1) { + if (RunningAsInit) { signal(SIGBUS, screech); signal(SIGSEGV, screech); } @@ -105,13 +135,8 @@ main(int argc, char **argv) if (!RunningAsInit) installEnvironment(); - if (argc > 1 && !strcmp(argv[1], "-fake")) { - variable_set2(VAR_DEBUG, "YES", 0); - Fake = TRUE; + if (Fake) msgConfirm("I'll be just faking it from here on out, OK?"); - } - if (argc > 1 && !strcmp(argv[1], "-restart")) - Restarting = TRUE; /* Try to preserve our scroll-back buffer */ if (OnVTY) { @@ -140,19 +165,14 @@ main(int argc, char **argv) /* First, see if we have any arguments to process (and argv[0] counts if it's not "sysinstall") */ if (!RunningAsInit) { - int i, start_arg; - - if (!strstr(argv[0], "sysinstall")) - start_arg = 0; - else if (Fake || Restarting) - start_arg = 2; - else - start_arg = 1; - for (i = start_arg; i < argc; i++) { + for (i = optionArgs+1; i < argc; i++) { if (DITEM_STATUS(dispatchCommand(argv[i])) != DITEM_SUCCESS) systemShutdown(1); } - if (argc > start_arg) + + /* If we were given commands to process on the command line, just exit + * now */ + if (argc > optionArgs+1) systemShutdown(0); } else @@ -187,7 +207,7 @@ main(int argc, char **argv) while (1) { choice = scroll = curr = max = 0; dmenuOpen(&MenuInitial, &choice, &scroll, &curr, &max, TRUE); - if (getpid() != 1 + if (!RunningAsInit #if defined(__sparc64__) || !msgNoYes("Are you sure you wish to exit? The system will halt.") #else diff --git a/usr.sbin/sysinstall/msg.c b/usr.sbin/sysinstall/msg.c index f11c72b17fc3..6e20c60ae5a0 100644 --- a/usr.sbin/sysinstall/msg.c +++ b/usr.sbin/sysinstall/msg.c @@ -233,7 +233,7 @@ msgFatal(char *fmt, ...) mvaddstr(StatusLine, 0, errstr); addstr(" - "); addstr("PRESS ANY KEY TO "); - if (getpid() == 1) + if (RunningAsInit) addstr("REBOOT"); else addstr("QUIT"); diff --git a/usr.sbin/sysinstall/system.c b/usr.sbin/sysinstall/system.c index ce1aa4b61b2a..91ea2b21782b 100644 --- a/usr.sbin/sysinstall/system.c +++ b/usr.sbin/sysinstall/system.c @@ -59,13 +59,20 @@ static int intr_restart(dialogMenuItem *self) { int ret, fd, fdmax; + char *arg; mediaClose(); free_variables(); fdmax = getdtablesize(); for (fd = 3; fd < fdmax; fd++) close(fd); - ret = execl(StartName, StartName, "-restart", (char *)NULL); + + if (RunningAsInit) + arg = "-restart -fakeInit"; + else + arg = "-restart"; + + ret = execl(StartName, StartName, arg, NULL); msgDebug("execl failed (%s)\n", strerror(errno)); /* NOTREACHED */ return -1; @@ -148,11 +155,10 @@ systemInitialize(int argc, char **argv) variable_set2(VAR_DEBUG, "YES", 0); /* Are we running as init? */ - if (getpid() == 1) { + if (RunningAsInit) { struct ufs_args ufs_args; int fd; - RunningAsInit = 1; setsid(); close(0); fd = open("/dev/ttyv0", O_RDWR); diff --git a/usr.sbin/sysinstall/termcap.c b/usr.sbin/sysinstall/termcap.c index 4f2b2e90cd9e..4dc36c2ce488 100644 --- a/usr.sbin/sysinstall/termcap.c +++ b/usr.sbin/sysinstall/termcap.c @@ -105,7 +105,7 @@ set_termcap(void) else { int i, on; - if (getpid() == 1) { + if (RunningAsInit) { DebugFD = open("/dev/ttyv1", O_WRONLY); if (DebugFD != -1) { on = 1;