Revision 16a06b24 block/rbd.c
b/block/rbd.c | ||
---|---|---|
102 | 102 |
*p = NULL; |
103 | 103 |
|
104 | 104 |
if (delim != '\0') { |
105 |
end = strchr(src, delim); |
|
106 |
if (end) { |
|
105 |
for (end = src; *end; ++end) { |
|
106 |
if (*end == delim) { |
|
107 |
break; |
|
108 |
} |
|
109 |
if (*end == '\\' && end[1] != '\0') { |
|
110 |
end++; |
|
111 |
} |
|
112 |
} |
|
113 |
if (*end == delim) { |
|
107 | 114 |
*p = end + 1; |
108 | 115 |
*end = '\0'; |
109 | 116 |
} |
... | ... | |
122 | 129 |
return 0; |
123 | 130 |
} |
124 | 131 |
|
132 |
static void qemu_rbd_unescape(char *src) |
|
133 |
{ |
|
134 |
char *p; |
|
135 |
|
|
136 |
for (p = src; *src; ++src, ++p) { |
|
137 |
if (*src == '\\' && src[1] != '\0') { |
|
138 |
src++; |
|
139 |
} |
|
140 |
*p = *src; |
|
141 |
} |
|
142 |
*p = '\0'; |
|
143 |
} |
|
144 |
|
|
125 | 145 |
static int qemu_rbd_parsename(const char *filename, |
126 | 146 |
char *pool, int pool_len, |
127 | 147 |
char *snap, int snap_len, |
... | ... | |
146 | 166 |
ret = -EINVAL; |
147 | 167 |
goto done; |
148 | 168 |
} |
169 |
qemu_rbd_unescape(pool); |
|
149 | 170 |
|
150 | 171 |
if (strchr(p, '@')) { |
151 | 172 |
ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p); |
... | ... | |
153 | 174 |
goto done; |
154 | 175 |
} |
155 | 176 |
ret = qemu_rbd_next_tok(snap, snap_len, p, ':', "snap name", &p); |
177 |
qemu_rbd_unescape(snap); |
|
156 | 178 |
} else { |
157 | 179 |
ret = qemu_rbd_next_tok(name, name_len, p, ':', "object name", &p); |
158 | 180 |
} |
181 |
qemu_rbd_unescape(name); |
|
159 | 182 |
if (ret < 0 || !p) { |
160 | 183 |
goto done; |
161 | 184 |
} |
... | ... | |
211 | 234 |
if (ret < 0) { |
212 | 235 |
break; |
213 | 236 |
} |
237 |
qemu_rbd_unescape(name); |
|
214 | 238 |
|
215 | 239 |
if (!p) { |
216 | 240 |
error_report("conf option %s has no value", name); |
... | ... | |
223 | 247 |
if (ret < 0) { |
224 | 248 |
break; |
225 | 249 |
} |
250 |
qemu_rbd_unescape(value); |
|
226 | 251 |
|
227 | 252 |
if (strcmp(name, "conf") == 0) { |
228 | 253 |
ret = rados_conf_read_file(cluster, value); |
Also available in: Unified diff