Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <sunrpc.h>
6 /*
7 * print formatters
8 */
9 int
10 sunrpcfmt(Fmt *f)
11 {
12 SunRpc *rpc;
14 rpc = va_arg(f->args, SunRpc*);
15 sunrpcprint(f, rpc);
16 return 0;
17 }
19 static SunProg **fmtProg;
20 static int nfmtProg;
21 static RWLock fmtLock;
23 void
24 sunfmtinstall(SunProg *p)
25 {
26 int i;
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 }
41 int
42 suncallfmt(Fmt *f)
43 {
44 int i;
45 void (*fmt)(Fmt*, SunCall*);
46 SunCall *c;
47 SunProg *p;
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 }