svn commit: r211417 - head/usr.sbin/sysinstall

Bruce Cran brucec at FreeBSD.org
Tue Aug 17 09:39:07 UTC 2010


Author: brucec
Date: Tue Aug 17 09:39:06 2010
New Revision: 211417
URL: http://svn.freebsd.org/changeset/base/211417

Log:
  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

Modified:
  head/usr.sbin/sysinstall/globals.c
  head/usr.sbin/sysinstall/install.c
  head/usr.sbin/sysinstall/main.c
  head/usr.sbin/sysinstall/msg.c
  head/usr.sbin/sysinstall/system.c
  head/usr.sbin/sysinstall/termcap.c

Modified: head/usr.sbin/sysinstall/globals.c
==============================================================================
--- head/usr.sbin/sysinstall/globals.c	Tue Aug 17 09:13:26 2010	(r211416)
+++ head/usr.sbin/sysinstall/globals.c	Tue Aug 17 09:39:06 2010	(r211417)
@@ -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;

Modified: head/usr.sbin/sysinstall/install.c
==============================================================================
--- head/usr.sbin/sysinstall/install.c	Tue Aug 17 09:13:26 2010	(r211416)
+++ head/usr.sbin/sysinstall/install.c	Tue Aug 17 09:39:06 2010	(r211417)
@@ -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);

Modified: head/usr.sbin/sysinstall/main.c
==============================================================================
--- head/usr.sbin/sysinstall/main.c	Tue Aug 17 09:13:26 2010	(r211416)
+++ head/usr.sbin/sysinstall/main.c	Tue Aug 17 09:39:06 2010	(r211417)
@@ -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

Modified: head/usr.sbin/sysinstall/msg.c
==============================================================================
--- head/usr.sbin/sysinstall/msg.c	Tue Aug 17 09:13:26 2010	(r211416)
+++ head/usr.sbin/sysinstall/msg.c	Tue Aug 17 09:39:06 2010	(r211417)
@@ -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");

Modified: head/usr.sbin/sysinstall/system.c
==============================================================================
--- head/usr.sbin/sysinstall/system.c	Tue Aug 17 09:13:26 2010	(r211416)
+++ head/usr.sbin/sysinstall/system.c	Tue Aug 17 09:39:06 2010	(r211417)
@@ -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);

Modified: head/usr.sbin/sysinstall/termcap.c
==============================================================================
--- head/usr.sbin/sysinstall/termcap.c	Tue Aug 17 09:13:26 2010	(r211416)
+++ head/usr.sbin/sysinstall/termcap.c	Tue Aug 17 09:39:06 2010	(r211417)
@@ -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;


More information about the svn-src-all mailing list