xref: /plan9/sys/src/libsunrpc/prog.c (revision 0b459c2cb92b7c9d88818e9a2f72e678e5bc4553)
1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <sunrpc.h>
5 
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*);
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
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 		return SunGarbageArgs;
33 	return SunSuccess;
34 }
35 
36 SunStatus
37 sunCallUnpackAlloc(SunProg *prog, SunCallType type, uchar *a, uchar *ea, uchar **pa, SunCall **pc)
38 {
39 	uchar *x;
40 	uint size;
41 	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
42 	SunCall *c;
43 
44 	if(pa == nil)
45 		pa = &x;
46 	if(type < 0 || type >= prog->nproc || (unpack=prog->proc[type].unpack) == nil)
47 		return SunProcUnavail;
48 	size = prog->proc[type].sizeoftype;
49 	if(size == 0)
50 		return SunProcUnavail;
51 	c = mallocz(size, 1);
52 	if(c == nil)
53 		return SunSystemErr;
54 	c->type = type;
55 	if((*unpack)(a, ea, pa, c) < 0){
56 		free(c);
57 		return SunGarbageArgs;
58 	}
59 	*pc = c;
60 	return SunSuccess;
61 }
62 
63 uint
64 sunCallSize(SunProg *prog, SunCall *c)
65 {
66 	uint (*size)(SunCall*);
67 
68 	if(c->type < 0 || c->type >= prog->nproc || (size=prog->proc[c->type].size) == nil)
69 		return ~0;
70 	return (*size)(c);
71 }
72