1# CIDRMATCH.RC
2#
3# File created 7/12/2005 -GE
4# Last Updated: 4/03/2010
5
6# CIDR (Classless Inter-Domain Routing)
7#
8# Generate partial regexp patterns for every possible IPv4 NETWORK/CIDR
9# pattern from /8 to /32 related to the IPv4 address we are looking at.
10#
11# This file is written entirely in procmail. Yes, I know it's re-inventing the wheel
12# however this may be the only way to ensure maximum backward compatability with
13# the various older operating systems using the SpamBouncer. -GE
14
15:0
16* ! LOCALIP ?? ^000\.000\.000\.000$
17{
18 Q1A=${QUAD2}
19
20 # Bit7
21 :0
22 * 1^0
23 * $ ${Q1A}^0
24 * -128^0
25 {
26  BIT7=128
27  Q1A=$=
28  :0
29  * $ ${Q1A}^0
30  * -1^0
31  { Q1A=$= }
32  :0 E
33  { Q1A=0 }
34 }
35 :0 E
36 { BIT7=0 }
37
38 # Bit6
39 :0
40 * 1^0
41 * $ ${Q1A}^0
42 * -64^0
43 {
44  BIT6=64
45  Q1A=$=
46  :0
47  * $ ${Q1A}^0
48  * -1^0
49  { Q1A=$= }
50  :0 E
51  { Q1A=0 }
52 }
53 :0 E
54 { BIT6=0 }
55
56 # Bit5
57 :0
58 * 1^0
59 * $ ${Q1A}^0
60 * -32^0
61 {
62  BIT5=32
63  Q1A=$=
64  :0
65  * $ ${Q1A}^0
66  * -1^0
67  { Q1A=$= }
68  :0 E
69  { Q1A=0 }
70 }
71 :0 E
72 { BIT5=0 }
73
74 # Bit4
75 :0
76 * 1^0
77 * $ ${Q1A}^0
78 * -16^0
79 {
80  BIT4=16
81  Q1A=$=
82  :0
83  * $ ${Q1A}^0
84  * -1^0
85  { Q1A=$= }
86  :0 E
87  { Q1A=0 }
88 }
89 :0 E
90 { BIT4=0 }
91
92 # Bit3
93 :0
94 * 1^0
95 * $ ${Q1A}^0
96 * -8^0
97 {
98  BIT3=8
99  Q1A=$=
100  :0
101  * $ ${Q1A}^0
102  * -1^0
103  { Q1A=$= }
104  :0 E
105  { Q1A=0 }
106 }
107 :0 E
108 { BIT3=0 }
109
110 # Bit2
111 :0
112 * 1^0
113 * $ ${Q1A}^0
114 * -4^0
115 {
116  BIT2=4
117  Q1A=$=
118  :0
119  * $ ${Q1A}^0
120  * -1^0
121  { Q1A=$= }
122  :0 E
123  { Q1A=0 }
124 }
125 :0 E
126 { BIT2=0 }
127
128 # Bit1
129 :0
130 * 1^0
131 * $ ${Q1A}^0
132 * -2^0
133 {
134  BIT1=2
135  Q1A=$=
136  :0
137  * $ ${Q1A}^0
138  * -1^0
139  { Q1A=$= }
140  :0 E
141  { Q1A=0 }
142 }
143 :0 E
144 { BIT1=0 }
145
146 # Bit0 is implied
147
148 # CIDR8
149 CIDR8="${QUAD1}\.0\.0\.0/8"
150
151 # CIDR9
152 :0
153 * $ ${BIT7}^0
154 {
155  CIDRT=$=
156  CIDR9="${QUAD1}\.${CIDRT}\.0\.0/9"
157 }
158 :0 E
159 { CIDR9="${QUAD1}\.0\.0\.0/9" }
160
161 # CIDR10
162 :0
163 * $ ${BIT7}^0
164 * $ ${BIT6}^0
165 {
166  CIDRT=$=
167  CIDR10="${QUAD1}\.${CIDRT}\.0\.0/10"
168 }
169 :0 E
170 { CIDR10="${QUAD1}\.0\.0\.0/10" }
171
172 # CIDR11
173 :0
174 * $ ${BIT7}^0
175 * $ ${BIT6}^0
176 * $ ${BIT5}^0
177 {
178  CIDRT=$=
179  CIDR11="${QUAD1}\.${CIDRT}\.0\.0/11"
180 }
181 :0 E
182 { CIDR11="${QUAD1}\.0\.0\.0/11" }
183
184
185 # CIDR12
186 :0
187 * $ ${BIT7}^0
188 * $ ${BIT6}^0
189 * $ ${BIT5}^0
190 * $ ${BIT4}^0
191 {
192  CIDRT=$=
193  CIDR12="${QUAD1}\.${CIDRT}\.0\.0/12"
194 }
195 :0 E
196 { CIDR12="${QUAD1}\.0\.0\.0/12" }
197
198 # CIDR13
199 :0
200 * $ ${BIT7}^0
201 * $ ${BIT6}^0
202 * $ ${BIT5}^0
203 * $ ${BIT4}^0
204 * $ ${BIT3}^0
205 {
206  CIDRT=$=
207  CIDR13="${QUAD1}\.${CIDRT}\.0\.0/13"
208 }
209 :0 E
210 { CIDR13="${QUAD1}\.0\.0\.0/13" }
211
212 # CIDR14
213 :0
214 * $ ${BIT7}^0
215 * $ ${BIT6}^0
216 * $ ${BIT5}^0
217 * $ ${BIT4}^0
218 * $ ${BIT3}^0
219 * $ ${BIT2}^0
220 {
221  CIDRT=$=
222  CIDR14="${QUAD1}\.${CIDRT}\.0\.0/14"
223 }
224 :0 E
225 { CIDR14="${QUAD1}\.0\.0\.0/14" }
226
227 # CIDR15
228 :0
229 * $ ${BIT7}^0
230 * $ ${BIT6}^0
231 * $ ${BIT5}^0
232 * $ ${BIT4}^0
233 * $ ${BIT3}^0
234 * $ ${BIT2}^0
235 * $ ${BIT1}^0
236 {
237  CIDRT=$=
238  CIDR15="${QUAD1}\.${CIDRT}\.0\.0/15"
239 }
240 :0 E
241 { CIDR15="${QUAD1}\.0\.0\.0/15" }
242
243 # CIDR16
244 CIDR16="${QUAD1}\.${QUAD2}\.0\.0/16"
245
246 Q1A=${QUAD3}
247
248 # Bit7
249 :0
250 * 1^0
251 * $ ${Q1A}^0
252 * -128^0
253 {
254  BIT7=128
255  Q1A=$=
256  :0
257  * $ ${Q1A}^0
258  * -1^0
259  { Q1A=$= }
260  :0 E
261  { Q1A=0 }
262 }
263 :0 E
264 { BIT7=0 }
265
266 # Bit6
267 :0
268 * 1^0
269 * $ ${Q1A}^0
270 * -64^0
271 {
272  BIT6=64
273  Q1A=$=
274  :0
275  * $ ${Q1A}^0
276  * -1^0
277  { Q1A=$= }
278  :0 E
279  { Q1A=0 }
280 }
281 :0 E
282 { BIT6=0 }
283
284 # Bit5
285 :0
286 * 1^0
287 * $ ${Q1A}^0
288 * -32^0
289 {
290  BIT5=32
291  Q1A=$=
292  :0
293  * $ ${Q1A}^0
294  * -1^0
295  { Q1A=$= }
296  :0 E
297  { Q1A=0 }
298 }
299 :0 E
300 { BIT5=0 }
301
302 # Bit4
303 :0
304 * 1^0
305 * $ ${Q1A}^0
306 * -16^0
307 {
308  BIT4=16
309  Q1A=$=
310  :0
311  * $ ${Q1A}^0
312  * -1^0
313  { Q1A=$= }
314  :0 E
315  { Q1A=0 }
316 }
317 :0 E
318 { BIT4=0 }
319
320 # Bit3
321 :0
322 * 1^0
323 * $ ${Q1A}^0
324 * -8^0
325 {
326  BIT3=8
327  Q1A=$=
328  :0
329  * $ ${Q1A}^0
330  * -1^0
331  { Q1A=$= }
332  :0 E
333  { Q1A=0 }
334 }
335 :0 E
336 { BIT3=0 }
337
338 # Bit2
339 :0
340 * 1^0
341 * $ ${Q1A}^0
342 * -4^0
343 {
344  BIT2=4
345  Q1A=$=
346  :0
347  * $ ${Q1A}^0
348  * -1^0
349  { Q1A=$= }
350  :0 E
351  { Q1A=0 }
352 }
353 :0 E
354 { BIT2=0 }
355
356 # Bit1
357 :0
358 * 1^0
359 * $ ${Q1A}^0
360 * -2^0
361 {
362  BIT1=2
363  Q1A=$=
364  :0
365  * $ ${Q1A}^0
366  * -1^0
367  { Q1A=$= }
368  :0 E
369  { Q1A=0 }
370 }
371 :0 E
372 { BIT1=0 }
373
374 # Bit0 is implied
375
376 # CIDR17
377 :0
378 * $ ${BIT7}^0
379 {
380  CIDRT=$=
381  CIDR17="${QUAD1}\.${QUAD2}\.${CIDRT}\.0/17"
382 }
383 :0 E
384 { CIDR17="${QUAD1}\.${QUAD2}\.0\.0/17" }
385
386 # CIDR18
387 :0
388 * $ ${BIT7}^0
389 * $ ${BIT6}^0
390 {
391  CIDRT=$=
392  CIDR18="${QUAD1}\.${QUAD2}\.${CIDRT}\.0/18"
393 }
394 :0 E
395 { CIDR18="${QUAD1}\.${QUAD2}\.0\.0/18" }
396
397 # CIDR19
398 :0
399 * $ ${BIT7}^0
400 * $ ${BIT6}^0
401 * $ ${BIT5}^0
402 {
403  CIDRT=$=
404  CIDR19="${QUAD1}\.${QUAD2}\.${CIDRT}\.0/19"
405 }
406 :0 E
407 { CIDR19="${QUAD1}\.${QUAD2}\.0\.0/19" }
408
409
410 # CIDR20
411 :0
412 * $ ${BIT7}^0
413 * $ ${BIT6}^0
414 * $ ${BIT5}^0
415 * $ ${BIT4}^0
416 {
417  CIDRT=$=
418  CIDR20="${QUAD1}\.${QUAD2}\.${CIDRT}\.0/20"
419 }
420 :0 E
421 { CIDR20="${QUAD1}\.${QUAD2}\.0\.0/20" }
422
423 # CIDR21
424 :0
425 * $ ${BIT7}^0
426 * $ ${BIT6}^0
427 * $ ${BIT5}^0
428 * $ ${BIT4}^0
429 * $ ${BIT3}^0
430 {
431  CIDRT=$=
432  CIDR21="${QUAD1}\.${QUAD2}\.${CIDRT}\.0/21"
433 }
434 :0 E
435 { CIDR21="${QUAD1}\.${QUAD2}\.0\.0/21" }
436
437 # CIDR22
438 :0
439 * $ ${BIT7}^0
440 * $ ${BIT6}^0
441 * $ ${BIT5}^0
442 * $ ${BIT4}^0
443 * $ ${BIT3}^0
444 * $ ${BIT2}^0
445 {
446  CIDRT=$=
447  CIDR22="${QUAD1}\.${QUAD2}\.${CIDRT}\.0/22"
448 }
449 :0 E
450 { CIDR22="${QUAD1}\.${QUAD2}\.0\.0/22" }
451
452 # CIDR23
453 :0
454 * $ ${BIT7}^0
455 * $ ${BIT6}^0
456 * $ ${BIT5}^0
457 * $ ${BIT4}^0
458 * $ ${BIT3}^0
459 * $ ${BIT2}^0
460 * $ ${BIT1}^0
461 {
462  CIDRT=$=
463  CIDR23="${QUAD1}\.${QUAD2}\.${CIDRT}\.0/23"
464 }
465 :0 E
466 { CIDR23="${QUAD1}\.${QUAD2}\.0\.0/23" }
467
468 # CIDR24
469 CIDR24="${QUAD1}\.${QUAD2}\.${QUAD3}\.0/24"
470
471 Q1A=${QUAD4}
472
473 # Bit7
474 :0
475 * 1^0
476 * $ ${Q1A}^0
477 * -128^0
478 {
479  BIT7=128
480  Q1A=$=
481  :0
482  * $ ${Q1A}^0
483  * -1^0
484  { Q1A=$= }
485  :0 E
486  { Q1A=0 }
487 }
488 :0 E
489 { BIT7=0 }
490
491 # Bit6
492 :0
493 * 1^0
494 * $ ${Q1A}^0
495 * -64^0
496 {
497  BIT6=64
498  Q1A=$=
499  :0
500  * $ ${Q1A}^0
501  * -1^0
502  { Q1A=$= }
503  :0 E
504  { Q1A=0 }
505 }
506 :0 E
507 { BIT6=0 }
508
509 # Bit5
510 :0
511 * 1^0
512 * $ ${Q1A}^0
513 * -32^0
514 {
515  BIT5=32
516  Q1A=$=
517  :0
518  * $ ${Q1A}^0
519  * -1^0
520  { Q1A=$= }
521  :0 E
522  { Q1A=0 }
523 }
524 :0 E
525 { BIT5=0 }
526
527 # Bit4
528 :0
529 * 1^0
530 * $ ${Q1A}^0
531 * -16^0
532 {
533  BIT4=16
534  Q1A=$=
535  :0
536  * $ ${Q1A}^0
537  * -1^0
538  { Q1A=$= }
539  :0 E
540  { Q1A=0 }
541 }
542 :0 E
543 { BIT4=0 }
544
545 # Bit3
546 :0
547 * 1^0
548 * $ ${Q1A}^0
549 * -8^0
550 {
551  BIT3=8
552  Q1A=$=
553  :0
554  * $ ${Q1A}^0
555  * -1^0
556  { Q1A=$= }
557  :0 E
558  { Q1A=0 }
559 }
560 :0 E
561 { BIT3=0 }
562
563 # Bit2
564 :0
565 * 1^0
566 * $ ${Q1A}^0
567 * -4^0
568 {
569  BIT2=4
570  Q1A=$=
571  :0
572  * $ ${Q1A}^0
573  * -1^0
574  { Q1A=$= }
575  :0 E
576  { Q1A=0 }
577 }
578 :0 E
579 { BIT2=0 }
580
581 # Bit1
582 :0
583 * 1^0
584 * $ ${Q1A}^0
585 * -2^0
586 {
587  BIT1=2
588  Q1A=$=
589  :0
590  * $ ${Q1A}^0
591  * -1^0
592  { Q1A=$= }
593  :0 E
594  { Q1A=0 }
595 }
596 :0 E
597 { BIT1=0 }
598
599 # Bit0 is implied
600
601 # CIDR25
602 :0
603 * $ ${BIT7}^0
604 {
605  CIDRT=$=
606  CIDR25="${QUAD1}\.${QUAD2}\.${QUAD3}\.${CIDRT}/25"
607 }
608 :0 E
609 { CIDR25="${QUAD1}\.${QUAD2}\.${QUAD3}\.0/25" }
610
611 # CIDR26
612 :0
613 * $ ${BIT7}^0
614 * $ ${BIT6}^0
615 {
616  CIDRT=$=
617  CIDR26="${QUAD1}\.${QUAD2}\.${QUAD3}\.${CIDRT}/26"
618 }
619 :0 E
620 { CIDR26="${QUAD1}\.${QUAD2}\.${QUAD3}\.0/26" }
621
622 # CIDR27
623 :0
624 * $ ${BIT7}^0
625 * $ ${BIT6}^0
626 * $ ${BIT5}^0
627 {
628  CIDRT=$=
629  CIDR27="${QUAD1}\.${QUAD2}\.${QUAD3}\.${CIDRT}/27"
630 }
631 :0 E
632 { CIDR27="${QUAD1}\.${QUAD2}\.${QUAD3}\.0/27" }
633
634
635 # CIDR28
636 :0
637 * $ ${BIT7}^0
638 * $ ${BIT6}^0
639 * $ ${BIT5}^0
640 * $ ${BIT4}^0
641 {
642  CIDRT=$=
643  CIDR28="${QUAD1}\.${QUAD2}\.${QUAD3}\.${CIDRT}/28"
644 }
645 :0 E
646 { CIDR28="${QUAD1}\.${QUAD2}\.${QUAD3}\.0/28" }
647
648 # CIDR29
649 :0
650 * $ ${BIT7}^0
651 * $ ${BIT6}^0
652 * $ ${BIT5}^0
653 * $ ${BIT4}^0
654 * $ ${BIT3}^0
655 {
656  CIDRT=$=
657  CIDR29="${QUAD1}\.${QUAD2}\.${QUAD3}\.${CIDRT}/29"
658 }
659 :0 E
660 { CIDR29="${QUAD1}\.${QUAD2}\.${QUAD3}\.0/29" }
661
662 # CIDR30
663 :0
664 * $ ${BIT7}^0
665 * $ ${BIT6}^0
666 * $ ${BIT5}^0
667 * $ ${BIT4}^0
668 * $ ${BIT3}^0
669 * $ ${BIT2}^0
670 {
671  CIDRT=$=
672  CIDR30="${QUAD1}\.${QUAD2}\.${QUAD3}\.${CIDRT}/30"
673 }
674 :0 E
675 { CIDR30="${QUAD1}\.${QUAD2}\.${QUAD3}\.0/30" }
676
677 # CIDR31
678 :0
679 * $ ${BIT7}^0
680 * $ ${BIT6}^0
681 * $ ${BIT5}^0
682 * $ ${BIT4}^0
683 * $ ${BIT3}^0
684 * $ ${BIT2}^0
685 * $ ${BIT1}^0
686 {
687  CIDRT=$=
688  CIDR31="${QUAD1}\.${QUAD2}\.${QUAD3}\.${CIDRT}/31"
689 }
690 :0 E
691 { CIDR31="${QUAD1}\.${QUAD2}\.${QUAD3}\.0/31" }
692
693 # CIDR32
694 CIDR32="${QUAD1}\.${QUAD2}\.${QUAD3}\.${QUAD4}(/32)?"
695
696 LOCALIPREGEXP="^(${CIDR8}|${CIDR9}|${CIDR10}|${CIDR11}|${CIDR12}|${CIDR13}|${CIDR14}|${CIDR15}|${CIDR16}|${CIDR17}|${CIDR18}|${CIDR19}|${CIDR20}|${CIDR21}|${CIDR22}|${CIDR23}|${CIDR24}|${CIDR25}|${CIDR26}|${CIDR27}|${CIDR28}|${CIDR29}|${CIDR30}|${CIDR31}|${CIDR32})$"
697
698 SBLOG="L9-functions/cidrmatch.rc: Debug: LOCALIP=${LOCALIP}"
699 INCLUDERC=${SBDIR}/functions/loglevel.rc
700 SBLOG="L9-functions/cidrmatch.rc: Debug: LOCALIPREGEXP=${LOCALIPREGEXP}"
701 INCLUDERC=${SBDIR}/functions/loglevel.rc
702}
703:0 E
704{
705 SBLOG="L8-functions/cidrmatch.rc: Debug: LOCALIP=${LOCALIP} Setting LOCALIPREGEXP='NULL'"
706 INCLUDERC=${SBDIR}/functions/loglevel.rc
707 LOCALIPREGEXP='NULL'
708}
709