| #include <u.h> |
| #include <libc.h> |
| #include <thread.h> |
| #include <sunrpc.h> |
| |
| SunStatus |
| suncallpack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c) |
| { |
| uchar *x; |
| int (*pack)(uchar*, uchar*, uchar**, SunCall*); |
| |
| if(pa == nil) |
| pa = &x; |
| if((int32)c->type < 0 || c->type >= prog->nproc || (pack=prog->proc[c->type].pack) == nil) |
| return SunProcUnavail; |
| if((*pack)(a, ea, pa, c) < 0) |
| return SunGarbageArgs; |
| return SunSuccess; |
| } |
| |
| SunStatus |
| suncallunpack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c) |
| { |
| uchar *x; |
| int (*unpack)(uchar*, uchar*, uchar**, SunCall*); |
| |
| if(pa == nil) |
| pa = &x; |
| if((int32)c->type < 0 || c->type >= prog->nproc || (unpack=prog->proc[c->type].unpack) == nil) |
| return SunProcUnavail; |
| if((*unpack)(a, ea, pa, c) < 0){ |
| fprint(2, "%ud %d: '%.*H' unpack failed\n", prog->prog, c->type, (int)(ea-a), a); |
| return SunGarbageArgs; |
| } |
| return SunSuccess; |
| } |
| |
| SunStatus |
| suncallunpackalloc(SunProg *prog, SunCallType type, uchar *a, uchar *ea, uchar **pa, SunCall **pc) |
| { |
| uchar *x; |
| uint size; |
| int (*unpack)(uchar*, uchar*, uchar**, SunCall*); |
| SunCall *c; |
| |
| if(pa == nil) |
| pa = &x; |
| if((int32)type < 0 || type >= prog->nproc || (unpack=prog->proc[type].unpack) == nil) |
| return SunProcUnavail; |
| size = prog->proc[type].sizeoftype; |
| if(size == 0) |
| return SunProcUnavail; |
| c = mallocz(size, 1); |
| if(c == nil) |
| return SunSystemErr; |
| c->type = type; |
| if((*unpack)(a, ea, pa, c) < 0){ |
| fprint(2, "in: %.*H unpack failed\n", (int)(ea-a), a); |
| free(c); |
| return SunGarbageArgs; |
| } |
| *pc = c; |
| return SunSuccess; |
| } |
| |
| uint |
| suncallsize(SunProg *prog, SunCall *c) |
| { |
| uint (*size)(SunCall*); |
| |
| if((int32)c->type < 0 || c->type >= prog->nproc || (size=prog->proc[c->type].size) == nil) |
| return ~0; |
| return (*size)(c); |
| } |