]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/mount.c
libtags, zuke: add *.mod support (thanks kemal)
[plan9front.git] / sys / src / cmd / mount.c
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 char *spec = "";
10 int flag = MREPL;
11 int qflag = 0;
12 int noauth = 0;
13 int asnone = 0;
14
15 int
16 amount0(int fd, char *mntpt, int flags, char *aname, char *keyspec)
17 {
18         int rv, afd;
19         AuthInfo *ai;
20
21         afd = fauth(fd, aname);
22         if(afd >= 0){
23                 ai = auth_proxy(afd, amount_getkey, "proto=p9any role=client %s", keyspec);
24                 if(ai != nil)
25                         auth_freeAI(ai);
26                 else
27                         fprint(2, "%s: auth_proxy: %r\n", argv0);
28         }
29         rv = mount(fd, afd, mntpt, flags, aname);
30         if(afd >= 0)
31                 close(afd);
32         return rv;
33 }
34
35 void
36 main(int argc, char *argv[])
37 {
38         int fd, rv;
39
40         ARGBEGIN{
41         case 'a':
42                 flag |= MAFTER;
43                 break;
44         case 'b':
45                 flag |= MBEFORE;
46                 break;
47         case 'c':
48                 flag |= MCREATE;
49                 break;
50         case 'C':
51                 flag |= MCACHE;
52                 break;
53         case 'k':
54                 keyspec = EARGF(usage());
55                 break;
56         case 'N':
57                 asnone = 1;
58                 /* no break */
59         case 'n':
60                 noauth = 1;
61                 break;
62         case 'q':
63                 qflag = 1;
64                 break;
65         default:
66                 usage();
67         }ARGEND
68
69         if(argc == 3)
70                 spec = argv[2];
71         else if(argc != 2)
72                 usage();
73
74         if((flag&MAFTER)&&(flag&MBEFORE))
75                 usage();
76
77         fd = open(argv[0], ORDWR);
78         if(fd < 0){
79                 if(qflag)
80                         exits(0);
81                 fprint(2, "%s: can't open %s: %r\n", argv0, argv[0]);
82                 exits("open");
83         }
84
85         if(asnone){
86                 if(procsetuser("none") < 0){
87                         if(qflag)
88                                 exits(0);
89                         fprint(2, "%s: can't become none: %r\n", argv0);
90                         exits("becomenone");
91                 }
92         }
93
94         notify(catch);
95         if(noauth)
96                 rv = mount(fd, -1, argv[1], flag, spec);
97         else
98                 rv = amount0(fd, argv[1], flag, spec, keyspec);
99         if(rv == -1){
100                 if(qflag)
101                         exits(0);
102                 fprint(2, "%s: mount %s: %r\n", argv0, argv[1]);
103                 exits("mount");
104         }
105         exits(0);
106 }
107
108 void
109 catch(void *, char *m)
110 {
111         fprint(2, "%s: %s\n", argv0, m);
112         exits(m);
113 }
114
115 void
116 usage(void)
117 {
118         fprint(2, "usage: mount [-a|-b] [-cCnNq] [-k keypattern] /srv/service dir [spec]\n");
119         exits("usage");
120 }