qdev: Relax parsing of bus option

Treat multiple successive slashes as a one slash.  Ignore trailing
slashes.  This is how POSIX pathnames work.
This commit is contained in:
Markus Armbruster 2010-02-19 16:09:25 +01:00
parent fdcfa190ab
commit fc98eb430e

View File

@ -555,8 +555,8 @@ static BusState *qbus_find(const char *path)
pos = 0;
} else {
if (sscanf(path, "%127[^/]%n", elem, &len) != 1) {
error_report("path parse error (\"%s\")", path);
return NULL;
assert(!path[0]);
elem[0] = len = 0;
}
bus = qbus_find_recursive(main_system_bus, elem, NULL);
if (!bus) {
@ -567,15 +567,18 @@ static BusState *qbus_find(const char *path)
}
for (;;) {
assert(path[pos] == '/' || !path[pos]);
while (path[pos] == '/') {
pos++;
}
if (path[pos] == '\0') {
/* we are done */
return bus;
}
/* find device */
if (sscanf(path+pos, "/%127[^/]%n", elem, &len) != 1) {
error_report("path parse error (\"%s\" pos %d)", path, pos);
return NULL;
if (sscanf(path+pos, "%127[^/]%n", elem, &len) != 1) {
assert(0);
elem[0] = len = 0;
}
pos += len;
dev = qbus_find_dev(bus, elem);
@ -584,6 +587,11 @@ static BusState *qbus_find(const char *path)
qbus_list_dev(bus);
return NULL;
}
assert(path[pos] == '/' || !path[pos]);
while (path[pos] == '/') {
pos++;
}
if (path[pos] == '\0') {
/* last specified element is a device. If it has exactly
* one child bus accept it nevertheless */
@ -601,9 +609,9 @@ static BusState *qbus_find(const char *path)
}
/* find bus */
if (sscanf(path+pos, "/%127[^/]%n", elem, &len) != 1) {
error_report("path parse error (\"%s\" pos %d)", path, pos);
return NULL;
if (sscanf(path+pos, "%127[^/]%n", elem, &len) != 1) {
assert(0);
elem[0] = len = 0;
}
pos += len;
bus = qbus_find_bus(dev, elem);