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