gethostbyname() will not attempt a DNS lookup if so enabled
This commit is contained in:
parent
4102470bdd
commit
7dec298ef3
@ -206,7 +206,11 @@ int dns_whois(FAR const char *name, FAR struct sockaddr_in *addr);
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT_IPv6
|
||||
int dns_gethostip(FAR const char *hostname, FAR struct in6_addr *ipaddr);
|
||||
#else
|
||||
int dns_gethostip(FAR const char *hostname, FAR in_addr_t *ipaddr);
|
||||
#endif
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
|
@ -513,6 +513,9 @@ menuconfig NETDB_HOSTFILE
|
||||
default n
|
||||
depends on FS_READABLE
|
||||
select LIBC_NETDB
|
||||
---help---
|
||||
Enable network host table look ups via gethostbyname() and
|
||||
gethostbyaddr().
|
||||
|
||||
if NETDB_HOSTFILE
|
||||
|
||||
@ -536,7 +539,8 @@ config NETDB_DNSCLIENT
|
||||
depends on NET && NET_UDP
|
||||
select LIBC_NETDB
|
||||
---help---
|
||||
Enable support for the name resolution.
|
||||
Enable support for the name resolution; Enable network host
|
||||
resolution via gethostbyname().
|
||||
|
||||
if NETDB_DNSCLIENT
|
||||
|
||||
|
@ -219,6 +219,7 @@ float lib_sqrtapprox(float x);
|
||||
/* Defined in lib_parsehostfile.c */
|
||||
|
||||
#ifdef CONFIG_NETDB_HOSTFILE
|
||||
struct hostent;
|
||||
ssize_t lib_parse_hostfile(FAR FILE *stream, FAR struct hostent *host,
|
||||
FAR char *buf, size_t buflen);
|
||||
#endif
|
||||
|
@ -44,13 +44,6 @@ ifeq ($(CONFIG_NET_ROUTE),y)
|
||||
CSRCS += lib_addroute.c lib_delroute.c
|
||||
endif
|
||||
|
||||
# netdb support
|
||||
|
||||
ifeq ($(CONFIG_NETDB_HOSTFILE),y)
|
||||
CSRCS += lib_netdb.c lib_gethostbyname.c lib_gethostbynamer.c
|
||||
CSRCS += lib_gethostbyaddr.c lib_gethostbyaddrr.c lib_parsehostfile.c
|
||||
endif
|
||||
|
||||
# Add the net directory to the build
|
||||
|
||||
DEPPATH += --dep-path net
|
||||
|
@ -37,17 +37,22 @@ ifeq ($(CONFIG_LIBC_NETDB),y)
|
||||
|
||||
# Add the netdb C files to the build
|
||||
|
||||
CSRCS += lib_netdb.c
|
||||
|
||||
# Add host file support
|
||||
|
||||
ifeq ($(CONFIG_NETDB_HOSTFILE),y)
|
||||
CSRCS += lib_netdb.c lib_gethostbyname.c lib_gethostbynamer.c
|
||||
CSRCS += lib_gethostbyaddr.c lib_gethostbyaddrr.c lib_parsehostfile.c
|
||||
CSRCS += lib_gethostbyname.c lib_gethostbynamer.c lib_gethostbyaddr.c
|
||||
CSRCS += lib_gethostbyaddrr.c lib_parsehostfile.c
|
||||
endif
|
||||
|
||||
# Add DNS support
|
||||
# Add DNS lookup support
|
||||
|
||||
ifeq ($(CONFIG_NETDB_DNSCLIENT),y)
|
||||
CSRCS = dns_resolver.c dns_socket.c dns_gethostip.c
|
||||
ifneq ($(CONFIG_NETDB_HOSTFILE),y)
|
||||
CSRCS += lib_gethostbyname.c lib_gethostbynamer.c
|
||||
endif
|
||||
CSRCS += dns_resolver.c dns_socket.c dns_gethostip.c
|
||||
endif
|
||||
|
||||
# Add the net directory to the build
|
||||
|
@ -75,7 +75,11 @@
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT_IPv6
|
||||
int dns_gethostip(FAR const char *hostname, FAR struct in6_addr *ipaddr)
|
||||
#else
|
||||
int dns_gethostip(FAR const char *hostname, FAR in_addr_t *ipaddr)
|
||||
#endif
|
||||
{
|
||||
int sockfd = -1;
|
||||
int ret=ERROR;
|
||||
|
@ -45,7 +45,7 @@
|
||||
#include "lib_internal.h"
|
||||
#include "netdb/lib_netdb.h"
|
||||
|
||||
#ifdef CONFIG_NETDB_HOSTFILE
|
||||
#ifdef CONFIG_LIBC_NETDB
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
@ -89,4 +89,4 @@ FAR struct hostent *gethostbyname(FAR const char *name)
|
||||
return ret == 0 ? &g_hostent : NULL;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NETDB_HOSTFILE */
|
||||
#endif /* CONFIG_LIBC_NETDB */
|
||||
|
@ -47,9 +47,11 @@
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <nuttx/net/dnsclient.h>
|
||||
|
||||
#include "lib_internal.h"
|
||||
|
||||
#ifdef CONFIG_NETDB_HOSTFILE
|
||||
#ifdef CONFIG_LIBC_NETDB
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
@ -189,71 +191,120 @@ static int lib_numeric_address(FAR const char *name, FAR struct hostent *host,
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: gethostname_r
|
||||
* Name: lib_dns_lookup
|
||||
*
|
||||
* Description:
|
||||
* The gethostbyname_r() function returns a structure of type hostent for
|
||||
* the given host name. Here name is either a hostname, or an IPv4 address
|
||||
* in standard dot notation (as for inet_addr(3)), or an IPv6 address in
|
||||
* colon (and possibly dot) notation.
|
||||
* Try to look-up the host name from the DNS server
|
||||
*
|
||||
* If name is an IPv4 or IPv6 address, no lookup is performed and
|
||||
* gethostbyname_r() simply copies name into the h_name field
|
||||
* and its struct in_addr equivalent into the h_addr_list[0] field of the
|
||||
* returned hostent structure.
|
||||
*
|
||||
* gethostname_r() is *not* POSIX but is similar to a Glibc extension and is
|
||||
* used internally by NuttX to implement the POSIX gethostname().
|
||||
*
|
||||
* Input Parameters:
|
||||
* Input paramters:
|
||||
* name - The name of the host to find.
|
||||
* host - Caller provided location to return the host data.
|
||||
* buf - Caller provided buffer to hold string data associated with the
|
||||
* host data.
|
||||
* buflen - The size of the caller-provided buffer
|
||||
* h_errnop - There h_errno value returned in the event of a failure.
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) is returned on success, -1 (ERROR) is returned on a failure
|
||||
* with the returned h_errno value provided the reason for the failure.
|
||||
* Zero (0) is returned if the DNS lookup was successful.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int gethostbyname_r(FAR const char *name, FAR struct hostent *host,
|
||||
FAR char *buf, size_t buflen, int *h_errnop)
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT
|
||||
static int lib_dns_lookup(FAR const char *name, FAR struct hostent *host,
|
||||
FAR char *buf, size_t buflen)
|
||||
{
|
||||
FAR struct hostent_info_s *info;
|
||||
FAR char *ptr;
|
||||
size_t addrlen;
|
||||
int addrtype;
|
||||
int namelen;
|
||||
int ret;
|
||||
|
||||
/* Verify that we have a buffer big enough to get started (it still may not
|
||||
* be big enough).
|
||||
*/
|
||||
|
||||
if (buflen <= sizeof(struct hostent_info_s))
|
||||
{
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
/* Initialize buffers */
|
||||
|
||||
info = (FAR struct hostent_info_s *)buf;
|
||||
ptr = info->hi_data;
|
||||
buflen -= (sizeof(struct hostent_info_s) - 1);
|
||||
|
||||
memset(host, 0, sizeof(struct hostent));
|
||||
memset(info, 0, sizeof(struct hostent_info_s));
|
||||
|
||||
/* Try to get the host address using the DNS name server */
|
||||
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT_IPv6
|
||||
addrlen = sizeof(struct in6_addr);
|
||||
addrtype = AF_INET6;
|
||||
ret = dns_gethostip(name, (FAR struct in6_addr *)ptr);
|
||||
#else
|
||||
addrlen = sizeof(struct in6_addr);
|
||||
addrtype = AF_INET;
|
||||
ret = dns_gethostip(name, (FAR in_addr_t *)ptr);
|
||||
#endif
|
||||
|
||||
/* Was the DNS lookup successful? */
|
||||
|
||||
if (ret >= 0)
|
||||
{
|
||||
/* Yes.. Return the address that we obtained from the DNS name server. */
|
||||
|
||||
info->hi_addrlist[0] = ptr;
|
||||
host->h_addr_list = info->hi_addrlist;
|
||||
host->h_addrtype = addrtype;
|
||||
host->h_length = addrlen;
|
||||
|
||||
ptr += addrlen;
|
||||
buflen -= addrlen;
|
||||
|
||||
/* And copy name */
|
||||
|
||||
namelen = strlen(name);
|
||||
if (addrlen + namelen + 1 > buflen)
|
||||
{
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
strncpy(ptr, name, buflen);
|
||||
return OK;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif /* CONFIG_NETDB_DNSCLIENT */
|
||||
|
||||
/****************************************************************************
|
||||
* Name: lib_hostfile_lookup
|
||||
*
|
||||
* Description:
|
||||
* Try to look-up the host name from the network host file
|
||||
*
|
||||
* Input paramters:
|
||||
* name - The name of the host to find.
|
||||
* host - Caller provided location to return the host data.
|
||||
* buf - Caller provided buffer to hold string data associated with the
|
||||
* host data.
|
||||
* buflen - The size of the caller-provided buffer
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (0) is returned if the DNS lookup was successful.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_NETDB_HOSTFILE
|
||||
static int lib_hostfile_lookup(FAR const char *name, FAR struct hostent *host,
|
||||
FAR char *buf, size_t buflen, int *h_errnop)
|
||||
{
|
||||
FAR FILE *stream;
|
||||
int herrnocode;
|
||||
int nread;
|
||||
|
||||
DEBUGASSERT(name != NULL && host != NULL && buf != NULL);
|
||||
|
||||
/* Make sure that the h_errno has a non-error code */
|
||||
|
||||
if (h_errnop)
|
||||
{
|
||||
*h_errnop = 0;
|
||||
}
|
||||
|
||||
/* Check for a numeric hostname */
|
||||
|
||||
if (lib_numeric_address(name, host, buf, buflen) == 0)
|
||||
{
|
||||
/* Yes.. we are done */
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/* Try to find the name in the HOSTALIASES environment variable */
|
||||
/* REVISIT: Not implemented */
|
||||
|
||||
/* Try to get the host address using the DNS name server */
|
||||
/* REVISIT: Not implemented */
|
||||
|
||||
/* Search the hosts file for a match */
|
||||
|
||||
stream = fopen(CONFIG_NETDB_HOSTCONF_PATH, "r");
|
||||
@ -352,5 +403,98 @@ errorout_with_herrnocode:
|
||||
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NETDB_HOSTFILE */
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: gethostname_r
|
||||
*
|
||||
* Description:
|
||||
* The gethostbyname_r() function returns a structure of type hostent for
|
||||
* the given host name. Here name is either a hostname, or an IPv4 address
|
||||
* in standard dot notation (as for inet_addr(3)), or an IPv6 address in
|
||||
* colon (and possibly dot) notation.
|
||||
*
|
||||
* If name is an IPv4 or IPv6 address, no lookup is performed and
|
||||
* gethostbyname_r() simply copies name into the h_name field
|
||||
* and its struct in_addr equivalent into the h_addr_list[0] field of the
|
||||
* returned hostent structure.
|
||||
*
|
||||
* gethostname_r() is *not* POSIX but is similar to a Glibc extension and is
|
||||
* used internally by NuttX to implement the POSIX gethostname().
|
||||
*
|
||||
* Input Parameters:
|
||||
* name - The name of the host to find.
|
||||
* host - Caller provided location to return the host data.
|
||||
* buf - Caller provided buffer to hold string data associated with the
|
||||
* host data.
|
||||
* buflen - The size of the caller-provided buffer
|
||||
* h_errnop - There h_errno value returned in the event of a failure.
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero (OK) is returned on success, -1 (ERROR) is returned on a failure
|
||||
* with the returned h_errno value provided the reason for the failure.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int gethostbyname_r(FAR const char *name, FAR struct hostent *host,
|
||||
FAR char *buf, size_t buflen, int *h_errnop)
|
||||
{
|
||||
int ret;
|
||||
|
||||
DEBUGASSERT(name != NULL && host != NULL && buf != NULL);
|
||||
|
||||
/* Make sure that the h_errno has a non-error code */
|
||||
|
||||
if (h_errnop)
|
||||
{
|
||||
*h_errnop = 0;
|
||||
}
|
||||
|
||||
/* Check for a numeric hostname */
|
||||
|
||||
if (lib_numeric_address(name, host, buf, buflen) == 0)
|
||||
{
|
||||
/* Yes.. we are done */
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/* Try to find the name in the HOSTALIASES environment variable */
|
||||
/* REVISIT: Not implemented */
|
||||
|
||||
#ifdef CONFIG_NETDB_DNSCLIENT
|
||||
/* Try to get the host address using the DNS name server */
|
||||
|
||||
ret = lib_dns_lookup(name, host, buf, buflen);
|
||||
if (ret >= 0)
|
||||
{
|
||||
/* Successful DNS lookup! */
|
||||
|
||||
return OK;
|
||||
}
|
||||
#endif /* CONFIG_NETDB_DNSCLIENT */
|
||||
|
||||
#ifdef CONFIG_NETDB_HOSTFILE
|
||||
/* Search the hosts file for a match */
|
||||
|
||||
return lib_hostfile_lookup(name, host, buf, buflen, h_errnop);
|
||||
|
||||
#else
|
||||
/* The host file file is not supported. The host name mapping was not
|
||||
* found from any lookup heuristic
|
||||
*/
|
||||
|
||||
if (h_errnop)
|
||||
{
|
||||
*h_errnop = HOST_NOT_FOUND;
|
||||
}
|
||||
|
||||
return ERROR;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* CONFIG_LIBC_NETDB */
|
||||
|
@ -43,7 +43,7 @@
|
||||
|
||||
#include "netdb/lib_netdb.h"
|
||||
|
||||
#ifdef CONFIG_NETDB_HOSTFILE
|
||||
#ifdef CONFIG_LIBC_NETDB
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
@ -56,4 +56,4 @@ char g_hostbuffer[CONFIG_NETDB_BUFSIZE];
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
#endif /* CONFIG_NETDB_HOSTFILE */
|
||||
#endif /* CONFIG_LIBC_NETDB */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/****************************************************************************
|
||||
* libc/netdb/lib_netdb.h
|
||||
* libc/net/lib_netdb.h
|
||||
*
|
||||
* Copyright (C) 2015 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
@ -33,8 +33,8 @@
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __LIBC_NET_LIB_NETDB_H
|
||||
#define __LIBC_NET_LIB_NETDB_H
|
||||
#ifndef __LIBC_NETDB_LIB_NETDB_H
|
||||
#define __LIBC_NETDB_LIB_NETDB_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
@ -44,7 +44,7 @@
|
||||
|
||||
#include <netdb.h>
|
||||
|
||||
#ifdef CONFIG_NETDB_HOSTFILE
|
||||
#ifdef CONFIG_LIBC_NETDB
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
@ -94,5 +94,5 @@ EXTERN char g_hostbuffer[CONFIG_NETDB_BUFSIZE];
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __INCLUDE_NETDB_H */
|
||||
#endif /* __LIBC_NET_LIB_NETDB_H */
|
||||
#endif /* CONFIG_LIBC_NETDB */
|
||||
#endif /* __LIBC_NETDB_LIB_NETDB_H */
|
||||
|
Loading…
Reference in New Issue
Block a user