fmt.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 }