plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }