1/* See LICENSE file for copyright and license details. */
2
3
4#include <errno.h>
5#include <stdlib.h>
6#include <unistd.h>
7
8#include "util.h"
9
10static void
11usage(void)
12{
13 eprintf("usage: %s dir [cmd [arg ...]]\n", argv0);
14}
15
16// ?man chroot: run command in new root
17// ?man arguments: dir [cmd [arg ...
18// ?man run a command or shell with a substitute root directory
19int
20main(int argc, char *argv[])
21{
22 char *shell[] = { "/bin/sh", "-i", NULL }, *aux, *cmd;
23 int savederrno;
24
25 ARGBEGIN {
26 default:
27 usage();
28 } ARGEND
29
30 if (!argc)
31 usage();
32
33 if ((aux = getenv("SHELL")))
34 shell[0] = aux;
35
36 if (chroot(argv[0]) < 0)
37 eprintf("chroot %s:", argv[0]);
38
39 if (chdir("/") < 0)
40 eprintf("chdir:");
41
42 if (argc == 1) {
43 cmd = *shell;
44 execvp(cmd, shell);
45 } else {
46 cmd = argv[1];
47 execvp(cmd, argv + 1);
48 }
49
50 savederrno = errno;
51 weprintf("execvp %s:", cmd);
52
53 _exit(126 + (savederrno == ENOENT));
54}