38 do { if (x) free(x); (x) = NULL; } while(0)
45 sr = (SPF_request_t *)malloc(
sizeof(SPF_request_t));
48 memset(sr, 0,
sizeof(SPF_request_t));
50 sr->spf_server = spf_server;
51 sr->client_ver = AF_UNSPEC;
52 sr->ipv4.s_addr = htonl(INADDR_ANY);
53 sr->ipv6 = in6addr_any;
75 sr->client_dom =
NULL;
77 sr->client_ver = AF_INET;
87 sr->client_dom =
NULL;
89 sr->client_ver = AF_INET6;
100 if (inet_pton(AF_INET, astr, &addr) <= 0)
108 struct in6_addr addr;
111 if (inet_pton(AF_INET6, astr, &addr) <= 0)
121 sr->helo_dom = strdup(dom);
125 if (sr->env_from ==
NULL)
133 SPF_server_t *spf_server;
134 spf_server = sr->spf_server;
135 return spf_server->rec_dom;
149 if (*from ==
'\0' && sr->helo_dom !=
NULL)
151 cp = strrchr(from,
'@');
152 if (cp && (cp != from)) {
153 sr->env_from = strdup(from);
158 sr->env_from_lp = malloc(len + 1);
159 if (!sr->env_from_lp) {
163 strncpy(sr->env_from_lp, from, len);
164 sr->env_from_lp[len] =
'\0';
165 sr->env_from_dp = strdup(cp + 1);
166 if (!sr->env_from_dp) {
173 if (cp == from) from++;
174 len =
sizeof(
"postmaster@") + strlen(from);
175 sr->env_from = malloc(len + 1);
178 sprintf(sr->env_from,
"postmaster@%s", from);
179 sr->env_from_lp = strdup(
"postmaster");
180 if (!sr->env_from_lp) {
184 sr->env_from_dp = strdup(from);
185 if (!sr->env_from_dp) {
198 SPF_server_t *spf_server;
201 spf_server = sr->spf_server;
204 if (sr->client_dom ==
NULL) {
208 return sr->client_dom;
214 if (sr->client_ver == AF_INET) {
215 if ((ntohl(sr->ipv4.s_addr) & IN_CLASSA_NET) ==
216 (IN_LOOPBACKNET << 24)) {
220 else if (sr->client_ver == AF_INET6) {
221 if (IN6_IS_ADDR_LOOPBACK(&sr->ipv6))
228SPF_request_prepare(SPF_request_t *sr)
231 sr->cur_dom = sr->helo_dom;
233 sr->cur_dom = sr->env_from_dp;
241SPF_request_query_record(SPF_request_t *spf_request,
242 SPF_response_t *spf_response,
243 SPF_record_t *spf_record,
249 SPF_i_done(spf_response, spf_response->result, spf_response->reason, spf_response->err);
254 SPF_infof(
"Warning: %d errors in response, "
255 "but no error code. Evaluating.",
258 spf_response->spf_record_exp = spf_record;
260 spf_request, spf_response, 0);
271 SPF_response_t **spf_responsep)
273 SPF_server_t *spf_server;
274 SPF_record_t *spf_record;
278 spf_server = spf_request->spf_server;
282 if (! *spf_responsep)
290 SPF_request_prepare(spf_request);
293 *spf_responsep, &spf_record);
294 return SPF_request_query_record(spf_request, *spf_responsep,
301 SPF_response_t **spf_responsep,
304 SPF_server_t *spf_server;
305 SPF_record_t *spf_record;
309 spf_server = spf_request->spf_server;
313 if (! *spf_responsep)
321 SPF_request_prepare(spf_request);
324 *spf_responsep, &spf_record,
326 return SPF_request_query_record(spf_request, *spf_responsep,
341 SPF_response_t **spf_responsep,
344 SPF_server_t *spf_server;
345 SPF_record_t *spf_record;
347 const char *rcpt_to_dom;
352 spf_server = spf_request->spf_server;
356 if (! *spf_responsep)
364 rcpt_to_dom = strchr(rcpt_to,
'@');
365 if (rcpt_to_dom ==
NULL)
366 rcpt_to_dom = rcpt_to;
369 spf_request->cur_dom = rcpt_to_dom;
371 len =
sizeof(
SPF_VER_STR) + 64 + strlen(rcpt_to_dom);
372 record = malloc(len);
375 snprintf(record, len,
SPF_VER_STR " mx:%s", rcpt_to_dom);
377 *spf_responsep, &spf_record,
380 return SPF_request_query_record(spf_request, *spf_responsep,
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)
char * SPF_dns_get_client_dom(SPF_dns_server_t *spf_dns_server, SPF_request_t *sr)
SPF_response_t * SPF_response_new(SPF_request_t *spf_request)
int SPF_response_errors(SPF_response_t *rp)
SPF_errcode_t SPF_record_interpret(SPF_record_t *spf_record, SPF_request_t *spf_request, SPF_response_t *spf_response, int depth)
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)
#define SPF_ASSERT_NOTNULL(x)
SPF_errcode_t SPF_i_done(SPF_response_t *spf_response, SPF_result_t result, SPF_reason_t reason, SPF_errcode_t err)
SPF_request_t * SPF_request_new(SPF_server_t *spf_server)
SPF_errcode_t SPF_request_set_ipv6_str(SPF_request_t *sr, const char *astr)
SPF_errcode_t SPF_request_query_fallback(SPF_request_t *spf_request, SPF_response_t **spf_responsep, const char *record)
SPF_errcode_t SPF_request_set_ipv4(SPF_request_t *sr, struct in_addr addr)
int SPF_request_set_env_from(SPF_request_t *sr, const char *from)
SPF_errcode_t SPF_request_set_helo_dom(SPF_request_t *sr, const char *dom)
SPF_errcode_t SPF_request_set_ipv4_str(SPF_request_t *sr, const char *astr)
const char * SPF_request_get_client_dom(SPF_request_t *sr)
const char * SPF_request_get_rec_dom(SPF_request_t *sr)
int SPF_request_is_loopback(SPF_request_t *sr)
void SPF_request_free(SPF_request_t *sr)
SPF_errcode_t SPF_request_query_rcptto(SPF_request_t *spf_request, SPF_response_t **spf_responsep, const char *rcpt_to)
SPF_errcode_t SPF_request_query_mailfrom(SPF_request_t *spf_request, SPF_response_t **spf_responsep)
SPF_errcode_t SPF_request_set_ipv6(SPF_request_t *sr, struct in6_addr addr)