mount.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <auth.h>
  4. void usage(void);
  5. void catch(void*, char*);
  6. char *keyspec = "";
  7. int
  8. amount0(int fd, char *mntpt, int flags, char *aname, char *keyspec)
  9. {
  10. int rv, afd;
  11. AuthInfo *ai;
  12. afd = fauth(fd, aname);
  13. if(afd >= 0){
  14. ai = auth_proxy(afd, amount_getkey, "proto=p9any role=client %s", keyspec);
  15. if(ai != nil)
  16. auth_freeAI(ai);
  17. }
  18. rv = mount(fd, afd, mntpt, flags, aname);
  19. if(afd >= 0)
  20. close(afd);
  21. return rv;
  22. }
  23. void
  24. main(int argc, char *argv[])
  25. {
  26. char *spec;
  27. ulong flag = 0;
  28. int qflag = 0;
  29. int noauth = 0;
  30. int fd, rv;
  31. ARGBEGIN{
  32. case 'a':
  33. flag |= MAFTER;
  34. break;
  35. case 'b':
  36. flag |= MBEFORE;
  37. break;
  38. case 'c':
  39. flag |= MCREATE;
  40. break;
  41. case 'C':
  42. flag |= MCACHE;
  43. break;
  44. case 'k':
  45. keyspec = EARGF(usage());
  46. break;
  47. case 'n':
  48. noauth = 1;
  49. break;
  50. case 'q':
  51. qflag = 1;
  52. break;
  53. default:
  54. usage();
  55. }ARGEND
  56. spec = 0;
  57. if(argc == 2)
  58. spec = "";
  59. else if(argc == 3)
  60. spec = argv[2];
  61. else
  62. usage();
  63. if((flag&MAFTER)&&(flag&MBEFORE))
  64. usage();
  65. fd = open(argv[0], ORDWR);
  66. if(fd < 0){
  67. if(qflag)
  68. exits(0);
  69. fprint(2, "%s: can't open %s: %r\n", argv0, argv[0]);
  70. exits("open");
  71. }
  72. notify(catch);
  73. if(noauth)
  74. rv = mount(fd, -1, argv[1], flag, spec);
  75. else
  76. rv = amount0(fd, argv[1], flag, spec, keyspec);
  77. if(rv < 0){
  78. if(qflag)
  79. exits(0);
  80. fprint(2, "%s: mount %s: %r\n", argv0, argv[1]);
  81. exits("mount");
  82. }
  83. exits(0);
  84. }
  85. void
  86. catch(void *x, char *m)
  87. {
  88. USED(x);
  89. fprint(2, "mount: %s\n", m);
  90. exits(m);
  91. }
  92. void
  93. usage(void)
  94. {
  95. fprint(2, "usage: mount [-a|-b] [-cnrq] [-k keypattern] /srv/service dir [spec]\n");
  96. exits("usage");
  97. }