libc/netdb: Make gethostbyaddr_r callable even without CONFIG_NETDB_HOSTFILE

and fix other minor issue

Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
Change-Id: I1c12440cfb7aef4394539e02a12aeb10088f236b
This commit is contained in:
Xiang Xiao 2020-03-29 18:31:45 +08:00 committed by patacongo
parent c85fe67ebc
commit a709c83b2e
4 changed files with 49 additions and 46 deletions

View File

@ -38,6 +38,7 @@ ifeq ($(CONFIG_LIBC_NETDB),y)
# Add the netdb C files to the build # Add the netdb C files to the build
CSRCS += lib_netdb.c lib_gethostbyname.c lib_gethostbynamer.c CSRCS += lib_netdb.c lib_gethostbyname.c lib_gethostbynamer.c
CSRCS += lib_gethostbyaddr.c lib_gethostbyaddrr.c
CSRCS += lib_getservbyname.c lib_getservbynamer.c CSRCS += lib_getservbyname.c lib_getservbynamer.c
CSRCS += lib_getservbyport.c lib_getservbyportr.c CSRCS += lib_getservbyport.c lib_getservbyportr.c
CSRCS += lib_gaistrerror.c lib_freeaddrinfo.c lib_getaddrinfo.c CSRCS += lib_gaistrerror.c lib_freeaddrinfo.c lib_getaddrinfo.c
@ -46,7 +47,7 @@ CSRCS += lib_getnameinfo.c
# Add host file support # Add host file support
ifeq ($(CONFIG_NETDB_HOSTFILE),y) ifeq ($(CONFIG_NETDB_HOSTFILE),y)
CSRCS += lib_gethostbyaddr.c lib_gethostbyaddrr.c lib_parsehostfile.c CSRCS += lib_parsehostfile.c
endif endif
# Add DNS lookup support # Add DNS lookup support

View File

@ -45,7 +45,7 @@
#include "libc.h" #include "libc.h"
#include "netdb/lib_netdb.h" #include "netdb/lib_netdb.h"
#ifdef CONFIG_NETDB_HOSTFILE #ifdef CONFIG_LIBC_NETDB
/**************************************************************************** /****************************************************************************
* Public Functions * Public Functions
@ -89,4 +89,4 @@ FAR struct hostent *gethostbyaddr(FAR const void *addr, socklen_t len, int type)
return ret == 0 ? &g_hostent : NULL; return ret == 0 ? &g_hostent : NULL;
} }
#endif /* CONFIG_NETDB_HOSTFILE */ #endif /* CONFIG_LIBC_NETDB */

View File

