chiark / gitweb /
bus: parse uid/gid/pid/tid meta data from kdbus messages
[elogind.git] / src / libsystemd-bus / bus-match.c
index 972ac8e00ebfa817ff0c9bb33598b71c83251a3a..fed25c1a2aeda0576e0a52818cf0a66ac0833746 100644 (file)
@@ -212,6 +212,9 @@ int bus_match_run(
         if (!node)
                 return 0;
 
         if (!node)
                 return 0;
 
+        if (bus && bus->match_callbacks_modified)
+                return 0;
+
         /* Not these special semantics: when traversing the tree we
          * usually let bus_match_run() when called for a node
          * recursively invoke bus_match_run(). There's are two
         /* Not these special semantics: when traversing the tree we
          * usually let bus_match_run() when called for a node
          * recursively invoke bus_match_run(). There's are two
@@ -241,6 +244,13 @@ int bus_match_run(
 
         case BUS_MATCH_LEAF:
 
 
         case BUS_MATCH_LEAF:
 
+                if (bus) {
+                        if (node->leaf.last_iteration == bus->iteration_counter)
+                                return 0;
+
+                        node->leaf.last_iteration = bus->iteration_counter;
+                }
+
                 /* Run the callback. And then invoke siblings. */
                 assert(node->leaf.callback);
                 r = node->leaf.callback(bus, ret, m, node->leaf.userdata);
                 /* Run the callback. And then invoke siblings. */
                 assert(node->leaf.callback);
                 r = node->leaf.callback(bus, ret, m, node->leaf.userdata);
@@ -323,6 +333,9 @@ int bus_match_run(
                 }
         }
 
                 }
         }
 
+        if (bus && bus->match_callbacks_modified)
+                return 0;
+
         /* And now, let's invoke our siblings */
         return bus_match_run(bus, node->next, ret, m);
 }
         /* And now, let's invoke our siblings */
         return bus_match_run(bus, node->next, ret, m);
 }