Blob


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