summaryrefslogtreecommitdiff
path: root/resolv
diff options
context:
space:
mode:
Diffstat (limited to 'resolv')
-rw-r--r--resolv/netdb.h16
-rw-r--r--resolv/res_send.c44
2 files changed, 18 insertions, 42 deletions
diff --git a/resolv/netdb.h b/resolv/netdb.h
index dc1f7cec61..7671c6aca5 100644
--- a/resolv/netdb.h
+++ b/resolv/netdb.h
@@ -1,4 +1,4 @@
- /* Copyright (C) 1996-2002, 2003, 2004, 2009 Free Software Foundation, Inc.
+ /* Copyright (C) 1996-2004, 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -53,22 +53,24 @@
__BEGIN_DECLS
+#if defined __USE_MISC || !defined __USE_XOPEN2K8
/* Error status for non-reentrant lookup functions.
We use a macro to access always the thread-specific `h_errno' variable. */
-#define h_errno (*__h_errno_location ())
+# define h_errno (*__h_errno_location ())
/* Function to get address of global `h_errno' variable. */
extern int *__h_errno_location (void) __THROW __attribute__ ((__const__));
/* Possible values left in `h_errno'. */
-#define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found. */
-#define TRY_AGAIN 2 /* Non-Authoritative Host not found,
+# define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found. */
+# define TRY_AGAIN 2 /* Non-Authoritative Host not found,
or SERVERFAIL. */
-#define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED,
+# define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED,
NOTIMP. */
-#define NO_DATA 4 /* Valid name, no data record of requested
+# define NO_DATA 4 /* Valid name, no data record of requested
type. */
+#endif
#if defined __USE_MISC || defined __USE_GNU
# define NETDB_INTERNAL -1 /* See errno. */
# define NETDB_SUCCESS 0 /* No problem. */
@@ -85,7 +87,7 @@ extern int *__h_errno_location (void) __THROW __attribute__ ((__const__));
# define SCOPE_DELIMITER '%'
#endif
-#if defined __USE_MISC || defined __USE_GNU
+#ifdef __USE_MISC
/* Print error indicated by `h_errno' variable on standard error. STR
if non-null is printed before the error string. */
extern void herror (__const char *__str) __THROW;
diff --git a/resolv/res_send.c b/resolv/res_send.c
index e2bbfcc83f..28a47e42b8 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -199,10 +199,6 @@ static void Perror(const res_state, FILE *, const char *, int);
#endif
static int sock_eq(struct sockaddr_in6 *, struct sockaddr_in6 *);
-/* Reachover. */
-
-static void convaddr4to6(struct sockaddr_in6 *sa);
-
/* Public. */
/* int
@@ -911,10 +907,12 @@ static int
reopen (res_state statp, int *terrno, int ns)
{
if (EXT(statp).nssocks[ns] == -1) {
- struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns];
+ struct sockaddr *nsap
+ = (struct sockaddr *) EXT(statp).nsaddrs[ns];
+ socklen_t slen;
/* only try IPv6 if IPv6 NS and if not failed before */
- if ((EXT(statp).nscount6 > 0) && !statp->ipv6_unavail) {
+ if (nsap->sa_family == AF_INET6 && !statp->ipv6_unavail) {
if (__builtin_expect (__have_o_nonblock >= 0, 1)) {
EXT(statp).nssocks[ns] =
socket(PF_INET6, SOCK_DGRAM|SOCK_NONBLOCK,
@@ -931,12 +929,8 @@ reopen (res_state statp, int *terrno, int 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
- IPv4-mapped */
- else if (nsap->sin6_family == AF_INET)
- convaddr4to6(nsap);
- }
- if (EXT(statp).nssocks[ns] < 0) {
+ slen = sizeof (struct sockaddr_in6);
+ } else if (nsap->sa_family == AF_INET) {
if (__builtin_expect (__have_o_nonblock >= 0, 1)) {
EXT(statp).nssocks[ns]
= socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK,
@@ -951,6 +945,7 @@ reopen (res_state statp, int *terrno, int ns)
if (__builtin_expect (__have_o_nonblock < 0, 0))
EXT(statp).nssocks[ns]
= socket(PF_INET, SOCK_DGRAM, 0);
+ slen = sizeof (struct sockaddr_in);
}
if (EXT(statp).nssocks[ns] < 0) {
*terrno = errno;
@@ -969,10 +964,8 @@ reopen (res_state statp, int *terrno, int ns)
* error message is received. We can thus detect
* the absence of a nameserver without timing out.
*/
- if (connect(EXT(statp).nssocks[ns], (struct sockaddr *)nsap,
- sizeof *nsap) < 0) {
- Aerror(statp, stderr, "connect(dg)", errno,
- (struct sockaddr *) nsap);
+ if (connect(EXT(statp).nssocks[ns], nsap, slen) < 0) {
+ Aerror(statp, stderr, "connect(dg)", errno, nsap);
__res_iclose(statp, false);
return (0);
}
@@ -1415,22 +1408,3 @@ sock_eq(struct sockaddr_in6 *a1, struct sockaddr_in6 *a2) {
(a1->sin6_addr.s6_addr32[3] ==
((struct sockaddr_in *)a2)->sin_addr.s_addr));
}
-
-/*
- * Converts IPv4 family, address and port to
- * IPv6 family, IPv4-mapped IPv6 address and port.
- */
-static void
-convaddr4to6(struct sockaddr_in6 *sa)
-{
- struct sockaddr_in *sa4p = (struct sockaddr_in *) sa;
- in_port_t port = sa4p->sin_port;
- in_addr_t addr = sa4p->sin_addr.s_addr;
-
- sa->sin6_family = AF_INET6;
- sa->sin6_port = port;
- sa->sin6_addr.s6_addr32[0] = 0;
- sa->sin6_addr.s6_addr32[1] = 0;
- sa->sin6_addr.s6_addr32[2] = htonl(0xFFFF);
- sa->sin6_addr.s6_addr32[3] = addr;
-}