netdb: Regard hosts file prior to DNS when resolving
- Linux: What inside /etc/hosts comes first. - NuttX: Even if we write a domain in /etc/hosts, we still use DNS result instead of hosts lines. This patch change this behavior. Signed-off-by: Zhe Weng <wengzhe@xiaomi.com>
This commit is contained in:
parent
3930c70954
commit
e7043828a7
@ -576,10 +576,9 @@ static int lib_dns_lookup(FAR const char *name, FAR struct hostent_s *host,
|
|||||||
#ifdef CONFIG_NETDB_HOSTFILE
|
#ifdef CONFIG_NETDB_HOSTFILE
|
||||||
static int lib_hostfile_lookup(FAR const char *name,
|
static int lib_hostfile_lookup(FAR const char *name,
|
||||||
FAR struct hostent_s *host, FAR char *buf,
|
FAR struct hostent_s *host, FAR char *buf,
|
||||||
size_t buflen, FAR int *h_errnop)
|
size_t buflen)
|
||||||
{
|
{
|
||||||
FAR FILE *stream;
|
FAR FILE *stream;
|
||||||
int herrnocode;
|
|
||||||
int nread;
|
int nread;
|
||||||
|
|
||||||
/* Search the hosts file for a match */
|
/* Search the hosts file for a match */
|
||||||
@ -591,10 +590,8 @@ static int lib_hostfile_lookup(FAR const char *name,
|
|||||||
|
|
||||||
nerr("ERROR: Failed to open the hosts file %s: %d\n",
|
nerr("ERROR: Failed to open the hosts file %s: %d\n",
|
||||||
CONFIG_NETDB_HOSTCONF_PATH, errcode);
|
CONFIG_NETDB_HOSTCONF_PATH, errcode);
|
||||||
UNUSED(errcode);
|
|
||||||
|
|
||||||
herrnocode = NO_RECOVERY;
|
return errcode;
|
||||||
goto errorout_with_herrnocode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Loop reading entries from the hosts file until a match is found or
|
/* Loop reading entries from the hosts file until a match is found or
|
||||||
@ -620,8 +617,8 @@ static int lib_hostfile_lookup(FAR const char *name,
|
|||||||
}
|
}
|
||||||
else if (nread != -EAGAIN)
|
else if (nread != -EAGAIN)
|
||||||
{
|
{
|
||||||
herrnocode = NO_RECOVERY;
|
fclose(stream);
|
||||||
goto errorout_with_stream;
|
return nread;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (nread > 0)
|
else if (nread > 0)
|
||||||
@ -664,21 +661,11 @@ static int lib_hostfile_lookup(FAR const char *name,
|
|||||||
while (nread != 0);
|
while (nread != 0);
|
||||||
|
|
||||||
/* We get here when the end of the hosts file is encountered without
|
/* We get here when the end of the hosts file is encountered without
|
||||||
* finding the hostname.
|
* finding the hostname. Return 1 meaning that we have no errors but
|
||||||
|
* no match either.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
herrnocode = HOST_NOT_FOUND;
|
return 1;
|
||||||
|
|
||||||
errorout_with_stream:
|
|
||||||
fclose(stream);
|
|
||||||
|
|
||||||
errorout_with_herrnocode:
|
|
||||||
if (h_errnop)
|
|
||||||
{
|
|
||||||
*h_errnop = herrnocode;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ERROR;
|
|
||||||
}
|
}
|
||||||
#endif /* CONFIG_NETDB_HOSTFILE */
|
#endif /* CONFIG_NETDB_HOSTFILE */
|
||||||
|
|
||||||
@ -756,6 +743,17 @@ int gethostentbyname_r(FAR const char *name,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_NETDB_HOSTFILE
|
||||||
|
/* Search the hosts file for a match */
|
||||||
|
|
||||||
|
if (lib_hostfile_lookup(name, host, buf, buflen) == 0)
|
||||||
|
{
|
||||||
|
/* Found the host in hosts file */
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Try to find the name in the HOSTALIASES environment variable */
|
/* Try to find the name in the HOSTALIASES environment variable */
|
||||||
|
|
||||||
#ifdef CONFIG_NETDB_DNSCLIENT
|
#ifdef CONFIG_NETDB_DNSCLIENT
|
||||||
@ -780,23 +778,12 @@ int gethostentbyname_r(FAR const char *name,
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_NETDB_DNSCLIENT */
|
#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)
|
if (h_errnop)
|
||||||
{
|
{
|
||||||
*h_errnop = HOST_NOT_FOUND;
|
*h_errnop = HOST_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ERROR;
|
return ERROR;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_LIBC_NETDB */
|
#endif /* CONFIG_LIBC_NETDB */
|
||||||
|
Loading…
Reference in New Issue
Block a user