From: Hannes Reinecke Date: Fri, 19 Mar 2021 09:50:37 +0000 (+0100) Subject: Parse 'address' string into components X-Git-Tag: v1.0-rc0~133^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=1ceab68e3676af1d792c646825faf6c6ada91cec;p=users%2Fsagi%2Flibnvme.git Parse 'address' string into components 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 --- diff --git a/src/nvme/tree.c b/src/nvme/tree.c index 74aba7df..5d5e5efc 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -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: diff --git a/src/nvme/tree.h b/src/nvme/tree.h index dc525974..d936d2cb 100644 --- a/src/nvme/tree.h +++ b/src/nvme/tree.h @@ -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: