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