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
amount0(int fd,char * mntpt,int flags,char * aname,char * keyspec)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
main(int argc,char * argv[])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
catch(void * x,char * m)99 catch(void *x, char *m)
100 {
101 USED(x);
102 fprint(2, "mount: %s\n", m);
103 exits(m);
104 }
105
106 void
usage(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