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