1/* See LICENSE file for copyright and license details. */
2
3#include <errno.h>
4#include <stdlib.h>
5#include <unistd.h>
6
7#include "util.h"
8#include "wexec.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 {
27 default:
28 usage();
29 }
30 ARGEND
31
32 if (!argc)
33 usage();
34
35 if ((aux = getenv("SHELL")))
36 shell[0] = aux;
37
38 if (chroot(argv[0]) < 0)
39 eprintf("chroot %s:", argv[0]);
40
41 if (chdir("/") < 0)
42 eprintf("chdir:");
43
44 if (argc == 1) {
45 cmd = *shell;
46 wexecvp_self(cmd, shell);
47 } else {
48 cmd = argv[1];
49 wexecvp_self(cmd, argv + 1);
50 }
51
52 savederrno = errno;
53 weprintf("wexecvp %s:", cmd);
54
55 _exit(126 + (savederrno == ENOENT));
56}