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
|
static size_t
|
||||||
spdk_nvme_transport_id_parse(struct spdk_nvme_transport_id *trid, const char *str)
|
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 *sep, *sep1;
|
||||||
const char *whitespace = " \t\n";
|
const char *whitespace = " \t\n";
|
||||||
size_t key_len, val_len;
|
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 key[32];
|
||||||
char val[1024];
|
char val[1024];
|
||||||
|
|
||||||
@ -736,50 +789,14 @@ spdk_nvme_transport_id_parse(struct spdk_nvme_transport_id *trid, const char *st
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (*str != '\0') {
|
while (*str != '\0') {
|
||||||
str += strspn(str, whitespace);
|
|
||||||
|
|
||||||
sep = strchr(str, ':');
|
val_len = parse_next_key(&str, key, val, sizeof(key), sizeof(val));
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
if (val_len == 0) {
|
||||||
SPDK_ERRLOG("Key without value\n");
|
SPDK_ERRLOG("Failed to parse transport ID\n");
|
||||||
return -EINVAL;
|
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 (strcasecmp(key, "trtype") == 0) {
|
||||||
if (spdk_nvme_transport_id_parse_trtype(&trid->trtype, val) != 0) {
|
if (spdk_nvme_transport_id_parse_trtype(&trid->trtype, val) != 0) {
|
||||||
SPDK_ERRLOG("Unknown trtype '%s'\n", val);
|
SPDK_ERRLOG("Unknown trtype '%s'\n", val);
|
||||||
|
Loading…
Reference in New Issue
Block a user