mount.c 1.6 KB

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