]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libauth/auth_getuserpasswd.c
kernel: avoid selecting the boot process in killbig()
[plan9front.git] / sys / src / libauth / auth_getuserpasswd.c
1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 #include "authlocal.h"
5
6 enum {
7         ARgiveup = 100,
8 };
9
10 static int
11 dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
12 {
13         int ret;
14
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 }
24
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;
33
34         up = nil;
35         rpc = nil;
36         params = nil;
37
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;
50
51         if(dorpc(rpc, "start", params, strlen(params), getkey) != ARok
52         || dorpc(rpc, "read", nil, 0, getkey) != ARok)
53                 goto out;
54
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;
69
70 out:
71         free(params);
72         auth_freerpc(rpc);
73         close(fd);
74         return up;
75 }