xref: /plan9/sys/src/cmd/auth/newns.c (revision ec59a3ddbfceee0efe34584c2c9981a5e5ff1ec4)
1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 
5 void
6 usage(void)
7 {
8 	fprint(2, "usage: newns [-ad] [-n namespace] [cmd [args...]]\n");
9 	exits("usage");
10 }
11 
12 static int
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
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 	add = 0;
33 	nsfile = "/lib/namespace";
34 	ARGBEGIN{
35 	case 'a':
36 		add = 1;
37 		break;
38 	case 'd':
39 		newnsdebug = 1;
40 		break;
41 	case 'n':
42 		nsfile = ARGF();
43 		break;
44 	default:
45 		usage();
46 		break;
47 	}ARGEND
48 	if(argc == 0)
49 		argv = defargv;
50 	if (add)
51 		addns(getuser(), nsfile);
52 	else
53 		newns(getuser(), nsfile);
54 	exec(argv[0], argv);
55 	if(!rooted(argv[0])){
56 		rerrstr(err, sizeof err);
57 		exec(smprint("/bin/%s", argv[0]), argv);
58 		errstr(err, sizeof err);
59 	}
60 	sysfatal("exec: %s: %r", argv[0]);
61 }
62