diff options
Diffstat (limited to 'coreutils/chroot.c')
-rw-r--r-- | coreutils/chroot.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/coreutils/chroot.c b/coreutils/chroot.c new file mode 100644 index 000000000..62cfdc244 --- /dev/null +++ b/coreutils/chroot.c | |||
@@ -0,0 +1,37 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * Mini chroot implementation for busybox | ||
4 | * | ||
5 | * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. | ||
8 | */ | ||
9 | |||
10 | /* BB_AUDIT SUSv3 N/A -- Matches GNU behavior. */ | ||
11 | |||
12 | #include "busybox.h" | ||
13 | |||
14 | int chroot_main(int argc, char **argv) | ||
15 | { | ||
16 | if (argc < 2) { | ||
17 | bb_show_usage(); | ||
18 | } | ||
19 | |||
20 | ++argv; | ||
21 | if (chroot(*argv)) { | ||
22 | bb_perror_msg_and_die("cannot change root directory to %s", *argv); | ||
23 | } | ||
24 | xchdir("/"); | ||
25 | |||
26 | ++argv; | ||
27 | if (argc == 2) { | ||
28 | argv -= 2; | ||
29 | if (!(*argv = getenv("SHELL"))) { | ||
30 | *argv = (char *) DEFAULT_SHELL; | ||
31 | } | ||
32 | argv[1] = (char *) "-i"; | ||
33 | } | ||
34 | |||
35 | execvp(*argv, argv); | ||
36 | bb_perror_msg_and_die("cannot execute %s", *argv); | ||
37 | } | ||