public inbox for glibc-cvs@sourceware.org help / color / mirror / Atom feed
From: Siddhesh Poyarekar <siddhesh@sourceware.org> To: glibc-cvs@sourceware.org Subject: [glibc/siddhesh/gai-cleanup2] gaih_inet: make gethosts into a function Date: Tue, 1 Mar 2022 02:41:17 +0000 (GMT) [thread overview] Message-ID: <20220301024117.6CBC63858C74@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=fb77c48d079662d513597f6ec0960ee70c7f4664 commit fb77c48d079662d513597f6ec0960ee70c7f4664 Author: Siddhesh Poyarekar <siddhesh@sourceware.org> Date: Mon Feb 28 21:53:42 2022 +0530 gaih_inet: make gethosts into a function The macro is quite a pain to debug, so make gethosts into a function to make it easier to maintain. Diff: --- sysdeps/posix/getaddrinfo.c | 154 +++++++++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 65 deletions(-) diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index 59109d0a35..1d248c8835 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -282,69 +282,82 @@ convert_hostent_to_gaih_addrtuple (const struct addrinfo *req, return true; } -#define gethosts(_family) \ - { \ - struct hostent th; \ - char *localcanon = NULL; \ - no_data = 0; \ - while (1) \ - { \ - status = DL_CALL_FCT (fct, (name, _family, &th, \ - tmpbuf->data, tmpbuf->length, \ - &errno, &h_errno, NULL, &localcanon)); \ - if (status != NSS_STATUS_TRYAGAIN || h_errno != NETDB_INTERNAL \ - || errno != ERANGE) \ - break; \ - if (!scratch_buffer_grow (tmpbuf)) \ - { \ - result = -EAI_MEMORY; \ - goto free_and_return; \ - } \ - } \ - if (status == NSS_STATUS_NOTFOUND \ - || status == NSS_STATUS_TRYAGAIN || status == NSS_STATUS_UNAVAIL) \ - { \ - if (h_errno == NETDB_INTERNAL) \ - { \ - result = -EAI_SYSTEM; \ - goto free_and_return; \ - } \ - if (h_errno == TRY_AGAIN) \ - no_data = EAI_AGAIN; \ - else \ - no_data = h_errno == NO_DATA; \ - } \ - else if (status == NSS_STATUS_SUCCESS) \ - { \ - struct gaih_addrtuple *addrmem = NULL; \ - if (!convert_hostent_to_gaih_addrtuple (req, _family, &th, &addrmem)) \ - { \ - result = -EAI_SYSTEM; \ - goto free_and_return; \ - } \ - if (addrmem && !gaih_lookup_result_push_alloc (res, addrmem)) \ - { \ - free (addrmem); \ - result = -EAI_MEMORY; \ - goto free_and_return; \ - } \ - *pat = addrmem; \ - while (*pat != NULL) \ - pat = &((*pat)->next); \ - if (localcanon != NULL && canon == NULL) \ - { \ - char *canonbuf = __strdup (localcanon); \ - if (canonbuf == NULL) \ - { \ - result = -EAI_SYSTEM; \ - goto free_and_return; \ - } \ - canon = canonbuf; \ - } \ - if (_family == AF_INET6 && addrmem != NULL) \ - res->got_ipv6 = true; \ - } \ - } +static int +gethosts (nss_gethostbyname3_r fct, const int family, const char *name, + const struct addrinfo *req, struct scratch_buffer *tmpbuf, + struct gaih_addrtuple **pat, struct gaih_lookup_result *res, + enum nss_status *statusp, char **canonp, int *no_datap) +{ + struct hostent th; + char *localcanon = NULL; + *no_datap = 0; + int result = 0; + enum nss_status status = *statusp; + struct gaih_addrtuple *addrmem = NULL; + + while (1) + { + status = DL_CALL_FCT (fct, (name, family, &th, + tmpbuf->data, tmpbuf->length, + &errno, &h_errno, NULL, &localcanon)); + if (status != NSS_STATUS_TRYAGAIN || h_errno != NETDB_INTERNAL + || errno != ERANGE) + break; + if (!scratch_buffer_grow (tmpbuf)) + { + result = -EAI_MEMORY; + goto out; + } + } + if (status == NSS_STATUS_NOTFOUND + || status == NSS_STATUS_TRYAGAIN || status == NSS_STATUS_UNAVAIL) + { + if (h_errno == NETDB_INTERNAL) + { + result = -EAI_SYSTEM; + goto out; + } + if (h_errno == TRY_AGAIN) + *no_datap = EAI_AGAIN; + else + *no_datap = h_errno == NO_DATA; + } + else if (status == NSS_STATUS_SUCCESS) + { + if (!convert_hostent_to_gaih_addrtuple (req, family, &th, &addrmem)) + { + result = -EAI_SYSTEM; + goto out; + } + if (addrmem && !gaih_lookup_result_push_alloc (res, addrmem)) + { + result = -EAI_MEMORY; + goto out; + } + if (localcanon != NULL && *canonp == NULL) + { + char *canonbuf = __strdup (localcanon); + if (canonbuf == NULL) + { + result = -EAI_SYSTEM; + goto out; + } + *canonp = canonbuf; + } + if (family == AF_INET6 && addrmem != NULL) + res->got_ipv6 = true; + } + +out: + *statusp = status; + + if (result != 0) + free (addrmem); + else + *pat = addrmem; + + return result; +} /* This function is called if a canonical name is requested, but if @@ -911,7 +924,10 @@ get_nss_addresses (const char *name, const struct addrinfo *req, { if (req->ai_family == AF_INET6 || req->ai_family == AF_UNSPEC) { - gethosts (AF_INET6); + if ((result = gethosts (fct, AF_INET6, name, req, tmpbuf, + pat, res, &status, &canon, + &no_data)) != 0) + goto free_and_return; no_inet6_data = no_data; inet6_status = status; } @@ -922,7 +938,12 @@ get_nss_addresses (const char *name, const struct addrinfo *req, know we are not going to need them. */ && ((req->ai_flags & AI_ALL) || !res->got_ipv6))) { - gethosts (AF_INET); + while (*pat != NULL) + pat = &((*pat)->next); + if ((result = gethosts (fct, AF_INET, name, req, tmpbuf, + pat, res, &status, &canon, + &no_data)) != 0) + goto free_and_return; if (req->ai_family == AF_INET) { @@ -931,6 +952,9 @@ get_nss_addresses (const char *name, const struct addrinfo *req, } } + while (*pat != NULL) + pat = &((*pat)->next); + /* If we found one address for AF_INET or AF_INET6, don't continue the search. */ if (inet6_status == NSS_STATUS_SUCCESS
next reply other threads:[~2022-03-01 2:41 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-03-01 2:41 Siddhesh Poyarekar [this message] 2022-03-07 16:56 Siddhesh Poyarekar 2022-03-08 14:10 Siddhesh Poyarekar 2022-03-14 14:17 Siddhesh Poyarekar
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20220301024117.6CBC63858C74@sourceware.org \ --to=siddhesh@sourceware.org \ --cc=glibc-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).