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:
152 sunrpcunpack(uchar *a, uchar *ea, uchar **pa, SunRpc *rpc)
156 memset(rpc, 0, sizeof *rpc);
157 if(sunuint32unpack(a, ea, &a, &rpc->xid) < 0
158 || sunuint32unpack(a, ea, &a, &x) < 0)
166 if(sunuint32unpack(a, ea, &a, &x) < 0 || x != RpcVersion
167 || sunuint32unpack(a, ea, &a, &rpc->prog) < 0
168 || sunuint32unpack(a, ea, &a, &rpc->vers) < 0
169 || sunuint32unpack(a, ea, &a, &rpc->proc) < 0
170 || sunauthinfounpack(a, ea, &a, &rpc->cred) < 0
171 || sunauthinfounpack(a, ea, &a, &rpc->verf) < 0)
180 if(sunuint32unpack(a, ea, &a, &x) < 0)
182 fprint(2, "x %x\n", x);
187 if(sunauthinfounpack(a, ea, &a, &rpc->verf) < 0
188 || sunuint32unpack(a, ea, &a, &x) < 0)
192 rpc->status = SunSuccess;
201 rpc->status = SunAcceptError | x;
203 case MsgProgMismatch:
204 rpc->status = SunAcceptError | x;
205 if(sunuint32unpack(a, ea, &a, &rpc->low) < 0
206 || sunuint32unpack(a, ea, &a, &rpc->high) < 0)
212 if(sunuint32unpack(a, ea, &a, &x) < 0)
214 fprint(2, "xx %ux\n", x);
219 if(sunuint32unpack(a, ea, &a, &x) < 0)
221 rpc->status = SunAuthError | x;
224 rpc->status = SunRejectError | x;
225 if(sunuint32unpack(a, ea, &a, &rpc->low) < 0
226 || sunuint32unpack(a, ea, &a, &rpc->high) < 0)
238 return SunGarbageArgs;
242 sunrpcprint(Fmt *fmt, SunRpc *rpc)
244 fmtprint(fmt, "xid=%#ux", rpc->xid);
246 fmtprint(fmt, " prog %#ux vers %#ux proc %#ux [", rpc->prog, rpc->vers, rpc->proc);
247 sunauthinfoprint(fmt, &rpc->cred);
248 fmtprint(fmt, "] [");
249 sunauthinfoprint(fmt, &rpc->verf);
252 fmtprint(fmt, " status %#ux [", rpc->status);
253 sunauthinfoprint(fmt, &rpc->verf);
254 fmtprint(fmt, "] low %#ux high %#ux", rpc->low, rpc->high);
259 sunauthinfoprint(Fmt *fmt, SunAuthInfo *ai)
263 fmtprint(fmt, "none");
266 fmtprint(fmt, "short");
269 fmtprint(fmt, "sys");
272 fmtprint(fmt, "%#ux", ai->flavor);
276 /* fmtprint(fmt, " %.*H", ai->ndata, ai->data); */
280 sunauthinfosize(SunAuthInfo *ai)
282 return 4 + sunvaropaquesize(ai->ndata);
286 sunauthinfopack(uchar *a, uchar *ea, uchar **pa, SunAuthInfo *ai)
288 if(sunuint32pack(a, ea, &a, &ai->flavor) < 0
289 || sunvaropaquepack(a, ea, &a, &ai->data, &ai->ndata, 400) < 0)
300 sunauthinfounpack(uchar *a, uchar *ea, uchar **pa, SunAuthInfo *ai)
302 if(sunuint32unpack(a, ea, &a, &ai->flavor) < 0
303 || sunvaropaqueunpack(a, ea, &a, &ai->data, &ai->ndata, 400) < 0)
314 sunenumpack(uchar *a, uchar *ea, uchar **pa, int *e)
319 return sunuint32pack(a, ea, pa, &x);
323 sunuint1pack(uchar *a, uchar *ea, uchar **pa, u1int *u)
328 return sunuint32pack(a, ea, pa, &x);
332 sunuint32pack(uchar *a, uchar *ea, uchar **pa, u32int *u)
353 sunenumunpack(uchar *a, uchar *ea, uchar **pa, int *e)
356 if(sunuint32unpack(a, ea, pa, &x) < 0)
363 sunuint1unpack(uchar *a, uchar *ea, uchar **pa, u1int *u)
366 if(sunuint32unpack(a, ea, pa, &x) < 0 || (x!=0 && x!=1)){
375 sunuint32unpack(uchar *a, uchar *ea, uchar **pa, u32int *u)
395 sunuint64unpack(uchar *a, uchar *ea, uchar **pa, u64int *u)
399 if(sunuint32unpack(a, ea, &a, &x) < 0
400 || sunuint32unpack(a, ea, &a, &y) < 0)
402 *u = ((uvlong)x<<32) | y;
411 sunuint64pack(uchar *a, uchar *ea, uchar **pa, u64int *u)
417 if(sunuint32pack(a, ea, &a, &x) < 0
418 || sunuint32pack(a, ea, &a, &y) < 0)
428 sunstringsize(char *s)
430 return (4+strlen(s)+3) & ~3;
434 sunstringunpack(uchar *a, uchar *ea, uchar **pa, char **s, u32int max)
439 if(sunvaropaqueunpack(a, ea, pa, &dat, &n, max) < 0)
441 /* slide string down over length to make room for NUL */
443 memmove(dat, dat+1, n);
452 sunstringpack(uchar *a, uchar *ea, uchar **pa, char **s, u32int max)
457 return sunvaropaquepack(a, ea, pa, (uchar**)s, &n, max);
461 sunvaropaquesize(u32int n)
467 sunvaropaquepack(uchar *a, uchar *ea, uchar **pa, uchar **dat, u32int *ndat, u32int max)
469 if(*ndat > max || sunuint32pack(a, ea, &a, ndat) < 0
470 || sunfixedopaquepack(a, ea, &a, *dat, *ndat) < 0)
481 sunvaropaqueunpack(uchar *a, uchar *ea, uchar **pa, uchar **dat, u32int *ndat, u32int max)
483 if(sunuint32unpack(a, ea, &a, ndat) < 0
499 sunfixedopaquesize(u32int n)
505 sunfixedopaquepack(uchar *a, uchar *ea, uchar **pa, uchar *dat, u32int n)
514 memset(a+n, 0, nn-n);
525 sunfixedopaqueunpack(uchar *a, uchar *ea, uchar **pa, uchar *dat, u32int n)