]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsunrpc/prog.c
ssh: document thumbfile options
[plan9front.git] / sys / src / libsunrpc / prog.c
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 }