newns.c 979 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. rfork(RFNAMEG);
  29. add = 0;
  30. nsfile = "/lib/namespace";
  31. ARGBEGIN{
  32. case 'a':
  33. add = 1;
  34. break;
  35. case 'd':
  36. newnsdebug = 1;
  37. break;
  38. case 'n':
  39. nsfile = ARGF();
  40. break;
  41. default:
  42. usage();
  43. break;
  44. }ARGEND
  45. if(argc == 0)
  46. argv = defargv;
  47. if (add)
  48. addns(getuser(), nsfile);
  49. else
  50. newns(getuser(), nsfile);
  51. exec(argv[0], argv);
  52. if(!rooted(argv[0])){
  53. rerrstr(err, sizeof err);
  54. exec(smprint("/bin/%s", argv[0]), argv);
  55. errstr(err, sizeof err);
  56. }
  57. sysfatal("exec: %s: %r", argv[0]);
  58. }