xref: /plan9/sys/src/libsunrpc/prog.c (revision 6ff5e9135082ce281d25c68a5544eef8249d480c)
1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <sunrpc.h>
5 
6 SunStatus
sunCallPack(SunProg * prog,uchar * a,uchar * ea,uchar ** pa,SunCall * c)7 sunCallPack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c)
8 {
9 	uchar *x;
10 	int (*pack)(uchar*, uchar*, uchar**, SunCall*);
11 
12 	if(pa == nil)
13 		pa = &x;
14 	if(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 }
20 
21 SunStatus
sunCallUnpack(SunProg * prog,uchar * a,uchar * ea,uchar ** pa,SunCall * c)22 sunCallUnpack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c)
23 {
24 	uchar *x;
25 	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
26 
27 	if(pa == nil)
28 		pa = &x;
29 	if(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, "in: %.*H unpack failed\n", (int)(ea-a), a);
33 		return SunGarbageArgs;
34 	}
35 	return SunSuccess;
36 }
37 
38 SunStatus
sunCallUnpackAlloc(SunProg * prog,SunCallType type,uchar * a,uchar * ea,uchar ** pa,SunCall ** pc)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;
45 
46 	if(pa == nil)
47 		pa = &x;
48 	if(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 }
65 
66 uint
sunCallSize(SunProg * prog,SunCall * c)67 sunCallSize(SunProg *prog, SunCall *c)
68 {
69 	uint (*size)(SunCall*);
70 
71 	if(c->type < 0 || c->type >= prog->nproc || (size=prog->proc[c->type].size) == nil)
72 		return ~0;
73 	return (*size)(c);
74 }
75