aoemask.c 1.6 KB

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