mirror of https://gitee.com/openkylin/qemu.git
rbd: allow escaping in config string
The config string is variously delimited by =, @, and /, depending on the field. Allow these characters to be escaped by preceeding them with \. Signed-off-by: Sage Weil <sage@newdream.net> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
cf26a4e6f8
commit
16a06b2430
29
block/rbd.c
29
block/rbd.c
|
@ -102,8 +102,15 @@ static int qemu_rbd_next_tok(char *dst, int dst_len,
|
||||||
*p = NULL;
|
*p = NULL;
|
||||||
|
|
||||||
if (delim != '\0') {
|
if (delim != '\0') {
|
||||||
end = strchr(src, delim);
|
for (end = src; *end; ++end) {
|
||||||
if (end) {
|
if (*end == delim) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (*end == '\\' && end[1] != '\0') {
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*end == delim) {
|
||||||
*p = end + 1;
|
*p = end + 1;
|
||||||
*end = '\0';
|
*end = '\0';
|
||||||
}
|
}
|
||||||
|
@ -122,6 +129,19 @@ static int qemu_rbd_next_tok(char *dst, int dst_len,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void qemu_rbd_unescape(char *src)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
for (p = src; *src; ++src, ++p) {
|
||||||
|
if (*src == '\\' && src[1] != '\0') {
|
||||||
|
src++;
|
||||||
|
}
|
||||||
|
*p = *src;
|
||||||
|
}
|
||||||
|
*p = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
static int qemu_rbd_parsename(const char *filename,
|
static int qemu_rbd_parsename(const char *filename,
|
||||||
char *pool, int pool_len,
|
char *pool, int pool_len,
|
||||||
char *snap, int snap_len,
|
char *snap, int snap_len,
|
||||||
|
@ -146,6 +166,7 @@ static int qemu_rbd_parsename(const char *filename,
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
qemu_rbd_unescape(pool);
|
||||||
|
|
||||||
if (strchr(p, '@')) {
|
if (strchr(p, '@')) {
|
||||||
ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p);
|
ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p);
|
||||||
|
@ -153,9 +174,11 @@ static int qemu_rbd_parsename(const char *filename,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
ret = qemu_rbd_next_tok(snap, snap_len, p, ':', "snap name", &p);
|
ret = qemu_rbd_next_tok(snap, snap_len, p, ':', "snap name", &p);
|
||||||
|
qemu_rbd_unescape(snap);
|
||||||
} else {
|
} else {
|
||||||
ret = qemu_rbd_next_tok(name, name_len, p, ':', "object name", &p);
|
ret = qemu_rbd_next_tok(name, name_len, p, ':', "object name", &p);
|
||||||
}
|
}
|
||||||
|
qemu_rbd_unescape(name);
|
||||||
if (ret < 0 || !p) {
|
if (ret < 0 || !p) {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
@ -211,6 +234,7 @@ static int qemu_rbd_set_conf(rados_t cluster, const char *conf)
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
qemu_rbd_unescape(name);
|
||||||
|
|
||||||
if (!p) {
|
if (!p) {
|
||||||
error_report("conf option %s has no value", name);
|
error_report("conf option %s has no value", name);
|
||||||
|
@ -223,6 +247,7 @@ static int qemu_rbd_set_conf(rados_t cluster, const char *conf)
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
qemu_rbd_unescape(value);
|
||||||
|
|
||||||
if (strcmp(name, "conf") == 0) {
|
if (strcmp(name, "conf") == 0) {
|
||||||
ret = rados_conf_read_file(cluster, value);
|
ret = rados_conf_read_file(cluster, value);
|
||||||
|
|
Loading…
Reference in New Issue