Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 #include <authsrv.h>
5 #include "authlocal.h"
7 enum {
8 ARgiveup = 100,
9 };
11 static int
12 dorpc(AuthRpc *rpc, char *verb, char *val, int len, AuthGetkey *getkey)
13 {
14 int ret;
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 }
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 int afd;
32 AuthRpc *rpc;
33 Attr *a;
35 if((afd = open("/mnt/factotum/rpc", ORDWR)) < 0)
36 return -1;
38 if((rpc = auth_allocrpc(afd)) == nil){
39 close(afd);
40 return -1;
41 }
43 quotefmtinstall(); /* just in case */
44 va_start(arg, fmt);
45 p = vsmprint(fmt, arg);
46 va_end(arg);
48 if(p==nil
49 || dorpc(rpc, "start", p, strlen(p), getkey) != ARok
50 || dorpc(rpc, "write", chal, nchal, getkey) != ARok
51 || dorpc(rpc, "read", nil, 0, getkey) != ARok){
52 free(p);
53 close(afd);
54 auth_freerpc(rpc);
55 return -1;
56 }
57 free(p);
59 if(rpc->narg < nresp)
60 nresp = rpc->narg;
61 memmove(resp, rpc->arg, nresp);
63 if((a = auth_attr(rpc)) != nil
64 && (s = _strfindattr(a, "user")) != nil && strlen(s) < nuser)
65 strcpy(user, s);
66 else if(nuser > 0)
67 user[0] = '\0';
69 _freeattr(a);
70 close(afd);
71 auth_freerpc(rpc);
72 return nresp;
73 }