[BZ #4647]
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:
parent
3abee0b7f1
commit
ae1ad3aebb
13
ChangeLog
13
ChangeLog
|
@ -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>
|
||||
|
||||
* elf/rtld.c (dl_main): Don't call init_tls more than once.
|
||||
|
|
|
@ -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>
|
||||
|
||||
* sysdeps/pthread/pt-initfini.c: Tell gcc about the nonstandard
|
||||
|
|
|
@ -97,6 +97,9 @@ enum
|
|||
= 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
|
||||
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
|
||||
|
|
|
@ -43,7 +43,8 @@ __pthread_mutex_lock (mutex)
|
|||
pid_t id = THREAD_GETMEM (THREAD_SELF, tid);
|
||||
|
||||
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. */
|
||||
case PTHREAD_MUTEX_RECURSIVE_NP:
|
||||
|
|
|
@ -37,7 +37,8 @@ pthread_mutex_timedlock (mutex, abstime)
|
|||
/* We must not check ABSTIME here. If the thread does not block
|
||||
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. */
|
||||
case PTHREAD_MUTEX_RECURSIVE_NP:
|
||||
|
|
|
@ -31,7 +31,8 @@ __pthread_mutex_trylock (mutex)
|
|||
int oldval;
|
||||
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. */
|
||||
case PTHREAD_MUTEX_RECURSIVE_NP:
|
||||
|
|
|
@ -31,7 +31,8 @@ __pthread_mutex_unlock_usercnt (mutex, decr)
|
|||
{
|
||||
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:
|
||||
/* Recursive mutex. */
|
||||
|
|
|
@ -241,8 +241,8 @@ __res_vinit(res_state statp, int preinit) {
|
|||
line[sizeof(name) - 1] == '\t'))
|
||||
|
||||
if ((fp = fopen(_PATH_RESCONF, "rc")) != NULL) {
|
||||
/* No threads use this stream. */
|
||||
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||
/* No threads use this stream. */
|
||||
__fsetlocking (fp, FSETLOCKING_BYCALLER);
|
||||
/* read the config file */
|
||||
while (fgets_unlocked(buf, sizeof(buf), fp) != NULL) {
|
||||
/* skip comments */
|
||||
|
@ -397,8 +397,11 @@ __res_vinit(res_state statp, int preinit) {
|
|||
if (nserv > 1)
|
||||
statp->nscount = nserv;
|
||||
#ifdef _LIBC
|
||||
if (nservall - nserv > 0)
|
||||
if (nservall - nserv > 0) {
|
||||
statp->_u._ext.nscount6 = nservall - nserv;
|
||||
/* We try IPv6 servers again. */
|
||||
statp->ipv6_unavail = false;
|
||||
}
|
||||
#endif
|
||||
#ifdef RESOLVSORT
|
||||
statp->nsort = nsort;
|
||||
|
|
|
@ -813,17 +813,20 @@ send_dg(res_state statp,
|
|||
struct pollfd pfd[1];
|
||||
int ptimeout;
|
||||
struct sockaddr_in6 from;
|
||||
static int socket_pf = 0;
|
||||
socklen_t fromlen;
|
||||
int resplen, seconds, n;
|
||||
|
||||
if (EXT(statp).nssocks[ns] == -1) {
|
||||
/* 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] =
|
||||
socket(PF_INET6, SOCK_DGRAM, 0);
|
||||
socket_pf = EXT(statp).nssocks[ns] < 0 ? PF_INET
|
||||
: PF_INET6;
|
||||
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)
|
||||
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);
|
||||
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,
|
||||
* actually), sending to a nameserver datagram
|
||||
|
|
|
@ -110,21 +110,25 @@ struct __res_state {
|
|||
nsaddr_list[MAXNS]; /* address of name server */
|
||||
# define nsaddr nsaddr_list[0] /* for backward compatibility */
|
||||
u_short id; /* current message id */
|
||||
/* 2 byte hole here. */
|
||||
char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */
|
||||
char defdname[256]; /* default domain (deprecated) */
|
||||
u_long pfcode; /* RES_PRF_ flags - see below. */
|
||||
unsigned ndots:4; /* threshold for initial abs. query */
|
||||
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 in_addr addr;
|
||||
u_int32_t mask;
|
||||
} sort_list[MAXRESOLVSORT];
|
||||
/* 4 byte hole here on 64-bit architectures. */
|
||||
res_send_qhook qhook; /* query hook */
|
||||
res_send_rhook rhook; /* response hook */
|
||||
int res_h_errno; /* last one set for this context */
|
||||
int _vcsock; /* PRIVATE: for res_send VC i/o */
|
||||
u_int _flags; /* PRIVATE: see below */
|
||||
/* 4 byte hole here on 64-bit architectures. */
|
||||
union {
|
||||
char pad[52]; /* On an i386 this means 512b total. */
|
||||
struct {
|
||||
|
|
Loading…
Reference in New Issue