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