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