]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
Parse 'address' string into components
authorHannes Reinecke <hare@suse.de>
Fri, 19 Mar 2021 09:50:37 +0000 (10:50 +0100)
committerHannes Reinecke <hare@suse.de>
Fri, 19 Mar 2021 09:50:37 +0000 (10:50 +0100)
The 'address' string really are several parts (traddr, trsvcid, and
host_addr) which are separated by commas. So avoid every user having
to parse that string on its own this patch exposes the individual parts
via nvme_ctrl_get_{traddr,trsvcid,host_traddr}.
Each call might return NULL if the respective value isn't set.

Signed-off-by: Hannes Reinecke <hare@suse.de>
src/nvme/tree.c
src/nvme/tree.h

index 74aba7dfaf78ab166c24b7811eed587a8a73001d..5d5e5efcd382150153606a7cb5084d1f7454b912 100644 (file)
@@ -93,6 +93,9 @@ struct nvme_ctrl {
        char *sqsize;
        char *transport;
        char *subsysnqn;
+       char *traddr;
+       char *trsvcid;
+       char *host_traddr;
 };
 
 struct nvme_subsystem {
@@ -482,6 +485,21 @@ const char *nvme_ctrl_get_transport(nvme_ctrl_t c)
        return c->transport;
 }
 
+const char *nvme_ctrl_get_traddr(nvme_ctrl_t c)
+{
+       return c->traddr;
+}
+
+const char *nvme_ctrl_get_trsvcid(nvme_ctrl_t c)
+{
+       return c->trsvcid;
+}
+
+const char *nvme_ctrl_get_host_traddr(nvme_ctrl_t c)
+{
+       return c->host_traddr;
+}
+
 int nvme_ctrl_identify(nvme_ctrl_t c, struct nvme_id_ctrl *id)
 {
        return nvme_identify_ctrl(nvme_ctrl_get_fd(c), id);
@@ -537,6 +555,11 @@ void nvme_free_ctrl(nvme_ctrl_t c)
        free(c->sysfs_dir);
        free(c->subsysnqn);
        free(c->address);
+       free(c->traddr);
+       if (c->trsvcid)
+               free(c->trsvcid);
+       if (c->host_traddr)
+               free(c->host_traddr);
        free(c->firmware);
        free(c->model);
        free(c->state);
@@ -581,6 +604,8 @@ static nvme_ctrl_t __nvme_ctrl_alloc(const char *path, const char *name)
 {
        DIR *d;
        nvme_ctrl_t c;
+       char *addr, *a, *e;
+       char *traddr = NULL, *trsvcid = NULL, *host_traddr = NULL;
 
        d = opendir(path);
        if (!d)
@@ -612,7 +637,24 @@ static nvme_ctrl_t __nvme_ctrl_alloc(const char *path, const char *name)
        c->serial = nvme_get_ctrl_attr(c, "serial");
        c->sqsize = nvme_get_ctrl_attr(c, "sqsize");
        c->transport = nvme_get_ctrl_attr(c, "transport");
-
+       /* Parse 'address' string into components */
+       addr = strdup(c->address);
+       a = strtok_r(addr, ",", &e);
+       while (a && strlen(a)) {
+               if (!strncmp(a, "traddr=", 7))
+                       traddr = a + 7;
+               else if (!strncmp(a, "trsvcid=", 8))
+                       trsvcid = a + 8;
+               else if (!strncmp(a, "host_traddr=", 12))
+                       host_traddr = a + 12;
+               a = strtok_r(NULL, ",", &e);
+       }
+       c->traddr = strdup(traddr);
+       if (trsvcid)
+               c->trsvcid = strdup(trsvcid);
+       if (host_traddr)
+               c->host_traddr = strdup(host_traddr);
+       free(addr);
        return c;
 
 free_ctrl:
index dc52597485f6efc98eb8c51ae3be266cfb71c618..d936d2cb8cfa21c00345f14f143d744b03c7c76e 100644 (file)
@@ -587,6 +587,30 @@ const char *nvme_ctrl_get_subsysnqn(nvme_ctrl_t c);
  */
 nvme_subsystem_t nvme_ctrl_get_subsystem(nvme_ctrl_t c);
 
+/**
+ * nvme_ctrl_get_traddr() -
+ * @c:
+ *
+ * Return:
+ */
+const char *nvme_ctrl_get_traddr(nvme_ctrl_t c);
+
+/**
+ * nvme_ctrl_get_trsvcid() -
+ * @c:
+ *
+ * Return:
+ */
+const char *nvme_ctrl_get_trsvcid(nvme_ctrl_t c);
+
+/**
+ * nvme_ctrl_get_host_traddr() -
+ * @c:
+ *
+ * Return:
+ */
+const char *nvme_ctrl_get_host_traddr(nvme_ctrl_t c);
+
 /**
  * nvme_ctrl_identify() -
  * @c: