7 * RPC protocol constants
36 MsgAuthRejectedCred = 2,
38 MsgAuthRejectedVerf = 4,
40 MsgAuthInvalidResp = 6,
45 sunrpcpack(uchar *a, uchar *ea, uchar **pa, SunRpc *rpc)
49 if(sunuint32pack(a, ea, &a, &rpc->xid) < 0)
52 if(sunuint32pack(a, ea, &a, (x=MsgCall, &x)) < 0
53 || sunuint32pack(a, ea, &a, (x=RpcVersion, &x)) < 0
54 || sunuint32pack(a, ea, &a, &rpc->prog) < 0
55 || sunuint32pack(a, ea, &a, &rpc->vers) < 0
56 || sunuint32pack(a, ea, &a, &rpc->proc) < 0
57 || sunauthinfopack(a, ea, &a, &rpc->cred) < 0
58 || sunauthinfopack(a, ea, &a, &rpc->verf) < 0
59 || sunfixedopaquepack(a, ea, &a, rpc->data, rpc->ndata) < 0)
62 if(sunuint32pack(a, ea, &a, (x=MsgReply, &x)) < 0)
64 switch(rpc->status&0xF0000){
67 if(sunuint32pack(a, ea, &a, (x=MsgAccepted, &x)) < 0
68 || sunauthinfopack(a, ea, &a, &rpc->verf) < 0)
72 if(sunuint32pack(a, ea, &a, (x=MsgDenied, &x)) < 0
73 || sunuint32pack(a, ea, &a, (x=MsgAuthError, &x)) < 0)
77 if(sunuint32pack(a, ea, &a, (x=MsgDenied, &x)) < 0)
84 if(sunuint32pack(a, ea, &a, (x=MsgSuccess, &x)) < 0
85 || sunfixedopaquepack(a, ea, &a, rpc->data, rpc->ndata) < 0)
90 if(sunuint32pack(a, ea, &a, (x=rpc->status&0xFFFF, &x)) < 0
91 || sunuint32pack(a, ea, &a, &rpc->low) < 0
92 || sunuint32pack(a, ea, &a, &rpc->high) < 0)
96 if(sunuint32pack(a, ea, &a, (x=rpc->status&0xFFFF, &x)) < 0)
107 return SunGarbageArgs;
111 sunrpcsize(SunRpc *rpc)
118 a += sunauthinfosize(&rpc->cred);
119 a += sunauthinfosize(&rpc->verf);
120 a += sunfixedopaquesize(rpc->ndata);
123 switch(rpc->status&0xF0000){
126 a += 4+sunauthinfosize(&rpc->verf);
138 a += 4+sunfixedopaquesize(rpc->ndata);
141 case SunProgMismatch:
151 sunrpcunpack(uchar *a, uchar *ea, uchar **pa, SunRpc *rpc)
155 memset(rpc, 0, sizeof *rpc);
156 if(sunuint32unpack(a, ea, &a, &rpc->xid) < 0
157 || sunuint32unpack(a, ea, &a, &x) < 0)
165 if(sunuint32unpack(a, ea, &a, &x) < 0 || x != RpcVersion
166 || sunuint32unpack(a, ea, &a, &rpc->prog) < 0
167 || sunuint32unpack(a, ea, &a, &rpc->vers) < 0
168 || sunuint32unpack(a, ea, &a, &rpc->proc) < 0
169 || sunauthinfounpack(a, ea, &a, &rpc->cred) < 0
170 || sunauthinfounpack(a, ea, &a, &rpc->verf) < 0)
179 if(sunuint32unpack(a, ea, &a, &x) < 0)
181 fprint(2, "x %x\n", x);
186 if(sunauthinfounpack(a, ea, &a, &rpc->verf) < 0
187 || sunuint32unpack(a, ea, &a, &x) < 0)
191 rpc->status = SunSuccess;
200 rpc->status = SunAcceptError | x;
202 case MsgProgMismatch:
203 rpc->status = SunAcceptError | x;
204 if(sunuint32unpack(a, ea, &a, &rpc->low) < 0
205 || sunuint32unpack(a, ea, &a, &rpc->high) < 0)
211 if(sunuint32unpack(a, ea, &a, &x) < 0)
213 fprint(2, "xx %ux\n", x);
218 if(sunuint32unpack(a, ea, &a, &x) < 0)
220 rpc->status = SunAuthError | x;
223 rpc->status = SunRejectError | x;
224 if(sunuint32unpack(a, ea, &a, &rpc->low) < 0
225 || sunuint32unpack(a, ea, &a, &rpc->high) < 0)
237 return SunGarbageArgs;
241 sunrpcprint(Fmt *fmt, SunRpc *rpc)
243 fmtprint(fmt, "xid=%#ux", rpc->xid);
245 fmtprint(fmt, " prog %#ux vers %#ux proc %#ux [", rpc->prog, rpc->vers, rpc->proc);
246 sunauthinfoprint(fmt, &rpc->cred);
247 fmtprint(fmt, "] [");
248 sunauthinfoprint(fmt, &rpc->verf);
251 fmtprint(fmt, " status %#ux [", rpc->status);
252 sunauthinfoprint(fmt, &rpc->verf);
253 fmtprint(fmt, "] low %#ux high %#ux", rpc->low, rpc->high);
258 sunauthinfoprint(Fmt *fmt, SunAuthInfo *ai)
262 fmtprint(fmt, "none");
265 fmtprint(fmt, "short");
268 fmtprint(fmt, "sys");
271 fmtprint(fmt, "%#ux", ai->flavor);
275 // fmtprint(fmt, " %.*H", ai->ndata, ai->data);
279 sunauthinfosize(SunAuthInfo *ai)
281 return 4 + sunvaropaquesize(ai->ndata);
285 sunauthinfopack(uchar *a, uchar *ea, uchar **pa, SunAuthInfo *ai)
287 if(sunuint32pack(a, ea, &a, &ai->flavor) < 0
288 || sunvaropaquepack(a, ea, &a, &ai->data, &ai->ndata, 400) < 0)
299 sunauthinfounpack(uchar *a, uchar *ea, uchar **pa, SunAuthInfo *ai)
301 if(sunuint32unpack(a, ea, &a, &ai->flavor) < 0
302 || sunvaropaqueunpack(a, ea, &a, &ai->data, &ai->ndata, 400) < 0)
313 sunenumpack(uchar *a, uchar *ea, uchar **pa, int *e)
318 return sunuint32pack(a, ea, pa, &x);
322 sunuint1pack(uchar *a, uchar *ea, uchar **pa, u1int *u)
327 return sunuint32pack(a, ea, pa, &x);
331 sunuint32pack(uchar *a, uchar *ea, uchar **pa, u32int *u)
352 sunenumunpack(uchar *a, uchar *ea, uchar **pa, int *e)
355 if(sunuint32unpack(a, ea, pa, &x) < 0)
362 sunuint1unpack(uchar *a, uchar *ea, uchar **pa, u1int *u)
365 if(sunuint32unpack(a, ea, pa, &x) < 0 || (x!=0 && x!=1)){
374 sunuint32unpack(uchar *a, uchar *ea, uchar **pa, u32int *u)
394 sunuint64unpack(uchar *a, uchar *ea, uchar **pa, u64int *u)
398 if(sunuint32unpack(a, ea, &a, &x) < 0
399 || sunuint32unpack(a, ea, &a, &y) < 0)
401 *u = ((uvlong)x<<32) | y;
410 sunuint64pack(uchar *a, uchar *ea, uchar **pa, u64int *u)
416 if(sunuint32pack(a, ea, &a, &x) < 0
417 || sunuint32pack(a, ea, &a, &y) < 0)
427 sunstringsize(char *s)
429 return (4+strlen(s)+3) & ~3;
433 sunstringunpack(uchar *a, uchar *ea, uchar **pa, char **s, u32int max)
438 if(sunvaropaqueunpack(a, ea, pa, &dat, &n, max) < 0)
440 /* slide string down over length to make room for NUL */
441 memmove(dat-1, dat, n);
450 sunstringpack(uchar *a, uchar *ea, uchar **pa, char **s, u32int max)
455 return sunvaropaquepack(a, ea, pa, (uchar**)s, &n, max);
459 sunvaropaquesize(u32int n)
465 sunvaropaquepack(uchar *a, uchar *ea, uchar **pa, uchar **dat, u32int *ndat, u32int max)
467 if(*ndat > max || sunuint32pack(a, ea, &a, ndat) < 0
468 || sunfixedopaquepack(a, ea, &a, *dat, *ndat) < 0)
479 sunvaropaqueunpack(uchar *a, uchar *ea, uchar **pa, uchar **dat, u32int *ndat, u32int max)
481 if(sunuint32unpack(a, ea, &a, ndat) < 0
497 sunfixedopaquesize(u32int n)
503 sunfixedopaquepack(uchar *a, uchar *ea, uchar **pa, uchar *dat, u32int n)
512 memset(a+n, 0, nn-n);
523 sunfixedopaqueunpack(uchar *a, uchar *ea, uchar **pa, uchar *dat, u32int n)