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