Fix chroot, leave console alone if -c not specified, and yank debug code.
authorRob Landley <rob@landley.net>
Tue, 20 Dec 2005 17:25:51 +0000 (17:25 -0000)
committerRob Landley <rob@landley.net>
Tue, 20 Dec 2005 17:25:51 +0000 (17:25 -0000)
(I still haven't set up a test environment to confirm this works...)

util-linux/switch_root.c

index 2426995608b7aa7329787029a15243b4bea29828..0c86eec080074b29e7542f9b521af68970ed3cb6 100644 (file)
@@ -56,17 +56,17 @@ static void delete_contents(char *directory)
                        closedir(dir);
                        
                        // Directory should now be empty.  Zap it.
-                       printf("rmdir %s\n",directory); // rmdir(directory);
+                       rmdir(directory);
                }
                
        // It wasn't a directory.  Zap it.
                
-       } else printf("unlink %s\n",directory); //unlink(directory);
+       } else unlink(directory);
 }
 
 int switch_root_main(int argc, char *argv[])
 {
-       char *newroot, *console="/dev/console";
+       char *newroot, *console=NULL;
        struct stat st1, st2;
        struct statfs stfs;
 
@@ -98,19 +98,24 @@ int switch_root_main(int argc, char *argv[])
        }
 
        // Zap everything out of rootdev
+
        delete_contents("/");
        
-       // Overmount / with newdir
+       // Overmount / with newdir and chroot into it.  The chdir is needed to
+       // recalculate "." and ".." links.
 
-       if (mount(".", "/", NULL, MS_MOVE, NULL) || chdir("/"))
+       if (mount(".", "/", NULL, MS_MOVE, NULL) || chroot(".") || chdir("/"))
                bb_error_msg_and_die("moving root");
        
-       // Reopen stdin/stdout/stderr to /dev/console
-       close(0);
-       if(open(console, O_RDWR) < 0)
-               bb_error_msg_and_die("Bad console '%s'",console);
-       dup2(0, 1);
-       dup2(0, 2);
+       // If a new console specified, redirect stdin/stdout/stderr to that.
+
+       if (console) {
+               close(0);
+               if(open(console, O_RDWR) < 0)
+                       bb_error_msg_and_die("Bad console '%s'",console);
+               dup2(0, 1);
+               dup2(0, 2);
+       }
 
        // Exec real init.  (This is why we must be pid 1.)
        execv(argv[optind],argv+optind+1);