@ -51,7 +51,7 @@
#include "libc.h" #include "libc.h"
#include "netdb/lib_netdb.h" #include "netdb/lib_netdb.h"
#ifdef CONFIG_NETDB_HOSTFILE #ifdef CONFIG_LIBC_NETDB
/**************************************************************************** /****************************************************************************
* Private Type Definitions * Private Type Definitions
@ -86,7 +86,7 @@ struct hostent_info_s
* *
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_NET_LOOPBACK #if defined(CONFIG_NET_LOOPBACK) && defined(CONFIG_NET_IPv4)
static bool lib_lo_ipv4match(FAR const void *addr, socklen_t len, int type) static bool lib_lo_ipv4match(FAR const void *addr, socklen_t len, int type)
{ {
FAR struct in_addr *ipv4addr; FAR struct in_addr *ipv4addr;
@ -96,7 +96,7 @@ static bool lib_lo_ipv4match(FAR const void *addr, socklen_t len, int type)
ipv4addr = (FAR struct in_addr *)addr; ipv4addr = (FAR struct in_addr *)addr;
return net_ipv4addr_maskcmp(ipv4addr->s_addr, return net_ipv4addr_maskcmp(ipv4addr->s_addr,
g_lo_ipv4addr, g_lo_ipv4addr,
g_lo_ipv4addr); g_lo_ipv4mask);
} }
return false; return false;
@ -120,15 +120,17 @@ static bool lib_lo_ipv4match(FAR const void *addr, socklen_t len, int type)
* *
****************************************************************************/ ****************************************************************************/
#if (defined CONFIG_NET_LOOPBACK) && defined (CONFIG_NET_IPv6) #if defined(CONFIG_NET_LOOPBACK) && defined(CONFIG_NET_IPv6)
static bool lib_lo_ipv6match(FAR const void *addr, socklen_t len, int type) static bool lib_lo_ipv6match(FAR const void *addr, socklen_t len, int type)
{ {
FAR struct in_addr6 *ipv6addr; FAR struct in6_addr *ipv6addr;
if (type == AF_INET6 && len >= sizeof(struct in_addr6)) if (type == AF_INET6 && len >= sizeof(struct in6_addr))
{ {
ipv6addr = (FAR struct in_addr6 *)addr; ipv6addr = (FAR struct in6_addr *)addr;
return net_ipv6addr_cmp(ipv6addr->sin6_addr.s6_addr16, g_lo_ipv6addr); return net_ipv6addr_maskcmp(ipv6addr->s6_addr16,
g_lo_ipv6addr,
g_lo_ipv6mask);
} }
return false; return false;
@ -150,30 +152,26 @@ static bool lib_lo_ipv6match(FAR const void *addr, socklen_t len, int type)
* buf - Caller provided buffer to hold string data associated with the * buf - Caller provided buffer to hold string data associated with the
* host data. * host data.
* buflen - The size of the caller-provided buffer * buflen - The size of the caller-provided buffer
* h_errnop - There h_errno value returned in the event of a failure.
* *
* Returned Value: * Returned Value:
* Zero (OK) is returned on success, -1 (ERROR) is returned on a failure * 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.
* *
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_NET_LOOPBACK #ifdef CONFIG_NET_LOOPBACK
static int lib_localhost(FAR const void *addr, socklen_t len, int type, static int lib_localhost(FAR const void *addr, socklen_t len, int type,
FAR struct hostent *host, FAR char *buf, FAR struct hostent *host, FAR char *buf,
size_t buflen, int *h_errnop) size_t buflen)
{ {
FAR struct hostent_info_s *info; FAR struct hostent_info_s *info;
socklen_t addrlen; socklen_t addrlen;
FAR const uint8_t *src; FAR const uint8_t *src;
FAR char *dest; FAR char *dest;
bool match;
int herrnocode;
int namelen; int namelen;
memset(host, 0, sizeof(struct hostent)); memset(host, 0, sizeof(struct hostent));
memset(buf, 0, buflen);
#ifdef CONFIG_NET_IPv4
if (lib_lo_ipv4match(addr, len, type)) if (lib_lo_ipv4match(addr, len, type))
{ {
/* Setup to transfer the IPv4 address */ /* Setup to transfer the IPv4 address */
@ -181,24 +179,27 @@ static int lib_localhost(FAR const void *addr, socklen_t len, int type,
addrlen = sizeof(struct in_addr); addrlen = sizeof(struct in_addr);
src = (FAR uint8_t *)&g_lo_ipv4addr; src = (FAR uint8_t *)&g_lo_ipv4addr;
host->h_addrtype = AF_INET; host->h_addrtype = AF_INET;
goto out_copy;
} }
#endif
#ifdef CONFIG_NET_IPv6 #ifdef CONFIG_NET_IPv6
else if (lib_lo_ipv6match(addr, len, type)) if (lib_lo_ipv6match(addr, len, type))
{ {
/* Setup to transfer the IPv6 address */ /* Setup to transfer the IPv6 address */
addrlen = sizeof(struct in6_addr); addrlen = sizeof(struct in6_addr);
src = (FAR uint8_t *)&g_lo_ipv6addr; src = (FAR uint8_t *)&g_lo_ipv6addr;
host->h_addrtype = AF_INET6; host->h_addrtype = AF_INET6;
goto out_copy;
} }
#endif #endif
else
{
/* Return 1 meaning that we have no errors but no match either */ /* Return 1 meaning that we have no errors but no match either */
return 1; return 1;
}
out_copy:
/* Make sure that space remains to hold the hostent structure and /* Make sure that space remains to hold the hostent structure and
* the IP address. * the IP address.
*/ */
@ -212,6 +213,7 @@ static int lib_localhost(FAR const void *addr, socklen_t len, int type,
dest = info->hi_data; dest = info->hi_data;
buflen -= (sizeof(struct hostent_info_s) - 1); buflen -= (sizeof(struct hostent_info_s) - 1);
memset(info, 0, sizeof(struct hostent_info_s));
memcpy(dest, src, addrlen); memcpy(dest, src, addrlen);
info->hi_addrlist[0] = dest; info->hi_addrlist[0] = dest;
@ -224,24 +226,15 @@ static int lib_localhost(FAR const void *addr, socklen_t len, int type,
/* And copy localhost host name */ /* And copy localhost host name */
namelen = strlen(g_lo_hostname); namelen = strlen(g_lo_hostname);
if (addrlen + namelen + 1 > buflen) if (namelen + 1 > buflen)
{ {
herrnocode = ERANGE; return -ERANGE;
goto errorout_with_herrnocode;
} }
strncpy(dest, g_lo_hostname, buflen); strncpy(dest, g_lo_hostname, buflen);
host->h_name = dest; host->h_name = dest;
return 0; return 0;
errorout_with_herrnocode:
if (h_errnop)
{
*h_errnop = herrnocode;
}
return ERROR;
} }
#endif #endif
@ -267,6 +260,7 @@ errorout_with_herrnocode:
* *
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_NETDB_HOSTFILE
int lib_hostfile_lookup(FAR const void *addr, socklen_t len, int type, int lib_hostfile_lookup(FAR const void *addr, socklen_t len, int type,
FAR struct hostent *host, FAR char *buf, FAR struct hostent *host, FAR char *buf,
size_t buflen, int *h_errnop) size_t buflen, int *h_errnop)
@ -356,6 +350,7 @@ errorout_with_herrnocode:
return ERROR; return ERROR;
} }
#endif
/**************************************************************************** /****************************************************************************
* Public Functions * Public Functions
@ -407,7 +402,7 @@ int gethostbyaddr_r(FAR const void *addr, socklen_t len, int type,
#ifdef CONFIG_NET_LOOPBACK #ifdef CONFIG_NET_LOOPBACK
/* Check for the local loopback address */ /* Check for the local loopback address */
if (lib_localhost(addr, len, type, host, buf, buflen, h_errnop) == 0) if (lib_localhost(addr, len, type, host, buf, buflen) == 0)
{ {
/* Yes.. we are done */ /* Yes.. we are done */
@ -424,9 +419,23 @@ int gethostbyaddr_r(FAR const void *addr, socklen_t len, int type,
* 3. Search the hosts file for a match. * 3. Search the hosts file for a match.
*/ */
#ifdef CONFIG_NETDB_HOSTFILE
/* Search the hosts file for a match */ /* Search the hosts file for a match */
return lib_hostfile_lookup(addr, len, type, host, buf, buflen, h_errnop); return lib_hostfile_lookup(addr, len, type, host, buf, buflen, h_errnop);
#else
/* The host file file is not supported. The host address mapping was not
* found from any lookup heuristic
*/
if (h_errnop)
{
*h_errnop = HOST_NOT_FOUND;
}
return ERROR;
#endif
} }
#endif /* CONFIG_NETDB_HOSTFILE */ #endif /* CONFIG_LIBC_NETDB */

View File

@ -95,12 +95,6 @@ int getnameinfo(FAR const struct sockaddr *addr, socklen_t addrlen,
if (!(flags & NI_NUMERICHOST)) if (!(flags & NI_NUMERICHOST))
{ {
#ifndef CONFIG_NETDB_HOSTFILE
/* Fall-back to numeric for the host name. */
flags |= NI_NUMERICHOST;
UNUSED(saddr_len);
#else
struct hostent hostent; struct hostent hostent;
int h_errno; int h_errno;
@ -161,7 +155,6 @@ int getnameinfo(FAR const struct sockaddr *addr, socklen_t addrlen,
flags |= NI_NUMERICHOST; flags |= NI_NUMERICHOST;
} }
#endif /* CONFIG_NETDB_HOSTFILE */
} }
if (flags & NI_NUMERICHOST) if (flags & NI_NUMERICHOST)
@ -184,8 +177,8 @@ int getnameinfo(FAR const struct sockaddr *addr, socklen_t addrlen,
struct servent servent; struct servent servent;
struct servent *result; struct servent *result;
ret = getservbyport_r(port, flags & NI_DGRAM ? "udp" : NULL, &servent, ret = getservbyport_r(port, flags & NI_DGRAM ? "udp" : "tcp",
serv, servlen, &result); &servent, serv, servlen, &result);
if (ret == OK) if (ret == OK)
{ {