Use getnameinfo(3) instead of our own equivalent

I didn't know getnameinfo(3) existed, so I implemented it, or something
similar to it called inet_sockaddr2str().  Let's use the standard API.

Link: <https://inbox.sourceware.org/libc-alpha/0f25d60f-f183-b518-b6c1-6d46aa63ee57@gmail.com/T/>
Link: <https://stackoverflow.com/a/42190913/6872717>
Link: <https://github.com/shadow-maint/shadow/pull/617>
Link: <https://software.codidact.com/posts/287748>
Cc: Zack Weinberg <zack@owlfolio.org>
Signed-off-by: Alejandro Colomar <alx@kernel.org>
This commit is contained in:
Alejandro Colomar
2023-01-19 19:33:53 +01:00
committed by Serge Hallyn
parent ac8b81c2b7
commit b2bed465e8
4 changed files with 13 additions and 93 deletions

View File

@@ -267,22 +267,24 @@ static const char *resolve_hostname (const char *string)
char *addr_str;
struct addrinfo *addrs;
gai_err = getaddrinfo(string, NULL, NULL, &addrs);
if (gai_err != 0)
goto notfound;
static char host[MAXHOSTNAMELEN];
addr_str = inet_sockaddr2str(addrs[0].ai_addr);
if (addr_str == NULL) {
SYSLOG ((LOG_ERR, "inet_sockaddr2str(): %s", strerror(errno)));
abort();
gai_err = getaddrinfo(string, NULL, NULL, &addrs);
if (gai_err != 0) {
SYSLOG ((LOG_ERR, "getaddrinfo(%s): %s", string, gai_strerror(gai_err)));
return string;
}
addr_str = host;
gai_err = getnameinfo(addrs[0].ai_addr, addrs[0].ai_addrlen,
host, NITEMS(host), NULL, 0, NI_NUMERICHOST);
if (gai_err != 0) {
SYSLOG ((LOG_ERR, "getnameinfo(%s): %s", string, gai_strerror(gai_err)));
addr_str = string;
}
freeaddrinfo(addrs);
return addr_str;
notfound:
SYSLOG ((LOG_ERR, "getaddrinfo(%s): %s", string, gai_strerror(gai_err)));
return string;
}
/* from_match - match a host or tty against a list of tokens */