65 lines
1.1 KiB
C
65 lines
1.1 KiB
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;
|
|
}
|