#include <9pm/u.h>
#include <9pm/libc.h>
#include <9pm/auth.h>
#include "authlocal.h"
enum {
ARgiveup = 100,
};
static int
dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
{
int ret;
for(;;){
if((ret = _auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey)
return ret;
if(getkey == nil)
return ARgiveup; /* don't know how */
if((*getkey)(rpc->arg) < 0)
return ARgiveup; /* user punted */
}
}
int
auth_respond(void *chal, uint nchal, void *resp, uint nresp, AuthGetkey *getkey, char *fmt, ...)
{
char buf[256];
va_list arg;
int afd;
AuthRpc *rpc;
if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0)
return -1;
if((rpc = _auth_allocrpc(afd)) == nil){
close(afd);
return -1;
}
quotefmtinstall(); /* just in case */
va_start(arg, fmt);
doprint(buf, buf+sizeof buf, fmt, arg);
va_end(arg);
if(dorpc(rpc, "start", buf, strlen(buf), getkey) != ARok
|| dorpc(rpc, "write", chal, nchal, getkey) != ARok
|| dorpc(rpc, "read", nil, 0, getkey) != ARok){
close(afd);
_auth_freerpc(rpc);
return -1;
}
if(rpc->narg < nresp)
nresp = rpc->narg;
memmove(resp, rpc->arg, nresp);
close(afd);
_auth_freerpc(rpc);
return nresp;
}
syntax highlighted by Code2HTML, v. 0.9.1