xref: /plan9/sys/src/cmd/ip/snoopy/aoemask.c (revision 43751f27fa93b002d5e921851faf5da5cbdcb417)
1*43751f27SDavid du Colombier #include <u.h>
2*43751f27SDavid du Colombier #include <libc.h>
3*43751f27SDavid du Colombier #include <ip.h>
4*43751f27SDavid du Colombier #include "dat.h"
5*43751f27SDavid du Colombier #include "protos.h"
6*43751f27SDavid du Colombier 
7*43751f27SDavid du Colombier typedef struct {
8*43751f27SDavid du Colombier 	uchar	res;
9*43751f27SDavid du Colombier 	uchar	cmd;
10*43751f27SDavid du Colombier 	uchar	err;
11*43751f27SDavid du Colombier 	uchar	cnt;
12*43751f27SDavid du Colombier } Hdr;
13*43751f27SDavid du Colombier 
14*43751f27SDavid du Colombier enum {
15*43751f27SDavid du Colombier 	Ocmd,
16*43751f27SDavid du Colombier 	Oerr,
17*43751f27SDavid du Colombier 	Ocnt,
18*43751f27SDavid du Colombier 
19*43751f27SDavid du Colombier 	Hsize	= 4,
20*43751f27SDavid du Colombier };
21*43751f27SDavid du Colombier 
22*43751f27SDavid du Colombier static Field p_fields[] =
23*43751f27SDavid du Colombier {
24*43751f27SDavid du Colombier 	{ "cmd",	Fnum,	Ocmd,	"command", },
25*43751f27SDavid du Colombier 	{ "err",	Fnum,	Oerr,	"error", },
26*43751f27SDavid du Colombier 	{ "cnt",	Fnum,	Ocnt,	"count", },
27*43751f27SDavid du Colombier 	nil
28*43751f27SDavid du Colombier };
29*43751f27SDavid du Colombier 
30*43751f27SDavid du Colombier static Mux p_mux[] = {
31*43751f27SDavid du Colombier 	{ "aoemd",	0 },
32*43751f27SDavid du Colombier 	{ "aoemd",	1 },
33*43751f27SDavid du Colombier 	nil
34*43751f27SDavid du Colombier };
35*43751f27SDavid du Colombier 
36*43751f27SDavid du Colombier static void
p_compile(Filter * f)37*43751f27SDavid du Colombier p_compile(Filter *f)
38*43751f27SDavid du Colombier {
39*43751f27SDavid du Colombier 	Mux *m;
40*43751f27SDavid du Colombier 
41*43751f27SDavid du Colombier 	if(f->op == '='){
42*43751f27SDavid du Colombier 		compile_cmp(aoerr.name, f, p_fields);
43*43751f27SDavid du Colombier 		return;
44*43751f27SDavid du Colombier 	}
45*43751f27SDavid du Colombier 	for(m = p_mux; m->name; m++)
46*43751f27SDavid du Colombier 		if(strcmp(f->s, m->name) == 0){
47*43751f27SDavid du Colombier 			f->pr = m->pr;
48*43751f27SDavid du Colombier 			f->ulv = m->val;
49*43751f27SDavid du Colombier 			f->subop = Ocmd;
50*43751f27SDavid du Colombier 			return;
51*43751f27SDavid du Colombier 		}
52*43751f27SDavid du Colombier 	sysfatal("unknown aoemask field: %s", f->s);
53*43751f27SDavid du Colombier }
54*43751f27SDavid du Colombier 
55*43751f27SDavid du Colombier static int
p_filter(Filter * f,Msg * m)56*43751f27SDavid du Colombier p_filter(Filter *f, Msg *m)
57*43751f27SDavid du Colombier {
58*43751f27SDavid du Colombier 	Hdr *h;
59*43751f27SDavid du Colombier 
60*43751f27SDavid du Colombier 	if(m->pe - m->ps < Hsize)
61*43751f27SDavid du Colombier 		return 0;
62*43751f27SDavid du Colombier 
63*43751f27SDavid du Colombier 	h = (Hdr*)m->ps;
64*43751f27SDavid du Colombier 	m->ps += Hsize;
65*43751f27SDavid du Colombier 
66*43751f27SDavid du Colombier 	switch(f->subop){
67*43751f27SDavid du Colombier 	case Ocmd:
68*43751f27SDavid du Colombier 		return h->cmd == f->ulv;
69*43751f27SDavid du Colombier 	case Oerr:
70*43751f27SDavid du Colombier 		return h->err == f->ulv;
71*43751f27SDavid du Colombier 	case Ocnt:
72*43751f27SDavid du Colombier 		return h->cnt == f->ulv;
73*43751f27SDavid du Colombier 	}
74*43751f27SDavid du Colombier 	return 0;
75*43751f27SDavid du Colombier }
76*43751f27SDavid du Colombier 
77*43751f27SDavid du Colombier static char *ctab[] = {
78*43751f27SDavid du Colombier 	"read",
79*43751f27SDavid du Colombier 	"edit",
80*43751f27SDavid du Colombier };
81*43751f27SDavid du Colombier 
82*43751f27SDavid du Colombier static char *etab[] = {
83*43751f27SDavid du Colombier 	"",
84*43751f27SDavid du Colombier 	"bad",
85*43751f27SDavid du Colombier 	"full",
86*43751f27SDavid du Colombier };
87*43751f27SDavid du Colombier 
88*43751f27SDavid du Colombier static int
p_seprint(Msg * m)89*43751f27SDavid du Colombier p_seprint(Msg *m)
90*43751f27SDavid du Colombier {
91*43751f27SDavid du Colombier 	char *s, *t;
92*43751f27SDavid du Colombier 	Hdr *h;
93*43751f27SDavid du Colombier 
94*43751f27SDavid du Colombier 	if(m->pe - m->ps < Hsize)
95*43751f27SDavid du Colombier 		return 0;
96*43751f27SDavid du Colombier 
97*43751f27SDavid du Colombier 	h = (Hdr*)m->ps;
98*43751f27SDavid du Colombier 	m->ps += Hsize;
99*43751f27SDavid du Colombier 
100*43751f27SDavid du Colombier 	demux(p_mux, h->cmd, h->cmd, m, &dump);
101*43751f27SDavid du Colombier 
102*43751f27SDavid du Colombier 	s = "unk";
103*43751f27SDavid du Colombier 	if(h->cmd < nelem(ctab))
104*43751f27SDavid du Colombier 		s = ctab[h->cmd];
105*43751f27SDavid du Colombier 	t = "unk";
106*43751f27SDavid du Colombier 	if(h->err < nelem(etab))
107*43751f27SDavid du Colombier 		s = etab[h->err];
108*43751f27SDavid du Colombier 	m->p = seprint(m->p, m->e, "cmd=%d %s err=%d %s cnt=%d\n",
109*43751f27SDavid du Colombier 		h->cmd, s, h->err, t, h->cnt);
110*43751f27SDavid du Colombier 	return 0;
111*43751f27SDavid du Colombier }
112*43751f27SDavid du Colombier 
113*43751f27SDavid du Colombier Proto aoemask = {
114*43751f27SDavid du Colombier 	"aoemask",
115*43751f27SDavid du Colombier 	p_compile,
116*43751f27SDavid du Colombier 	p_filter,
117*43751f27SDavid du Colombier 	p_seprint,
118*43751f27SDavid du Colombier 	p_mux,
119*43751f27SDavid du Colombier 	"%lud",
120*43751f27SDavid du Colombier 	p_fields,
121*43751f27SDavid du Colombier 	defaultframer,
122*43751f27SDavid du Colombier };
123