From 255e1fe83691a2c5a3328bcec13e2bce0a140696 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sat, 8 Sep 2007 21:54:43 +0000 Subject: Added receive timeout via setsockopt(SO_RCVTIMEO) git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@336 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/netutils/resolv/resolv.c | 43 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) (limited to 'nuttx/netutils/resolv/resolv.c') diff --git a/nuttx/netutils/resolv/resolv.c b/nuttx/netutils/resolv/resolv.c index b6c861e51..b318e551e 100644 --- a/nuttx/netutils/resolv/resolv.c +++ b/nuttx/netutils/resolv/resolv.c @@ -52,6 +52,9 @@ #include #include +#include +#include +#include #include #include @@ -341,10 +344,29 @@ int resolv_query(const char *name, struct sockaddr_in6 *addr) int resolv_query(const char *name, struct sockaddr_in *addr) #endif { - int ret = send_query(name, addr); - if (ret == 0) + int retries; + int ret; + + // Loop while receive timeout errors occur and there are remaining retries + for (retries = 0; retries < 3; retries++) { + if (send_query(name, addr) < 0) + { + return ERROR; + } + ret = recv_response(addr); + if (ret >= 0) + { + /* Response received successfully */ + return OK; + } + + else if (*get_errno_ptr() != EAGAIN) + { + /* Some failure other than receive timeout occurred */ + return ERROR; + } } return ret; } @@ -352,9 +374,9 @@ int resolv_query(const char *name, struct sockaddr_in *addr) /* Obtain the currently configured DNS server. */ #ifdef CONFIG_NET_IPv6 -void resolv_getserver(const struct sockaddr_in6 *dnsserver) +void resolv_getserver(struct sockaddr_in6 *dnsserver) #else -void resolv_getserver(const struct sockaddr_in *dnsserver) +void resolv_getserver(struct sockaddr_in *dnsserver) #endif { memcpy(dnsserver, &g_dnsserver, ADDRLEN); @@ -375,10 +397,23 @@ void resolv_conf(const struct sockaddr_in *dnsserver) int resolv_init(void) { + struct timeval tv; g_sockfd = socket(PF_INET, SOCK_DGRAM, 0); if (g_sockfd < 0) { return ERROR; } + + /* Set up a receive timeout */ + + tv.tv_sec = 30; + tv.tv_usec = 0; + if (setsockopt(g_sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)) < 0) + { + close(g_sockfd); + g_sockfd = -1; + return ERROR; + } + return OK; } -- cgit v1.2.3