]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
tree: Add nvme_ctrl_get_src_addr() to get the controller's src_addr
authorMartin Belanger <martin.belanger@dell.com>
Thu, 17 Aug 2023 10:46:26 +0000 (06:46 -0400)
committerDaniel Wagner <wagi@monom.org>
Thu, 17 Aug 2023 12:58:39 +0000 (14:58 +0200)
Signed-off-by: Martin Belanger <martin.belanger@dell.com>
src/libnvme.map
src/nvme/tree.c
src/nvme/tree.h

index c77c2aebb80947a3e34f1649c90878bec6cb68d2..a6870458d950b9de5d21ec79b7ca788396ea8333 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: LGPL-2.1-or-later
 LIBNVME_1_6 {
        global:
+               nvme_ctrl_get_src_addr;
                nvme_ctrl_release_fd;
                nvme_host_release_fds;
                nvme_ns_release_fd;
index 0405b335fb773245dee31e715d709591f96aa0f4..b641b2bcd434033300e054e9ae6f6b1e1239e2aa 100644 (file)
@@ -881,6 +881,32 @@ const char *nvme_ctrl_get_address(nvme_ctrl_t c)
        return c->address ? c->address : "";
 }
 
+char *nvme_ctrl_get_src_addr(nvme_ctrl_t c, char *src_addr, size_t src_addr_len)
+{
+       size_t l;
+       char *p;
+
+       if (!c->address)
+               return NULL;
+
+       p = strstr(c->address, "src_addr=");
+       if (!p)
+               return NULL;
+
+       p += strlen("src_addr=");
+       l = strcspn(p, ",%"); /* % to eliminate IPv6 scope (if present) */
+       if (l >= src_addr_len) {
+               nvme_msg(root_from_ctrl(c), LOG_ERR,
+                        "Buffer for src_addr is too small (%zu must be > %zu)\n",
+                        src_addr_len, l);
+               return NULL;
+       }
+
+       strncpy(src_addr, p, l);
+       src_addr[l] = '\0';
+       return src_addr;
+}
+
 const char *nvme_ctrl_get_phy_slot(nvme_ctrl_t c)
 {
        return c->phy_slot ? c->phy_slot : "";
index ac3c30f804609b143646a2841cee10a73dd217c2..8b9a483c5ce7af54c06f4792cbf12a325d10addf 100644 (file)
@@ -15,6 +15,7 @@
 #include <stddef.h>
 
 #include <sys/types.h>
+#include <netinet/in.h>
 
 #include "ioctl.h"
 #include "util.h"
@@ -840,6 +841,16 @@ const char *nvme_ctrl_get_sysfs_dir(nvme_ctrl_t c);
  */
 const char *nvme_ctrl_get_address(nvme_ctrl_t c);
 
+/**
+ * nvme_ctrl_get_src_addr() - Extract src_addr from the c->address string
+ * @c: Controller instance
+ * @src_addr: Where to copy the src_addr. Size must be at least INET6_ADDRSTRLEN.
+ * @src_addr_len: Length of the buffer @src_addr.
+ *
+ * Return: Pointer to @src_addr on success. NULL on failure to extract the src_addr.
+ */
+char *nvme_ctrl_get_src_addr(nvme_ctrl_t c, char *src_addr, size_t src_addr_len);
+
 /**
  * nvme_ctrl_get_phy_slot() - PCI physical slot number of a controller
  * @c: Controller instance