|
@@ -530,12 +530,6 @@ int form_query(int id, const char *name, int type, unsigned char *packet,
|
|
|
|
|
|
#ifdef L_dnslookup
|
|
|
|
|
|
-int dns_caught_signal = 0;
|
|
|
-void dns_catch_signal(int signo)
|
|
|
-{
|
|
|
- dns_caught_signal = 1;
|
|
|
-}
|
|
|
-
|
|
|
int dns_lookup(const char *name, int type, int nscount, char **nsip,
|
|
|
unsigned char **outpacket, struct resolv_answer *a)
|
|
|
{
|
|
@@ -546,8 +540,8 @@ int dns_lookup(const char *name, int type, int nscount, char **nsip,
|
|
|
#ifdef __UCLIBC_HAS_IPV6__
|
|
|
struct sockaddr_in6 sa6;
|
|
|
#endif
|
|
|
- int oldalarm;
|
|
|
- __sighandler_t oldhandler;
|
|
|
+ struct timeval tv;
|
|
|
+ fd_set fds;
|
|
|
struct resolv_header h;
|
|
|
struct resolv_question q;
|
|
|
int retries = 0;
|
|
@@ -652,23 +646,19 @@ int dns_lookup(const char *name, int type, int nscount, char **nsip,
|
|
|
|
|
|
send(fd, packet, len, 0);
|
|
|
|
|
|
- dns_caught_signal = 0;
|
|
|
- oldalarm = alarm(REPLY_TIMEOUT);
|
|
|
- oldhandler = signal(SIGALRM, dns_catch_signal);
|
|
|
-
|
|
|
- i = recv(fd, packet, PACKETSZ, 0);
|
|
|
+ FD_ZERO(&fds);
|
|
|
+ FD_SET(fd, &fds);
|
|
|
+ tv.tv_sec = REPLY_TIMEOUT;
|
|
|
+ tv.tv_usec = 0;
|
|
|
+ if (select(fd + 1, &fds, NULL, NULL, &tv) <= 0) {
|
|
|
+ DPRINTF("Timeout\n");
|
|
|
|
|
|
- alarm(0);
|
|
|
- signal(SIGALRM, oldhandler);
|
|
|
- alarm(oldalarm);
|
|
|
-
|
|
|
- DPRINTF("Timeout=%d, len=%d\n", dns_caught_signal, i);
|
|
|
-
|
|
|
- if (dns_caught_signal)
|
|
|
-
|
|
|
- to next nameserver on queue */
|
|
|
+
|
|
|
+ * to next nameserver on queue */
|
|
|
goto again;
|
|
|
+ }
|
|
|
|
|
|
+ i = recv(fd, packet, 512, 0);
|
|
|
if (i < HFIXEDSZ)
|
|
|
|
|
|
goto again;
|