From 672115fef41125b8c8f899e9c00839e67be9f62b Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Tue, 18 Dec 2018 13:44:37 -0700 Subject: [PATCH] nvme.c: break out parsing from trid parse This code snippet will be generally useful for parsing information when we add support for host address configuration. Change-Id: Ic90f485de5a5db699901da029c9a29be4db477c7 Signed-off-by: Seth Howell Reviewed-on: https://review.gerrithub.io/437739 Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Ben Walker Chandler-Test-Pool: SPDK Automated Test System Tested-by: SPDK CI Jenkins --- lib/nvme/nvme.c | 97 +++++++++++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 40 deletions(-) diff --git a/lib/nvme/nvme.c b/lib/nvme/nvme.c index 2641062c3..b2da4527d 100644 --- a/lib/nvme/nvme.c +++ b/lib/nvme/nvme.c @@ -722,12 +722,65 @@ spdk_nvme_transport_id_adrfam_str(enum spdk_nvmf_adrfam adrfam) } } -int -spdk_nvme_transport_id_parse(struct spdk_nvme_transport_id *trid, const char *str) +static size_t +parse_next_key(const char **str, char *key, char *val, size_t key_buf_size, size_t val_buf_size) { + const char *sep, *sep1; const char *whitespace = " \t\n"; size_t key_len, val_len; + + *str += strspn(*str, whitespace); + + sep = strchr(*str, ':'); + if (!sep) { + sep = strchr(*str, '='); + if (!sep) { + SPDK_ERRLOG("Key without ':' or '=' separator\n"); + return 0; + } + } else { + sep1 = strchr(*str, '='); + if ((sep1 != NULL) && (sep1 < sep)) { + sep = sep1; + } + } + + key_len = sep - *str; + if (key_len >= key_buf_size) { + SPDK_ERRLOG("Key length %zu greater than maximum allowed %zu\n", + key_len, key_buf_size - 1); + return 0; + } + + memcpy(key, *str, key_len); + key[key_len] = '\0'; + + *str += key_len + 1; /* Skip key: */ + val_len = strcspn(*str, whitespace); + if (val_len == 0) { + SPDK_ERRLOG("Key without value\n"); + return 0; + } + + if (val_len >= val_buf_size) { + SPDK_ERRLOG("Value length %zu greater than maximum allowed %zu\n", + val_len, val_buf_size - 1); + return 0; + } + + memcpy(val, *str, val_len); + val[val_len] = '\0'; + + *str += val_len; + + return val_len; +} + +int +spdk_nvme_transport_id_parse(struct spdk_nvme_transport_id *trid, const char *str) +{ + size_t val_len; char key[32]; char val[1024]; @@ -736,50 +789,14 @@ spdk_nvme_transport_id_parse(struct spdk_nvme_transport_id *trid, const char *st } while (*str != '\0') { - str += strspn(str, whitespace); - sep = strchr(str, ':'); - if (!sep) { - sep = strchr(str, '='); - if (!sep) { - SPDK_ERRLOG("Key without ':' or '=' separator\n"); - return -EINVAL; - } - } else { - sep1 = strchr(str, '='); - if ((sep1 != NULL) && (sep1 < sep)) { - sep = sep1; - } - } + val_len = parse_next_key(&str, key, val, sizeof(key), sizeof(val)); - key_len = sep - str; - if (key_len >= sizeof(key)) { - SPDK_ERRLOG("Transport key length %zu greater than maximum allowed %zu\n", - key_len, sizeof(key) - 1); - return -EINVAL; - } - - memcpy(key, str, key_len); - key[key_len] = '\0'; - - str += key_len + 1; /* Skip key: */ - val_len = strcspn(str, whitespace); if (val_len == 0) { - SPDK_ERRLOG("Key without value\n"); + SPDK_ERRLOG("Failed to parse transport ID\n"); return -EINVAL; } - if (val_len >= sizeof(val)) { - SPDK_ERRLOG("Transport value length %zu greater than maximum allowed %zu\n", - val_len, sizeof(val) - 1); - return -EINVAL; - } - - memcpy(val, str, val_len); - val[val_len] = '\0'; - - str += val_len; - if (strcasecmp(key, "trtype") == 0) { if (spdk_nvme_transport_id_parse_trtype(&trid->trtype, val) != 0) { SPDK_ERRLOG("Unknown trtype '%s'\n", val);