summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sysinstall
diff options
context:
space:
mode:
authorbrucec <brucec@FreeBSD.org>2010-08-17 09:39:06 +0000
committerbrucec <brucec@FreeBSD.org>2010-08-17 09:39:06 +0000
commit8d54dbc4591e4b62384caa7d630faa4299ee25b5 (patch)
treedddcbea3eb4b045482f04c13e365e39ed7d2049f /usr.sbin/sysinstall
parent5a79777b4407edd39781e06216e4dc6ca68bb6a7 (diff)
downloadFreeBSD-src-8d54dbc4591e4b62384caa7d630faa4299ee25b5.zip
FreeBSD-src-8d54dbc4591e4b62384caa7d630faa4299ee25b5.tar.gz
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
Diffstat (limited to 'usr.sbin/sysinstall')
-rw-r--r--usr.sbin/sysinstall/globals.c3
-rw-r--r--usr.sbin/sysinstall/install.c2
-rw-r--r--usr.sbin/sysinstall/main.c58
-rw-r--r--usr.sbin/sysinstall/msg.c2
-rw-r--r--usr.sbin/sysinstall/system.c12
-rw-r--r--usr.sbin/sysinstall/termcap.c2
6 files changed, 51 insertions, 28 deletions
diff --git a/usr.sbin/sysinstall/globals.c b/usr.sbin/sysinstall/globals.c
index 9119c15..6c98b06 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 cd43e94..07a16d1 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 47cbbcd..3f9164a 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 f11c72b..6e20c60 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 ce1aa4b..91ea2b2 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 4f2b2e9..4dc36c2 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;
OpenPOWER on IntegriCloud