From 94fba5b9acd6608c69befff99cf083cf60bde098 Mon Sep 17 00:00:00 2001 From: Leonid Evdokimov Date: Wed, 10 Aug 2011 15:58:47 +0400 Subject: [PATCH] Add DNS_ERR_NODATA error code to handle empty replies. --- evdns.c | 7 ++++++- include/event2/dns.h | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/evdns.c b/evdns.c index 4ff9f8dc..6b501698 100644 --- a/evdns.c +++ b/evdns.c @@ -843,13 +843,17 @@ reply_handle(struct request *const req, u16 flags, u32 ttl, struct reply *reply) /* there was an error */ if (flags & 0x0200) { error = DNS_ERR_TRUNCATED; - } else { + } else if (flags & 0x000f) { u16 error_code = (flags & 0x000f) - 1; if (error_code > 4) { error = DNS_ERR_UNKNOWN; } else { error = error_codes[error_code]; } + } else if (reply && !reply->have_answer) { + error = DNS_ERR_NODATA; + } else { + error = DNS_ERR_UNKNOWN; } switch (error) { @@ -3871,6 +3875,7 @@ evdns_err_to_string(int err) case DNS_ERR_TIMEOUT: return "request timed out"; case DNS_ERR_SHUTDOWN: return "dns subsystem shut down"; case DNS_ERR_CANCEL: return "dns request canceled"; + case DNS_ERR_NODATA: return "no records in the reply"; default: return "[Unknown error code]"; } } diff --git a/include/event2/dns.h b/include/event2/dns.h index a51da899..61c6e4f1 100644 --- a/include/event2/dns.h +++ b/include/event2/dns.h @@ -166,6 +166,10 @@ extern "C" { #define DNS_ERR_SHUTDOWN 68 /** The request was canceled via a call to evdns_cancel_request */ #define DNS_ERR_CANCEL 69 +/** There were no answers and no error condition in the DNS packet. + * This can happen when you ask for an address that exists, but a record + * type that doesn't. */ +#define DNS_ERR_NODATA 70 #define DNS_IPv4_A 1 #define DNS_PTR 2 -- 2.40.0