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