From 786dcb6287b61bbd5ebb905cbc5b1496b927d7b8 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 18 Apr 2006 23:35:12 +0000 Subject: * sysdeps/posix/getaddrinfo.c (getaddrinfo): Rewrite to avoid loop over gaih array. There is only on function to call in the moment. --- ChangeLog | 5 +++++ sysdeps/posix/getaddrinfo.c | 42 ++++++++++++++++++++++++++++++++++---- sysdeps/unix/sysv/linux/check_pf.c | 4 ++-- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index b03dace8b9..4e25d030c5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-04-18 Ulrich Drepper + + * sysdeps/posix/getaddrinfo.c (getaddrinfo): Rewrite to avoid loop + over gaih array. There is only on function to call in the moment. + 2006-04-16 Ulrich Drepper * include/ifaddrs.h: Define struct in6addrinfo. diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index 5746f4673e..843e60bba3 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -1095,6 +1095,7 @@ gaih_inet (const char *name, const struct gaih_service *service, return 0; } +#if 0 static const struct gaih gaih[] = { { PF_INET6, gaih_inet }, @@ -1104,6 +1105,7 @@ static const struct gaih gaih[] = #endif { PF_UNSPEC, NULL } }; +#endif struct sort_result { @@ -1484,11 +1486,9 @@ int getaddrinfo (const char *name, const char *service, const struct addrinfo *hints, struct addrinfo **pai) { - int i = 0, j = 0, last_i = 0; + int i = 0, last_i = 0; int nresults = 0; - struct addrinfo *p = NULL, **end; - const struct gaih *g = gaih; - const struct gaih *pg = NULL; + struct addrinfo *p = NULL; struct gaih_service gaih_service, *pservice; struct addrinfo local_hints; @@ -1575,12 +1575,21 @@ getaddrinfo (const char *name, const char *service, else pservice = NULL; + struct addrinfo **end; if (pai) end = &p; else end = NULL; unsigned int naddrs = 0; +#if 0 + /* If we would support more protocols than just IPv4 and IPv6 we + would iterate over a table with appropriate callback functions. + Since we currently only handle IPv4 and IPv6 this is not + necessary. */ + const struct gaih *g = gaih; + const struct gaih *pg = NULL; + int j = 0; while (g->gaih) { if (hints->ai_family == g->family || hints->ai_family == AF_UNSPEC) @@ -1624,6 +1633,31 @@ getaddrinfo (const char *name, const char *service, free (in6ai); return EAI_FAMILY; } +#else + if (hints->ai_family == AF_UNSPEC || hints->ai_family == AF_INET + || hints->ai_family == AF_INET6) + { + last_i = gaih_inet (name, pservice, hints, end, &naddrs); + if (last_i != 0) + { + freeaddrinfo (p); + free (in6ai); + + return -(i & GAIH_EAI); + } + if (end) + while (*end) + { + end = &((*end)->ai_next); + ++nresults; + } + } + else + { + free (in6ai); + return EAI_FAMILY; + } +#endif if (naddrs > 1) { diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c index 75b7dd0d82..f186182cf6 100644 --- a/sysdeps/unix/sysv/linux/check_pf.c +++ b/sysdeps/unix/sysv/linux/check_pf.c @@ -131,7 +131,7 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, break; case IFA_ADDRESS: - address = RTA_DATA (ta); + address = RTA_DATA (rta); break; } @@ -147,7 +147,7 @@ make_request (int fd, pid_t pid, bool *seen_ipv4, bool *seen_ipv6, memcpy (newp->info.addr, address ?: local, sizeof (newp->info.addr)); newp->next = in6ailist; - in6ailsit = newp; + in6ailist = newp; ++in6ailistlen; } break; -- cgit v1.2.3