1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
Tomas Janousek  <tjanouse@redhat.com>
            Ulrich Drepper  <drepper@redhat.com>

	[BZ #4647]
	* resolv/res_send.c (send_dg): Remove socket_pf.  Use ipv6_unavail
	member in __res_state, only convaddr4to6 if nssocks[ns] is a PF_INET6
	socket.
	* resolv/resolv.h (__res_state): Add ipv6_unavail member.  Make
	unused member a bitmap.
	* resolv/res_init.c (__res_vinit): Reset ipv6_unavail if IPv6
	servers are configured.

2007-06-18  Jakub Jelinek  <jakub@redhat.com>
This commit is contained in:
Ulrich Drepper
2007-06-18 22:22:57 +00:00
parent 3abee0b7f1
commit ae1ad3aebb
10 changed files with 51 additions and 15 deletions

View File

@ -1,3 +1,16 @@
2007-06-18 Jakub Jelinek <jakub@redhat.com>
Tomas Janousek <tjanouse@redhat.com>
Ulrich Drepper <drepper@redhat.com>
[BZ #4647]
* resolv/res_send.c (send_dg): Remove socket_pf. Use ipv6_unavail
member in __res_state, only convaddr4to6 if nssocks[ns] is a PF_INET6
socket.
* resolv/resolv.h (__res_state): Add ipv6_unavail member. Make
unused member a bitmap.
* resolv/res_init.c (__res_vinit): Reset ipv6_unavail if IPv6
servers are configured.
2007-06-18 Jakub Jelinek <jakub@redhat.com> 2007-06-18 Jakub Jelinek <jakub@redhat.com>
* elf/rtld.c (dl_main): Don't call init_tls more than once. * elf/rtld.c (dl_main): Don't call init_tls more than once.

View File

@ -1,3 +1,11 @@
2007-06-18 Ulrich Drepper <drepper@redhat.com>
* pthreadP.h: Define PTHREAD_MUTEX_TYPE.
* phtread_mutex_lock.c: Use PTHREAD_MUTEX_TYPE.
* pthread_mutex_timedlock.c: Likewise.
* pthread_mutex_trylock.c: Likewise.
* pthread_mutex_unlock.c: Likewise.
2007-06-17 Andreas Schwab <schwab@suse.de> 2007-06-17 Andreas Schwab <schwab@suse.de>
* sysdeps/pthread/pt-initfini.c: Tell gcc about the nonstandard * sysdeps/pthread/pt-initfini.c: Tell gcc about the nonstandard

View File

@ -97,6 +97,9 @@ enum
= PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_PRIO_PROTECT_NP | PTHREAD_MUTEX_ADAPTIVE_NP
}; };
#define PTHREAD_MUTEX_TYPE(m) \
((m)->__data.__kind)
/* Ceiling in __data.__lock. __data.__lock is signed, so don't /* Ceiling in __data.__lock. __data.__lock is signed, so don't
use the MSB bit in there, but in the mask also include that bit, use the MSB bit in there, but in the mask also include that bit,
so that the compiler can optimize & PTHREAD_MUTEX_PRIO_CEILING_MASK so that the compiler can optimize & PTHREAD_MUTEX_PRIO_CEILING_MASK

View File

@ -43,7 +43,8 @@ __pthread_mutex_lock (mutex)
pid_t id = THREAD_GETMEM (THREAD_SELF, tid); pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
int retval = 0; int retval = 0;
switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP)) switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
PTHREAD_MUTEX_TIMED_NP))
{ {
/* Recursive mutex. */ /* Recursive mutex. */
case PTHREAD_MUTEX_RECURSIVE_NP: case PTHREAD_MUTEX_RECURSIVE_NP:

View File

