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