X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fchroot.c;h=78751df84c30ffb019b6a147453f1347904c1618;hb=00bd76728d44901a260f2dcdbeed52b3c85d6b6b;hp=3622c26dc7461360dafbed65bb18a193608883e9;hpb=029011b9eeaf491d00fda1d072c4c6094df96c3a;p=oweals%2Fbusybox.git diff --git a/coreutils/chroot.c b/coreutils/chroot.c index 3622c26dc..78751df84 100644 --- a/coreutils/chroot.c +++ b/coreutils/chroot.c @@ -2,75 +2,54 @@ /* * Mini chroot implementation for busybox * + * Copyright (C) 1999-2004 by Erik Andersen * - * Copyright (C) 1999 by Lineo, inc. - * Written by Erik Andersen , - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ - -#include "internal.h" -#include -#include -#include - - -static const char chroot_usage[] = "chroot NEWROOT [COMMAND...]\n\n" - - "Run COMMAND with root directory set to NEWROOT.\n"; - - - -int chroot_main(int argc, char **argv) +//config:config CHROOT +//config: bool "chroot (3.7 kb)" +//config: default y +//config: help +//config: chroot is used to change the root directory and run a command. +//config: The default command is '/bin/sh'. + +//applet:IF_CHROOT(APPLET_NOEXEC(chroot, chroot, BB_DIR_USR_SBIN, BB_SUID_DROP, chroot)) + +//kbuild:lib-$(CONFIG_CHROOT) += chroot.o + +/* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */ + +//usage:#define chroot_trivial_usage +//usage: "NEWROOT [PROG ARGS]" +//usage:#define chroot_full_usage "\n\n" +//usage: "Run PROG with root directory set to NEWROOT" +//usage: +//usage:#define chroot_example_usage +//usage: "$ ls -l /bin/ls\n" +//usage: "lrwxrwxrwx 1 root root 12 Apr 13 00:46 /bin/ls -> /BusyBox\n" +//usage: "# mount /dev/hdc1 /mnt -t minix\n" +//usage: "# chroot /mnt\n" +//usage: "# ls -l /bin/ls\n" +//usage: "-rwxr-xr-x 1 root root 40816 Feb 5 07:45 /bin/ls*\n" + +#include "libbb.h" + +int chroot_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int chroot_main(int argc UNUSED_PARAM, char **argv) { - if ((argc < 2) || (**(argv + 1) == '-')) { - usage(chroot_usage); + ++argv; + if (!*argv) + bb_show_usage(); + + xchroot(*argv); + + ++argv; + if (!*argv) { /* no 2nd param (PROG), use shell */ + argv -= 2; + argv[0] = (char *) get_shell_name(); + argv[1] = (char *) "-i"; /* GNU coreutils 8.4 compat */ + /*argv[2] = NULL; - already is */ } - argc--; - argv++; - - if (chroot(*argv) || (chdir("/"))) { - fprintf(stderr, "chroot: cannot change root directory to %s: %s\n", - *argv, strerror(errno)); - exit(FALSE); - } - - 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"; - execlp(prog, prog, NULL); - } - fprintf(stderr, "chroot: cannot execute %s: %s\n", - *argv, strerror(errno)); - exit(FALSE); + BB_EXECVP_or_die(argv); } - - -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/