* 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.
This commit is contained in:
Ulrich Drepper 2006-05-06 17:20:59 +00:00
parent 697e162863
commit 8e45b1acc2
2 changed files with 18 additions and 22 deletions

View File

@ -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

View File

@ -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. */