newns.c 962 B

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