prog.c (1759B)
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((int32)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((int32)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, "%ud %d: '%.*H' unpack failed\n", prog->prog, c->type, (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((int32)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((int32)c->type < 0 || c->type >= prog->nproc || (size=prog->proc[c->type].size) == nil) 72 return ~0; 73 return (*size)(c); 74 }