diff --git a/ChangeLog b/ChangeLog index d507b518941..82532d05716 100755 --- a/ChangeLog +++ b/ChangeLog @@ -11303,3 +11303,5 @@ * tools/mkdeps.c: Extended/fixed support for --winpath option. Dependencies now work under Cygwin with a native Windows toolchain (2016-01-10). + * libc/netdb: Add support for the use of a DNS resolver file like + /etc/resolv.conf (2016-01-14). diff --git a/libc/Kconfig b/libc/Kconfig index a9246777b9a..3f8e88b0170 100644 --- a/libc/Kconfig +++ b/libc/Kconfig @@ -592,9 +592,26 @@ config NETDB_DNSCLIENT_MAXRESPONSE can be received by the DNS resolver. The default is 96 but may need to be larger on enterprise networks (perhaps 176). + +config NETDB_RESOLVCONF + bool "DNS resolver file support" + default n + depends on FS_READABLE + ---help--- + Enable DNS server look ups in resolver file like /etc/resolv.conf. + +if NETDB_RESOLVCONF + +config NETDB_RESOLVCONF_PATH + string "Path to host configuration file" + default "/etc/resolv.conf" + +endif # NETDB_RESOLVCONF + choice prompt "DNS server address type" default NETDB_DNSSERVER_NOADDR + depends on !NETDB_RESOLVCONF config NETDB_DNSSERVER_NOADDR bool "No default DNS server address" @@ -700,21 +717,6 @@ config NETDB_DNSSERVER_IPv6ADDR_8 of the 8-values. The default for all eight values is fc00::1. endif # NETDB_DNSSERVER_IPv6 - -config NETDB_RESOLVCONF - bool "DNS server file support" - default n - depends on FS_READABLE - ---help--- - Enable DNS server look ups in resolver file. - -if NETDB_RESOLVCONF - -config NETDB_RESOLVCONF_PATH - string "Path to host configuration file" - default "/etc/resolv.conf" - -endif # NETDB_RESOLVCONF endif # NETDB_DNSCLIENT comment "Non-standard Library Support" diff --git a/libc/netdb/lib_dnsbind.c b/libc/netdb/lib_dnsbind.c new file mode 100644 index 00000000000..c7eae42953a --- /dev/null +++ b/libc/netdb/lib_dnsbind.c @@ -0,0 +1,123 @@ +/**************************************************************************** + * libc/netdb/lib_dnsclien.c + * + * Copyright (C) 2007, 2009, 2012, 2014-2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include + +#include "netdb/lib_dns.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#if CONFIG_NSOCKET_DESCRIPTORS < 1 +# error CONFIG_NSOCKET_DESCRIPTORS must be greater than zero +#endif + +#if CONFIG_NET_SOCKOPTS < 1 +# error CONFIG_NET_SOCKOPTS required by this logic +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: dns_bind + * + * Description: + * Initialize the DNS resolver and return a socket bound to the DNS name + * server. The name server was previously selected via dns_server(). + * + * Input Parameters: + * None + * + * Returned Value: + * On success, the bound, non-negative socket descriptor is returned. A + * negated errno value is returned on any failure. + * + ****************************************************************************/ + +int dns_bind(void) +{ + struct timeval tv; + int errcode; + int sd; + int ret; + + /* Has the DNS client been properly initialized? */ + + if (!dns_initialize()) + { + ndbg("ERROR: DNS client has not been initialized\n"); + return -EDESTADDRREQ; + } + + /* Create a new socket */ + + sd = socket(PF_INET, SOCK_DGRAM, 0); + if (sd < 0) + { + errcode = get_errno(); + ndbg("ERROR: socket() failed: %d\n", errcode); + return -errcode; + } + + /* Set up a receive timeout */ + + tv.tv_sec = 30; + tv.tv_usec = 0; + + ret = setsockopt(sd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(struct timeval)); + if (ret < 0) + { + errcode = get_errno(); + ndbg("ERROR: setsockopt() failed: %d\n", errcode); + close(sd); + return -errcode; + } + + return sd; +} diff --git a/libc/netdb/lib_dnsforeach.c b/libc/netdb/lib_dnsforeach.c index 27ceed99d73..63ae1024e2b 100644 --- a/libc/netdb/lib_dnsforeach.c +++ b/libc/netdb/lib_dnsforeach.c @@ -92,6 +92,7 @@ int dns_foreach_nameserver(dns_callback_t callback, FAR void *arg) union dns_server_u u; FAR FILE *stream; char line[DNS_MAX_LINE]; + FAR char *addrstr; FAR char *ptr; int keylen; int ret; @@ -117,14 +118,21 @@ int dns_foreach_nameserver(dns_callback_t callback, FAR void *arg) /* Skip over the 'nameserver' keyword */ ptr = find_spaces(ptr); - ptr = skip_spaces(ptr); - if (*ptr == '\0') + addrstr = skip_spaces(ptr); + if (*addrstr == '\0') { ndbg("ERROR: Missing address in %s record\n", CONFIG_NETDB_RESOLVCONF_PATH); continue; } + /* Make sure that the address string is NUL terminated and + * not followed by garbage. + */ + + ptr = find_spaces(addrstr); + *ptr = '\0'; + /* Convert the address string to a binary representation */ /* REVISIT: We really need a customizable port number. The * OpenBSD version supports a [host]:port syntax. When a @@ -138,7 +146,7 @@ int dns_foreach_nameserver(dns_callback_t callback, FAR void *arg) #ifdef CONFIG_NET_IPv4 /* Try to convert the IPv4 address */ - ret = inet_pton(AF_INET, ptr, &u.ipv4.sin_addr); + ret = inet_pton(AF_INET, addrstr, &u.ipv4.sin_addr); /* The inet_pton() function returns 1 if the conversion succeeds */ @@ -157,7 +165,7 @@ int dns_foreach_nameserver(dns_callback_t callback, FAR void *arg) { /* Try to convert the IPv6 address */ - ret = inet_pton(AF_INET6, ptr, &u.ipv6.sin6_addr); + ret = inet_pton(AF_INET6, addrstr, &u.ipv6.sin6_addr); /* The inet_pton() function returns 1 if the conversion * succeeds. @@ -175,7 +183,7 @@ int dns_foreach_nameserver(dns_callback_t callback, FAR void *arg) else #endif { - ndbg("ERROR: Unrecognized address: %s\n", ptr) + ndbg("ERROR: Unrecognized address: %s\n", addrstr) ret = OK; } #ifdef CONFIG_NET_IPv6 diff --git a/libc/netdb/lib_dnsinit.c b/libc/netdb/lib_dnsinit.c index ddb138d8960..04b490a1675 100644 --- a/libc/netdb/lib_dnsinit.c +++ b/libc/netdb/lib_dnsinit.c @@ -43,6 +43,8 @@ #include #include +#include + #include "netdb/lib_dns.h" /**************************************************************************** diff --git a/libc/netdb/lib_dnsquery.c b/libc/netdb/lib_dnsquery.c index 5b1861e88b7..283b3ae8fe4 100644 --- a/libc/netdb/lib_dnsquery.c +++ b/libc/netdb/lib_dnsquery.c @@ -650,7 +650,7 @@ int dns_query(int sd, FAR const char *hostname, FAR struct sockaddr *addr, /* Set up the query info structure */ query.sd = sd; - query.result = OK; + query.result = -EADDRNOTAVAIL; query.hostname = hostname; query.addr = addr; query.addrlen = addrlen;