ref: ff2ebe6cfdacd890a74a6d2f9b0acd062d2633b7
dir: /sys/src/libsunrpc/fmt.c/
#include <u.h> #include <libc.h> #include <thread.h> #include <sunrpc.h> /* * print formatters */ int sunRpcFmt(Fmt *f) { SunRpc *rpc; rpc = va_arg(f->args, SunRpc*); sunRpcPrint(f, rpc); return 0; } static SunProg **fmtProg; static int nfmtProg; static RWLock fmtLock; void sunFmtInstall(SunProg *p) { int i; wlock(&fmtLock); for(i=0; i<nfmtProg; i++){ if(fmtProg[i] == p){ wunlock(&fmtLock); return; } } if(nfmtProg%16 == 0) fmtProg = erealloc(fmtProg, sizeof(fmtProg[0])*(nfmtProg+16)); fmtProg[nfmtProg++] = p; wunlock(&fmtLock); } int sunCallFmt(Fmt *f) { int i; void (*fmt)(Fmt*, SunCall*); SunCall *c; SunProg *p; c = va_arg(f->args, SunCall*); rlock(&fmtLock); for(i=0; i<nfmtProg; i++){ p = fmtProg[i]; if(p->prog == c->rpc.prog && p->vers == c->rpc.vers){ runlock(&fmtLock); if(c->type < 0 || c->type >= p->nproc || (fmt=p->proc[c->type].fmt) == nil) return fmtprint(f, "unknown proc %c%d", "TR"[c->type&1], c->type>>1); (*fmt)(f, c); return 0; } } runlock(&fmtLock); fmtprint(f, "<sunrpc %d %d %c%d>", c->rpc.prog, c->rpc.vers, "TR"[c->type&1], c->type>>1); return 0; }