13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <auth.h>
43e12c5d1SDavid du Colombier
53e12c5d1SDavid du Colombier void usage(void);
63e12c5d1SDavid du Colombier void catch(void*, char*);
7*17629263SDavid du Colombier
8d9306527SDavid du Colombier char *keyspec = "";
9d9306527SDavid du Colombier
10d9306527SDavid du Colombier int
amount0(int fd,char * mntpt,int flags,char * aname,char * keyspec)11d9306527SDavid du Colombier amount0(int fd, char *mntpt, int flags, char *aname, char *keyspec)
12d9306527SDavid du Colombier {
13d9306527SDavid du Colombier int rv, afd;
14d9306527SDavid du Colombier AuthInfo *ai;
15d9306527SDavid du Colombier
16d9306527SDavid du Colombier afd = fauth(fd, aname);
17d9306527SDavid du Colombier if(afd >= 0){
18d9306527SDavid du Colombier ai = auth_proxy(afd, amount_getkey, "proto=p9any role=client %s", keyspec);
19d9306527SDavid du Colombier if(ai != nil)
20d9306527SDavid du Colombier auth_freeAI(ai);
21d5dc43e7SDavid du Colombier else
22d5dc43e7SDavid du Colombier fprint(2, "%s: auth_proxy: %r\n", argv0);
23d9306527SDavid du Colombier }
24d9306527SDavid du Colombier rv = mount(fd, afd, mntpt, flags, aname);
25d9306527SDavid du Colombier if(afd >= 0)
26d9306527SDavid du Colombier close(afd);
27d9306527SDavid du Colombier return rv;
28d9306527SDavid du Colombier }
293e12c5d1SDavid du Colombier
303e12c5d1SDavid du Colombier void
main(int argc,char * argv[])313e12c5d1SDavid du Colombier main(int argc, char *argv[])
323e12c5d1SDavid du Colombier {
33219b2ee8SDavid du Colombier char *spec;
343e12c5d1SDavid du Colombier ulong flag = 0;
357dd7cddfSDavid du Colombier int qflag = 0;
36cd42b314SDavid du Colombier int noauth = 0;
37cd42b314SDavid du Colombier int fd, rv;
383e12c5d1SDavid du Colombier
393e12c5d1SDavid du Colombier ARGBEGIN{
403e12c5d1SDavid du Colombier case 'a':
413e12c5d1SDavid du Colombier flag |= MAFTER;
423e12c5d1SDavid du Colombier break;
433e12c5d1SDavid du Colombier case 'b':
443e12c5d1SDavid du Colombier flag |= MBEFORE;
453e12c5d1SDavid du Colombier break;
463e12c5d1SDavid du Colombier case 'c':
473e12c5d1SDavid du Colombier flag |= MCREATE;
483e12c5d1SDavid du Colombier break;
497dd7cddfSDavid du Colombier case 'C':
507dd7cddfSDavid du Colombier flag |= MCACHE;
517dd7cddfSDavid du Colombier break;
52d9306527SDavid du Colombier case 'k':
53d9306527SDavid du Colombier keyspec = EARGF(usage());
54d9306527SDavid du Colombier break;
55cd42b314SDavid du Colombier case 'n':
56cd42b314SDavid du Colombier noauth = 1;
57cd42b314SDavid du Colombier break;
587dd7cddfSDavid du Colombier case 'q':
597dd7cddfSDavid du Colombier qflag = 1;
607dd7cddfSDavid du Colombier break;
613e12c5d1SDavid du Colombier default:
623e12c5d1SDavid du Colombier usage();
633e12c5d1SDavid du Colombier }ARGEND
643e12c5d1SDavid du Colombier
653e12c5d1SDavid du Colombier spec = 0;
663e12c5d1SDavid du Colombier if(argc == 2)
673e12c5d1SDavid du Colombier spec = "";
683e12c5d1SDavid du Colombier else if(argc == 3)
693e12c5d1SDavid du Colombier spec = argv[2];
703e12c5d1SDavid du Colombier else
713e12c5d1SDavid du Colombier usage();
723e12c5d1SDavid du Colombier
733e12c5d1SDavid du Colombier if((flag&MAFTER)&&(flag&MBEFORE))
743e12c5d1SDavid du Colombier usage();
753e12c5d1SDavid du Colombier
763e12c5d1SDavid du Colombier fd = open(argv[0], ORDWR);
773e12c5d1SDavid du Colombier if(fd < 0){
787dd7cddfSDavid du Colombier if(qflag)
797dd7cddfSDavid du Colombier exits(0);
803e12c5d1SDavid du Colombier fprint(2, "%s: can't open %s: %r\n", argv0, argv[0]);
813e12c5d1SDavid du Colombier exits("open");
823e12c5d1SDavid du Colombier }
833e12c5d1SDavid du Colombier
843e12c5d1SDavid du Colombier notify(catch);
85cd42b314SDavid du Colombier if(noauth)
86cd42b314SDavid du Colombier rv = mount(fd, -1, argv[1], flag, spec);
87cd42b314SDavid du Colombier else
88cd42b314SDavid du Colombier rv = amount0(fd, argv[1], flag, spec, keyspec);
89cd42b314SDavid du Colombier if(rv < 0){
907dd7cddfSDavid du Colombier if(qflag)
917dd7cddfSDavid du Colombier exits(0);
927dd7cddfSDavid du Colombier fprint(2, "%s: mount %s: %r\n", argv0, argv[1]);
933e12c5d1SDavid du Colombier exits("mount");
943e12c5d1SDavid du Colombier }
953e12c5d1SDavid du Colombier exits(0);
963e12c5d1SDavid du Colombier }
973e12c5d1SDavid du Colombier
983e12c5d1SDavid du Colombier void
catch(void * x,char * m)993e12c5d1SDavid du Colombier catch(void *x, char *m)
1003e12c5d1SDavid du Colombier {
1013e12c5d1SDavid du Colombier USED(x);
1023e12c5d1SDavid du Colombier fprint(2, "mount: %s\n", m);
1033e12c5d1SDavid du Colombier exits(m);
1043e12c5d1SDavid du Colombier }
1053e12c5d1SDavid du Colombier
1063e12c5d1SDavid du Colombier void
usage(void)1073e12c5d1SDavid du Colombier usage(void)
1083e12c5d1SDavid du Colombier {
109*17629263SDavid du Colombier fprint(2, "usage: mount [-a|-b] [-cnq] [-k keypattern] /srv/service dir [spec]\n");
1103e12c5d1SDavid du Colombier exits("usage");
1113e12c5d1SDavid du Colombier }
112