83struct _SPF_dns_cache_bucket_t {
84 struct _SPF_dns_cache_bucket_t *
next;
116 {
return (
void *)spfhook; }
163 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
164 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
165 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
166 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
167 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
168 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
169 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
170 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
171 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
172 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
173 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
174 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
175 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
176 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
177 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
178 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
179 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
180 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
181 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
182 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
183 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
184 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
185 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
186 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
187 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
188 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
189 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
190 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
191 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
192 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
193 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
194 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
195 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
196 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
197 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
198 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
199 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
200 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
201 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
202 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
203 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
204 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
205 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
206 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
207 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
208 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
209 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
210 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
211 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
212 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
213 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
218crc32str(
unsigned int accum,
const char *str,
int max_hash_len)
220 for( ; *str !=
'\0' && max_hash_len > 0; str++ ) {
224 accum =
crc_32_tab[ (
unsigned char)accum ^ (
unsigned char)*str ]
225 ^ (
unsigned char)(accum >> 8);
235#define hash(h,s,a) crc32str(a,s,h->max_hash_len)
240 const char *domain,
ns_type rr_type,
int idx)
247 bucket = spfhook->
cache[idx];
251 while (bucket !=
NULL) {
267 else if (rr->
rr_type != rr_type) {
270 else if (strcmp(rr->
domain, domain) != 0) {
278 spfhook->
cache[idx] = bucket;
285 bucket = spfhook->
cache[idx];
287 bucket = bucket->
next;
305 spfhook->
cache[idx] = bucket;
317 const char *domain,
ns_type rr_type)
328 size_t new_len = strlen(domain) + 1;
331 new_domain = realloc(cached_rr->
domain, new_len);
332 if (new_domain ==
NULL)
334 cached_rr->
domain = new_domain;
337 strcpy(cached_rr->
domain, domain);
353 p = strstr( cached_rr->
domain,
".arpa" );
354 if ( p && p[
sizeof(
".arpa" )-1 ] ==
'\0' )
368SPF_dns_cache_lookup(SPF_dns_server_t *spf_dns_server,
369 const char *domain,
ns_type rr_type,
int should_cache)
377 spfhook = SPF_voidp2spfhook(spf_dns_server->hook);
381 idx =
hash(spfhook, domain, 0 );
386 bucket = SPF_dns_cache_bucket_find(spfhook, domain, rr_type, idx);
387 if (bucket !=
NULL) {
393 else if (rr !=
NULL) {
405 if (!spf_dns_server->layer_below)
409 domain, rr_type, should_cache );
416 if (SPF_dns_cache_rr_fixup(spfhook, cached_rr, domain, rr_type) ==
SPF_E_SUCCESS){
417 if (SPF_dns_cache_bucket_add(spfhook, cached_rr, idx) ==
SPF_E_SUCCESS) {
435SPF_dns_cache_free( SPF_dns_server_t *spf_dns_server )
444 spfhook = SPF_voidp2spfhook( spf_dns_server->hook );
448 if (spfhook->
cache) {
450 bucket = spfhook->
cache[i];
451 while (bucket !=
NULL) {
453 bucket = bucket->
next;
461 free(spfhook->
cache);
476 pthread_mutex_destroy(&(spfhook->
cache_lock));
481 free(spf_dns_server);
488 const char *name,
int debug,
int cache_bits)
490 SPF_dns_server_t *spf_dns_server;
495 if ( cache_bits < 1 || cache_bits > 16 )
496 SPF_error(
"cache bits out of range (1..16)." );
499 spf_dns_server = malloc(
sizeof(SPF_dns_server_t));
500 if (spf_dns_server ==
NULL)
502 memset(spf_dns_server, 0,
sizeof(SPF_dns_server_t));
505 if (spf_dns_server->hook ==
NULL) {
506 free(spf_dns_server);
514 spf_dns_server->destroy = SPF_dns_cache_free;
515 spf_dns_server->lookup = SPF_dns_cache_lookup;
516 spf_dns_server->get_spf =
NULL;
517 spf_dns_server->get_exp =
NULL;
518 spf_dns_server->add_cache =
NULL;
519 spf_dns_server->layer_below = layer_below;
520 spf_dns_server->name = name;
521 spf_dns_server->debug =
debug;
523 spfhook = SPF_voidp2spfhook( spf_dns_server->hook );
527 spfhook->
max_hash_len = cache_bits > 4 ? cache_bits * 2 : 8;
530 sizeof(*spfhook->
cache));
545 free(spf_dns_server);
551 return spf_dns_server;
556 time_t min_ttl, time_t err_ttl,
557 time_t txt_ttl, time_t rdns_ttl )
563 spfhook = SPF_voidp2spfhook( spf_dns_server->hook );
565 if (spfhook !=
NULL) {
584 spfhook = SPF_voidp2spfhook( spf_dns_server->hook );
SPF_dns_rr_t * SPF_dns_lookup(SPF_dns_server_t *spf_dns_server, const char *domain, ns_type rr_type, int should_cache)
void SPF_dns_rr_free(SPF_dns_rr_t *spfrr)
SPF_dns_rr_t * SPF_dns_rr_new_nxdomain(SPF_dns_server_t *spf_dns_server, const char *domain)
SPF_errcode_t SPF_dns_rr_dup(SPF_dns_rr_t **dstp, SPF_dns_rr_t *src)
#define SPF_ASSERT_NOTNULL(x)
#define SPF_error(errmsg)
SPF_dns_server_t * SPF_dns_cache_new(SPF_dns_server_t *layer_below, const char *name, int debug, int cache_bits)
void SPF_dns_cache_set_ttl(SPF_dns_server_t *spf_dns_server, time_t min_ttl, time_t err_ttl, time_t txt_ttl, time_t rdns_ttl)
const unsigned int crc_32_tab[256]
void SPF_dns_set_conserve_cache(SPF_dns_server_t *spf_dns_server, int conserve_cache)
struct _SPF_dns_cache_bucket_t * next
SPF_dns_cache_bucket_t ** cache
pthread_mutex_t cache_lock