xref: /plan9/sys/src/cmd/mount.c (revision 176292634dc5012c9be01e1d166eb1ec75f099d5)
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