diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-03-23 13:00:37 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-03-23 13:00:37 +0200 |
commit | 2d91db836a95a66c7b9ad1acb9dd0ebf93fb4f44 (patch) | |
tree | c148b4f3b57eb4994cad241046f4e1ffce3ffcd1 | |
parent | c659e6efca03b4a75df03ee46b0c3b8694ff1bbb (diff) | |
download | mailfromd-2d91db836a95a66c7b9ad1acb9dd0ebf93fb4f44.tar.gz mailfromd-2d91db836a95a66c7b9ad1acb9dd0ebf93fb4f44.tar.bz2 |
Fix dns_resolve_ipstr
* lib/dns.c (dns_resolve_ipstr): Select rrtype depending on the
domain in question. This should produce the same results as it was
in the previous res_query implementation, which queried for T_ANY
and selected the first RR type returned.
-rw-r--r-- | lib/dns.c | 22 |
1 files changed, 15 insertions, 7 deletions
@@ -438,27 +438,35 @@ dns_resolve_ipstr(const char *ipstr, const char *domain, char **hbuf) int rc; adns_answer *ans; char *name; - - if (!dns_str_is_ipv4(ipstr)) - return dns_failure; - if (!domain) { + adns_rrtype type; + + if (!domain || strcasecmp(domain, "in-addr.arpa") == 0) { IPBUF ipbuf; + if (!dns_str_is_ipv4(ipstr)) + return dns_failure; if (dns_reverse_ipstr(ipstr, ipbuf)) return dns_failure; mu_asprintf(&name, "%s.in-addr.arpa", ipbuf); + type = adns_r_ptr_raw; } else { mu_asprintf(&name, "%s.%s", ipstr, domain); + type = adns_r_a; } - rc = adns_synchronous(get_state(), name, adns_r_ptr_raw, + rc = adns_synchronous(get_state(), name, type, DEFAULT_QFLAGS, &ans); free(name); if (rc) return errno_to_dns_status(rc); status = adns_to_dns_status(ans->status); - if (status == dns_success) - *hbuf = mu_strdup(ans->rrs.str[0]); + if (status == dns_success) { + if (ans->type == adns_r_ptr_raw) { + *hbuf = mu_strdup(ans->rrs.str[0]); + } else { + *hbuf = mu_strdup(inet_ntoa(ans->rrs.inaddr[0])); + } + } free(ans); return status; } |