netdb: resolv.conf logic is functional

This commit is contained in:
Gregory Nutt 2016-01-14 15:12:42 -06:00
parent 1a8531c951
commit 300d34f029
6 changed files with 158 additions and 21 deletions

View File

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

View File

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

123
libc/netdb/lib_dnsbind.c Normal file
View File

@ -0,0 +1,123 @@
/****************************************************************************
* libc/netdb/lib_dnsclien.c
*
* Copyright (C) 2007, 2009, 2012, 2014-2016 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* 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 <nuttx/config.h>
#include <sys/time.h>
#include <unistd.h>
#include <errno.h>
#include <debug.h>
#include <nuttx/net/dns.h>
#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;
}

View File

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

View File

@ -43,6 +43,8 @@
#include <errno.h>
#include <assert.h>
#include <arpa/inet.h>
#include "netdb/lib_dns.h"
/****************************************************************************

View File

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