Blame


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"
5 be8b315d 2004-06-17 devnull
6 be8b315d 2004-06-17 devnull static struct {
7 be8b315d 2004-06-17 devnull char *verb;
8 be8b315d 2004-06-17 devnull int val;
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,
18 be8b315d 2004-06-17 devnull };
19 be8b315d 2004-06-17 devnull
20 be8b315d 2004-06-17 devnull static int
21 be8b315d 2004-06-17 devnull classify(char *buf, uint n, AuthRpc *rpc)
22 be8b315d 2004-06-17 devnull {
23 be8b315d 2004-06-17 devnull int i, len;
24 be8b315d 2004-06-17 devnull
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 = "";
31 be8b315d 2004-06-17 devnull }else{
32 be8b315d 2004-06-17 devnull rpc->narg = n - (len+1);
33 be8b315d 2004-06-17 devnull rpc->arg = (char*)buf+len+1;
34 be8b315d 2004-06-17 devnull }
35 be8b315d 2004-06-17 devnull return tab[i].val;
36 be8b315d 2004-06-17 devnull }
37 be8b315d 2004-06-17 devnull }
38 be8b315d 2004-06-17 devnull werrstr("malformed rpc response: %s", buf);
39 be8b315d 2004-06-17 devnull return ARrpcfailure;
40 be8b315d 2004-06-17 devnull }
41 be8b315d 2004-06-17 devnull
42 be8b315d 2004-06-17 devnull AuthRpc*
43 be8b315d 2004-06-17 devnull auth_allocrpc(int afd)
44 be8b315d 2004-06-17 devnull {
45 be8b315d 2004-06-17 devnull AuthRpc *rpc;
46 be8b315d 2004-06-17 devnull
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;
52 be8b315d 2004-06-17 devnull }
53 be8b315d 2004-06-17 devnull
54 be8b315d 2004-06-17 devnull void
55 be8b315d 2004-06-17 devnull auth_freerpc(AuthRpc *rpc)
56 be8b315d 2004-06-17 devnull {
57 be8b315d 2004-06-17 devnull free(rpc);
58 be8b315d 2004-06-17 devnull }
59 be8b315d 2004-06-17 devnull
60 be8b315d 2004-06-17 devnull uint
61 be8b315d 2004-06-17 devnull auth_rpc(AuthRpc *rpc, char *verb, void *a, int na)
62 be8b315d 2004-06-17 devnull {
63 be8b315d 2004-06-17 devnull int l, n, type;
64 be8b315d 2004-06-17 devnull char *f[4];
65 be8b315d 2004-06-17 devnull
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;
70 be8b315d 2004-06-17 devnull }
71 be8b315d 2004-06-17 devnull
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;
79 be8b315d 2004-06-17 devnull }
80 be8b315d 2004-06-17 devnull
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';
84 be8b315d 2004-06-17 devnull
85 be8b315d 2004-06-17 devnull /*
86 be8b315d 2004-06-17 devnull * Set error string for good default behavior.
87 be8b315d 2004-06-17 devnull */
88 be8b315d 2004-06-17 devnull switch(type = classify(rpc->ibuf, n, rpc)){
89 be8b315d 2004-06-17 devnull default:
90 be8b315d 2004-06-17 devnull werrstr("unknown rpc type %d (bug in auth_rpc.c)", type);
91 be8b315d 2004-06-17 devnull break;
92 be8b315d 2004-06-17 devnull case ARok:
93 be8b315d 2004-06-17 devnull break;
94 be8b315d 2004-06-17 devnull case ARrpcfailure:
95 be8b315d 2004-06-17 devnull break;
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");
99 be8b315d 2004-06-17 devnull else
100 be8b315d 2004-06-17 devnull werrstr("%s", rpc->arg);
101 be8b315d 2004-06-17 devnull break;
102 be8b315d 2004-06-17 devnull case ARneedkey:
103 be8b315d 2004-06-17 devnull werrstr("needkey %s", rpc->arg);
104 be8b315d 2004-06-17 devnull break;
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);
108 be8b315d 2004-06-17 devnull else
109 be8b315d 2004-06-17 devnull werrstr("badkey %s", f[1]);
110 be8b315d 2004-06-17 devnull break;
111 be8b315d 2004-06-17 devnull case ARphase:
112 be8b315d 2004-06-17 devnull werrstr("phase error %s", rpc->arg);
113 be8b315d 2004-06-17 devnull break;
114 be8b315d 2004-06-17 devnull }
115 be8b315d 2004-06-17 devnull return type;
116 be8b315d 2004-06-17 devnull }