#ifndef _CIDR_MATCH_H_INCLUDED_ #define _CIDR_MATCH_H_INCLUDED_ /*++ /* NAME /* dict_cidr 3h /* SUMMARY /* CIDR-style pattern matching /* SYNOPSIS /* #include /* DESCRIPTION /* .nf /* * System library. */ #include /* CHAR_BIT */ /* * Utility library. */ #include /* MAI_V6ADDR_BYTES etc. */ #include /* * External interface. * * Address length is protocol dependent. Find out how large our address byte * strings should be. */ #ifdef HAS_IPV6 # define CIDR_MATCH_ABYTES MAI_V6ADDR_BYTES #else # define CIDR_MATCH_ABYTES MAI_V4ADDR_BYTES #endif /* * Each parsed CIDR pattern can be member of a linked list. */ typedef struct CIDR_MATCH { int op; /* operation, match or control flow */ int match; /* positive or negative match */ unsigned char net_bytes[CIDR_MATCH_ABYTES]; /* network portion */ unsigned char mask_bytes[CIDR_MATCH_ABYTES]; /* network mask */ unsigned char addr_family; /* AF_XXX */ unsigned char addr_byte_count; /* typically, 4 or 16 */ unsigned char addr_bit_count; /* optimization */ unsigned char mask_shift; /* optimization */ struct CIDR_MATCH *next; /* next entry */ struct CIDR_MATCH *block_end; /* block terminator */ } CIDR_MATCH; #define CIDR_MATCH_OP_MATCH 1 /* Match this pattern */ #define CIDR_MATCH_OP_IF 2 /* Increase if/endif nesting on match */ #define CIDR_MATCH_OP_ENDIF 3 /* Decrease if/endif nesting on match */ #define CIDR_MATCH_TRUE 1 /* Request positive match */ #define CIDR_MATCH_FALSE 0 /* Request negative match */ extern VSTRING *cidr_match_parse(CIDR_MATCH *, char *, int, VSTRING *); extern VSTRING *cidr_match_parse_if(CIDR_MATCH *, char *, int, VSTRING *); extern void cidr_match_endif(CIDR_MATCH *); extern CIDR_MATCH *cidr_match_execute(CIDR_MATCH *, const char *); /* LICENSE /* .ad /* .fi /* The Secure Mailer license must be distributed with this software. /* AUTHOR(S) /* Wietse Venema /* IBM T.J. Watson Research /* P.O. Box 704 /* Yorktown Heights, NY 10598, USA /* /* Wietse Venema /* Google, Inc. /* 111 8th Avenue /* New York, NY 10011, USA /*--*/ #endif