mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 04:50:07 +00:00
nss_files: Refactor gethostbyname3 multi case into separate function
This is in preparation of further cleanup work.
This commit is contained in:
parent
a8dce6197a
commit
8ed70de2fa
@ -1,3 +1,9 @@
|
|||||||
|
2017-10-10 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
* nss/nss_files/files-hosts.c (gethostbyname3_multi): New
|
||||||
|
function.
|
||||||
|
(_nss_files_gethostbyname3_r): Call it.
|
||||||
|
|
||||||
2017-10-09 Joseph Myers <joseph@codesourcery.com>
|
2017-10-09 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
* sysdeps/generic/math-type-macros.h [!declare_mgen_alias]: Give
|
* sysdeps/generic/math-type-macros.h [!declare_mgen_alias]: Give
|
||||||
|
@ -115,35 +115,11 @@ DB_LOOKUP (hostbyaddr, ,,,
|
|||||||
}, const void *addr, socklen_t len, int af)
|
}, const void *addr, socklen_t len, int af)
|
||||||
#undef EXTRA_ARGS_VALUE
|
#undef EXTRA_ARGS_VALUE
|
||||||
|
|
||||||
enum nss_status
|
static enum nss_status
|
||||||
_nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result,
|
gethostbyname3_multi (FILE * stream, const char *name, int af,
|
||||||
char *buffer, size_t buflen, int *errnop,
|
struct hostent *result, char *buffer, size_t buflen,
|
||||||
int *herrnop, int32_t *ttlp, char **canonp)
|
int *errnop, int *herrnop, int flags)
|
||||||
{
|
{
|
||||||
FILE *stream = NULL;
|
|
||||||
uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct hostent_data);
|
|
||||||
buffer += pad;
|
|
||||||
buflen = buflen > pad ? buflen - pad : 0;
|
|
||||||
|
|
||||||
/* Open file. */
|
|
||||||
enum nss_status status = internal_setent (&stream);
|
|
||||||
|
|
||||||
if (status == NSS_STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
/* XXX Is using _res to determine whether we want to convert IPv4
|
|
||||||
addresses to IPv6 addresses really the right thing to do? */
|
|
||||||
int flags = (res_use_inet6 () ? AI_V4MAPPED : 0);
|
|
||||||
|
|
||||||
while ((status = internal_getent (stream, result, buffer, buflen, errnop,
|
|
||||||
herrnop, af, flags))
|
|
||||||
== NSS_STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
LOOKUP_NAME_CASE (h_name, h_aliases)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status == NSS_STATUS_SUCCESS
|
|
||||||
&& _res_hconf.flags & HCONF_FLAG_MULTI)
|
|
||||||
{
|
|
||||||
/* We have to get all host entries from the file. */
|
/* We have to get all host entries from the file. */
|
||||||
size_t tmp_buflen = MIN (buflen, 4096);
|
size_t tmp_buflen = MIN (buflen, 4096);
|
||||||
char tmp_buffer_stack[tmp_buflen]
|
char tmp_buffer_stack[tmp_buflen]
|
||||||
@ -154,6 +130,7 @@ _nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result,
|
|||||||
int naliases = 0;
|
int naliases = 0;
|
||||||
char *bufferend;
|
char *bufferend;
|
||||||
bool tmp_buffer_malloced = false;
|
bool tmp_buffer_malloced = false;
|
||||||
|
enum nss_status status;
|
||||||
|
|
||||||
while (result->h_aliases[naliases] != NULL)
|
while (result->h_aliases[naliases] != NULL)
|
||||||
++naliases;
|
++naliases;
|
||||||
@ -335,8 +312,40 @@ _nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result,
|
|||||||
out:
|
out:
|
||||||
if (tmp_buffer_malloced)
|
if (tmp_buffer_malloced)
|
||||||
free (tmp_buffer);
|
free (tmp_buffer);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum nss_status
|
||||||
|
_nss_files_gethostbyname3_r (const char *name, int af, struct hostent *result,
|
||||||
|
char *buffer, size_t buflen, int *errnop,
|
||||||
|
int *herrnop, int32_t *ttlp, char **canonp)
|
||||||
|
{
|
||||||
|
FILE *stream = NULL;
|
||||||
|
uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct hostent_data);
|
||||||
|
buffer += pad;
|
||||||
|
buflen = buflen > pad ? buflen - pad : 0;
|
||||||
|
|
||||||
|
/* Open file. */
|
||||||
|
enum nss_status status = internal_setent (&stream);
|
||||||
|
|
||||||
|
if (status == NSS_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
/* XXX Is using _res to determine whether we want to convert IPv4
|
||||||
|
addresses to IPv6 addresses really the right thing to do? */
|
||||||
|
int flags = (res_use_inet6 () ? AI_V4MAPPED : 0);
|
||||||
|
|
||||||
|
while ((status = internal_getent (stream, result, buffer, buflen, errnop,
|
||||||
|
herrnop, af, flags))
|
||||||
|
== NSS_STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
LOOKUP_NAME_CASE (h_name, h_aliases)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (status == NSS_STATUS_SUCCESS
|
||||||
|
&& _res_hconf.flags & HCONF_FLAG_MULTI)
|
||||||
|
status = gethostbyname3_multi
|
||||||
|
(stream, name, af, result, buffer, buflen, errnop, herrnop, flags);
|
||||||
|
|
||||||
internal_endent (&stream);
|
internal_endent (&stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user