@ -37,7 +37,8 @@ pthread_mutex_timedlock (mutex, abstime)
/* We must not check ABSTIME here. If the thread does not block /* We must not check ABSTIME here. If the thread does not block
abstime must not be checked for a valid value. */ abstime must not be checked for a valid value. */
switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP)) switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
PTHREAD_MUTEX_TIMED_NP))
{ {
/* Recursive mutex. */ /* Recursive mutex. */
case PTHREAD_MUTEX_RECURSIVE_NP: case PTHREAD_MUTEX_RECURSIVE_NP:

View File

@ -31,7 +31,8 @@ __pthread_mutex_trylock (mutex)
int oldval; int oldval;
pid_t id = THREAD_GETMEM (THREAD_SELF, tid); pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP)) switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
PTHREAD_MUTEX_TIMED_NP))
{ {
/* Recursive mutex. */ /* Recursive mutex. */
case PTHREAD_MUTEX_RECURSIVE_NP: case PTHREAD_MUTEX_RECURSIVE_NP:

View File

@ -31,7 +31,8 @@ __pthread_mutex_unlock_usercnt (mutex, decr)
{ {
int newowner = 0; int newowner = 0;
switch (__builtin_expect (mutex->__data.__kind, PTHREAD_MUTEX_TIMED_NP)) switch (__builtin_expect (PTHREAD_MUTEX_TYPE (mutex),
PTHREAD_MUTEX_TIMED_NP))
{ {
case PTHREAD_MUTEX_RECURSIVE_NP: case PTHREAD_MUTEX_RECURSIVE_NP:
/* Recursive mutex. */ /* Recursive mutex. */

View File

@ -241,8 +241,8 @@ __res_vinit(res_state statp, int preinit) {
line[sizeof(name) - 1] == '\t')) line[sizeof(name) - 1] == '\t'))
if ((fp = fopen(_PATH_RESCONF, "rc")) != NULL) { if ((fp = fopen(_PATH_RESCONF, "rc")) != NULL) {
/* No threads use this stream. */ /* No threads use this stream. */
__fsetlocking (fp, FSETLOCKING_BYCALLER); __fsetlocking (fp, FSETLOCKING_BYCALLER);
/* read the config file */ /* read the config file */
while (fgets_unlocked(buf, sizeof(buf), fp) != NULL) { while (fgets_unlocked(buf, sizeof(buf), fp) != NULL) {
/* skip comments */ /* skip comments */
@ -397,8 +397,11 @@ __res_vinit(res_state statp, int preinit) {
if (nserv > 1) if (nserv > 1)
statp->nscount = nserv; statp->nscount = nserv;
#ifdef _LIBC #ifdef _LIBC
if (nservall - nserv > 0) if (nservall - nserv > 0) {
statp->_u._ext.nscount6 = nservall - nserv; statp->_u._ext.nscount6 = nservall - nserv;
/* We try IPv6 servers again. */
statp->ipv6_unavail = false;
}
#endif #endif
#ifdef RESOLVSORT #ifdef RESOLVSORT
statp->nsort = nsort; statp->nsort = nsort;

View File

@ -813,17 +813,20 @@ send_dg(res_state statp,
struct pollfd pfd[1]; struct pollfd pfd[1];
int ptimeout; int ptimeout;
struct sockaddr_in6 from; struct sockaddr_in6 from;
static int socket_pf = 0;
socklen_t fromlen; socklen_t fromlen;
int resplen, seconds, n; int resplen, seconds, n;
if (EXT(statp).nssocks[ns] == -1) { if (EXT(statp).nssocks[ns] == -1) {
/* only try IPv6 if IPv6 NS and if not failed before */ /* only try IPv6 if IPv6 NS and if not failed before */
if ((EXT(statp).nscount6 > 0) && (socket_pf != PF_INET)) { if ((EXT(statp).nscount6 > 0) && !statp->ipv6_unavail) {
EXT(statp).nssocks[ns] = EXT(statp).nssocks[ns] =
socket(PF_INET6, SOCK_DGRAM, 0); socket(PF_INET6, SOCK_DGRAM, 0);
socket_pf = EXT(statp).nssocks[ns] < 0 ? PF_INET if (EXT(statp).nssocks[ns] < 0)
: PF_INET6; 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) if (EXT(statp).nssocks[ns] < 0)
EXT(statp).nssocks[ns] = socket(PF_INET, SOCK_DGRAM, 0); EXT(statp).nssocks[ns] = socket(PF_INET, SOCK_DGRAM, 0);
@ -832,9 +835,7 @@ send_dg(res_state statp,
Perror(statp, stderr, "socket(dg)", errno); Perror(statp, stderr, "socket(dg)", errno);
return (-1); return (-1);
} }
/* If IPv6 socket and nsap is IPv4, make it IPv4-mapped */
if ((socket_pf == PF_INET6) && (nsap->sin6_family == AF_INET))
convaddr4to6(nsap);
/* /*
* On a 4.3BSD+ machine (client and server, * On a 4.3BSD+ machine (client and server,
* actually), sending to a nameserver datagram * actually), sending to a nameserver datagram

View File

@ -110,21 +110,25 @@ struct __res_state {
nsaddr_list[MAXNS]; /* address of name server */ nsaddr_list[MAXNS]; /* address of name server */
# define nsaddr nsaddr_list[0] /* for backward compatibility */ # define nsaddr nsaddr_list[0] /* for backward compatibility */
u_short id; /* current message id */ u_short id; /* current message id */
/* 2 byte hole here. */
char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */ char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */
char defdname[256]; /* default domain (deprecated) */ char defdname[256]; /* default domain (deprecated) */
u_long pfcode; /* RES_PRF_ flags - see below. */ u_long pfcode; /* RES_PRF_ flags - see below. */
unsigned ndots:4; /* threshold for initial abs. query */ unsigned ndots:4; /* threshold for initial abs. query */
unsigned nsort:4; /* number of elements in sort_list[] */ unsigned nsort:4; /* number of elements in sort_list[] */
char unused[3]; unsigned ipv6_unavail:1; /* connecting to IPv6 server failed */
unsigned unused:23;
struct { struct {
struct in_addr addr; struct in_addr addr;
u_int32_t mask; u_int32_t mask;
} sort_list[MAXRESOLVSORT]; } sort_list[MAXRESOLVSORT];
/* 4 byte hole here on 64-bit architectures. */
res_send_qhook qhook; /* query hook */ res_send_qhook qhook; /* query hook */
res_send_rhook rhook; /* response hook */ res_send_rhook rhook; /* response hook */
int res_h_errno; /* last one set for this context */ int res_h_errno; /* last one set for this context */
int _vcsock; /* PRIVATE: for res_send VC i/o */ int _vcsock; /* PRIVATE: for res_send VC i/o */
u_int _flags; /* PRIVATE: see below */ u_int _flags; /* PRIVATE: see below */
/* 4 byte hole here on 64-bit architectures. */
union { union {
char pad[52]; /* On an i386 this means 512b total. */ char pad[52]; /* On an i386 this means 512b total. */
struct { struct {