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