URI:
       tfmt.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tfmt.c (1153B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <thread.h>
            4 #include <sunrpc.h>
            5 
            6 /*
            7  * print formatters
            8  */
            9 int
           10 sunrpcfmt(Fmt *f)
           11 {
           12         SunRpc *rpc;
           13 
           14         rpc = va_arg(f->args, SunRpc*);
           15         sunrpcprint(f, rpc);
           16         return 0;
           17 }
           18 
           19 static SunProg **fmtProg;
           20 static int nfmtProg;
           21 static RWLock fmtLock;
           22 
           23 void
           24 sunfmtinstall(SunProg *p)
           25 {
           26         int i;
           27 
           28         wlock(&fmtLock);
           29         for(i=0; i<nfmtProg; i++){
           30                 if(fmtProg[i] == p){
           31                         wunlock(&fmtLock);
           32                         return;
           33                 }
           34         }
           35         if(nfmtProg%16 == 0)
           36                 fmtProg = erealloc(fmtProg, sizeof(fmtProg[0])*(nfmtProg+16));
           37         fmtProg[nfmtProg++] = p;
           38         wunlock(&fmtLock);
           39 }
           40 
           41 int
           42 suncallfmt(Fmt *f)
           43 {
           44         int i;
           45         void (*fmt)(Fmt*, SunCall*);
           46         SunCall *c;
           47         SunProg *p;
           48 
           49         c = va_arg(f->args, SunCall*);
           50         rlock(&fmtLock);
           51         for(i=0; i<nfmtProg; i++){
           52                 p = fmtProg[i];
           53                 if(p->prog == c->rpc.prog && p->vers == c->rpc.vers){
           54                         runlock(&fmtLock);
           55                         if((int32)c->type < 0 || c->type >= p->nproc || (fmt=p->proc[c->type].fmt) == nil)
           56                                 return fmtprint(f, "unknown proc %c%d", "TR"[c->type&1], c->type>>1);
           57                         (*fmt)(f, c);
           58                         return 0;
           59                 }
           60         }
           61         runlock(&fmtLock);
           62         fmtprint(f, "<sunrpc %d %d %c%d>", c->rpc.prog, c->rpc.vers, "TR"[c->type&1], c->type>>1);
           63         return 0;
           64 }