summaryrefslogtreecommitdiffstats
path: root/src/nvme/util.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2023-06-30 22:36:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2023-06-30 22:36:10 +0000
commit61d0a8bdffbbb7229776d2f4f2e79ed22d21551f (patch)
tree2e249969fedce45eb37ae6314ad167595900fe38 /src/nvme/util.c
parentReleasing debian version 1.4-4. (diff)
downloadlibnvme-61d0a8bdffbbb7229776d2f4f2e79ed22d21551f.tar.xz
libnvme-61d0a8bdffbbb7229776d2f4f2e79ed22d21551f.zip
Merging upstream version 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.c80
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 */