Blame


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