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 <seth.howell@intel.com>
Reviewed-on: https://review.gerrithub.io/437739
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Seth Howell 2018-12-18 13:44:37 -07:00 committed by Jim Harris
parent 3d4c012a2e
commit 672115fef4

View File

@ -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);