summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2014-06-01 16:51:57 -0300
committerAlexandre Oliva <aoliva@redhat.com>2014-11-07 07:18:53 -0200
commitd4139de660d1f25ad34ab023b13ec3cad78986d2 (patch)
treee968250d80aa41a2eb86cade2728e0d6054576d4
parent91bbe1798129768e77cffecf324400fa4d31ad10 (diff)
downloadglibc-lxoliva/getaddrinfo.tar.gz
-rw-r--r--sysdeps/posix/getaddrinfo.c214
1 files changed, 107 insertions, 107 deletions
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 3121d3bb65..50855ceaab 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -566,113 +566,6 @@ gaih_inet (const char *name, const struct gaih_service *service,
int no_more;
int old_res_options;
- /* If we do not have to look for IPv6 addresses or the canonical
- name, use the simple, old functions, which do not support
- IPv6 scope ids, nor retrieving the canonical name. */
- if (req->ai_family == AF_INET
- && (req->ai_flags & AI_CANONNAME) == 0)
- {
- /* Allocate additional room for struct host_data. */
- size_t tmpbuflen = (512 + MAX_NR_ALIASES * sizeof(char*)
- + 16 * sizeof(char));
- assert (tmpbuf == NULL);
- tmpbuf = alloca_account (tmpbuflen, alloca_used);
- int rc;
- struct hostent th;
- struct hostent *h;
- int herrno;
-
- while (1)
- {
- rc = __gethostbyname2_r (name, AF_INET, &th, tmpbuf,
- tmpbuflen, &h, &herrno);
- if (rc != ERANGE || herrno != NETDB_INTERNAL)
- break;
-
- if (!malloc_tmpbuf
- && __libc_use_alloca (alloca_used + 2 * tmpbuflen))
- tmpbuf = extend_alloca_account (tmpbuf, tmpbuflen,
- 2 * tmpbuflen,
- alloca_used);
- else
- {
- char *newp = realloc (malloc_tmpbuf ? tmpbuf : NULL,
- 2 * tmpbuflen);
- if (newp == NULL)
- {
- result = -EAI_MEMORY;
- goto free_and_return;
- }
- tmpbuf = newp;
- malloc_tmpbuf = true;
- tmpbuflen = 2 * tmpbuflen;
- }
- }
-
- if (rc == 0)
- {
- if (h != NULL)
- {
- int i;
- /* We found data, count the number of addresses. */
- for (i = 0; h->h_addr_list[i]; ++i)
- ;
- if (i > 0 && *pat != NULL)
- --i;
-
- if (__libc_use_alloca (alloca_used
- + i * sizeof (struct gaih_addrtuple)))
- addrmem = alloca_account (i * sizeof (struct gaih_addrtuple),
- alloca_used);
- else
- {
- addrmem = malloc (i
- * sizeof (struct gaih_addrtuple));
- if (addrmem == NULL)
- {
- result = -EAI_MEMORY;
- goto free_and_return;
- }
- malloc_addrmem = true;
- }
-
- /* Now convert it into the list. */
- struct gaih_addrtuple *addrfree = addrmem;
- for (i = 0; h->h_addr_list[i]; ++i)
- {
- if (*pat == NULL)
- {
- *pat = addrfree++;
- (*pat)->scopeid = 0;
- }
- (*pat)->next = NULL;
- (*pat)->family = AF_INET;
- memcpy ((*pat)->addr, h->h_addr_list[i],
- h->h_length);
- pat = &((*pat)->next);
- }
- }
- }
- else
- {
- if (herrno == NETDB_INTERNAL)
- {
- __set_h_errno (herrno);
- result = -EAI_SYSTEM;
- }
- else if (herrno == TRY_AGAIN)
- result = -EAI_AGAIN;
- else
- /* We made requests but they turned out no data.
- The name is known, though. */
- result = -EAI_NODATA;
-
- goto free_and_return;
- }
-
- goto process_list;
- }
-
#ifdef USE_NSCD
if (__nss_not_use_nscd_hosts > 0
&& ++__nss_not_use_nscd_hosts > NSS_NSCD_RETRY)
@@ -806,6 +699,113 @@ gaih_inet (const char *name, const struct gaih_service *service,
}
#endif
+ /* If we do not have to look for IPv6 addresses or the canonical
+ name, use the simple, old functions, which do not support
+ IPv6 scope ids, nor retrieving the canonical name. */
+ if (req->ai_family == AF_INET
+ && (req->ai_flags & AI_CANONNAME) == 0)
+ {
+ /* Allocate additional room for struct host_data. */
+ size_t tmpbuflen = (512 + MAX_NR_ALIASES * sizeof(char*)
+ + 16 * sizeof(char));
+ assert (tmpbuf == NULL);
+ tmpbuf = alloca_account (tmpbuflen, alloca_used);
+ int rc;
+ struct hostent th;
+ struct hostent *h;
+ int herrno;
+
+ while (1)
+ {
+ rc = __gethostbyname2_r (name, AF_INET, &th, tmpbuf,
+ tmpbuflen, &h, &herrno);
+ if (rc != ERANGE || herrno != NETDB_INTERNAL)
+ break;
+
+ if (!malloc_tmpbuf
+ && __libc_use_alloca (alloca_used + 2 * tmpbuflen))
+ tmpbuf = extend_alloca_account (tmpbuf, tmpbuflen,
+ 2 * tmpbuflen,
+ alloca_used);
+ else
+ {
+ char *newp = realloc (malloc_tmpbuf ? tmpbuf : NULL,
+ 2 * tmpbuflen);
+ if (newp == NULL)
+ {
+ result = -EAI_MEMORY;
+ goto free_and_return;
+ }
+ tmpbuf = newp;
+ malloc_tmpbuf = true;
+ tmpbuflen = 2 * tmpbuflen;
+ }
+ }
+
+ if (rc == 0)
+ {
+ if (h != NULL)
+ {
+ int i;
+ /* We found data, count the number of addresses. */
+ for (i = 0; h->h_addr_list[i]; ++i)
+ ;
+ if (i > 0 && *pat != NULL)
+ --i;
+
+ if (__libc_use_alloca (alloca_used
+ + i * sizeof (struct gaih_addrtuple)))
+ addrmem = alloca_account (i * sizeof (struct gaih_addrtuple),
+ alloca_used);
+ else
+ {
+ addrmem = malloc (i
+ * sizeof (struct gaih_addrtuple));
+ if (addrmem == NULL)
+ {
+ result = -EAI_MEMORY;
+ goto free_and_return;
+ }
+ malloc_addrmem = true;
+ }
+
+ /* Now convert it into the list. */
+ struct gaih_addrtuple *addrfree = addrmem;
+ for (i = 0; h->h_addr_list[i]; ++i)
+ {
+ if (*pat == NULL)
+ {
+ *pat = addrfree++;
+ (*pat)->scopeid = 0;
+ }
+ (*pat)->next = NULL;
+ (*pat)->family = AF_INET;
+ memcpy ((*pat)->addr, h->h_addr_list[i],
+ h->h_length);
+ pat = &((*pat)->next);
+ }
+ }
+ }
+ else
+ {
+ if (herrno == NETDB_INTERNAL)
+ {
+ __set_h_errno (herrno);
+ result = -EAI_SYSTEM;
+ }
+ else if (herrno == TRY_AGAIN)
+ result = -EAI_AGAIN;
+ else
+ /* We made requests but they turned out no data.
+ The name is known, though. */
+ result = -EAI_NODATA;
+
+ goto free_and_return;
+ }
+
+ goto process_list;
+ }
+
if (__nss_hosts_database == NULL)
no_more = __nss_database_lookup ("hosts", NULL,
"dns [!UNAVAIL=return] files",