Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
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
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
99
catch(void *x, char *m)
100
{
101
	USED(x);
102
	fprint(2, "mount: %s\n", m);
103
	exits(m);
104
}
105
 
106
void
107
usage(void)
108
{
109
	fprint(2, "usage: mount [-a|-b] [-cnq] [-k keypattern] /srv/service dir [spec]\n");
110
	exits("usage");
111
}