svn commit: trunk/busybox/util-linux

vda at busybox.net vda at busybox.net
Fri Jul 11 23:44:52 UTC 2008


Author: vda
Date: 2008-07-11 16:44:50 -0700 (Fri, 11 Jul 2008)
New Revision: 22809

Log:
switch_root: shrink

function                                             old     new   delta
switch_root_main                                     402     401      -1
rootdev                                                8       -      -8
delete_contents                                      226     179     -47
------------------------------------------------------------------------------
(add/remove: 0/1 grow/shrink: 0/2 up/down: 0/-56)             Total: -56 bytes



Modified:
   trunk/busybox/util-linux/switch_root.c


Changeset:
Modified: trunk/busybox/util-linux/switch_root.c
===================================================================
--- trunk/busybox/util-linux/switch_root.c	2008-07-11 23:09:34 UTC (rev 22808)
+++ trunk/busybox/util-linux/switch_root.c	2008-07-11 23:44:50 UTC (rev 22809)
@@ -9,9 +9,7 @@
 #include "libbb.h"
 #include <sys/vfs.h>
 
-
 // Make up for header deficiencies.
-
 #ifndef RAMFS_MAGIC
 #define RAMFS_MAGIC ((unsigned)0x858458f6)
 #endif
@@ -24,18 +22,16 @@
 #define MS_MOVE     8192
 #endif
 
-static dev_t rootdev;
-
 // Recursively delete contents of rootfs.
-
-static void delete_contents(const char *directory)
+static void delete_contents(const char *directory, dev_t rootdev)
 {
 	DIR *dir;
 	struct dirent *d;
 	struct stat st;
 
 	// Don't descend into other filesystems
-	if (lstat(directory, &st) || st.st_dev != rootdev) return;
+	if (lstat(directory, &st) || st.st_dev != rootdev)
+		return;
 
 	// Recursively delete the contents of directories.
 	if (S_ISDIR(st.st_mode)) {
@@ -45,13 +41,13 @@
 				char *newdir = d->d_name;
 
 				// Skip . and ..
-				if (*newdir=='.' && (!newdir[1] || (newdir[1]=='.' && !newdir[2])))
+				if (DOT_OR_DOTDOT(newdir))
 					continue;
 
 				// Recurse to delete contents
-				newdir = alloca(strlen(directory) + strlen(d->d_name) + 2);
-				sprintf(newdir, "%s/%s", directory, d->d_name);
-				delete_contents(newdir);
+				newdir = concat_path_file(directory, newdir);
+				delete_contents(newdir, rootdev);
+				free(newdir);
 			}
 			closedir(dir);
 
@@ -60,7 +56,6 @@
 		}
 
 	// It wasn't a directory.  Zap it.
-
 	} else unlink(directory);
 }
 
@@ -70,15 +65,14 @@
 	char *newroot, *console = NULL;
 	struct stat st1, st2;
 	struct statfs stfs;
+	dev_t rootdev;
 
 	// Parse args (-c console)
-
 	opt_complementary = "-2"; // minimum 2 params
 	getopt32(argv, "+c:", &console); // '+': stop parsing at first non-option
 	argv += optind;
 
 	// Change to new root directory and verify it's a different fs.
-
 	newroot = *argv++;
 
 	xchdir(newroot);
@@ -90,7 +84,6 @@
 	// Additional sanity checks: we're about to rm -rf /,  so be REALLY SURE
 	// we mean it.  (I could make this a CONFIG option, but I would get email
 	// from all the people who WILL eat their filesystems.)
-
 	if (lstat("/init", &st1) || !S_ISREG(st1.st_mode) || statfs("/", &stfs)
 	 || (((unsigned)stfs.f_type != RAMFS_MAGIC) && ((unsigned)stfs.f_type != TMPFS_MAGIC))
 	 || (getpid() != 1)
@@ -99,24 +92,21 @@
 	}
 
 	// Zap everything out of rootdev
+	delete_contents("/", rootdev);
 
-	delete_contents("/");
-
 	// Overmount / with newdir and chroot into it.  The chdir is needed to
 	// recalculate "." and ".." links.
-
 	if (mount(".", "/", NULL, MS_MOVE, NULL))
 		bb_error_msg_and_die("error moving root");
 	xchroot(".");
 	xchdir("/");
 
 	// If a new console specified, redirect stdin/stdout/stderr to that.
-
 	if (console) {
 		close(0);
 		xopen(console, O_RDWR);
-		dup2(0, 1);
-		dup2(0, 2);
+		xdup2(0, 1);
+		xdup2(0, 2);
 	}
 
 	// Exec real init.  (This is why we must be pid 1.)




More information about the busybox-cvs mailing list