1*34e04225SDavid du Colombier #include <u.h> 2*34e04225SDavid du Colombier #include <libc.h> 3*34e04225SDavid du Colombier #include <thread.h> 4*34e04225SDavid du Colombier #include <sunrpc.h> 5*34e04225SDavid du Colombier 6*34e04225SDavid du Colombier SunStatus 7*34e04225SDavid du Colombier sunCallPack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c) 8*34e04225SDavid du Colombier { 9*34e04225SDavid du Colombier uchar *x; 10*34e04225SDavid du Colombier int (*pack)(uchar*, uchar*, uchar**, SunCall*); 11*34e04225SDavid du Colombier 12*34e04225SDavid du Colombier if(pa == nil) 13*34e04225SDavid du Colombier pa = &x; 14*34e04225SDavid du Colombier if(c->type < 0 || c->type >= prog->nproc || (pack=prog->proc[c->type].pack) == nil) 15*34e04225SDavid du Colombier return SunProcUnavail; 16*34e04225SDavid du Colombier if((*pack)(a, ea, pa, c) < 0) 17*34e04225SDavid du Colombier return SunGarbageArgs; 18*34e04225SDavid du Colombier return SunSuccess; 19*34e04225SDavid du Colombier } 20*34e04225SDavid du Colombier 21*34e04225SDavid du Colombier SunStatus 22*34e04225SDavid du Colombier sunCallUnpack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c) 23*34e04225SDavid du Colombier { 24*34e04225SDavid du Colombier uchar *x; 25*34e04225SDavid du Colombier int (*unpack)(uchar*, uchar*, uchar**, SunCall*); 26*34e04225SDavid du Colombier 27*34e04225SDavid du Colombier if(pa == nil) 28*34e04225SDavid du Colombier pa = &x; 29*34e04225SDavid du Colombier if(c->type < 0 || c->type >= prog->nproc || (unpack=prog->proc[c->type].unpack) == nil) 30*34e04225SDavid du Colombier return SunProcUnavail; 31*34e04225SDavid du Colombier if((*unpack)(a, ea, pa, c) < 0) 32*34e04225SDavid du Colombier return SunGarbageArgs; 33*34e04225SDavid du Colombier return SunSuccess; 34*34e04225SDavid du Colombier } 35*34e04225SDavid du Colombier 36*34e04225SDavid du Colombier SunStatus 37*34e04225SDavid du Colombier sunCallUnpackAlloc(SunProg *prog, SunCallType type, uchar *a, uchar *ea, uchar **pa, SunCall **pc) 38*34e04225SDavid du Colombier { 39*34e04225SDavid du Colombier uchar *x; 40*34e04225SDavid du Colombier uint size; 41*34e04225SDavid du Colombier int (*unpack)(uchar*, uchar*, uchar**, SunCall*); 42*34e04225SDavid du Colombier SunCall *c; 43*34e04225SDavid du Colombier 44*34e04225SDavid du Colombier if(pa == nil) 45*34e04225SDavid du Colombier pa = &x; 46*34e04225SDavid du Colombier if(type < 0 || type >= prog->nproc || (unpack=prog->proc[type].unpack) == nil) 47*34e04225SDavid du Colombier return SunProcUnavail; 48*34e04225SDavid du Colombier size = prog->proc[type].sizeoftype; 49*34e04225SDavid du Colombier if(size == 0) 50*34e04225SDavid du Colombier return SunProcUnavail; 51*34e04225SDavid du Colombier c = mallocz(size, 1); 52*34e04225SDavid du Colombier if(c == nil) 53*34e04225SDavid du Colombier return SunSystemErr; 54*34e04225SDavid du Colombier c->type = type; 55*34e04225SDavid du Colombier if((*unpack)(a, ea, pa, c) < 0){ 56*34e04225SDavid du Colombier free(c); 57*34e04225SDavid du Colombier return SunGarbageArgs; 58*34e04225SDavid du Colombier } 59*34e04225SDavid du Colombier *pc = c; 60*34e04225SDavid du Colombier return SunSuccess; 61*34e04225SDavid du Colombier } 62*34e04225SDavid du Colombier 63*34e04225SDavid du Colombier uint 64*34e04225SDavid du Colombier sunCallSize(SunProg *prog, SunCall *c) 65*34e04225SDavid du Colombier { 66*34e04225SDavid du Colombier uint (*size)(SunCall*); 67*34e04225SDavid du Colombier 68*34e04225SDavid du Colombier if(c->type < 0 || c->type >= prog->nproc || (size=prog->proc[c->type].size) == nil) 69*34e04225SDavid du Colombier return ~0; 70*34e04225SDavid du Colombier return (*size)(c); 71*34e04225SDavid du Colombier } 72