1*34e04225SDavid du Colombier #include <u.h>
2*34e04225SDavid du Colombier #include <libc.h>
3*34e04225SDavid du Colombier #include <thread.h>
4*34e04225SDavid du Colombier #include <sunrpc.h>
5*34e04225SDavid du Colombier
6*34e04225SDavid du Colombier /*
7*34e04225SDavid du Colombier * print formatters
8*34e04225SDavid du Colombier */
9*34e04225SDavid du Colombier int
sunRpcFmt(Fmt * f)10*34e04225SDavid du Colombier sunRpcFmt(Fmt *f)
11*34e04225SDavid du Colombier {
12*34e04225SDavid du Colombier SunRpc *rpc;
13*34e04225SDavid du Colombier
14*34e04225SDavid du Colombier rpc = va_arg(f->args, SunRpc*);
15*34e04225SDavid du Colombier sunRpcPrint(f, rpc);
16*34e04225SDavid du Colombier return 0;
17*34e04225SDavid du Colombier }
18*34e04225SDavid du Colombier
19*34e04225SDavid du Colombier static SunProg **fmtProg;
20*34e04225SDavid du Colombier static int nfmtProg;
21*34e04225SDavid du Colombier static RWLock fmtLock;
22*34e04225SDavid du Colombier
23*34e04225SDavid du Colombier void
sunFmtInstall(SunProg * p)24*34e04225SDavid du Colombier sunFmtInstall(SunProg *p)
25*34e04225SDavid du Colombier {
26*34e04225SDavid du Colombier int i;
27*34e04225SDavid du Colombier
28*34e04225SDavid du Colombier wlock(&fmtLock);
29*34e04225SDavid du Colombier for(i=0; i<nfmtProg; i++){
30*34e04225SDavid du Colombier if(fmtProg[i] == p){
31*34e04225SDavid du Colombier wunlock(&fmtLock);
32*34e04225SDavid du Colombier return;
33*34e04225SDavid du Colombier }
34*34e04225SDavid du Colombier }
35*34e04225SDavid du Colombier if(nfmtProg%16 == 0)
36*34e04225SDavid du Colombier fmtProg = erealloc(fmtProg, sizeof(fmtProg[0])*(nfmtProg+16));
37*34e04225SDavid du Colombier fmtProg[nfmtProg++] = p;
38*34e04225SDavid du Colombier wunlock(&fmtLock);
39*34e04225SDavid du Colombier }
40*34e04225SDavid du Colombier
41*34e04225SDavid du Colombier int
sunCallFmt(Fmt * f)42*34e04225SDavid du Colombier sunCallFmt(Fmt *f)
43*34e04225SDavid du Colombier {
44*34e04225SDavid du Colombier int i;
45*34e04225SDavid du Colombier void (*fmt)(Fmt*, SunCall*);
46*34e04225SDavid du Colombier SunCall *c;
47*34e04225SDavid du Colombier SunProg *p;
48*34e04225SDavid du Colombier
49*34e04225SDavid du Colombier c = va_arg(f->args, SunCall*);
50*34e04225SDavid du Colombier rlock(&fmtLock);
51*34e04225SDavid du Colombier for(i=0; i<nfmtProg; i++){
52*34e04225SDavid du Colombier p = fmtProg[i];
53*34e04225SDavid du Colombier if(p->prog == c->rpc.prog && p->vers == c->rpc.vers){
54*34e04225SDavid du Colombier runlock(&fmtLock);
55*34e04225SDavid du Colombier if(c->type < 0 || c->type >= p->nproc || (fmt=p->proc[c->type].fmt) == nil)
56*34e04225SDavid du Colombier return fmtprint(f, "unknown proc %c%d", "TR"[c->type&1], c->type>>1);
57*34e04225SDavid du Colombier (*fmt)(f, c);
58*34e04225SDavid du Colombier return 0;
59*34e04225SDavid du Colombier }
60*34e04225SDavid du Colombier }
61*34e04225SDavid du Colombier runlock(&fmtLock);
62*34e04225SDavid du Colombier fmtprint(f, "<sunrpc %d %d %c%d>", c->rpc.prog, c->rpc.vers, "TR"[c->type&1], c->type>>1);
63*34e04225SDavid du Colombier return 0;
64*34e04225SDavid du Colombier }
65