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