1 be8b315d 2004-06-17 devnull #include <u.h>
2 be8b315d 2004-06-17 devnull #include <libc.h>
3 be8b315d 2004-06-17 devnull #include <auth.h>
4 be8b315d 2004-06-17 devnull #include "authlocal.h"
6 be8b315d 2004-06-17 devnull static struct {
7 be8b315d 2004-06-17 devnull char *verb;
9 be8b315d 2004-06-17 devnull } tab[] = {
10 be8b315d 2004-06-17 devnull "ok", ARok,
11 be8b315d 2004-06-17 devnull "done", ARdone,
12 be8b315d 2004-06-17 devnull "error", ARerror,
13 be8b315d 2004-06-17 devnull "needkey", ARneedkey,
14 be8b315d 2004-06-17 devnull "badkey", ARbadkey,
15 be8b315d 2004-06-17 devnull "phase", ARphase,
16 be8b315d 2004-06-17 devnull "toosmall", ARtoosmall,
17 be8b315d 2004-06-17 devnull "error", ARerror,
20 be8b315d 2004-06-17 devnull static int
21 be8b315d 2004-06-17 devnull classify(char *buf, uint n, AuthRpc *rpc)
23 be8b315d 2004-06-17 devnull int i, len;
25 be8b315d 2004-06-17 devnull for(i=0; i<nelem(tab); i++){
26 be8b315d 2004-06-17 devnull len = strlen(tab[i].verb);
27 be8b315d 2004-06-17 devnull if(n >= len && memcmp(buf, tab[i].verb, len) == 0 && (n==len || buf[len]==' ')){
28 be8b315d 2004-06-17 devnull if(n==len){
29 be8b315d 2004-06-17 devnull rpc->narg = 0;
30 be8b315d 2004-06-17 devnull rpc->arg = "";
32 be8b315d 2004-06-17 devnull rpc->narg = n - (len+1);
33 be8b315d 2004-06-17 devnull rpc->arg = (char*)buf+len+1;
35 be8b315d 2004-06-17 devnull return tab[i].val;
38 be8b315d 2004-06-17 devnull werrstr("malformed rpc response: %s", buf);
39 be8b315d 2004-06-17 devnull return ARrpcfailure;
43 be8b315d 2004-06-17 devnull auth_allocrpc(int afd)
45 be8b315d 2004-06-17 devnull AuthRpc *rpc;
47 be8b315d 2004-06-17 devnull rpc = mallocz(sizeof(*rpc), 1);
48 be8b315d 2004-06-17 devnull if(rpc == nil)
49 be8b315d 2004-06-17 devnull return nil;
50 be8b315d 2004-06-17 devnull rpc->afd = afd;
51 be8b315d 2004-06-17 devnull return rpc;
55 be8b315d 2004-06-17 devnull auth_freerpc(AuthRpc *rpc)
57 be8b315d 2004-06-17 devnull free(rpc);
61 be8b315d 2004-06-17 devnull auth_rpc(AuthRpc *rpc, char *verb, void *a, int na)
63 be8b315d 2004-06-17 devnull int l, n, type;
64 be8b315d 2004-06-17 devnull char *f[4];
66 be8b315d 2004-06-17 devnull l = strlen(verb);
67 be8b315d 2004-06-17 devnull if(na+l+1 > AuthRpcMax){
68 be8b315d 2004-06-17 devnull werrstr("rpc too big");
69 be8b315d 2004-06-17 devnull return ARtoobig;
72 be8b315d 2004-06-17 devnull memmove(rpc->obuf, verb, l);
73 be8b315d 2004-06-17 devnull rpc->obuf[l] = ' ';
74 be8b315d 2004-06-17 devnull memmove(rpc->obuf+l+1, a, na);
75 be8b315d 2004-06-17 devnull if((n=write(rpc->afd, rpc->obuf, l+1+na)) != l+1+na){
76 be8b315d 2004-06-17 devnull if(n >= 0)
77 be8b315d 2004-06-17 devnull werrstr("auth_rpc short write");
78 be8b315d 2004-06-17 devnull return ARrpcfailure;
81 be8b315d 2004-06-17 devnull if((n=read(rpc->afd, rpc->ibuf, AuthRpcMax)) < 0)
82 be8b315d 2004-06-17 devnull return ARrpcfailure;
83 be8b315d 2004-06-17 devnull rpc->ibuf[n] = '\0';
86 be8b315d 2004-06-17 devnull * Set error string for good default behavior.
88 be8b315d 2004-06-17 devnull switch(type = classify(rpc->ibuf, n, rpc)){
90 be8b315d 2004-06-17 devnull werrstr("unknown rpc type %d (bug in auth_rpc.c)", type);
92 be8b315d 2004-06-17 devnull case ARok:
94 be8b315d 2004-06-17 devnull case ARrpcfailure:
96 be8b315d 2004-06-17 devnull case ARerror:
97 be8b315d 2004-06-17 devnull if(rpc->narg == 0)
98 be8b315d 2004-06-17 devnull werrstr("unspecified rpc error");
100 be8b315d 2004-06-17 devnull werrstr("%s", rpc->arg);
102 be8b315d 2004-06-17 devnull case ARneedkey:
103 be8b315d 2004-06-17 devnull werrstr("needkey %s", rpc->arg);
105 be8b315d 2004-06-17 devnull case ARbadkey:
106 be8b315d 2004-06-17 devnull if(getfields(rpc->arg, f, nelem(f), 0, "\n") < 2)
107 be8b315d 2004-06-17 devnull werrstr("badkey %s", rpc->arg);
109 be8b315d 2004-06-17 devnull werrstr("badkey %s", f[1]);
111 be8b315d 2004-06-17 devnull case ARphase:
112 be8b315d 2004-06-17 devnull werrstr("phase error %s", rpc->arg);
115 be8b315d 2004-06-17 devnull return type;