summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordjm <>2008-04-18 21:36:32 +0000
committerdjm <>2008-04-18 21:36:32 +0000
commitad080a65a3e118c1b0f00e67a13c6f40b04446d3 (patch)
tree2d9e0553813f941002b8132b8338acddd726f568
parent165301a0f9e149652d5cea4bb7ae95744aaa3bf2 (diff)
downloadopenbsd-ad080a65a3e118c1b0f00e67a13c6f40b04446d3.tar.gz
openbsd-ad080a65a3e118c1b0f00e67a13c6f40b04446d3.tar.bz2
openbsd-ad080a65a3e118c1b0f00e67a13c6f40b04446d3.zip
convert select() => poll(), saves a runtime malloc+free per retry
feedback deraadt@ drahn@; ok deraadt@
-rw-r--r--src/lib/libc/net/res_send.c39
1 files changed, 16 insertions, 23 deletions
diff --git a/src/lib/libc/net/res_send.c b/src/lib/libc/net/res_send.c
index f7631350bc..187210cbd8 100644
--- a/src/lib/libc/net/res_send.c
+++ b/src/lib/libc/net/res_send.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: res_send.c,v 1.19 2005/08/06 20:30:04 espie Exp $ */ 1/* $OpenBSD: res_send.c,v 1.20 2008/04/18 21:36:32 djm Exp $ */
2 2
3/* 3/*
4 * ++Copyright++ 1985, 1989, 1993 4 * ++Copyright++ 1985, 1989, 1993
@@ -75,10 +75,11 @@
75#include <arpa/nameser.h> 75#include <arpa/nameser.h>
76#include <arpa/inet.h> 76#include <arpa/inet.h>
77 77
78#include <stdio.h>
79#include <netdb.h>
80#include <errno.h> 78#include <errno.h>
79#include <netdb.h>
80#include <poll.h>
81#include <resolv.h> 81#include <resolv.h>
82#include <stdio.h>
82#include <stdlib.h> 83#include <stdlib.h>
83#include <string.h> 84#include <string.h>
84#include <unistd.h> 85#include <unistd.h>
@@ -466,7 +467,7 @@ res_send(const u_char *buf, int buflen, u_char *ans, int anssiz)
466 /* 467 /*
467 * Receive length & response 468 * Receive length & response
468 */ 469 */
469read_len: 470 read_len:
470 cp = ans; 471 cp = ans;
471 len = INT16SZ; 472 len = INT16SZ;
472 while ((n = read(s, (char *)cp, (int)len)) > 0) { 473 while ((n = read(s, (char *)cp, (int)len)) > 0) {
@@ -553,8 +554,8 @@ read_len:
553 /* 554 /*
554 * Use datagrams. 555 * Use datagrams.
555 */ 556 */
556 struct timeval timeout; 557 struct pollfd pfd;
557 fd_set *dsmaskp; 558 int timeout;
558 struct sockaddr_storage from; 559 struct sockaddr_storage from;
559 socklen_t fromlen; 560 socklen_t fromlen;
560 561
@@ -594,7 +595,7 @@ read_len:
594 * ICMP port unreachable message to be returned. 595 * ICMP port unreachable message to be returned.
595 * If our datagram socket is "connected" to the 596 * If our datagram socket is "connected" to the
596 * server, we get an ECONNREFUSED error on the next 597 * server, we get an ECONNREFUSED error on the next
597 * socket operation, and select returns if the 598 * socket operation, and poll returns if the
598 * error message is received. We can thus detect 599 * error message is received. We can thus detect
599 * the absence of a nameserver without timing out. 600 * the absence of a nameserver without timing out.
600 * If we have sent queries to at least two servers, 601 * If we have sent queries to at least two servers,
@@ -676,27 +677,19 @@ read_len:
676 /* 677 /*
677 * Wait for reply 678 * Wait for reply
678 */ 679 */
679 timeout.tv_sec = (_resp->retrans << try); 680 timeout = 1000 * (_resp->retrans << try);
680 if (try > 0) 681 if (try > 0)
681 timeout.tv_sec /= _resp->nscount; 682 timeout /= _resp->nscount;
682 if ((long) timeout.tv_sec <= 0) 683 if (timeout < 1000)
683 timeout.tv_sec = 1; 684 timeout = 1000;
684 timeout.tv_usec = 0;
685 wait: 685 wait:
686 dsmaskp = (fd_set *)calloc(howmany(s+1, NFDBITS), 686 pfd.fd = s;
687 sizeof(fd_mask)); 687 pfd.events = POLLIN;
688 if (dsmaskp == NULL) { 688 n = poll(&pfd, 1, timeout);
689 res_close();
690 goto next_ns;
691 }
692 FD_SET(s, dsmaskp);
693 n = select(s+1, dsmaskp, (fd_set *)NULL,
694 (fd_set *)NULL, &timeout);
695 free(dsmaskp);
696 if (n < 0) { 689 if (n < 0) {
697 if (errno == EINTR) 690 if (errno == EINTR)
698 goto wait; 691 goto wait;
699 Perror(stderr, "select", errno); 692 Perror(stderr, "poll", errno);
700 res_close(); 693 res_close();
701 goto next_ns; 694 goto next_ns;
702 } 695 }