tprog.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tprog.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 }