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;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to