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 <peter at trumanbrewery.com>
Approved by:	rrs (mentor)
MFC after:	1 month
This commit is contained in:
Rebecca Cran 2010-08-17 09:39:06 +00:00
parent 2793b01844
commit 3affea8f99
6 changed files with 51 additions and 28 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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");

View File

@ -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);

View File

@ -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;