switch_root: error_msg -> perror_msg, reduce by 22 bytes while at it.
diff --git a/util-linux/switch_root.c b/util-linux/switch_root.c
index 6dba9f0..88bb9db 100644
--- a/util-linux/switch_root.c
+++ b/util-linux/switch_root.c
@@ -75,14 +75,14 @@
 
 	opt_complementary = "-2";
 	getopt32(argc, argv, "c:", &console);
+	argv += optind;
 
 	// Change to new root directory and verify it's a different fs.
 
-	newroot = argv[optind++];
+	newroot = *argv++;
 
-	if (chdir(newroot) || lstat(".", &st1) || lstat("/", &st2) ||
-		st1.st_dev == st2.st_dev)
-	{
+	xchdir(newroot);
+	if (lstat(".", &st1) || lstat("/", &st2) || st1.st_dev == st2.st_dev) {
 		bb_error_msg_and_die("bad newroot %s", newroot);
 	}
 	rootdev = st2.st_dev;
@@ -105,8 +105,9 @@
 	// Overmount / with newdir and chroot into it.  The chdir is needed to
 	// recalculate "." and ".." links.
 
-	if (mount(".", "/", NULL, MS_MOVE, NULL) || chroot(".") || chdir("/"))
+	if (mount(".", "/", NULL, MS_MOVE, NULL) || chroot("."))
 		bb_error_msg_and_die("error moving root");
+	xchdir("/");
 
 	// If a new console specified, redirect stdin/stdout/stderr to that.
 
@@ -118,6 +119,6 @@
 	}
 
 	// Exec real init.  (This is why we must be pid 1.)
-	execv(argv[optind], argv+optind);
-	bb_error_msg_and_die("bad init '%s'", argv[optind]);
+	execv(argv[0], argv);
+	bb_perror_msg_and_die("bad init %s", argv[0]);
 }