50#define HOST_NAME_MAX 255
68SPF_server_set_rec_dom_ghbn(SPF_server_t *sp)
85SPF_server_new_common_pre(SPF_server_t *sp,
int debug)
89 memset(sp, 0,
sizeof(SPF_server_t));
96 err = SPF_server_set_rec_dom_ghbn(sp);
98 SPF_error(
"Failed to set rec_dom using gethostname()");
102SPF_server_new_common_post(SPF_server_t *sp)
104 SPF_response_t *spf_response;
111 SPF_errorf(
"Error code %d compiling default explanation", err);
115 SPF_error(
"Response errors compiling default explanation");
122 SPF_errorf(
"Error code %d compiling default whitelist", err);
126 SPF_error(
"Response errors compiling default whitelist");
134 SPF_dns_server_t *dc_r;
135 SPF_dns_server_t *dc_c;
136 SPF_dns_server_t *dc_z;
139 sp = (SPF_server_t *)malloc(
sizeof(SPF_server_t));
142 SPF_server_new_common_pre(sp,
debug);
143 sp->destroy_resolver = 1;
149 SPF_error(
"Failed to create DNS resolver");
156 SPF_error(
"Failed to create DNS resolver");
174 SPF_server_new_common_post(sp);
184 sp = (SPF_server_t *)malloc(
sizeof(SPF_server_t));
187 SPF_server_new_common_pre(sp,
debug);
188 sp->destroy_resolver = 0;
190 SPF_server_new_common_post(sp);
202 if (sp->resolver && sp->destroy_resolver)
204 if (sp->local_policy)
220 return SPF_server_set_rec_dom_ghbn(sp);
221 sp->rec_dom = strdup(dom);
230 sp->sanitize = sanitize;
236 SPF_response_t **spf_responsep)
238 SPF_macro_t *spf_macro =
NULL;
244 if (! *spf_responsep) {
246 if (! *spf_responsep)
254 sp->explanation = spf_macro;
258 "Failed to compile explanation '%s'", exp);
268 int use_default_whitelist,
269 SPF_response_t **spf_responsep)
271 SPF_record_t *spf_record =
NULL;
279 if (! *spf_responsep) {
281 if (! *spf_responsep)
286 if (use_default_whitelist)
288 record = malloc(len);
291 if (use_default_whitelist)
292 snprintf(record, len,
"%s %s %s",
295 snprintf(record, len,
"%s %s",
SPF_VER_STR, policy);
299 if (sp->local_policy)
301 sp->local_policy = spf_record;
305 "Failed to compile local policy '%s'", policy);
317 SPF_request_t *spf_request,
318 SPF_response_t *spf_response,
319 SPF_record_t **spf_recordp)
321 SPF_dns_server_t *resolver;
337 domain = spf_request->cur_dom;
342 resolver = spf_server->resolver;
344 if (resolver->get_spf)
345 return resolver->get_spf(spf_server, spf_request,
346 spf_response, spf_recordp);
355 if (spf_server->debug > 0)
356 SPF_debugf(
"get_record(%s): HOST_NOT_FOUND", domain);
365 "Host '%s' not found.", domain);
369 if (spf_server->debug > 0)
370 SPF_debugf(
"get_record(%s): NO_DATA", domain);
379 "No DNS data for '%s'.", domain);
383 if (spf_server->debug > 0)
384 SPF_debugf(
"get_record(%s): TRY_AGAIN", domain);
393 "Temporary DNS failure for '%s'.", domain);
397 if (spf_server->debug > 0)
398 SPF_debugf(
"get_record(%s): NO_RECOVERY", domain);
407 "Unrecoverable DNS failure for '%s'.", domain);
411 if (spf_server->debug > 0)
412 SPF_debugf(
"get_record(%s): NETDB_SUCCESS", domain);
416 if (spf_server->debug > 0)
417 SPF_debugf(
"get_record(%s): UNKNOWN_ERROR", domain);
425 "Unknown DNS failure for '%s': %d.",
430 if (rr_txt->
num_rr == 0) {
437 "No TXT records returned from DNS lookup for '%s'",
446 for (i = 0; i < rr_txt->
num_rr; i++) {
455 if (e ==
' ' || e ==
'\0') {
456 if (spf_server->debug > 0)
464 if (num_found == 0) {
473 "No SPF records for '%s'", domain);
482 "Multiple SPF records for '%s'", domain);
487 spf_response, spf_recordp,
488 rr_txt->
rr[idx_found]->
txt );
494 "Failed to compile SPF record for '%s'", domain);
504#define SPF_ACCESS_INT(f) \
505 SPF_errcode_t SPF_server_set_ ## f(SPF_server_t *s, int n) { \
506 s->f = n; return SPF_E_SUCCESS; \
508 int SPF_server_get_ ## f(SPF_server_t *s) { \
int strncasecmp(const char *s1, const char *s2, size_t n)
SPF_dns_server_t * SPF_dns_zone_new(SPF_dns_server_t *layer_below, const char *name, int debug)
void SPF_dns_free(SPF_dns_server_t *spf_dns_server)
SPF_dns_rr_t * SPF_dns_lookup(SPF_dns_server_t *spf_dns_server, const char *domain, ns_type rr_type, int should_cache)
SPF_response_t * SPF_response_new(SPF_request_t *spf_request)
SPF_errcode_t SPF_response_add_error(SPF_response_t *rp, SPF_errcode_t code, const char *format,...)
void SPF_response_free(SPF_response_t *rp)
int SPF_response_messages(SPF_response_t *rp)
void SPF_macro_free(SPF_macro_t *mac)
SPF_errcode_t SPF_record_compile(SPF_server_t *spf_server, SPF_response_t *spf_response, SPF_record_t **spf_recordp, const char *record)
void SPF_record_free(SPF_record_t *rp)
SPF_errcode_t SPF_record_compile_macro(SPF_server_t *spf_server, SPF_response_t *spf_response, SPF_macro_t **spf_macrop, const char *record)
#define SPF_DEFAULT_WHITELIST
SPF_dns_server_t * SPF_dns_cache_new(SPF_dns_server_t *layer_below, const char *name, int debug, int cache_bits)
SPF_dns_server_t * SPF_dns_resolv_new(SPF_dns_server_t *layer_below, const char *name, int debug)
void SPF_dns_rr_free(SPF_dns_rr_t *spfrr)
#define SPF_ASSERT_NOTNULL(x)
#define SPF_error(errmsg)
SPF_server_t * SPF_server_new(SPF_server_dnstype_t dnstype, int debug)
#define SPF_ACCESS_INT(f)
SPF_errcode_t SPF_server_set_explanation(SPF_server_t *sp, const char *exp, SPF_response_t **spf_responsep)
void SPF_server_free(SPF_server_t *sp)
SPF_errcode_t SPF_server_get_record(SPF_server_t *spf_server, SPF_request_t *spf_request, SPF_response_t *spf_response, SPF_record_t **spf_recordp)
SPF_errcode_t SPF_server_set_sanitize(SPF_server_t *sp, int sanitize)
SPF_errcode_t SPF_server_set_localpolicy(SPF_server_t *sp, const char *policy, int use_default_whitelist, SPF_response_t **spf_responsep)
SPF_errcode_t SPF_server_set_rec_dom(SPF_server_t *sp, const char *dom)
SPF_server_t * SPF_server_new_dns(SPF_dns_server_t *dns, int debug)