Exemple #1
0
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");
}