Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
		fprint(2, "in: %.*H unpack failed\n", (int)(ea-a), a);
33
		return SunGarbageArgs;
34
	}
35
	return SunSuccess;
36
}
37
 
38
SunStatus
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
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
}