xref: /plan9/sys/src/libsunrpc/fmt.c (revision 34e0422554c8e8bef66509534d2c44f4660bf678)
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