diff options
author | Lennart Poettering <lennart@poettering.net> | 2014-01-08 18:09:25 +0800 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2014-01-08 18:11:10 +0800 |
commit | bc6422cbd1dfc258fb2b4909a2a25ad356e63400 (patch) | |
tree | 845032997ffbec8f65c66565510c1a890356ef6d /src/libsystemd-bus | |
parent | e79e8afd62bdec28a88d52fa0761aff9ce145b77 (diff) |
bus: allow omitting quotes for values in match strings
dbus-daemon allows this, the dbus specification doesn't explicitly say
anything about it, so let's follow dbus-daemon on this.
Diffstat (limited to 'src/libsystemd-bus')
-rw-r--r-- | src/libsystemd-bus/bus-match.c | 42 | ||||
-rw-r--r-- | src/libsystemd-bus/test-bus-match.c | 2 |
2 files changed, 30 insertions, 14 deletions
diff --git a/src/libsystemd-bus/bus-match.c b/src/libsystemd-bus/bus-match.c index 34488d8673..ffc97562fd 100644 --- a/src/libsystemd-bus/bus-match.c +++ b/src/libsystemd-bus/bus-match.c @@ -726,25 +726,31 @@ int bus_match_parse( enum bus_match_node_type t; unsigned j = 0; size_t value_allocated = 0; - bool escaped = false; + bool escaped = false, quoted; uint8_t u; eq = strchr(p, '='); if (!eq) return -EINVAL; - if (eq[1] != '\'') - return -EINVAL; - t = bus_match_node_type_from_string(p, eq - p); if (t < 0) return -EINVAL; - for (q = eq + 2;; q++) { + quoted = eq[1] == '\''; + + for (q = eq + 1 + quoted;; q++) { if (*q == 0) { - r = -EINVAL; - goto fail; + + if (quoted) { + r = -EINVAL; + goto fail; + } else { + if (value) + value[j] = 0; + break; + } } if (!escaped) { @@ -752,10 +758,20 @@ int bus_match_parse( escaped = true; continue; } - if (*q == '\'') { - if (value) - value[j] = 0; - break; + + if (quoted) { + if (*q == '\'') { + if (value) + value[j] = 0; + break; + } + } else { + if (*q == ',') { + if (value) + value[j] = 0; + + break; + } } } @@ -801,12 +817,12 @@ int bus_match_parse( if (q[1] == 0) break; - if (q[1] != ',') { + if (q[quoted] != ',') { r = -EINVAL; goto fail; } - p = q + 2; + p = q + 1 + quoted; } /* Order the whole thing, so that we always generate the same tree */ diff --git a/src/libsystemd-bus/test-bus-match.c b/src/libsystemd-bus/test-bus-match.c index 25d2b927ed..7227e2585d 100644 --- a/src/libsystemd-bus/test-bus-match.c +++ b/src/libsystemd-bus/test-bus-match.c @@ -107,7 +107,7 @@ int main(int argc, char *argv[]) { assert_se(match_add(&root, "path_namespace='/foo/quux'", 11) >= 0); assert_se(match_add(&root, "arg1='two'", 12) >= 0); assert_se(match_add(&root, "member='waldo',arg2path='/prefix/'", 13) >= 0); - assert_se(match_add(&root, "member='waldo',path='/foo/bar',arg3namespace='prefix'", 14) >= 0); + assert_se(match_add(&root, "member=waldo,path='/foo/bar',arg3namespace='prefix'", 14) >= 0); bus_match_dump(&root, 0); |