xref: /plan9/sys/src/libsunrpc/prog.c (revision 6ff5e9135082ce281d25c68a5544eef8249d480c)
134e04225SDavid du Colombier #include <u.h>
234e04225SDavid du Colombier #include <libc.h>
334e04225SDavid du Colombier #include <thread.h>
434e04225SDavid du Colombier #include <sunrpc.h>
534e04225SDavid du Colombier 
634e04225SDavid du Colombier SunStatus
sunCallPack(SunProg * prog,uchar * a,uchar * ea,uchar ** pa,SunCall * c)734e04225SDavid du Colombier sunCallPack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c)
834e04225SDavid du Colombier {
934e04225SDavid du Colombier 	uchar *x;
1034e04225SDavid du Colombier 	int (*pack)(uchar*, uchar*, uchar**, SunCall*);
1134e04225SDavid du Colombier 
1234e04225SDavid du Colombier 	if(pa == nil)
1334e04225SDavid du Colombier 		pa = &x;
1434e04225SDavid du Colombier 	if(c->type < 0 || c->type >= prog->nproc || (pack=prog->proc[c->type].pack) == nil)
1534e04225SDavid du Colombier 		return SunProcUnavail;
1634e04225SDavid du Colombier 	if((*pack)(a, ea, pa, c) < 0)
1734e04225SDavid du Colombier 		return SunGarbageArgs;
1834e04225SDavid du Colombier 	return SunSuccess;
1934e04225SDavid du Colombier }
2034e04225SDavid du Colombier 
2134e04225SDavid du Colombier SunStatus
sunCallUnpack(SunProg * prog,uchar * a,uchar * ea,uchar ** pa,SunCall * c)2234e04225SDavid du Colombier sunCallUnpack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c)
2334e04225SDavid du Colombier {
2434e04225SDavid du Colombier 	uchar *x;
2534e04225SDavid du Colombier 	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
2634e04225SDavid du Colombier 
2734e04225SDavid du Colombier 	if(pa == nil)
2834e04225SDavid du Colombier 		pa = &x;
2934e04225SDavid du Colombier 	if(c->type < 0 || c->type >= prog->nproc || (unpack=prog->proc[c->type].unpack) == nil)
3034e04225SDavid du Colombier 		return SunProcUnavail;
31*6ff5e913SDavid du Colombier 	if((*unpack)(a, ea, pa, c) < 0){
32*6ff5e913SDavid du Colombier 		fprint(2, "in: %.*H unpack failed\n", (int)(ea-a), a);
3334e04225SDavid du Colombier 		return SunGarbageArgs;
34*6ff5e913SDavid du Colombier 	}
3534e04225SDavid du Colombier 	return SunSuccess;
3634e04225SDavid du Colombier }
3734e04225SDavid du Colombier 
3834e04225SDavid du Colombier SunStatus
sunCallUnpackAlloc(SunProg * prog,SunCallType type,uchar * a,uchar * ea,uchar ** pa,SunCall ** pc)3934e04225SDavid du Colombier sunCallUnpackAlloc(SunProg *prog, SunCallType type, uchar *a, uchar *ea, uchar **pa, SunCall **pc)
4034e04225SDavid du Colombier {
4134e04225SDavid du Colombier 	uchar *x;
4234e04225SDavid du Colombier 	uint size;
4334e04225SDavid du Colombier 	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);
4434e04225SDavid du Colombier 	SunCall *c;
4534e04225SDavid du Colombier 
4634e04225SDavid du Colombier 	if(pa == nil)
4734e04225SDavid du Colombier 		pa = &x;
4834e04225SDavid du Colombier 	if(type < 0 || type >= prog->nproc || (unpack=prog->proc[type].unpack) == nil)
4934e04225SDavid du Colombier 		return SunProcUnavail;
5034e04225SDavid du Colombier 	size = prog->proc[type].sizeoftype;
5134e04225SDavid du Colombier 	if(size == 0)
5234e04225SDavid du Colombier 		return SunProcUnavail;
5334e04225SDavid du Colombier 	c = mallocz(size, 1);
5434e04225SDavid du Colombier 	if(c == nil)
5534e04225SDavid du Colombier 		return SunSystemErr;
5634e04225SDavid du Colombier 	c->type = type;
5734e04225SDavid du Colombier 	if((*unpack)(a, ea, pa, c) < 0){
58*6ff5e913SDavid du Colombier 		fprint(2, "in: %.*H unpack failed\n", (int)(ea-a), a);
5934e04225SDavid du Colombier 		free(c);
6034e04225SDavid du Colombier 		return SunGarbageArgs;
6134e04225SDavid du Colombier 	}
6234e04225SDavid du Colombier 	*pc = c;
6334e04225SDavid du Colombier 	return SunSuccess;
6434e04225SDavid du Colombier }
6534e04225SDavid du Colombier 
6634e04225SDavid du Colombier uint
sunCallSize(SunProg * prog,SunCall * c)6734e04225SDavid du Colombier sunCallSize(SunProg *prog, SunCall *c)
6834e04225SDavid du Colombier {
6934e04225SDavid du Colombier 	uint (*size)(SunCall*);
7034e04225SDavid du Colombier 
7134e04225SDavid du Colombier 	if(c->type < 0 || c->type >= prog->nproc || (size=prog->proc[c->type].size) == nil)
7234e04225SDavid du Colombier 		return ~0;
7334e04225SDavid du Colombier 	return (*size)(c);
7434e04225SDavid du Colombier }
75