98
97
static void lmtp_print_addr(char *what, DNS_RR *addr_list)
101
struct in_addr in_addr;
100
MAI_HOSTADDR_STR hostaddr;
103
102
msg_info("begin %s address list", what);
104
103
for (addr = addr_list; addr; addr = addr->next) {
105
if (addr->data_len > sizeof(addr)) {
106
msg_warn("skipping address length %d", addr->data_len);
104
if (dns_rr_to_pa(addr, &hostaddr) == 0) {
105
msg_warn("skipping record type %s: %m", dns_strtype(addr->type));
108
memcpy((char *) &in_addr, addr->data, sizeof(in_addr));
109
107
msg_info("pref %4d host %s/%s",
110
108
addr->pref, addr->name,
114
112
msg_info("end %s address list", what);
132
132
* Interpret a numerical name as an address.
134
if (ISDIGIT(host[0]) && (inaddr.s_addr = inet_addr(host)) != INADDR_NONE) {
135
memset((char *) &fixed, 0, sizeof(fixed));
136
return (dns_rr_append(addr_list,
137
dns_rr_create(host, &fixed, pref,
138
(char *) &inaddr, sizeof(inaddr))));
134
if (hostaddr_to_sockaddr(host, (char *) 0, 0, &res0) == 0
135
&& strchr((char *) proto_info->sa_family_list, res0->ai_family) != 0) {
136
if ((addr = dns_sa_to_rr(host, pref, res0->ai_addr)) == 0)
137
msg_fatal("host %s: conversion error for address family %d: %m",
138
host, ((struct sockaddr *) (res0->ai_addr))->sa_family);
139
addr_list = dns_rr_append(addr_list, addr);
142
* Use gethostbyname() when DNS is disabled.
145
* Use native name service when DNS is disabled.
147
#define RETRY_AI_ERROR(e) \
148
((e) == EAI_AGAIN || (e) == EAI_MEMORY || (e) == EAI_SYSTEM)
144
150
if (var_disable_dns) {
145
memset((char *) &fixed, 0, sizeof(fixed));
146
if ((hp = gethostbyname(host)) == 0) {
147
vstring_sprintf(why, "%s: host not found", host);
148
lmtp_errno = LMTP_FAIL;
149
} else if (hp->h_addrtype != AF_INET) {
150
vstring_sprintf(why, "%s: host not found", host);
151
msg_warn("%s: unknown address family %d for %s",
152
myname, hp->h_addrtype, host);
153
lmtp_errno = LMTP_FAIL;
151
if ((aierr = hostname_to_sockaddr(host, (char *) 0, 0, &res0)) != 0) {
152
vstring_sprintf(why, "%s: %s", host, MAI_STRERROR(aierr));
153
lmtp_errno = (RETRY_AI_ERROR(aierr) ? LMTP_RETRY : LMTP_FAIL);
155
while (hp->h_addr_list[0]) {
156
addr_list = dns_rr_append(addr_list,
157
dns_rr_create(host, &fixed, pref,
155
for (found = 0, res = res0; res != 0; res = res->ai_next) {
156
if (strchr((char *) proto_info->sa_family_list, res->ai_family) == 0) {
157
msg_info("skipping address family %d for host %s",
158
res->ai_family, host);
162
if ((addr = dns_sa_to_rr(host, pref, res->ai_addr)) == 0)
163
msg_fatal("host %s: conversion error for address family %d: %m",
164
host, ((struct sockaddr *) (res0->ai_addr))->sa_family);
165
addr_list = dns_rr_append(addr_list, addr);
169
vstring_sprintf(why, "%s: host not found", host);
170
lmtp_errno = LMTP_FAIL;
167
177
* Append the addresses for this host to the address list.
169
switch (dns_lookup(host, T_A, RES_DEFNAMES, &addr, (VSTRING *) 0, why)) {
179
switch (dns_lookup_v(host, RES_DEFNAMES, &addr, (VSTRING *) 0, why,
180
DNS_REQ_FLAG_ALL, proto_info->dns_atype_list)) {
171
182
for (rr = addr; rr; rr = rr->next)