plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

auth_respond.c (1295B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <auth.h>
      4 #include <authsrv.h>
      5 #include "authlocal.h"
      6 
      7 enum {
      8 	ARgiveup = 100
      9 };
     10 
     11 static int
     12 dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
     13 {
     14 	int ret;
     15 
     16 	for(;;){
     17 		if((ret = auth_rpc(rpc, verb, val, len)) != ARneedkey && ret != ARbadkey)
     18 			return ret;
     19 		if(getkey == nil)
     20 			return ARgiveup;	/* don't know how */
     21 		if((*getkey)(rpc->arg) < 0)
     22 			return ARgiveup;	/* user punted */
     23 	}
     24 }
     25 
     26 int
     27 auth_respond(void *chal, uint nchal, char *user, uint nuser, void *resp, uint nresp, AuthGetkey *getkey, char *fmt, ...)
     28 {
     29 	char *p, *s;
     30 	va_list arg;
     31 	AuthRpc *rpc;
     32 	Attr *a;
     33 
     34 	if((rpc = auth_allocrpc()) == nil)
     35 		return -1;
     36 
     37 	quotefmtinstall();	/* just in case */
     38 	va_start(arg, fmt);
     39 	p = vsmprint(fmt, arg);
     40 	va_end(arg);
     41 
     42 	if(p==nil
     43 	|| dorpc(rpc, "start", p, strlen(p), getkey) != ARok
     44 	|| dorpc(rpc, "write", chal, nchal, getkey) != ARok
     45 	|| dorpc(rpc, "read", nil, 0, getkey) != ARok){
     46 		free(p);
     47 		auth_freerpc(rpc);
     48 		return -1;
     49 	}
     50 	free(p);
     51 
     52 	if(rpc->narg < nresp)
     53 		nresp = rpc->narg;
     54 	memmove(resp, rpc->arg, nresp);
     55 
     56 	if((a = auth_attr(rpc)) != nil
     57 	&& (s = _strfindattr(a, "user")) != nil && strlen(s) < nuser)
     58 		strcpy(user, s);
     59 	else if(nuser > 0)
     60 		user[0] = '\0';
     61 
     62 	_freeattr(a);
     63 	auth_freerpc(rpc);
     64 	return nresp;
     65 }