Blame


1 be8b315d 2004-06-17 devnull #include <u.h>
2 be8b315d 2004-06-17 devnull #include <libc.h>
3 be8b315d 2004-06-17 devnull #include <auth.h>
4 be8b315d 2004-06-17 devnull #include "authlocal.h"
5 be8b315d 2004-06-17 devnull
6 be8b315d 2004-06-17 devnull enum {
7 be8b315d 2004-06-17 devnull ARgiveup = 100,
8 be8b315d 2004-06-17 devnull };
9 be8b315d 2004-06-17 devnull
10 be8b315d 2004-06-17 devnull static int
11 be8b315d 2004-06-17 devnull dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
12 be8b315d 2004-06-17 devnull {
13 be8b315d 2004-06-17 devnull int ret;
14 be8b315d 2004-06-17 devnull
15 be8b315d 2004-06-17 devnull for(;;){
16 be8b315d 2004-06-17 devnull if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey)
17 be8b315d 2004-06-17 devnull return ret;
18 be8b315d 2004-06-17 devnull if(getkey == nil)
19 be8b315d 2004-06-17 devnull return ARgiveup; /* don't know how */
20 be8b315d 2004-06-17 devnull if((*getkey)(rpc->arg) < 0)
21 be8b315d 2004-06-17 devnull return ARgiveup; /* user punted */
22 be8b315d 2004-06-17 devnull }
23 be8b315d 2004-06-17 devnull }
24 be8b315d 2004-06-17 devnull
25 be8b315d 2004-06-17 devnull UserPasswd*
26 be8b315d 2004-06-17 devnull auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...)
27 be8b315d 2004-06-17 devnull {
28 be8b315d 2004-06-17 devnull AuthRpc *rpc;
29 be8b315d 2004-06-17 devnull char *f[3], *p, *params;
30 be8b315d 2004-06-17 devnull int fd;
31 be8b315d 2004-06-17 devnull va_list arg;
32 be8b315d 2004-06-17 devnull UserPasswd *up;
33 be8b315d 2004-06-17 devnull
34 be8b315d 2004-06-17 devnull up = nil;
35 be8b315d 2004-06-17 devnull rpc = nil;
36 be8b315d 2004-06-17 devnull params = nil;
37 be8b315d 2004-06-17 devnull
38 be8b315d 2004-06-17 devnull fd = open("/mnt/factotum/rpc", ORDWR);
39 be8b315d 2004-06-17 devnull if(fd < 0)
40 be8b315d 2004-06-17 devnull goto out;
41 be8b315d 2004-06-17 devnull rpc = auth_allocrpc(fd);
42 be8b315d 2004-06-17 devnull if(rpc == nil)
43 be8b315d 2004-06-17 devnull goto out;
44 be8b315d 2004-06-17 devnull quotefmtinstall(); /* just in case */
45 be8b315d 2004-06-17 devnull va_start(arg, fmt);
46 be8b315d 2004-06-17 devnull params = vsmprint(fmt, arg);
47 be8b315d 2004-06-17 devnull va_end(arg);
48 be8b315d 2004-06-17 devnull if(params == nil)
49 be8b315d 2004-06-17 devnull goto out;
50 be8b315d 2004-06-17 devnull
51 be8b315d 2004-06-17 devnull if(dorpc(rpc, "start", params, strlen(params), getkey) != ARok
52 be8b315d 2004-06-17 devnull || dorpc(rpc, "read", nil, 0, getkey) != ARok)
53 be8b315d 2004-06-17 devnull goto out;
54 be8b315d 2004-06-17 devnull
55 be8b315d 2004-06-17 devnull rpc->arg[rpc->narg] = '\0';
56 be8b315d 2004-06-17 devnull if(tokenize(rpc->arg, f, 2) != 2){
57 be8b315d 2004-06-17 devnull werrstr("bad answer from factotum");
58 be8b315d 2004-06-17 devnull goto out;
59 be8b315d 2004-06-17 devnull }
60 be8b315d 2004-06-17 devnull up = malloc(sizeof(*up)+rpc->narg+1);
61 be8b315d 2004-06-17 devnull if(up == nil)
62 be8b315d 2004-06-17 devnull goto out;
63 be8b315d 2004-06-17 devnull p = (char*)&up[1];
64 be8b315d 2004-06-17 devnull strcpy(p, f[0]);
65 be8b315d 2004-06-17 devnull up->user = p;
66 be8b315d 2004-06-17 devnull p += strlen(p)+1;
67 be8b315d 2004-06-17 devnull strcpy(p, f[1]);
68 be8b315d 2004-06-17 devnull up->passwd = p;
69 be8b315d 2004-06-17 devnull
70 be8b315d 2004-06-17 devnull out:
71 be8b315d 2004-06-17 devnull free(params);
72 be8b315d 2004-06-17 devnull auth_freerpc(rpc);
73 be8b315d 2004-06-17 devnull close(fd);
74 be8b315d 2004-06-17 devnull return up;
75 be8b315d 2004-06-17 devnull }