Blame


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