diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/libsunrpc/fmt.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/libsunrpc/fmt.c')
-rwxr-xr-x | sys/src/libsunrpc/fmt.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/sys/src/libsunrpc/fmt.c b/sys/src/libsunrpc/fmt.c new file mode 100755 index 000000000..e1bd24492 --- /dev/null +++ b/sys/src/libsunrpc/fmt.c @@ -0,0 +1,64 @@ +#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; +} |