Blame


1 3880f020 2005-03-18 devnull #include <u.h>
2 3880f020 2005-03-18 devnull #include <libc.h>
3 3880f020 2005-03-18 devnull #include <auth.h>
4 3880f020 2005-03-18 devnull #include <fcall.h>
5 3880f020 2005-03-18 devnull #include <thread.h>
6 3880f020 2005-03-18 devnull
7 5c84c448 2005-03-21 devnull int debug;
8 5c84c448 2005-03-21 devnull char *aname = "";
9 5c84c448 2005-03-21 devnull char *keypattern = "";
10 5c84c448 2005-03-21 devnull int fd;
11 5c84c448 2005-03-21 devnull int msize;
12 5c84c448 2005-03-21 devnull int doauth;
13 34e8254f 2005-07-27 devnull u32int afid = NOFID;
14 5c84c448 2005-03-21 devnull extern char *post9parg; /* clumsy hack */
15 5c84c448 2005-03-21 devnull void xauth(void);
16 5c84c448 2005-03-21 devnull AuthInfo* xauth_proxy(AuthGetkey *getkey, char *fmt, ...);
17 5c84c448 2005-03-21 devnull
18 3880f020 2005-03-18 devnull void
19 3880f020 2005-03-18 devnull usage(void)
20 3880f020 2005-03-18 devnull {
21 5c84c448 2005-03-21 devnull fprint(2, "usage: srv [-a] [-A aname] [-k keypattern] addr [srvname]\n");
22 3880f020 2005-03-18 devnull threadexitsall("usage");
23 3880f020 2005-03-18 devnull }
24 3880f020 2005-03-18 devnull
25 3880f020 2005-03-18 devnull void
26 3880f020 2005-03-18 devnull threadmain(int argc, char **argv)
27 3880f020 2005-03-18 devnull {
28 3880f020 2005-03-18 devnull char *addr, *service;
29 5c84c448 2005-03-21 devnull
30 5c84c448 2005-03-21 devnull fmtinstall('F', fcallfmt);
31 5c84c448 2005-03-21 devnull fmtinstall('M', dirmodefmt);
32 3880f020 2005-03-18 devnull
33 3880f020 2005-03-18 devnull ARGBEGIN{
34 5c84c448 2005-03-21 devnull case 'D':
35 5c84c448 2005-03-21 devnull debug = 1;
36 5c84c448 2005-03-21 devnull break;
37 5c84c448 2005-03-21 devnull case 'A':
38 5c84c448 2005-03-21 devnull /* BUG: should be able to repeat this and establish multiple afids */
39 5c84c448 2005-03-21 devnull aname = EARGF(usage());
40 5c84c448 2005-03-21 devnull break;
41 5c84c448 2005-03-21 devnull case 'a':
42 5c84c448 2005-03-21 devnull doauth = 1;
43 5c84c448 2005-03-21 devnull break;
44 151b86a0 2007-10-12 rsc case 'n':
45 151b86a0 2007-10-12 rsc doauth = -1;
46 151b86a0 2007-10-12 rsc break;
47 5c84c448 2005-03-21 devnull case 'k':
48 5c84c448 2005-03-21 devnull keypattern = EARGF(usage());
49 5c84c448 2005-03-21 devnull break;
50 3880f020 2005-03-18 devnull default:
51 3880f020 2005-03-18 devnull usage();
52 3880f020 2005-03-18 devnull }ARGEND
53 3880f020 2005-03-18 devnull
54 3880f020 2005-03-18 devnull if(argc != 1 && argc != 2)
55 3880f020 2005-03-18 devnull usage();
56 3880f020 2005-03-18 devnull
57 3880f020 2005-03-18 devnull addr = netmkaddr(argv[0], "tcp", "9fs");
58 3880f020 2005-03-18 devnull if((fd = dial(addr, nil, nil, nil)) < 0)
59 3880f020 2005-03-18 devnull sysfatal("dial %s: %r", addr);
60 5c84c448 2005-03-21 devnull
61 151b86a0 2007-10-12 rsc if(doauth > 0)
62 5c84c448 2005-03-21 devnull xauth();
63 5c84c448 2005-03-21 devnull
64 3880f020 2005-03-18 devnull if(argc == 2)
65 3880f020 2005-03-18 devnull service = argv[1];
66 3880f020 2005-03-18 devnull else
67 3880f020 2005-03-18 devnull service = argv[0];
68 5c84c448 2005-03-21 devnull
69 c48193be 2006-02-04 devnull rfork(RFNOTEG);
70 3880f020 2005-03-18 devnull if(post9pservice(fd, service) < 0)
71 3880f020 2005-03-18 devnull sysfatal("post9pservice: %r");
72 3880f020 2005-03-18 devnull
73 3880f020 2005-03-18 devnull threadexitsall(0);
74 3880f020 2005-03-18 devnull }
75 5c84c448 2005-03-21 devnull
76 5c84c448 2005-03-21 devnull void
77 5c84c448 2005-03-21 devnull do9p(Fcall *tx, Fcall *rx)
78 5c84c448 2005-03-21 devnull {
79 5c84c448 2005-03-21 devnull static uchar buf[9000];
80 5c84c448 2005-03-21 devnull static char ebuf[200];
81 5c84c448 2005-03-21 devnull int n;
82 5c84c448 2005-03-21 devnull
83 5c84c448 2005-03-21 devnull n = convS2M(tx, buf, sizeof buf);
84 5c84c448 2005-03-21 devnull if(n == BIT16SZ){
85 5c84c448 2005-03-21 devnull werrstr("convS2M failed");
86 5c84c448 2005-03-21 devnull goto err;
87 5c84c448 2005-03-21 devnull }
88 5c84c448 2005-03-21 devnull if(debug)
89 5c84c448 2005-03-21 devnull fprint(2, "<- %F\n", tx);
90 5c84c448 2005-03-21 devnull if(write(fd, buf, n) != n)
91 5c84c448 2005-03-21 devnull goto err;
92 5c84c448 2005-03-21 devnull if((n = read9pmsg(fd, buf, sizeof buf)) < 0)
93 5c84c448 2005-03-21 devnull goto err;
94 5c84c448 2005-03-21 devnull if(n == 0){
95 5c84c448 2005-03-21 devnull werrstr("unexpected eof");
96 5c84c448 2005-03-21 devnull goto err;
97 5c84c448 2005-03-21 devnull }
98 5c84c448 2005-03-21 devnull if(convM2S(buf, n, rx) != n){
99 5c84c448 2005-03-21 devnull werrstr("convM2S failed");
100 5c84c448 2005-03-21 devnull goto err;
101 5c84c448 2005-03-21 devnull }
102 5c84c448 2005-03-21 devnull if(debug)
103 5c84c448 2005-03-21 devnull fprint(2, "-> %F\n", rx);
104 5c84c448 2005-03-21 devnull if(rx->type != Rerror && rx->type != tx->type+1){
105 5c84c448 2005-03-21 devnull werrstr("unexpected type");
106 5c84c448 2005-03-21 devnull goto err;
107 5c84c448 2005-03-21 devnull }
108 5c84c448 2005-03-21 devnull if(rx->tag != tx->tag){
109 5c84c448 2005-03-21 devnull werrstr("unexpected tag");
110 5c84c448 2005-03-21 devnull goto err;
111 5c84c448 2005-03-21 devnull }
112 5c84c448 2005-03-21 devnull return;
113 5c84c448 2005-03-21 devnull
114 5c84c448 2005-03-21 devnull err:
115 5c84c448 2005-03-21 devnull rerrstr(ebuf, sizeof ebuf);
116 5c84c448 2005-03-21 devnull rx->ename = ebuf;
117 5c84c448 2005-03-21 devnull rx->type = Rerror;
118 5c84c448 2005-03-21 devnull return;
119 5c84c448 2005-03-21 devnull }
120 5c84c448 2005-03-21 devnull
121 5c84c448 2005-03-21 devnull void
122 5c84c448 2005-03-21 devnull xauth(void)
123 5c84c448 2005-03-21 devnull {
124 5c84c448 2005-03-21 devnull Fcall tx, rx;
125 5c84c448 2005-03-21 devnull
126 5c84c448 2005-03-21 devnull afid = 0;
127 5c84c448 2005-03-21 devnull tx.type = Tversion;
128 5c84c448 2005-03-21 devnull tx.tag = NOTAG;
129 5c84c448 2005-03-21 devnull tx.version = "9P2000";
130 5c84c448 2005-03-21 devnull tx.msize = 8192;
131 5c84c448 2005-03-21 devnull do9p(&tx, &rx);
132 5c84c448 2005-03-21 devnull if(rx.type == Rerror)
133 5c84c448 2005-03-21 devnull sysfatal("Tversion: %s", rx.ename);
134 5c84c448 2005-03-21 devnull msize = rx.msize;
135 5c84c448 2005-03-21 devnull
136 5c84c448 2005-03-21 devnull tx.type = Tauth;
137 5c84c448 2005-03-21 devnull tx.tag = 1;
138 5c84c448 2005-03-21 devnull tx.afid = afid;
139 5c84c448 2005-03-21 devnull tx.uname = getuser();
140 5c84c448 2005-03-21 devnull tx.aname = aname;
141 5c84c448 2005-03-21 devnull do9p(&tx, &rx);
142 5c84c448 2005-03-21 devnull if(rx.type == Rerror){
143 5c84c448 2005-03-21 devnull fprint(2, "rx: %s\n", rx.ename);
144 5c84c448 2005-03-21 devnull afid = NOFID;
145 5c84c448 2005-03-21 devnull return;
146 5c84c448 2005-03-21 devnull }
147 5c84c448 2005-03-21 devnull
148 78378021 2005-05-07 devnull if(xauth_proxy(auth_getkey, "proto=p9any role=client %s", keypattern) == nil)
149 5c84c448 2005-03-21 devnull sysfatal("authproxy: %r");
150 5c84c448 2005-03-21 devnull }
151 5c84c448 2005-03-21 devnull
152 5c84c448 2005-03-21 devnull int
153 5c84c448 2005-03-21 devnull xread(void *buf, int n)
154 5c84c448 2005-03-21 devnull {
155 5c84c448 2005-03-21 devnull Fcall tx, rx;
156 5c84c448 2005-03-21 devnull
157 5c84c448 2005-03-21 devnull tx.type = Tread;
158 5c84c448 2005-03-21 devnull tx.tag = 1;
159 5c84c448 2005-03-21 devnull tx.fid = 0; /* afid above */
160 5c84c448 2005-03-21 devnull tx.count = n;
161 5c84c448 2005-03-21 devnull tx.offset = 0;
162 5c84c448 2005-03-21 devnull do9p(&tx, &rx);
163 5c84c448 2005-03-21 devnull if(rx.type == Rerror){
164 5c84c448 2005-03-21 devnull werrstr("%s", rx.ename);
165 5c84c448 2005-03-21 devnull return -1;
166 5c84c448 2005-03-21 devnull }
167 5c84c448 2005-03-21 devnull
168 5c84c448 2005-03-21 devnull if(rx.count > n){
169 5c84c448 2005-03-21 devnull werrstr("too much data returned");
170 5c84c448 2005-03-21 devnull return -1;
171 5c84c448 2005-03-21 devnull }
172 5c84c448 2005-03-21 devnull memmove(buf, rx.data, rx.count);
173 5c84c448 2005-03-21 devnull return rx.count;
174 5c84c448 2005-03-21 devnull }
175 5c84c448 2005-03-21 devnull
176 5c84c448 2005-03-21 devnull int
177 5c84c448 2005-03-21 devnull xwrite(void *buf, int n)
178 5c84c448 2005-03-21 devnull {
179 5c84c448 2005-03-21 devnull Fcall tx, rx;
180 5c84c448 2005-03-21 devnull
181 5c84c448 2005-03-21 devnull tx.type = Twrite;
182 5c84c448 2005-03-21 devnull tx.tag = 1;
183 5c84c448 2005-03-21 devnull tx.fid = 0; /* afid above */
184 5c84c448 2005-03-21 devnull tx.data = buf;
185 5c84c448 2005-03-21 devnull tx.count = n;
186 5c84c448 2005-03-21 devnull tx.offset = 0;
187 5c84c448 2005-03-21 devnull do9p(&tx, &rx);
188 5c84c448 2005-03-21 devnull if(rx.type == Rerror){
189 5c84c448 2005-03-21 devnull werrstr("%s", rx.ename);
190 5c84c448 2005-03-21 devnull return -1;
191 5c84c448 2005-03-21 devnull }
192 5c84c448 2005-03-21 devnull return n;
193 5c84c448 2005-03-21 devnull }
194 5c84c448 2005-03-21 devnull
195 5c84c448 2005-03-21 devnull
196 5c84c448 2005-03-21 devnull /*
197 5c84c448 2005-03-21 devnull * changed to add -A below
198 5c84c448 2005-03-21 devnull */
199 5c84c448 2005-03-21 devnull #undef _exits
200 5c84c448 2005-03-21 devnull int
201 5c84c448 2005-03-21 devnull post9pservice(int fd, char *name)
202 5c84c448 2005-03-21 devnull {
203 5c84c448 2005-03-21 devnull int i;
204 5c84c448 2005-03-21 devnull char *ns, *s;
205 5c84c448 2005-03-21 devnull Waitmsg *w;
206 5c84c448 2005-03-21 devnull
207 5c84c448 2005-03-21 devnull if((ns = getns()) == nil)
208 5c84c448 2005-03-21 devnull return -1;
209 5c84c448 2005-03-21 devnull
210 5c84c448 2005-03-21 devnull s = smprint("unix!%s/%s", ns, name);
211 5c84c448 2005-03-21 devnull free(ns);
212 5c84c448 2005-03-21 devnull if(s == nil)
213 5c84c448 2005-03-21 devnull return -1;
214 5c84c448 2005-03-21 devnull switch(fork()){
215 5c84c448 2005-03-21 devnull case -1:
216 5c84c448 2005-03-21 devnull return -1;
217 5c84c448 2005-03-21 devnull case 0:
218 5c84c448 2005-03-21 devnull dup(fd, 0);
219 5c84c448 2005-03-21 devnull dup(fd, 1);
220 5c84c448 2005-03-21 devnull for(i=3; i<20; i++)
221 5c84c448 2005-03-21 devnull close(i);
222 151b86a0 2007-10-12 rsc if(doauth > 0)
223 5c84c448 2005-03-21 devnull execlp("9pserve", "9pserve", "-u",
224 5c84c448 2005-03-21 devnull "-M",
225 5c84c448 2005-03-21 devnull smprint("%d", msize),
226 5c84c448 2005-03-21 devnull "-A",
227 5c84c448 2005-03-21 devnull aname,
228 5c84c448 2005-03-21 devnull smprint("%d", afid),
229 5c84c448 2005-03-21 devnull s, (char*)0);
230 151b86a0 2007-10-12 rsc else
231 151b86a0 2007-10-12 rsc execlp("9pserve", "9pserve",
232 151b86a0 2007-10-12 rsc doauth < 0 ? "-nu" : "-u", s, (char*)0);
233 5c84c448 2005-03-21 devnull fprint(2, "exec 9pserve: %r\n");
234 5c84c448 2005-03-21 devnull _exits("exec");
235 5c84c448 2005-03-21 devnull default:
236 5c84c448 2005-03-21 devnull w = wait();
237 5c84c448 2005-03-21 devnull if(w == nil)
238 5c84c448 2005-03-21 devnull return -1;
239 5c84c448 2005-03-21 devnull close(fd);
240 5c84c448 2005-03-21 devnull free(s);
241 5c84c448 2005-03-21 devnull if(w->msg && w->msg[0]){
242 5c84c448 2005-03-21 devnull free(w);
243 5c84c448 2005-03-21 devnull werrstr("9pserve failed");
244 5c84c448 2005-03-21 devnull return -1;
245 5c84c448 2005-03-21 devnull }
246 5c84c448 2005-03-21 devnull free(w);
247 5c84c448 2005-03-21 devnull return 0;
248 5c84c448 2005-03-21 devnull }
249 5c84c448 2005-03-21 devnull }
250 5c84c448 2005-03-21 devnull
251 5c84c448 2005-03-21 devnull enum { ARgiveup = 100 };
252 5c84c448 2005-03-21 devnull static int
253 5c84c448 2005-03-21 devnull dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
254 5c84c448 2005-03-21 devnull {
255 5c84c448 2005-03-21 devnull int ret;
256 5c84c448 2005-03-21 devnull
257 5c84c448 2005-03-21 devnull for(;;){
258 5c84c448 2005-03-21 devnull if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey)
259 5c84c448 2005-03-21 devnull return ret;
260 5c84c448 2005-03-21 devnull if(getkey == nil)
261 5c84c448 2005-03-21 devnull return ARgiveup; /* don't know how */
262 5c84c448 2005-03-21 devnull if((*getkey)(rpc->arg) < 0)
263 5c84c448 2005-03-21 devnull return ARgiveup; /* user punted */
264 5c84c448 2005-03-21 devnull }
265 5c84c448 2005-03-21 devnull }
266 5c84c448 2005-03-21 devnull
267 5c84c448 2005-03-21 devnull
268 5c84c448 2005-03-21 devnull /*
269 5c84c448 2005-03-21 devnull * this just proxies what the factotum tells it to.
270 5c84c448 2005-03-21 devnull */
271 5c84c448 2005-03-21 devnull AuthInfo*
272 5c84c448 2005-03-21 devnull xfauth_proxy(AuthRpc *rpc, AuthGetkey *getkey, char *params)
273 5c84c448 2005-03-21 devnull {
274 5c84c448 2005-03-21 devnull char *buf;
275 5c84c448 2005-03-21 devnull int m, n, ret;
276 5c84c448 2005-03-21 devnull AuthInfo *a;
277 5c84c448 2005-03-21 devnull char oerr[ERRMAX];
278 5c84c448 2005-03-21 devnull
279 5c84c448 2005-03-21 devnull rerrstr(oerr, sizeof oerr);
280 5c84c448 2005-03-21 devnull werrstr("UNKNOWN AUTH ERROR");
281 5c84c448 2005-03-21 devnull
282 5c84c448 2005-03-21 devnull if(dorpc(rpc, "start", params, strlen(params), getkey) != ARok){
283 5c84c448 2005-03-21 devnull werrstr("fauth_proxy start: %r");
284 5c84c448 2005-03-21 devnull return nil;
285 5c84c448 2005-03-21 devnull }
286 5c84c448 2005-03-21 devnull
287 5c84c448 2005-03-21 devnull buf = malloc(AuthRpcMax);
288 5c84c448 2005-03-21 devnull if(buf == nil)
289 5c84c448 2005-03-21 devnull return nil;
290 5c84c448 2005-03-21 devnull for(;;){
291 5c84c448 2005-03-21 devnull switch(dorpc(rpc, "read", nil, 0, getkey)){
292 5c84c448 2005-03-21 devnull case ARdone:
293 5c84c448 2005-03-21 devnull free(buf);
294 5c84c448 2005-03-21 devnull a = auth_getinfo(rpc);
295 5c84c448 2005-03-21 devnull errstr(oerr, sizeof oerr); /* no error, restore whatever was there */
296 5c84c448 2005-03-21 devnull return a;
297 5c84c448 2005-03-21 devnull case ARok:
298 5c84c448 2005-03-21 devnull if(xwrite(rpc->arg, rpc->narg) != rpc->narg){
299 5c84c448 2005-03-21 devnull werrstr("auth_proxy write fid: %r");
300 5c84c448 2005-03-21 devnull goto Error;
301 5c84c448 2005-03-21 devnull }
302 5c84c448 2005-03-21 devnull break;
303 5c84c448 2005-03-21 devnull case ARphase:
304 5c84c448 2005-03-21 devnull n = 0;
305 5c84c448 2005-03-21 devnull memset(buf, 0, AuthRpcMax);
306 5c84c448 2005-03-21 devnull while((ret = dorpc(rpc, "write", buf, n, getkey)) == ARtoosmall){
307 5c84c448 2005-03-21 devnull if(atoi(rpc->arg) > AuthRpcMax)
308 5c84c448 2005-03-21 devnull break;
309 5c84c448 2005-03-21 devnull m = xread(buf+n, atoi(rpc->arg)-n);
310 5c84c448 2005-03-21 devnull if(m <= 0){
311 5c84c448 2005-03-21 devnull if(m == 0)
312 5c84c448 2005-03-21 devnull werrstr("auth_proxy short read: %s", buf);
313 5c84c448 2005-03-21 devnull goto Error;
314 5c84c448 2005-03-21 devnull }
315 5c84c448 2005-03-21 devnull n += m;
316 5c84c448 2005-03-21 devnull }
317 5c84c448 2005-03-21 devnull if(ret != ARok){
318 5c84c448 2005-03-21 devnull werrstr("auth_proxy rpc write: %s: %r", buf);
319 5c84c448 2005-03-21 devnull goto Error;
320 5c84c448 2005-03-21 devnull }
321 5c84c448 2005-03-21 devnull break;
322 5c84c448 2005-03-21 devnull default:
323 5c84c448 2005-03-21 devnull werrstr("auth_proxy rpc: %r");
324 5c84c448 2005-03-21 devnull goto Error;
325 5c84c448 2005-03-21 devnull }
326 5c84c448 2005-03-21 devnull }
327 5c84c448 2005-03-21 devnull Error:
328 5c84c448 2005-03-21 devnull free(buf);
329 5c84c448 2005-03-21 devnull return nil;
330 5c84c448 2005-03-21 devnull }
331 5c84c448 2005-03-21 devnull
332 5c84c448 2005-03-21 devnull AuthInfo*
333 5c84c448 2005-03-21 devnull xauth_proxy(AuthGetkey *getkey, char *fmt, ...)
334 5c84c448 2005-03-21 devnull {
335 5c84c448 2005-03-21 devnull char *p;
336 5c84c448 2005-03-21 devnull va_list arg;
337 5c84c448 2005-03-21 devnull AuthInfo *ai;
338 5c84c448 2005-03-21 devnull AuthRpc *rpc;
339 5c84c448 2005-03-21 devnull
340 5c84c448 2005-03-21 devnull quotefmtinstall(); /* just in case */
341 5c84c448 2005-03-21 devnull va_start(arg, fmt);
342 5c84c448 2005-03-21 devnull p = vsmprint(fmt, arg);
343 5c84c448 2005-03-21 devnull va_end(arg);
344 5c84c448 2005-03-21 devnull
345 5c84c448 2005-03-21 devnull rpc = auth_allocrpc();
346 5c84c448 2005-03-21 devnull if(rpc == nil){
347 5c84c448 2005-03-21 devnull free(p);
348 5c84c448 2005-03-21 devnull return nil;
349 5c84c448 2005-03-21 devnull }
350 5c84c448 2005-03-21 devnull
351 5c84c448 2005-03-21 devnull ai = xfauth_proxy(rpc, getkey, p);
352 5c84c448 2005-03-21 devnull free(p);
353 5c84c448 2005-03-21 devnull auth_freerpc(rpc);
354 5c84c448 2005-03-21 devnull return ai;
355 5c84c448 2005-03-21 devnull }
356 5c84c448 2005-03-21 devnull