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