master xplshn/aruu / cmd / pseudo / chroot.c
 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}