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:
parent
2793b01844
commit
3affea8f99
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user