Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <sunrpc.h>
6 SunStatus
7 suncallpack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c)
8 {
9 uchar *x;
10 int (*pack)(uchar*, uchar*, uchar**, SunCall*);
12 if(pa == nil)
13 pa = &x;
14 if((int32)c->type < 0 || c->type >= prog->nproc || (pack=prog->proc[c->type].pack) == nil)
15 return SunProcUnavail;
16 if((*pack)(a, ea, pa, c) < 0)
17 return SunGarbageArgs;
18 return SunSuccess;
19 }
21 SunStatus
22 suncallunpack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c)
23 {
24 uchar *x;
25 int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
27 if(pa == nil)
28 pa = &x;
29 if((int32)c->type < 0 || c->type >= prog->nproc || (unpack=prog->proc[c->type].unpack) == nil)
30 return SunProcUnavail;
31 if((*unpack)(a, ea, pa, c) < 0){
32 fprint(2, "%ud %d: '%.*H' unpack failed\n", prog->prog, c->type, (int)(ea-a), a);
33 return SunGarbageArgs;
34 }
35 return SunSuccess;
36 }
38 SunStatus
39 suncallunpackalloc(SunProg *prog, SunCallType type, uchar *a, uchar *ea, uchar **pa, SunCall **pc)
40 {
41 uchar *x;
42 uint size;
43 int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
44 SunCall *c;
46 if(pa == nil)
47 pa = &x;
48 if((int32)type < 0 || type >= prog->nproc || (unpack=prog->proc[type].unpack) == nil)
49 return SunProcUnavail;
50 size = prog->proc[type].sizeoftype;
51 if(size == 0)
52 return SunProcUnavail;
53 c = mallocz(size, 1);
54 if(c == nil)
55 return SunSystemErr;
56 c->type = type;
57 if((*unpack)(a, ea, pa, c) < 0){
58 fprint(2, "in: %.*H unpack failed\n", (int)(ea-a), a);
59 free(c);
60 return SunGarbageArgs;
61 }
62 *pc = c;
63 return SunSuccess;
64 }
66 uint
67 suncallsize(SunProg *prog, SunCall *c)
68 {
69 uint (*size)(SunCall*);
71 if((int32)c->type < 0 || c->type >= prog->nproc || (size=prog->proc[c->type].size) == nil)
72 return ~0;
73 return (*size)(c);
74 }