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