int vverify_append(const char *queue_id, const char *orig_rcpt, const char *recipient, const char *relay, time_t entry, const char *status, int rcpt_stat, const char *fmt, va_list ap) { VSTRING *text = vstring_alloc(10); int req_stat; /* * Impedance adaptor between bounce/defer/sent and verify_clnt. */ vstring_vsprintf(text, fmt, ap); if (var_verify_neg_cache || rcpt_stat == DEL_RCPT_STAT_OK) { req_stat = verify_clnt_update(orig_rcpt, rcpt_stat, "%s", vstring_str(text)); if (req_stat == VRFY_STAT_OK && strcasecmp(recipient, orig_rcpt) != 0) req_stat = verify_clnt_update(recipient, rcpt_stat, "%s", vstring_str(text)); } else { status = "undeliverable-but-not-cached"; req_stat = VRFY_STAT_OK; } if (req_stat == VRFY_STAT_OK) { log_adhoc(queue_id, orig_rcpt, recipient, relay, entry, status, "%s", vstring_str(text)); req_stat = 0; } else { msg_warn("%s: %s service failure", queue_id, var_verify_service); req_stat = -1; } vstring_free(text); return (req_stat); }
static void update(char *query) { char *addr; char *status_text; char *cp = query; if ((addr = mystrtok(&cp, " \t\r\n")) == 0 || (status_text = mystrtok(&cp, " \t\r\n")) == 0) { msg_warn("bad request format"); return; } while (*cp && ISSPACE(*cp)) cp++; if (*cp == 0) { msg_warn("bad request format"); return; } switch (verify_clnt_update(query, atoi(status_text), cp)) { case VRFY_STAT_OK: vstream_printf("OK\n"); vstream_fflush(VSTREAM_OUT); break; case VRFY_STAT_BAD: msg_warn("bad request format"); break; case VRFY_STAT_FAIL: msg_warn("request failed"); break; } }