1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4
5 void
usage(void)6 usage(void)
7 {
8 fprint(2, "usage: newns [-ad] [-n namespace] [cmd [args...]]\n");
9 exits("usage");
10 }
11
12 static int
rooted(char * s)13 rooted(char *s)
14 {
15 if(s[0] == '/')
16 return 1;
17 if(s[0] == '.' && s[1] == '/')
18 return 1;
19 if(s[0] == '.' && s[1] == '.' && s[2] == '/')
20 return 1;
21 return 0;
22 }
23
24 void
main(int argc,char ** argv)25 main(int argc, char **argv)
26 {
27 extern int newnsdebug;
28 char *defargv[] = { "/bin/rc", "-i", nil };
29 char *nsfile, err[ERRMAX];
30 int add;
31
32 rfork(RFNAMEG);
33 add = 0;
34 nsfile = "/lib/namespace";
35 ARGBEGIN{
36 case 'a':
37 add = 1;
38 break;
39 case 'd':
40 newnsdebug = 1;
41 break;
42 case 'n':
43 nsfile = ARGF();
44 break;
45 default:
46 usage();
47 break;
48 }ARGEND
49 if(argc == 0)
50 argv = defargv;
51 if (add)
52 addns(getuser(), nsfile);
53 else
54 newns(getuser(), nsfile);
55 exec(argv[0], argv);
56 if(!rooted(argv[0])){
57 rerrstr(err, sizeof err);
58 exec(smprint("/bin/%s", argv[0]), argv);
59 errstr(err, sizeof err);
60 }
61 sysfatal("exec: %s: %r", argv[0]);
62 }
63