Use an int to hold the result of fgetc (bug noted by David Kimdon).
[oweals/busybox.git] / coreutils / chroot.c
index d39549496542978484a089ad02e91c7ac404b254..ba3e5f86434ca5dbdfc98c3180ec68ff135d47a6 100644 (file)
@@ -1,7 +1,9 @@
+/* vi: set sw=4 ts=4: */
 /*
  * Mini chroot implementation for busybox
  *
- * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ * Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen
+ * Copyright (C) 1999,2000,2001 by Erik Andersen <andersee@debian.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  *
  */
 
-#include "internal.h"
+#include <stdlib.h>
 #include <stdio.h>
 #include <unistd.h>
-
-
-static const char chroot_usage[] = "NEWROOT [COMMAND...]\n"
-"Run COMMAND with root directory set to NEWROOT.\n";
-
-
+#include <errno.h>
+#include "busybox.h"
 
 int chroot_main(int argc, char **argv)
 {
-    if (argc < 2) {
-       fprintf(stderr, "Usage: %s %s", *argv, chroot_usage);
-       return( FALSE);
-    }
-    argc--;
-    argv++;
+       char *prog;
 
-    fprintf(stderr, "new root: %s\n", *argv);
-    
-    if (chroot (*argv) || (chdir ("/"))) {
-       perror("cannot chroot");
-       return( FALSE);
-    }
+       if ((argc < 2) || (**(argv + 1) == '-')) {
+               show_usage();
+       }
+       argc--;
+       argv++;
+
+       if (chroot(*argv) || (chdir("/"))) {
+               perror_msg_and_die("cannot change root directory to %s", *argv);
+       }
+
+       argc--;
+       argv++;
+       if (argc >= 1) {
+               prog = *argv;
+               execvp(*argv, argv);
+       } else {
+#if defined shell_main && defined CONFIG_FEATURE_SH_STANDALONE_SHELL
+               char shell[] = "/bin/sh";
+               char *shell_argv[2] = { shell, NULL };
+               applet_name = shell;
+               shell_main(1, shell_argv);
+               return EXIT_SUCCESS;
+#else
+               prog = getenv("SHELL");
+               if (!prog)
+                       prog = "/bin/sh";
+               execlp(prog, prog, NULL);
+#endif
+       }
+       perror_msg_and_die("cannot execute %s", prog);
 
-    argc--;
-    argv++;
-    if (argc >= 1) {
-       fprintf(stderr, "command: %s\n", *argv);
-       execvp (*argv, argv);
-    }
-    else {
-       char *prog;
-       prog = getenv ("SHELL");
-       if (!prog)
-           prog = "/bin/sh";
-       fprintf(stderr, "no command. running: %s\n", prog);
-       execlp (prog, prog, NULL);
-    }
-    perror("cannot exec");
-    return(FALSE);
 }
 
+
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/