[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[commits] r8610 - in /fsf/trunk/libc: ChangeLog resolv/res_init.c resolv/res_send.c resolv/resolv.h
- To: commits@xxxxxxxxxx
- Subject: [commits] r8610 - in /fsf/trunk/libc: ChangeLog resolv/res_init.c resolv/res_send.c resolv/resolv.h
- From: eglibc@xxxxxxxxxx
- Date: Sat, 27 Jun 2009 07:08:31 -0000
Author: eglibc
Date: Sat Jun 27 00:08:31 2009
New Revision: 8610
Log:
Import glibc-mainline for 2009-06-27
Modified:
fsf/trunk/libc/ChangeLog
fsf/trunk/libc/resolv/res_init.c
fsf/trunk/libc/resolv/res_send.c
fsf/trunk/libc/resolv/resolv.h
Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Sat Jun 27 00:08:31 2009
@@ -1,3 +1,14 @@
+2009-06-26 Ulrich Drepper <drepper@xxxxxxxxxx>
+
+ * resolv/resolv.h: Define RES_SNGLKUPREOP.
+ * resolv/res_init.c (res_setoptions): Recognize single-request-reopen
+ option.
+ * resolv/res_send.c (reopen): New function. Broken out of...
+ (send_dg): ... here. Recognize RES_SNGLKUPREOP. Implement second
+ fallback mechanism. If single-request fails switch to
+ single-request-reopen mode which opens a new socket for the second
+ request.
+
2009-06-25 Andreas Schwab <aschwab@xxxxxxxxxx>
* sysdeps/powerpc/powerpc32/____longjmp_chk.S (LOAD_ARG): Define.
Modified: fsf/trunk/libc/resolv/res_init.c
==============================================================================
--- fsf/trunk/libc/resolv/res_init.c (original)
+++ fsf/trunk/libc/resolv/res_init.c Sat Jun 27 00:08:31 2009
@@ -540,6 +540,9 @@
statp->options |= RES_NOCHECKNAME;
} else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) {
statp->options |= RES_USE_EDNS0;
+ } else if (!strncmp(cp, "single-request-reopen",
+ sizeof("single-request-reopen") - 1)) {
+ statp->options |= RES_SNGLKUPREOP;
} else if (!strncmp(cp, "single-request",
sizeof("single-request") - 1)) {
statp->options |= RES_SNGLKUP;
Modified: fsf/trunk/libc/resolv/res_send.c
==============================================================================
--- fsf/trunk/libc/resolv/res_send.c (original)
+++ fsf/trunk/libc/resolv/res_send.c Sat Jun 27 00:08:31 2009
@@ -908,24 +908,11 @@
}
static int
-send_dg(res_state statp,
- const u_char *buf, int buflen, const u_char *buf2, int buflen2,
- u_char **ansp, int *anssizp,
- int *terrno, int ns, int *v_circuit, int *gotsomewhere, u_char **anscp,
- u_char **ansp2, int *anssizp2, int *resplen2)
+reopen (res_state statp, int *terrno, int ns)
{
- const HEADER *hp = (HEADER *) buf;
- const HEADER *hp2 = (HEADER *) buf2;
- u_char *ans = *ansp;
- int orig_anssizp = *anssizp;
- struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns];
- struct timespec now, timeout, finish;
- struct pollfd pfd[1];
- int ptimeout;
- struct sockaddr_in6 from;
- int resplen, n;
-
if (EXT(statp).nssocks[ns] == -1) {
+ struct sockaddr_in6 *nsap = EXT(statp).nsaddrs[ns];
+
/* only try IPv6 if IPv6 NS and if not failed before */
if ((EXT(statp).nscount6 > 0) && !statp->ipv6_unavail) {
if (__builtin_expect (__have_o_nonblock >= 0, 1)) {
@@ -1000,6 +987,26 @@
}
}
+ return 1;
+}
+
+static int
+send_dg(res_state statp,
+ const u_char *buf, int buflen, const u_char *buf2, int buflen2,
+ u_char **ansp, int *anssizp,
+ int *terrno, int ns, int *v_circuit, int *gotsomewhere, u_char **anscp,
+ u_char **ansp2, int *anssizp2, int *resplen2)
+{
+ const HEADER *hp = (HEADER *) buf;
+ const HEADER *hp2 = (HEADER *) buf2;
+ u_char *ans = *ansp;
+ int orig_anssizp = *anssizp;
+ struct timespec now, timeout, finish;
+ struct pollfd pfd[1];
+ int ptimeout;
+ struct sockaddr_in6 from;
+ int resplen, n;
+
/*
* Compute time for the total operation.
*/
@@ -1008,8 +1015,15 @@
seconds /= statp->nscount;
if (seconds <= 0)
seconds = 1;
- bool single_request = (statp->options & RES_SNGLKUP) != 0;// XXX
+ bool single_request = (statp->options & RES_SNGLKUP) != 0;
+ bool single_request_reopen = (statp->options & RES_SNGLKUPREOP) != 0;
int save_gotsomewhere = *gotsomewhere;
+
+ int retval;
+ retry_reopen:
+ retval = reopen (statp, terrno, ns);
+ if (retval <= 0)
+ return retval;
retry:
evNowTime(&now);
evConsTime(&timeout, seconds, 0);
@@ -1064,6 +1078,14 @@
*gotsomewhere = save_gotsomewhere;
goto retry;
}
+ else if (!single_request_reopen)
+ {
+ statp->options |= RES_SNGLKUPREOP;
+ single_request_reopen = true;
+ *gotsomewhere = save_gotsomewhere;
+ __res_iclose (statp, false);
+ goto retry_reopen;
+ }
*resplen2 = 1;
return resplen;
@@ -1092,7 +1114,8 @@
Perror(statp, stderr, "send", errno);
goto err_out;
}
- if (nwritten != 0 || buf2 == NULL || single_request)
+ if (nwritten != 0 || buf2 == NULL
+ || single_request || single_request_reopen)
pfd[0].events = POLLIN;
else
pfd[0].events = POLLIN | POLLOUT;
@@ -1306,8 +1329,15 @@
recvresp2 = 1;
/* Repeat waiting if we have a second answer to arrive. */
if ((recvresp1 & recvresp2) == 0) {
- if (single_request)
+ if (single_request || single_request_reopen) {
pfd[0].events = POLLOUT;
+ if (single_request_reopen) {
+ __res_iclose (statp, false);
+ retval = reopen (statp, terrno, ns);
+ if (retval <= 0)
+ return retval;
+ }
+ }
goto wait;
}
/*
Modified: fsf/trunk/libc/resolv/resolv.h
==============================================================================
--- fsf/trunk/libc/resolv/resolv.h (original)
+++ fsf/trunk/libc/resolv/resolv.h Sat Jun 27 00:08:31 2009
@@ -216,6 +216,8 @@
reverse lookup */
#define RES_USE_EDNS0 0x00100000 /* Use EDNS0. */
#define RES_SNGLKUP 0x00200000 /* one outstanding request at a time */
+#define RES_SNGLKUPREOP 0x00400000 /* -"-, but open new socket for each
+ request */
#define RES_DEFAULT (RES_RECURSE|RES_DEFNAMES|RES_DNSRCH|RES_NOIP6DOTINT)