41 rp = (SPF_response_t *)malloc(
sizeof(SPF_response_t));
44 memset(rp, 0,
sizeof(SPF_response_t));
46 rp->spf_request = spf_request;
58 free(rp->received_spf);
60 if (rp->header_comment)
61 free(rp->header_comment);
63 free(rp->smtp_comment);
65 free(rp->explanation);
68 for (i = 0; i < rp->errors_length; i++) {
69 free(rp->errors[i].message);
77static SPF_response_t *
78SPF_response_choose(SPF_response_t *yes, SPF_response_t *no)
95 return SPF_response_choose(r2mx,
main);
99 return SPF_response_choose(
main, r2mx);
106 return SPF_response_choose(r2mx,
main);
109 return SPF_response_choose(
main, r2mx);
114 return SPF_response_choose(r2mx,
main);
126 return SPF_response_choose(r2mx,
main);
129 return SPF_response_choose(
main, r2mx);
155 return rp->received_spf;
161 return rp->received_spf_value;
167 return rp->header_comment;
173 return rp->smtp_comment;
179 return rp->explanation;
184#define SPF_ERRMSGSIZE 4096
187SPF_response_add_error_v(SPF_response_t *rp,
189 const char *text,
int idx,
190 const char *format, va_list ap)
200 size = vsnprintf(buf,
sizeof(buf), format, ap);
202 snprintf(&buf[size],
sizeof(buf) - size,
203 " near '%.12s'", &text[idx]);
207 if (rp->errors_length == rp->errors_size) {
208 size = rp->errors_size + (rp->errors_size / 4) + 4;
211 SPF_error(
"Failed to allocate memory for extra response error");
215 rp->errors_size = size;
218 rp->errors[rp->errors_length].
code = code;
219 rp->errors[rp->errors_length].is_error = is_error;
221 rp->errors[rp->errors_length].message = strdup(buf);
227#define SPF_ADD_ERROR(_ise, _txt, _ix) \
228 va_list ap; va_start(ap, format); \
229 SPF_response_add_error_v(rp, code, _ise, _txt, _ix, format, ap); \
231 va_end(ap); return code;
232#define SPF_ADD_WARN(_ise, _txt, _ix) \
233 va_list ap; va_start(ap, format); \
234 SPF_response_add_error_v(rp, code, _ise, _txt, _ix, format, ap); \
235 va_end(ap); return code;
240 const char *text,
const char *tptr,
241 const char *format, ...)
243 SPF_ADD_ERROR(1, text ? text : tptr, text ? (tptr - text) : 0);
249 const char *text,
int idx,
250 const char *format, ...)
258 const char *format, ...)
266 const char *text,
const char *tptr,
267 const char *format, ...)
269 SPF_ADD_WARN(0, text ? text : tptr, text ? (tptr - text) : 0);
275 const char *text,
int idx,
276 const char *format, ...)
284 const char *format, ...)
292 return rp->errors_length;
298 return rp->num_errors;
304 return rp->errors_length - rp->num_errors;
310 return &rp->errors[idx];
const char * SPF_strerror(SPF_errcode_t spf_err)
#define SPF_error(errmsg)
const char * SPF_response_get_explanation(SPF_response_t *rp)
SPF_errcode_t SPF_response_errcode(SPF_response_t *rp)
const char * SPF_response_get_smtp_comment(SPF_response_t *rp)
const char * SPF_response_get_received_spf(SPF_response_t *rp)
const char * SPF_response_get_header_comment(SPF_response_t *rp)
SPF_errcode_t SPF_response_add_warn_ptr(SPF_response_t *rp, SPF_errcode_t code, const char *text, const char *tptr, const char *format,...)
SPF_response_t * SPF_response_new(SPF_request_t *spf_request)
SPF_errcode_t SPF_response_add_error_idx(SPF_response_t *rp, SPF_errcode_t code, const char *text, int idx, const char *format,...)
#define SPF_ADD_ERROR(_ise, _txt, _ix)
SPF_errcode_t SPF_response_add_error_ptr(SPF_response_t *rp, SPF_errcode_t code, const char *text, const char *tptr, const char *format,...)
#define SPF_ADD_WARN(_ise, _txt, _ix)
SPF_errcode_t SPF_response_add_warn(SPF_response_t *rp, SPF_errcode_t code, const char *format,...)
int SPF_response_warnings(SPF_response_t *rp)
SPF_errcode_t SPF_response_add_error(SPF_response_t *rp, SPF_errcode_t code, const char *format,...)
SPF_errcode_t SPF_response_add_warn_idx(SPF_response_t *rp, SPF_errcode_t code, const char *text, int idx, const char *format,...)
void SPF_response_free(SPF_response_t *rp)
const char * SPF_error_message(SPF_error_t *err)
SPF_error_t * SPF_response_message(SPF_response_t *rp, int idx)
int SPF_response_messages(SPF_response_t *rp)
const char * SPF_response_get_received_spf_value(SPF_response_t *rp)
char SPF_error_errorp(SPF_error_t *err)
SPF_errcode_t SPF_error_code(SPF_error_t *err)
SPF_response_t * SPF_response_combine(SPF_response_t *main, SPF_response_t *r2mx)
SPF_result_t SPF_response_result(SPF_response_t *rp)
SPF_reason_t SPF_response_reason(SPF_response_t *rp)
int SPF_response_errors(SPF_response_t *rp)
int main(int argc, char *argv[])