mount.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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 fd;
  30. ARGBEGIN{
  31. case 'a':
  32. flag |= MAFTER;
  33. break;
  34. case 'b':
  35. flag |= MBEFORE;
  36. break;
  37. case 'c':
  38. flag |= MCREATE;
  39. break;
  40. case 'C':
  41. flag |= MCACHE;
  42. break;
  43. case 'k':
  44. keyspec = EARGF(usage());
  45. break;
  46. case 'q':
  47. qflag = 1;
  48. break;
  49. default:
  50. usage();
  51. }ARGEND
  52. spec = 0;
  53. if(argc == 2)
  54. spec = "";
  55. else if(argc == 3)
  56. spec = argv[2];
  57. else
  58. usage();
  59. if((flag&MAFTER)&&(flag&MBEFORE))
  60. usage();
  61. fd = open(argv[0], ORDWR);
  62. if(fd < 0){
  63. if(qflag)
  64. exits(0);
  65. fprint(2, "%s: can't open %s: %r\n", argv0, argv[0]);
  66. exits("open");
  67. }
  68. notify(catch);
  69. if(amount0(fd, argv[1], flag, spec, keyspec) < 0){
  70. if(qflag)
  71. exits(0);
  72. fprint(2, "%s: mount %s: %r\n", argv0, argv[1]);
  73. exits("mount");
  74. }
  75. exits(0);
  76. }
  77. void
  78. catch(void *x, char *m)
  79. {
  80. USED(x);
  81. fprint(2, "mount: %s\n", m);
  82. exits(m);
  83. }
  84. void
  85. usage(void)
  86. {
  87. fprint(2, "usage: mount [-a|-b] [-c] [-k keypattern] [-r] /srv/service dir [spec]\n");
  88. exits("usage");
  89. }