chiark / gitweb /
bus: allow omitting quotes for values in match strings
authorLennart Poettering <lennart@poettering.net>
Wed, 8 Jan 2014 10:09:25 +0000 (18:09 +0800)
committerLennart Poettering <lennart@poettering.net>
Wed, 8 Jan 2014 10:11:10 +0000 (18:11 +0800)
dbus-daemon allows this, the dbus specification doesn't explicitly say
anything about it, so let's follow dbus-daemon on this.

src/libsystemd-bus/bus-match.c
src/libsystemd-bus/test-bus-match.c

index 34488d8..ffc9756 100644 (file)
@@ -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 */
index 25d2b92..7227e25 100644 (file)
@@ -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);