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:
parent
3d4c012a2e
commit
672115fef4
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user