netdb: resolv.conf logic is functional
This commit is contained in:
parent
1a8531c951
commit
300d34f029
@ -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).
|
||||
|
32
libc/Kconfig
32
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"
|
||||
|
123
libc/netdb/lib_dnsbind.c
Normal file
123
libc/netdb/lib_dnsbind.c
Normal 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;
|
||||
}
|
@ -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
|
||||
|
@ -43,6 +43,8 @@
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "netdb/lib_dns.h"
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user