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)
79 if(sunUint32Pack(a, ea, &a, (x=MsgSuccess, &x)) < 0
80 || sunFixedOpaquePack(a, ea, &a, rpc->data, rpc->ndata) < 0)
85 if(sunUint32Pack(a, ea, &a, (x=rpc->status&0xFFFF, &x)) < 0
86 || sunUint32Pack(a, ea, &a, &rpc->low) < 0
87 || sunUint32Pack(a, ea, &a, &rpc->high) < 0)
91 if(sunUint32Pack(a, ea, &a, (x=rpc->status&0xFFFF, &x)) < 0)
101 return SunGarbageArgs;
105 sunRpcSize(SunRpc *rpc)
112 a += sunAuthInfoSize(&rpc->cred);
113 a += sunAuthInfoSize(&rpc->verf);
114 a += sunFixedOpaqueSize(rpc->ndata);
117 switch(rpc->status&0xF0000){
120 a += 4+sunAuthInfoSize(&rpc->verf);
129 a += 4+sunFixedOpaqueSize(rpc->ndata);
132 case SunProgMismatch:
142 sunRpcUnpack(uchar *a, uchar *ea, uchar **pa, SunRpc *rpc)
146 memset(rpc, 0, sizeof *rpc);
147 if(sunUint32Unpack(a, ea, &a, &rpc->xid) < 0
148 || sunUint32Unpack(a, ea, &a, &x) < 0)
156 if(sunUint32Unpack(a, ea, &a, &x) < 0 || x != RpcVersion
157 || sunUint32Unpack(a, ea, &a, &rpc->prog) < 0
158 || sunUint32Unpack(a, ea, &a, &rpc->vers) < 0
159 || sunUint32Unpack(a, ea, &a, &rpc->proc) < 0
160 || sunAuthInfoUnpack(a, ea, &a, &rpc->cred) < 0
161 || sunAuthInfoUnpack(a, ea, &a, &rpc->verf) < 0)
170 if(sunUint32Unpack(a, ea, &a, &x) < 0)
176 if(sunAuthInfoUnpack(a, ea, &a, &rpc->verf) < 0
177 || sunUint32Unpack(a, ea, &a, &x) < 0)
181 rpc->status = SunSuccess;
190 rpc->status = SunAcceptError | x;
192 case MsgProgMismatch:
193 rpc->status = SunAcceptError | x;
194 if(sunUint32Unpack(a, ea, &a, &rpc->low) < 0
195 || sunUint32Unpack(a, ea, &a, &rpc->high) < 0)
201 if(sunUint32Unpack(a, ea, &a, &x) < 0)
207 if(sunUint32Unpack(a, ea, &a, &x) < 0)
209 rpc->status = SunAuthError | x;
212 rpc->status = SunRejectError | x;
213 if(sunUint32Unpack(a, ea, &a, &rpc->low) < 0
214 || sunUint32Unpack(a, ea, &a, &rpc->high) < 0)
226 return SunGarbageArgs;
230 sunRpcPrint(Fmt *fmt, SunRpc *rpc)
232 fmtprint(fmt, "xid=%#ux", rpc->xid);
234 fmtprint(fmt, " prog %#ux vers %#ux proc %#ux [", rpc->prog, rpc->vers, rpc->proc);
235 sunAuthInfoPrint(fmt, &rpc->cred);
236 fmtprint(fmt, "] [");
237 sunAuthInfoPrint(fmt, &rpc->verf);
240 fmtprint(fmt, " status %#ux [", rpc->status);
241 sunAuthInfoPrint(fmt, &rpc->verf);
242 fmtprint(fmt, "] low %#ux high %#ux", rpc->low, rpc->high);
247 sunAuthInfoPrint(Fmt *fmt, SunAuthInfo *ai)
251 fmtprint(fmt, "none");
254 fmtprint(fmt, "short");
257 fmtprint(fmt, "sys");
260 fmtprint(fmt, "%#ux", ai->flavor);
264 // fmtprint(fmt, " %.*H", ai->ndata, ai->data);
268 sunAuthInfoSize(SunAuthInfo *ai)
270 return 4 + sunVarOpaqueSize(ai->ndata);
274 sunAuthInfoPack(uchar *a, uchar *ea, uchar **pa, SunAuthInfo *ai)
276 if(sunUint32Pack(a, ea, &a, &ai->flavor) < 0
277 || sunVarOpaquePack(a, ea, &a, &ai->data, &ai->ndata, 400) < 0)
288 sunAuthInfoUnpack(uchar *a, uchar *ea, uchar **pa, SunAuthInfo *ai)
290 if(sunUint32Unpack(a, ea, &a, &ai->flavor) < 0
291 || sunVarOpaqueUnpack(a, ea, &a, &ai->data, &ai->ndata, 400) < 0)
302 sunEnumPack(uchar *a, uchar *ea, uchar **pa, int *e)
307 return sunUint32Pack(a, ea, pa, &x);
311 sunUint1Pack(uchar *a, uchar *ea, uchar **pa, u1int *u)
316 return sunUint32Pack(a, ea, pa, &x);
320 sunUint32Pack(uchar *a, uchar *ea, uchar **pa, u32int *u)
341 sunEnumUnpack(uchar *a, uchar *ea, uchar **pa, int *e)
344 if(sunUint32Unpack(a, ea, pa, &x) < 0)
351 sunUint1Unpack(uchar *a, uchar *ea, uchar **pa, u1int *u)
354 if(sunUint32Unpack(a, ea, pa, &x) < 0 || (x!=0 && x!=1)){
363 sunUint32Unpack(uchar *a, uchar *ea, uchar **pa, u32int *u)
383 sunUint64Unpack(uchar *a, uchar *ea, uchar **pa, u64int *u)
387 if(sunUint32Unpack(a, ea, &a, &x) < 0
388 || sunUint32Unpack(a, ea, &a, &y) < 0)
390 *u = ((uvlong)x<<32) | y;
399 sunUint64Pack(uchar *a, uchar *ea, uchar **pa, u64int *u)
405 if(sunUint32Pack(a, ea, &a, &x) < 0
406 || sunUint32Pack(a, ea, &a, &y) < 0)
416 sunStringSize(char *s)
418 return (4+strlen(s)+3) & ~3;
422 sunStringUnpack(uchar *a, uchar *ea, uchar **pa, char **s, u32int max)
427 if(sunVarOpaqueUnpack(a, ea, pa, &dat, &n, max) < 0)
429 /* slide string down over length to make room for NUL */
430 memmove(dat-1, dat, n);
439 sunStringPack(uchar *a, uchar *ea, uchar **pa, char **s, u32int max)
444 return sunVarOpaquePack(a, ea, pa, (uchar**)s, &n, max);
448 sunVarOpaqueSize(u32int n)
454 sunVarOpaquePack(uchar *a, uchar *ea, uchar **pa, uchar **dat, u32int *ndat, u32int max)
456 if(*ndat > max || sunUint32Pack(a, ea, &a, ndat) < 0
457 || sunFixedOpaquePack(a, ea, &a, *dat, *ndat) < 0)
468 sunVarOpaqueUnpack(uchar *a, uchar *ea, uchar **pa, uchar **dat, u32int *ndat, u32int max)
470 if(sunUint32Unpack(a, ea, &a, ndat) < 0
486 sunFixedOpaqueSize(u32int n)
492 sunFixedOpaquePack(uchar *a, uchar *ea, uchar **pa, uchar *dat, u32int n)
501 memset(a+n, 0, nn-n);
512 sunFixedOpaqueUnpack(uchar *a, uchar *ea, uchar **pa, uchar *dat, u32int n)