int psc_dnsbl_retrieve(const char *client_addr, const char **dnsbl_name, int dnsbl_index) { const char *myname = "psc_dnsbl_retrieve"; PSC_DNSBL_SCORE *score; int result_score; /* * Sanity check. */ if ((score = (PSC_DNSBL_SCORE *) htable_find(dnsbl_score_cache, client_addr)) == 0) msg_panic("%s: no blocklist score for %s", myname, client_addr); /* * Disable callbacks. */ PSC_CALL_BACK_CANCEL(score, dnsbl_index); /* * Reads are destructive. */ result_score = score->total; *dnsbl_name = score->dnsbl_name; score->refcount -= 1; if (score->refcount < 1) { if (msg_verbose > 1) msg_info("%s: delete blocklist score for %s", myname, client_addr); htable_delete(dnsbl_score_cache, client_addr, myfree); } return (result_score); }
int psc_dnsbl_retrieve(const char *client_addr, const char **dnsbl_name, int dnsbl_index, int *dnsbl_ttl) { const char *myname = "psc_dnsbl_retrieve"; PSC_DNSBL_SCORE *score; int result_score; int result_ttl; /* * Sanity check. */ if ((score = (PSC_DNSBL_SCORE *) htable_find(dnsbl_score_cache, client_addr)) == 0) msg_panic("%s: no blocklist score for %s", myname, client_addr); /* * Disable callbacks. */ PSC_CALL_BACK_CANCEL(score, dnsbl_index); /* * Reads are destructive. */ result_score = score->total; *dnsbl_name = score->dnsbl_name; result_ttl = (result_score > 0) ? score->fail_ttl : score->pass_ttl; /* As with dnsblog(8), a value < 0 means no reply TTL. */ if (result_ttl < var_psc_dnsbl_min_ttl) result_ttl = var_psc_dnsbl_min_ttl; if (result_ttl > var_psc_dnsbl_max_ttl) result_ttl = var_psc_dnsbl_max_ttl; *dnsbl_ttl = result_ttl; if (msg_verbose) msg_info("%s: addr=%s score=%d ttl=%d", myname, client_addr, result_score, result_ttl); score->refcount -= 1; if (score->refcount < 1) { if (msg_verbose > 1) msg_info("%s: delete blocklist score for %s", myname, client_addr); htable_delete(dnsbl_score_cache, client_addr, myfree); } return (result_score); }