From: Martin Belanger Date: Thu, 17 Aug 2023 10:46:26 +0000 (-0400) Subject: tree: Add nvme_ctrl_get_src_addr() to get the controller's src_addr X-Git-Tag: v1.6~47 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=aaa0a1a3b67cdd9db232531590147f5d13a24b7a;p=users%2Fsagi%2Flibnvme.git tree: Add nvme_ctrl_get_src_addr() to get the controller's src_addr Signed-off-by: Martin Belanger --- diff --git a/src/libnvme.map b/src/libnvme.map index c77c2aeb..a6870458 100644 --- a/src/libnvme.map +++ b/src/libnvme.map @@ -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; diff --git a/src/nvme/tree.c b/src/nvme/tree.c index 0405b335..b641b2bc 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -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 : ""; diff --git a/src/nvme/tree.h b/src/nvme/tree.h index ac3c30f8..8b9a483c 100644 --- a/src/nvme/tree.h +++ b/src/nvme/tree.h @@ -15,6 +15,7 @@ #include #include +#include #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