aboutsummaryrefslogtreecommitdiff
path: root/hw/qdev.c
diff options
context:
space:
mode:
authorMarkus Armbruster <armbru@redhat.com>2010-02-19 16:09:25 +0100
committerMarkus Armbruster <armbru@redhat.com>2010-03-16 17:45:34 +0100
commitfc98eb430e49077710b0a6f287fc685c78e12556 (patch)
tree4477fd49284728941cf6a9972bf508413f2d4582 /hw/qdev.c
parentfdcfa190ab3f042339bcd77c640b20dec73d715e (diff)
qdev: Relax parsing of bus option
Treat multiple successive slashes as a one slash. Ignore trailing slashes. This is how POSIX pathnames work.
Diffstat (limited to 'hw/qdev.c')
-rw-r--r--hw/qdev.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/hw/qdev.c b/hw/qdev.c
index 36f2bd6189..790e90f552 100644
--- a/hw/qdev.c
+++ b/hw/qdev.c
@@ -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);