commit - cf6af233eb404fd64b01a964ab27d17e1ef37906
commit + 76e3b8e2062bd83badd8e162307739afa8094e19
blob - 3ebb70f09b5c170fde143cf36768c9bbcbea7076
blob + c0f2f0b1c7fc7046f28a70dc68e14fdef013417d
--- main.c
+++ main.c
struct dnsbl_query {
struct asr_query *query;
struct event_asr *event;
+ struct event timeout;
int resolved;
int blacklist;
struct dnsbl_session *session;
void dnsbl_connect(char *, int, struct timespec *, char *, char *, uint64_t,
uint64_t, struct smtp_filter_connect *);
void dnsbl_resolve(struct asr_result *, void *);
+void dnsbl_timeout(int, short, void *);
void dnsbl_session_free(struct dnsbl_session *);
int
struct smtp_filter_connect *params)
{
struct dnsbl_session *session;
+ struct timeval timeout = {1, 0};
char query[255];
u_char *addr;
int i, try;
dnsbl_resolve, &(session->query[i]));
session->query[i].blacklist = i;
session->query[i].session = session;
+ evtimer_set(&(session->query[i].timeout), dnsbl_timeout,
+ &(session->query[i]));
+ evtimer_add(&(session->query[i].timeout), &timeout);
}
}
query->resolved = 1;
query->event = NULL;
query->query = NULL;
+ evtimer_del(&(query->timeout));
if (result->ar_hostent != NULL) {
smtp_filter_disconnect(session->reqid, session->token,
"Host listed at %s", blacklists[query->blacklist]);
}
if (result->ar_h_errno != HOST_NOT_FOUND) {
smtp_filter_disconnect(session->reqid, session->token,
- "DNS error");
+ "DNS error on %s", blacklists[query->blacklist]);
dnsbl_session_free(session);
return;
}
}
void
+dnsbl_timeout(int fd, short event, void *arg)
+{
+ struct dnsbl_query *query = arg;
+ struct dnsbl_session *session = query->session;
+
+ smtp_filter_disconnect(session->reqid, session->token,
+ "DNS timeout on %s", blacklists[query->blacklist]);
+ dnsbl_session_free(session);
+}
+
+void
dnsbl_session_free(struct dnsbl_session *session)
{
int i;
for (i = 0; i < nblacklists; i++) {
- if (!session->query[i].resolved)
+ if (!session->query[i].resolved) {
event_asr_abort(session->query[i].event);
+ evtimer_del(&(session->query[i].timeout));
+ }
}
free(session->query);
free(session);