86 {
return (
void *)spfhook; }
96SPF_dns_zone_find(SPF_dns_server_t *spf_dns_server,
97 const char *domain,
ns_type rr_type,
103 spfhook = SPF_voidp2spfhook(spf_dns_server->hook);
105 if (spf_dns_server->debug)
106 SPF_debugf(
"zone: Searching for RR %s (%d)", domain, rr_type);
110 if (exact || strncmp(domain,
"*.", 2) == 0) {
111 for (i = 0; i < spfhook->
num_zone; i++) {
113 && strcasecmp(spfhook->
zone[i]->
domain, domain) == 0)
114 return spfhook->
zone[i];
116 if (spf_dns_server->debug)
121 size_t domain_len = strlen(domain);
125 if (domain_len && domain[domain_len - 1] ==
'.')
128 for (i = 0; i < spfhook->
num_zone; i++) {
131 if (spf_dns_server->debug)
137 if (strncmp(spfhook->
zone[i]->
domain,
"*.", 2) == 0) {
138 size_t zdomain_len = strlen(spfhook->
zone[i]->
domain) - 2;
139 if ((zdomain_len <= domain_len)
142 domain + (domain_len - zdomain_len),
144 return spfhook->
zone[i];
150 strlen(spfhook->
zone[i]->
domain) == domain_len) {
151 return spfhook->
zone[i];
154 if (spf_dns_server->debug)
164SPF_dns_zone_lookup(SPF_dns_server_t *spf_dns_server,
165 const char *domain,
ns_type rr_type,
int should_cache)
170 spfrr = SPF_dns_zone_find(spf_dns_server, domain, rr_type,
FALSE);
176 if (spf_dns_server->layer_below) {
178 domain, rr_type, should_cache);
181 spfhook = SPF_voidp2spfhook(spf_dns_server->hook);
190 const char *domain,
ns_type rr_type,
201 SPF_error(
"RR type ANY can not have data.");
203 SPF_error(
"RR type ANY must return a DNS error code.");
206 spfhook = SPF_voidp2spfhook(spf_dns_server->hook);
209 spfrr = SPF_dns_zone_find(spf_dns_server, domain, rr_type,
TRUE);
212 if ( spfrr ==
NULL ) {
221 new_zone = realloc( spfhook->
zone,
222 new_len *
sizeof( *new_zone ) );
223 if ( new_zone ==
NULL )
230 spfhook->
zone = new_zone;
235 domain, rr_type, 24*60*60, herrno);
246#define SPF_RR_TRY_REALLOC(rr, i, s) do { \
247 SPF_errcode_t __err = SPF_dns_rr_buf_realloc(rr, i, s); \
248 if (__err != SPF_E_SUCCESS) return __err; \
259 err = inet_pton( AF_INET, data, &spfrr->
rr[cnt]->
a );
266 err = inet_pton( AF_INET6, data, &spfrr->
rr[cnt]->
aaaa );
274 while (isdigit(*data)) data++;
275 while (isspace(*data)) data++;
277 strcpy( spfrr->
rr[cnt]->
mx, data );
283 strcpy( spfrr->
rr[cnt]->
txt, data );
288 strcpy( spfrr->
rr[cnt]->
ptr, data );
293 SPF_error(
"RR type ANY can not have data.");
295 SPF_error(
"RR type ANY must return a DNS error code.");
296 SPF_error(
"RR type ANY can not have multiple RR.");
312SPF_dns_zone_free(SPF_dns_server_t *spf_dns_server)
318 spfhook = SPF_voidp2spfhook(spf_dns_server->hook);
323 if (spfhook->
zone[i])
333 free(spf_dns_server);
338 const char *name,
int debug)
340 SPF_dns_server_t *spf_dns_server;
343 spf_dns_server = malloc(
sizeof(SPF_dns_server_t));
344 if (spf_dns_server ==
NULL)
346 memset(spf_dns_server, 0,
sizeof(SPF_dns_server_t));
349 if (spf_dns_server->hook ==
NULL) {
350 free(spf_dns_server);
358 spf_dns_server->destroy = SPF_dns_zone_free;
359 spf_dns_server->lookup = SPF_dns_zone_lookup;
360 spf_dns_server->get_spf =
NULL;
361 spf_dns_server->get_exp =
NULL;
362 spf_dns_server->add_cache =
NULL;
363 spf_dns_server->layer_below = layer_below;
364 spf_dns_server->name = name;
365 spf_dns_server->debug =
debug;
367 spfhook = SPF_voidp2spfhook(spf_dns_server->hook);
375 free(spf_dns_server);
385 free(spf_dns_server);
389 return spf_dns_server;
int strncasecmp(const char *s1, const char *s2, size_t n)
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_init(SPF_dns_server_t *spf_dns_server, const char *domain, ns_type rr_type, int ttl, SPF_dns_stat_t herrno)
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_zone_new(SPF_dns_server_t *layer_below, const char *name, int debug)
SPF_errcode_t SPF_dns_zone_add_str(SPF_dns_server_t *spf_dns_server, const char *domain, ns_type rr_type, SPF_dns_stat_t herrno, const char *data)
#define SPF_RR_TRY_REALLOC(rr, i, s)