diff options
Diffstat (limited to 'resolv')
-rw-r--r-- | resolv/Versions | 2 | ||||
-rw-r--r-- | resolv/nss_dns/dns-host.c | 20 | ||||
-rw-r--r-- | resolv/res_init.c | 11 | ||||
-rw-r--r-- | resolv/res_send.c | 58 |
4 files changed, 69 insertions, 22 deletions
diff --git a/resolv/Versions b/resolv/Versions index 4b2e5e9dbc..e5089f9c69 100644 --- a/resolv/Versions +++ b/resolv/Versions @@ -102,7 +102,7 @@ libnss_dns { _nss_dns_gethostbyname_r; _nss_dns_getnetbyaddr_r; _nss_dns_getnetbyname_r; _nss_dns_getcanonname_r; _nss_dns_gethostbyaddr2_r; - _nss_dns_gethostbyname4_r; + # _nss_dns_gethostbyname4_r; } } diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 6cbfcb63ce..b8e513a929 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -198,8 +198,14 @@ _nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result, 1024, &host_buffer.ptr, NULL, NULL, NULL); if (n < 0) { - status = (errno == ECONNREFUSED - ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND); + if (errno == ESRCH) + { + status = NSS_STATUS_TRYAGAIN; + h_errno = TRY_AGAIN; + } + else + status = (errno == ECONNREFUSED + ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND); *h_errnop = h_errno; if (h_errno == TRY_AGAIN) *errnop = EAGAIN; @@ -304,8 +310,14 @@ _nss_dns_gethostbyname4_r (const char *name, struct gaih_addrtuple **pat, &ans2p, &nans2p, &resplen2); if (n < 0) { - status = (errno == ECONNREFUSED - ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND); + if (errno == ESRCH) + { + status = NSS_STATUS_TRYAGAIN; + h_errno = TRY_AGAIN; + } + else + status = (errno == ECONNREFUSED + ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND); *herrnop = h_errno; if (h_errno == TRY_AGAIN) *errnop = EAGAIN; diff --git a/resolv/res_init.c b/resolv/res_init.c index a2840968f3..2bf830cc95 100644 --- a/resolv/res_init.c +++ b/resolv/res_init.c @@ -183,7 +183,7 @@ __res_vinit(res_state statp, int preinit) { #endif statp->nsaddr.sin_family = AF_INET; statp->nsaddr.sin_port = htons(NAMESERVER_PORT); - statp->nscount = 1; + statp->nscount = 0; statp->ndots = 1; statp->pfcode = 0; statp->_vcsock = -1; @@ -314,9 +314,9 @@ __res_vinit(res_state statp, int preinit) { cp++; if ((*cp != '\0') && (*cp != '\n') && __inet_aton(cp, &a)) { - statp->nsaddr_list[nserv].sin_addr = a; - statp->nsaddr_list[nserv].sin_family = AF_INET; - statp->nsaddr_list[nserv].sin_port = + statp->nsaddr_list[nservall].sin_addr = a; + statp->nsaddr_list[nservall].sin_family = AF_INET; + statp->nsaddr_list[nservall].sin_port = htons(NAMESERVER_PORT); nserv++; #ifdef _LIBC @@ -420,8 +420,7 @@ __res_vinit(res_state statp, int preinit) { continue; } } - if (nserv > 1) - statp->nscount = nserv; + statp->nscount = nservall; #ifdef _LIBC if (nservall - nserv > 0) { statp->_u._ext.nscount6 = nservall - nserv; diff --git a/resolv/res_send.c b/resolv/res_send.c index ac5cc0b4fe..f75a26ec23 100644 --- a/resolv/res_send.c +++ b/resolv/res_send.c @@ -95,6 +95,7 @@ static const char rcsid[] = "$BINDId: res_send.c,v 8.38 2000/03/30 20:16:51 vixi #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <kernel-features.h> #if PACKETSZ > 65536 #define MAXPACKET PACKETSZ @@ -103,6 +104,13 @@ static const char rcsid[] = "$BINDId: res_send.c,v 8.38 2000/03/30 20:16:51 vixi #endif +#ifndef __ASSUME_SOCK_CLOEXEC +static int __have_o_nonblock; +#else +# define __have_o_nonblock 0 +#endif + + /* From ev_streams.c. */ static inline void @@ -920,8 +928,20 @@ send_dg(res_state statp, if (EXT(statp).nssocks[ns] == -1) { /* only try IPv6 if IPv6 NS and if not failed before */ if ((EXT(statp).nscount6 > 0) && !statp->ipv6_unavail) { - EXT(statp).nssocks[ns] = - socket(PF_INET6, SOCK_DGRAM, 0); + if (__have_o_nonblock >= 0) { + EXT(statp).nssocks[ns] = + socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK, + 0); +#ifndef __ASSUME_SOCK_CLOEXEC + if (__have_o_nonblock == 0) + __have_o_nonblock + = (EXT(statp).nssocks[ns] == -1 + && errno == EINVAL ? -1 : 1); +#endif + } + if (__have_o_nonblock < 0) + EXT(statp).nssocks[ns] = + socket(PF_INET6, SOCK_DGRAM, 0); if (EXT(statp).nssocks[ns] < 0) statp->ipv6_unavail = errno == EAFNOSUPPORT; /* If IPv6 socket and nsap is IPv4, make it @@ -929,8 +949,22 @@ send_dg(res_state statp, else if (nsap->sin6_family == AF_INET) convaddr4to6(nsap); } - if (EXT(statp).nssocks[ns] < 0) - EXT(statp).nssocks[ns] = socket(PF_INET, SOCK_DGRAM, 0); + if (EXT(statp).nssocks[ns] < 0) { + if (__have_o_nonblock >= 0) { + EXT(statp).nssocks[ns] + = socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, + 0); +#ifndef __ASSUME_SOCK_CLOEXEC + if (__have_o_nonblock == 0) + __have_o_nonblock + = (EXT(statp).nssocks[ns] == -1 + && errno == EINVAL ? -1 : 1); +#endif + } + if (__have_o_nonblock < 0) + EXT(statp).nssocks[ns] + = socket(PF_INET, SOCK_DGRAM, 0); + } if (EXT(statp).nssocks[ns] < 0) { *terrno = errno; Perror(statp, stderr, "socket(dg)", errno); @@ -955,13 +989,15 @@ send_dg(res_state statp, __res_iclose(statp, false); return (0); } - /* Make socket non-blocking. */ - int fl = __fcntl (EXT(statp).nssocks[ns], F_GETFL); - if (fl != -1) - __fcntl (EXT(statp).nssocks[ns], F_SETFL, - fl | O_NONBLOCK); - Dprint(statp->options & RES_DEBUG, - (stdout, ";; new DG socket\n")) + if (__have_o_nonblock < 0) { + /* Make socket non-blocking. */ + int fl = __fcntl (EXT(statp).nssocks[ns], F_GETFL); + if (fl != -1) + __fcntl (EXT(statp).nssocks[ns], F_SETFL, + fl | O_NONBLOCK); + Dprint(statp->options & RES_DEBUG, + (stdout, ";; new DG socket\n")) + } } /* |