xref: /original-bsd/usr.sbin/chroot/chroot.c (revision 2bdcd748)
1 /*
2  * Copyright (c) 1988 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 char copyright[] =
10 "@(#) Copyright (c) 1988 The Regents of the University of California.\n\
11  All rights reserved.\n";
12 #endif /* not lint */
13 
14 #ifndef lint
15 static char sccsid[] = "@(#)chroot.c	5.9 (Berkeley) 02/10/93";
16 #endif /* not lint */
17 
18 #include <sys/types.h>
19 
20 #include <errno.h>
21 #include <paths.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <unistd.h>
26 
27 void fatal __P((char *));
28 void usage __P((void));
29 
30 int
31 main(argc, argv)
32 	int argc;
33 	char *argv[];
34 {
35 	int ch;
36 	char *shell;
37 
38 	while ((ch = getopt(argc, argv, "")) != EOF)
39 		switch(ch) {
40 		case '?':
41 		default:
42 			usage();
43 		}
44 	argc -= optind;
45 	argv += optind;
46 
47 	if (argc < 2)
48 		usage();
49 
50 	if (chdir(argv[1]) || chroot("."))
51 		fatal(argv[1]);
52 	if (argv[2]) {
53 		execvp(argv[2], &argv[2]);
54 		fatal(argv[2]);
55 	} else {
56 		if (!(shell = getenv("SHELL")))
57 			shell = _PATH_BSHELL;
58 		execlp(shell, shell, "-i", (char *)NULL);
59 		fatal(shell);
60 	}
61 	/* NOTREACHED */
62 }
63 
64 void
65 fatal(msg)
66 	char *msg;
67 {
68 	(void)fprintf(stderr, "chroot: %s: %s\n", msg, strerror(errno));
69 	exit(1);
70 }
71 
72 void
73 usage()
74 {
75 	(void)fprintf(stderr, "usage: chroot newroot [command]\n");
76 	exit(1);
77 }
78