xref: /plan9/sys/src/cmd/unix/drawterm/libauth/auth_getuserpasswd.c (revision ec59a3ddbfceee0efe34584c2c9981a5e5ff1ec4)
18ccd4a63SDavid du Colombier #include <u.h>
28ccd4a63SDavid du Colombier #include <libc.h>
38ccd4a63SDavid du Colombier #include <auth.h>
48ccd4a63SDavid du Colombier #include "authlocal.h"
58ccd4a63SDavid du Colombier 
68ccd4a63SDavid du Colombier enum {
78ccd4a63SDavid du Colombier 	ARgiveup = 100,
88ccd4a63SDavid du Colombier };
98ccd4a63SDavid du Colombier 
108ccd4a63SDavid du Colombier static int
dorpc(AuthRpc * rpc,char * verb,char * val,int len,AuthGetkey * getkey)118ccd4a63SDavid du Colombier dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
128ccd4a63SDavid du Colombier {
138ccd4a63SDavid du Colombier 	int ret;
148ccd4a63SDavid du Colombier 
158ccd4a63SDavid du Colombier 	for(;;){
168ccd4a63SDavid du Colombier 		if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey)
178ccd4a63SDavid du Colombier 			return ret;
18*ec59a3ddSDavid du Colombier 		if(getkey == 0)
198ccd4a63SDavid du Colombier 			return ARgiveup;	/* don't know how */
208ccd4a63SDavid du Colombier 		if((*getkey)(rpc->arg) < 0)
218ccd4a63SDavid du Colombier 			return ARgiveup;	/* user punted */
228ccd4a63SDavid du Colombier 	}
238ccd4a63SDavid du Colombier }
248ccd4a63SDavid du Colombier 
258ccd4a63SDavid du Colombier UserPasswd*
auth_getuserpasswd(AuthGetkey * getkey,char * fmt,...)268ccd4a63SDavid du Colombier auth_getuserpasswd(AuthGetkey *getkey, char *fmt, ...)
278ccd4a63SDavid du Colombier {
288ccd4a63SDavid du Colombier 	AuthRpc *rpc;
298ccd4a63SDavid du Colombier 	char *f[3], *p, *params;
308ccd4a63SDavid du Colombier 	int fd;
318ccd4a63SDavid du Colombier 	va_list arg;
328ccd4a63SDavid du Colombier 	UserPasswd *up;
338ccd4a63SDavid du Colombier 
348ccd4a63SDavid du Colombier 	up = nil;
358ccd4a63SDavid du Colombier 	rpc = nil;
368ccd4a63SDavid du Colombier 	params = nil;
378ccd4a63SDavid du Colombier 
388ccd4a63SDavid du Colombier 	fd = open("/mnt/factotum/rpc", ORDWR);
398ccd4a63SDavid du Colombier 	if(fd < 0)
408ccd4a63SDavid du Colombier 		goto out;
418ccd4a63SDavid du Colombier 	rpc = auth_allocrpc(fd);
428ccd4a63SDavid du Colombier 	if(rpc == nil)
438ccd4a63SDavid du Colombier 		goto out;
448ccd4a63SDavid du Colombier 	quotefmtinstall();	/* just in case */
458ccd4a63SDavid du Colombier 	va_start(arg, fmt);
468ccd4a63SDavid du Colombier 	params = vsmprint(fmt, arg);
478ccd4a63SDavid du Colombier 	va_end(arg);
488ccd4a63SDavid du Colombier 	if(params == nil)
498ccd4a63SDavid du Colombier 		goto out;
508ccd4a63SDavid du Colombier 
518ccd4a63SDavid du Colombier 	if(dorpc(rpc, "start", params, strlen(params), getkey) != ARok
528ccd4a63SDavid du Colombier 	|| dorpc(rpc, "read", nil, 0, getkey) != ARok)
538ccd4a63SDavid du Colombier 		goto out;
548ccd4a63SDavid du Colombier 
558ccd4a63SDavid du Colombier 	rpc->arg[rpc->narg] = '\0';
568ccd4a63SDavid du Colombier 	if(tokenize(rpc->arg, f, 2) != 2){
578ccd4a63SDavid du Colombier 		werrstr("bad answer from factotum");
588ccd4a63SDavid du Colombier 		goto out;
598ccd4a63SDavid du Colombier 	}
608ccd4a63SDavid du Colombier 	up = malloc(sizeof(*up)+rpc->narg+1);
618ccd4a63SDavid du Colombier 	if(up == nil)
628ccd4a63SDavid du Colombier 		goto out;
638ccd4a63SDavid du Colombier 	p = (char*)&up[1];
648ccd4a63SDavid du Colombier 	strcpy(p, f[0]);
658ccd4a63SDavid du Colombier 	up->user = p;
668ccd4a63SDavid du Colombier 	p += strlen(p)+1;
678ccd4a63SDavid du Colombier 	strcpy(p, f[1]);
688ccd4a63SDavid du Colombier 	up->passwd = p;
698ccd4a63SDavid du Colombier 
708ccd4a63SDavid du Colombier out:
718ccd4a63SDavid du Colombier 	free(params);
728ccd4a63SDavid du Colombier 	auth_freerpc(rpc);
738ccd4a63SDavid du Colombier 	close(fd);
748ccd4a63SDavid du Colombier 	return up;
758ccd4a63SDavid du Colombier }
76