CAMLprim value caml_spf_request_query_mailfrom(value req_val) { CAMLparam1(req_val); CAMLlocal3(ret, cmt, res); const char *s; SPF_request_t *req = (SPF_request_t *)req_val; SPF_response_t *resp; SPF_result_t result; caml_enter_blocking_section(); SPF_request_query_mailfrom(req, &resp); caml_leave_blocking_section(); ret = caml_alloc(5, 0); result = SPF_response_result(resp); res = caml_alloc(1, tag_of_result(result)); switch (result) { case SPF_RESULT_FAIL: case SPF_RESULT_SOFTFAIL: case SPF_RESULT_NEUTRAL: cmt = caml_alloc(2, 0); Store_field(cmt, 0, caml_copy_string(SPF_response_get_smtp_comment(resp))); Store_field(cmt, 1, caml_copy_string(SPF_response_get_explanation(resp))); res = caml_alloc(1, tag_of_result(result)); Store_field(res, 0, cmt); Store_field(ret, 0, res); break; case SPF_RESULT_INVALID: case SPF_RESULT_PASS: case SPF_RESULT_TEMPERROR: case SPF_RESULT_PERMERROR: case SPF_RESULT_NONE: Store_field(ret, 0, Val_int(tag_of_result(result))); break; } Store_field(ret, 1, Val_int(SPF_response_reason(resp))); /* For buggy libspf2 - avoid a segfault */ #define BUG_HEADER_COMMENT "internal error" #define BUG_RECEIVED_SPF_VALUE "none (" BUG_HEADER_COMMENT ")" #define BUG_RECEIVED_SPF "Received-SPF: " BUG_RECEIVED_SPF_VALUE s = SPF_response_get_received_spf(resp); Store_field(ret, 2, caml_copy_string(s ? s : BUG_RECEIVED_SPF)); s = SPF_response_get_received_spf_value(resp); Store_field(ret, 3, caml_copy_string(s ? s : BUG_RECEIVED_SPF_VALUE)); s = SPF_response_get_header_comment(resp); Store_field(ret, 4, caml_copy_string(s ? s : BUG_HEADER_COMMENT)); SPF_response_free(resp); CAMLreturn(ret); }
static void response_print(const char *context, SPF_response_t *spf_response) { syslog(LOG_DEBUG,"--vv--\n"); syslog(LOG_DEBUG,"Context: %s\n", context); if (spf_response == NULL) { syslog(LOG_DEBUG, "NULL RESPONSE!\n"); } else { syslog(LOG_DEBUG, "Response result: %s\n", SPF_strresult(SPF_response_result(spf_response))); syslog(LOG_DEBUG, "Response reason: %s\n", SPF_strreason(SPF_response_reason(spf_response))); syslog(LOG_DEBUG, "Response err: %s\n", SPF_strerror(SPF_response_errcode(spf_response))); response_print_errors(NULL, spf_response, SPF_response_errcode(spf_response)); } syslog(LOG_DEBUG,"--^^--\n"); }