testscan.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #include "sys.h"
  2. #include "spam.h"
  3. int debug;
  4. Biobuf bin;
  5. char patfile[128], header[Hdrsize+2];
  6. char cmd[1024];
  7. char* canon(Biobuf*, char*, char*, int*);
  8. int matcher(char *, Pattern*, char*, Resub*);
  9. int matchaction(Patterns*, char*);
  10. void
  11. usage(void)
  12. {
  13. fprint(2, "missing or bad arguments to qer\n");
  14. exits("usage");
  15. }
  16. void *
  17. Malloc(long n)
  18. {
  19. void *p;
  20. p = malloc(n);
  21. if(p == 0){
  22. fprint(2, "malloc error");
  23. exits("malloc");
  24. }
  25. return p;
  26. }
  27. void*
  28. Realloc(void *p, ulong n)
  29. {
  30. p = realloc(p, n);
  31. if(p == 0){
  32. fprint(2, "realloc error");
  33. exits("realloc");
  34. }
  35. return p;
  36. }
  37. void
  38. dumppats(void)
  39. {
  40. int i, j;
  41. Pattern *p;
  42. Spat *s, *q;
  43. for(i = 0; patterns[i].action; i++){
  44. for(p = patterns[i].regexps; p; p = p->next){
  45. print("%s <REGEXP>\n", patterns[i].action);
  46. if(p->alt)
  47. print("Alt:");
  48. for(s = p->alt; s; s = s->next)
  49. print("\t%s\n", s->string);
  50. }
  51. p = patterns[i].strings;
  52. if(p == 0)
  53. continue;
  54. for(j = 0; j < Nhash; j++){
  55. for(s = p->spat[j]; s; s = s->next){
  56. print("%s %s\n", patterns[i].action, s->string);
  57. if(s->alt)
  58. print("Alt:");
  59. for(q = s->alt; q; q = q->next)
  60. print("\t%s\n", q->string);
  61. }
  62. }
  63. }
  64. }
  65. void
  66. main(int argc, char *argv[])
  67. {
  68. int i, fd, n, aflag, vflag;
  69. char body[Bodysize+2], *raw, *ret;
  70. Biobuf *bp;
  71. sprint(patfile, "%s/patterns", UPASLIB);
  72. aflag = -1;
  73. vflag = 0;
  74. ARGBEGIN {
  75. case 'a':
  76. aflag = 1;
  77. break;
  78. case 'v':
  79. vflag = 1;
  80. break;
  81. case 'd':
  82. debug++;
  83. break;
  84. case 'p':
  85. strcpy(patfile,ARGF());
  86. break;
  87. } ARGEND
  88. bp = Bopen(patfile, OREAD);
  89. if(bp){
  90. parsepats(bp);
  91. Bterm(bp);
  92. }
  93. if(argc >= 1){
  94. fd = open(*argv, OREAD);
  95. if(fd < 0){
  96. fprint(2, "can't open %s\n", *argv);
  97. exits("open");
  98. }
  99. Binit(&bin, fd, OREAD);
  100. } else
  101. Binit(&bin, 0, OREAD);
  102. *body = 0;
  103. *header = 0;
  104. ret = 0;
  105. for(;;){
  106. raw = canon(&bin, header+1, body+1, &n);
  107. if(raw == 0)
  108. break;
  109. if(aflag == 0)
  110. continue;
  111. if(aflag < 0)
  112. aflag = 0;
  113. if(vflag){
  114. if(header[1]) {
  115. fprint(2, "\t**** Header ****\n\n");
  116. write(2, header+1, strlen(header+1));
  117. fprint(2, "\n");
  118. }
  119. fprint(2, "\t**** Body ****\n\n");
  120. if(body[1])
  121. write(2, body+1, strlen(body+1));
  122. fprint(2, "\n");
  123. }
  124. for(i = 0; patterns[i].action; i++){
  125. if(matchaction(&patterns[i], header+1))
  126. ret = patterns[i].action;
  127. if(i == HoldHeader)
  128. continue;
  129. if(matchaction(&patterns[i], body+1))
  130. ret = patterns[i].action;
  131. }
  132. }
  133. exits(ret);
  134. }
  135. char*
  136. canon(Biobuf *bp, char *header, char *body, int *n)
  137. {
  138. int hsize, base64;
  139. static char *raw;
  140. hsize = 0;
  141. base64 = 0;
  142. *header = 0;
  143. *body = 0;
  144. if(raw == 0){
  145. raw = readmsg(bp, &hsize, n);
  146. if(raw)
  147. base64 = convert(raw, raw+hsize, header, Hdrsize, 0);
  148. } else {
  149. free(raw);
  150. raw = readmsg(bp, 0, n);
  151. }
  152. if(raw){
  153. if(base64)
  154. conv64(raw+hsize, raw+*n, body, Bodysize);
  155. else
  156. convert(raw+hsize, raw+*n, body, Bodysize, 1);
  157. }
  158. return raw;
  159. }
  160. int
  161. matchaction(Patterns *pp, char *message)
  162. {
  163. char *name, *cp;
  164. int ret;
  165. Pattern *p;
  166. Resub m[1];
  167. if(message == 0 || *message == 0)
  168. return 0;
  169. name = pp->action;
  170. p = pp->strings;
  171. ret = 0;
  172. if(p)
  173. for(cp = message; matcher(name, p, cp, m); cp = m[0].ep)
  174. ret++;
  175. for(p = pp->regexps; p; p = p->next)
  176. for(cp = message; matcher(name, p, cp, m); cp = m[0].ep)
  177. ret++;
  178. return ret;
  179. }
  180. int
  181. matcher(char *action, Pattern *p, char *message, Resub *m)
  182. {
  183. if(matchpat(p, message, m)){
  184. if(p->action != Lineoff)
  185. xprint(1, action, m);
  186. return 1;
  187. }
  188. return 0;
  189. }