about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--resolv/res_send.c36
2 files changed, 18 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index 065f64d007..0bba553cfc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2006-05-06  Ulrich Drepper  <drepper@redhat.com>
 
+	* resolv/res_send.c (res_queriesmatch): Fix typo in comment.
+	(send_dg): Rewrite error handling to be more compact and avoid
+	double recomputation of timeouts.  Pass MSG_NOSIGNAL to send.
+
 	* include/arpa/nameser.h: Add optimizations for NS_GET16 and NS_GET32.
 
 	* resolv/res_send.c (res_nameinquery): Use NS_GET16 directly
diff --git a/resolv/res_send.c b/resolv/res_send.c
index 4bcb746159..ebe4fbfc9b 100644
--- a/resolv/res_send.c
+++ b/resolv/res_send.c
@@ -304,7 +304,7 @@ res_queriesmatch(const u_char *buf1, const u_char *eom1,
 		return (1);
 
 	/* Note that we initially do not convert QDCOUNT to the host byte
-	   order.  We can compare it with the second buffers QDCOUNT
+	   order.  We can compare it with the second buffer's QDCOUNT
 	   value without doing this.  */
 	int qdcount = ((HEADER*)buf1)->qdcount;
 	if (qdcount != ((HEADER*)buf2)->qdcount)
@@ -879,9 +879,12 @@ send_dg(res_state statp,
 	pfd[0].events = POLLOUT;
  wait:
 	if (need_recompute) {
+	recompute_resend:
 		evNowTime(&now);
 		if (evCmpTime(finish, now) <= 0) {
-			Perror(statp, stderr, "select", errno);
+		poll_err_out:
+			Perror(statp, stderr, "poll", errno);
+		err_out:
 			__res_iclose(statp, false);
 			return (0);
 		}
@@ -904,26 +907,18 @@ send_dg(res_state statp,
 		return (0);
 	}
 	if (n < 0) {
-		if (errno == EINTR) {
-		recompute_resend:
-			evNowTime(&now);
-			if (evCmpTime(finish, now) > 0) {
-				evSubTime(&timeout, &finish, &now);
-				goto wait;
-			}
-		}
-		Perror(statp, stderr, "poll", errno);
-		__res_iclose(statp, false);
-		return (0);
+		if (errno == EINTR)
+			goto recompute_resend;
+
+		goto poll_err_out;
 	}
 	__set_errno (0);
 	if (pfd[0].revents & POLLOUT) {
-		if (send(pfd[0].fd, (char*)buf, buflen, 0) != buflen) {
+		if (send (pfd[0].fd, buf, buflen, MSG_NOSIGNAL) != buflen) {
 			if (errno == EINTR || errno == EAGAIN)
 				goto recompute_resend;
 			Perror(statp, stderr, "send", errno);
-			__res_iclose(statp, false);
-			return (0);
+			goto err_out;
 		}
 		pfd[0].events = POLLIN;
 		++nwritten;
@@ -953,8 +948,7 @@ send_dg(res_state statp,
 				goto wait;
 			}
 			Perror(statp, stderr, "recvfrom", errno);
-			__res_iclose(statp, false);
-			return (0);
+			goto err_out;
 		}
 		*gotsomewhere = 1;
 		if (resplen < HFIXEDSZ) {
@@ -965,8 +959,7 @@ send_dg(res_state statp,
 			       (stdout, ";; undersized: %d\n",
 				resplen));
 			*terrno = EMSGSIZE;
-			__res_iclose(statp, false);
-			return (0);
+			goto err_out;
 		}
 		if (hp->id != anhp->id) {
 			/*
@@ -1044,8 +1037,7 @@ send_dg(res_state statp,
 		return (resplen);
 	} else if (pfd[0].revents & (POLLERR | POLLHUP | POLLNVAL)) {
 		/* Something went wrong.  We can stop trying.  */
-	  __res_iclose(statp, false);
-		return (0);
+		goto err_out;
 	}
 	else {
 	  	/* poll should not have returned > 0 in this case.  */