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