mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-02 01:40:07 +00:00
* sysdeps/posix/getaddrinfo.c: Avoid RFC 3484 sorting if there are
multiple return records but only one address.
This commit is contained in:
parent
da09af7627
commit
01abbc0f7f
@ -1,5 +1,8 @@
|
|||||||
2005-11-27 Ulrich Drepper <drepper@redhat.com>
|
2005-11-27 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/posix/getaddrinfo.c: Avoid RFC 3484 sorting if there are
|
||||||
|
multiple return records but only one address.
|
||||||
|
|
||||||
* sysdeps/posix/getaddrinfo.c (gaih_inet): Avoid some code duplication.
|
* sysdeps/posix/getaddrinfo.c (gaih_inet): Avoid some code duplication.
|
||||||
|
|
||||||
2005-11-27 Roland McGrath <roland@redhat.com>
|
2005-11-27 Roland McGrath <roland@redhat.com>
|
||||||
|
@ -121,7 +121,8 @@ struct gaih
|
|||||||
{
|
{
|
||||||
int family;
|
int family;
|
||||||
int (*gaih)(const char *name, const struct gaih_service *service,
|
int (*gaih)(const char *name, const struct gaih_service *service,
|
||||||
const struct addrinfo *req, struct addrinfo **pai);
|
const struct addrinfo *req, struct addrinfo **pai,
|
||||||
|
unsigned int *naddrs);
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct addrinfo default_hints =
|
static const struct addrinfo default_hints =
|
||||||
@ -363,7 +364,8 @@ extern service_user *__nss_hosts_database attribute_hidden;
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
gaih_inet (const char *name, const struct gaih_service *service,
|
gaih_inet (const char *name, const struct gaih_service *service,
|
||||||
const struct addrinfo *req, struct addrinfo **pai)
|
const struct addrinfo *req, struct addrinfo **pai,
|
||||||
|
unsigned int *naddrs)
|
||||||
{
|
{
|
||||||
const struct gaih_typeproto *tp = gaih_inet_typeproto;
|
const struct gaih_typeproto *tp = gaih_inet_typeproto;
|
||||||
struct gaih_servtuple *st = (struct gaih_servtuple *) &nullserv;
|
struct gaih_servtuple *st = (struct gaih_servtuple *) &nullserv;
|
||||||
@ -1087,6 +1089,8 @@ gaih_inet (const char *name, const struct gaih_service *service,
|
|||||||
}
|
}
|
||||||
*pai = NULL;
|
*pai = NULL;
|
||||||
|
|
||||||
|
++*naddrs;
|
||||||
|
|
||||||
ignore:
|
ignore:
|
||||||
at2 = at2->next;
|
at2 = at2->next;
|
||||||
}
|
}
|
||||||
@ -1535,6 +1539,7 @@ getaddrinfo (const char *name, const char *service,
|
|||||||
else
|
else
|
||||||
end = NULL;
|
end = NULL;
|
||||||
|
|
||||||
|
unsigned int naddrs = 0;
|
||||||
while (g->gaih)
|
while (g->gaih)
|
||||||
{
|
{
|
||||||
if (hints->ai_family == g->family || hints->ai_family == AF_UNSPEC)
|
if (hints->ai_family == g->family || hints->ai_family == AF_UNSPEC)
|
||||||
@ -1543,7 +1548,7 @@ getaddrinfo (const char *name, const char *service,
|
|||||||
if (pg == NULL || pg->gaih != g->gaih)
|
if (pg == NULL || pg->gaih != g->gaih)
|
||||||
{
|
{
|
||||||
pg = g;
|
pg = g;
|
||||||
i = g->gaih (name, pservice, hints, end);
|
i = g->gaih (name, pservice, hints, end, &naddrs);
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
{
|
{
|
||||||
/* EAI_NODATA is a more specific result as it says that
|
/* EAI_NODATA is a more specific result as it says that
|
||||||
@ -1575,7 +1580,7 @@ getaddrinfo (const char *name, const char *service,
|
|||||||
if (j == 0)
|
if (j == 0)
|
||||||
return EAI_FAMILY;
|
return EAI_FAMILY;
|
||||||
|
|
||||||
if (nresults > 1)
|
if (naddrs > 1)
|
||||||
{
|
{
|
||||||
/* Sort results according to RFC 3484. */
|
/* Sort results according to RFC 3484. */
|
||||||
struct sort_result results[nresults];
|
struct sort_result results[nresults];
|
||||||
|
Loading…
Reference in New Issue
Block a user