xref: /plan9/sys/src/libsunrpc/prog.c (revision 34e0422554c8e8bef66509534d2c44f4660bf678)
1*34e04225SDavid du Colombier #include <u.h>
2*34e04225SDavid du Colombier #include <libc.h>
3*34e04225SDavid du Colombier #include <thread.h>
4*34e04225SDavid du Colombier #include <sunrpc.h>
5*34e04225SDavid du Colombier 
6*34e04225SDavid du Colombier SunStatus
7*34e04225SDavid du Colombier sunCallPack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c)
8*34e04225SDavid du Colombier {
9*34e04225SDavid du Colombier 	uchar *x;
10*34e04225SDavid du Colombier 	int (*pack)(uchar*, uchar*, uchar**, SunCall*);
11*34e04225SDavid du Colombier 
12*34e04225SDavid du Colombier 	if(pa == nil)
13*34e04225SDavid du Colombier 		pa = &x;
14*34e04225SDavid du Colombier 	if(c->type < 0 || c->type >= prog->nproc || (pack=prog->proc[c->type].pack) == nil)
15*34e04225SDavid du Colombier 		return SunProcUnavail;
16*34e04225SDavid du Colombier 	if((*pack)(a, ea, pa, c) < 0)
17*34e04225SDavid du Colombier 		return SunGarbageArgs;
18*34e04225SDavid du Colombier 	return SunSuccess;
19*34e04225SDavid du Colombier }
20*34e04225SDavid du Colombier 
21*34e04225SDavid du Colombier SunStatus
22*34e04225SDavid du Colombier sunCallUnpack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c)
23*34e04225SDavid du Colombier {
24*34e04225SDavid du Colombier 	uchar *x;
25*34e04225SDavid du Colombier 	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
26*34e04225SDavid du Colombier 
27*34e04225SDavid du Colombier 	if(pa == nil)
28*34e04225SDavid du Colombier 		pa = &x;
29*34e04225SDavid du Colombier 	if(c->type < 0 || c->type >= prog->nproc || (unpack=prog->proc[c->type].unpack) == nil)
30*34e04225SDavid du Colombier 		return SunProcUnavail;
31*34e04225SDavid du Colombier 	if((*unpack)(a, ea, pa, c) < 0)
32*34e04225SDavid du Colombier 		return SunGarbageArgs;
33*34e04225SDavid du Colombier 	return SunSuccess;
34*34e04225SDavid du Colombier }
35*34e04225SDavid du Colombier 
36*34e04225SDavid du Colombier SunStatus
37*34e04225SDavid du Colombier sunCallUnpackAlloc(SunProg *prog, SunCallType type, uchar *a, uchar *ea, uchar **pa, SunCall **pc)
38*34e04225SDavid du Colombier {
39*34e04225SDavid du Colombier 	uchar *x;
40*34e04225SDavid du Colombier 	uint size;
41*34e04225SDavid du Colombier 	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
42*34e04225SDavid du Colombier 	SunCall *c;
43*34e04225SDavid du Colombier 
44*34e04225SDavid du Colombier 	if(pa == nil)
45*34e04225SDavid du Colombier 		pa = &x;
46*34e04225SDavid du Colombier 	if(type < 0 || type >= prog->nproc || (unpack=prog->proc[type].unpack) == nil)
47*34e04225SDavid du Colombier 		return SunProcUnavail;
48*34e04225SDavid du Colombier 	size = prog->proc[type].sizeoftype;
49*34e04225SDavid du Colombier 	if(size == 0)
50*34e04225SDavid du Colombier 		return SunProcUnavail;
51*34e04225SDavid du Colombier 	c = mallocz(size, 1);
52*34e04225SDavid du Colombier 	if(c == nil)
53*34e04225SDavid du Colombier 		return SunSystemErr;
54*34e04225SDavid du Colombier 	c->type = type;
55*34e04225SDavid du Colombier 	if((*unpack)(a, ea, pa, c) < 0){
56*34e04225SDavid du Colombier 		free(c);
57*34e04225SDavid du Colombier 		return SunGarbageArgs;
58*34e04225SDavid du Colombier 	}
59*34e04225SDavid du Colombier 	*pc = c;
60*34e04225SDavid du Colombier 	return SunSuccess;
61*34e04225SDavid du Colombier }
62*34e04225SDavid du Colombier 
63*34e04225SDavid du Colombier uint
64*34e04225SDavid du Colombier sunCallSize(SunProg *prog, SunCall *c)
65*34e04225SDavid du Colombier {
66*34e04225SDavid du Colombier 	uint (*size)(SunCall*);
67*34e04225SDavid du Colombier 
68*34e04225SDavid du Colombier 	if(c->type < 0 || c->type >= prog->nproc || (size=prog->proc[c->type].size) == nil)
69*34e04225SDavid du Colombier 		return ~0;
70*34e04225SDavid du Colombier 	return (*size)(c);
71*34e04225SDavid du Colombier }
72