diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-06-30 22:36:07 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2023-06-30 22:36:07 +0000 |
commit | 97e3d220503a676acd81839dea289f4e700d8bd8 (patch) | |
tree | 69791901e1ca15319c5c63ffb52fe9cc686f8bee /src/nvme/util.c | |
parent | Adding upstream version 1.4. (diff) | |
download | libnvme-97e3d220503a676acd81839dea289f4e700d8bd8.tar.xz libnvme-97e3d220503a676acd81839dea289f4e700d8bd8.zip |
Adding upstream version 1.5.upstream/1.5
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/nvme/util.c')
-rw-r--r-- | src/nvme/util.c | 80 |
1 files changed, 74 insertions, 6 deletions
diff --git a/src/nvme/util.c b/src/nvme/util.c index e7cbc8a..143cc31 100644 --- a/src/nvme/util.c +++ b/src/nvme/util.c @@ -8,6 +8,7 @@ */ #include <stdio.h> +#include <stdbool.h> #include <string.h> #include <errno.h> @@ -566,8 +567,9 @@ static const char * const libnvme_status[] = { [ENVME_CONNECT_INVAL] = "invalid arguments/configuration", [ENVME_CONNECT_ADDRINUSE] = "hostnqn already in use", [ENVME_CONNECT_NODEV] = "invalid interface", - [ENVME_CONNECT_OPNOTSUPP] ="not supported", + [ENVME_CONNECT_OPNOTSUPP] = "not supported", [ENVME_CONNECT_CONNREFUSED] = "connection refused", + [ENVME_CONNECT_ADDRNOTAVAIL] = "cannot assign requested address", }; const char *nvme_errno_to_string(int status) @@ -577,7 +579,7 @@ const char *nvme_errno_to_string(int status) return s; } -#ifdef HAVE_LIBNSS +#ifdef HAVE_NETDB char *hostname2traddr(struct nvme_root *r, const char *traddr) { struct addrinfo *host_info, hints = {.ai_family = AF_UNSPEC}; @@ -621,9 +623,7 @@ free_addrinfo: freeaddrinfo(host_info); return ret_traddr; } - -#else /* !HAVE_LIBNSS */ - +#else /* HAVE_NETDB */ char *hostname2traddr(struct nvme_root *r, const char *traddr) { nvme_msg(NULL, LOG_ERR, "No support for hostname IP address resolution; " \ @@ -632,7 +632,7 @@ char *hostname2traddr(struct nvme_root *r, const char *traddr) errno = -ENOTSUP; return NULL; } -#endif /* HAVE_LIBNSS */ +#endif /* HAVE_NETDB */ char *startswith(const char *s, const char *prefix) { @@ -904,3 +904,71 @@ int nvme_uuid_random(unsigned char uuid[NVME_UUID_LEN]) return 0; } + +#ifdef HAVE_NETDB +bool nvme_ipaddrs_eq(const char *addr1, const char *addr2) +{ + bool result = false; + struct addrinfo *info1 = NULL, hint1 = { .ai_flags=AI_NUMERICHOST, .ai_family=AF_UNSPEC }; + struct addrinfo *info2 = NULL, hint2 = { .ai_flags=AI_NUMERICHOST, .ai_family=AF_UNSPEC }; + + if (addr1 == addr2) + return true; + + if (!addr1 || !addr2) + return false; + + if (getaddrinfo(addr1, 0, &hint1, &info1) || !info1) + goto ipaddrs_eq_fail; + + if (getaddrinfo(addr2, 0, &hint2, &info2) || !info2) + goto ipaddrs_eq_fail; + + if (info1->ai_family == AF_INET && info2->ai_family == AF_INET) { + struct sockaddr_in *sockaddr1 = (struct sockaddr_in *)(info1->ai_addr); + struct sockaddr_in *sockaddr2 = (struct sockaddr_in *)(info2->ai_addr); + result = sockaddr1->sin_addr.s_addr == sockaddr2->sin_addr.s_addr; + } else if (info1->ai_family == AF_INET6 && info2->ai_family == AF_INET6) { + struct sockaddr_in6 *sockaddr1 = (struct sockaddr_in6 *)(info1->ai_addr); + struct sockaddr_in6 *sockaddr2 = (struct sockaddr_in6 *)(info2->ai_addr); + result = !memcmp(&sockaddr1->sin6_addr, &sockaddr2->sin6_addr, sizeof(struct in6_addr)); + } else { + struct sockaddr_in *sockaddr_v4; + struct sockaddr_in6 *sockaddr_v6; + switch (info1->ai_family) { + case AF_INET: + sockaddr_v6 = (struct sockaddr_in6 *)(info2->ai_addr); + if (IN6_IS_ADDR_V4MAPPED(&sockaddr_v6->sin6_addr)) { + sockaddr_v4 = (struct sockaddr_in *)(info1->ai_addr); + result = sockaddr_v4->sin_addr.s_addr == sockaddr_v6->sin6_addr.s6_addr32[3]; + } + break; + + case AF_INET6: + sockaddr_v6 = (struct sockaddr_in6 *)(info1->ai_addr); + if (IN6_IS_ADDR_V4MAPPED(&sockaddr_v6->sin6_addr)) { + sockaddr_v4 = (struct sockaddr_in *)(info2->ai_addr); + result = sockaddr_v4->sin_addr.s_addr == sockaddr_v6->sin6_addr.s6_addr32[3]; + } + break; + + default: ; + } + } + +ipaddrs_eq_fail: + if (info1) + freeaddrinfo(info1); + if (info2) + freeaddrinfo(info2); + return result; +} +#else /* HAVE_NETDB */ +bool nvme_ipaddrs_eq(const char *addr1, const char *addr2) +{ + nvme_msg(NULL, LOG_ERR, "no support for hostname ip address resolution; " \ + "recompile with libnss support.\n"); + + return false; +} +#endif /* HAVE_NETDB */ |