+static int process_driver(sd_bus *a, sd_bus *b, sd_bus_message *m) {
+ int r;
+
+ assert(a);
+ assert(b);
+ assert(m);
+
+ if (!streq_ptr(sd_bus_message_get_destination(m), "org.freedesktop.DBus"))
+ return 0;
+
+ if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "AddMatch")) {
+ const char *match;
+
+ r = sd_bus_message_read(m, "s", &match);
+ if (r < 0)
+ return r;
+
+ r = sd_bus_add_match(a, match, NULL, NULL);
+ if (r < 0)
+ return r;
+
+ return sd_bus_reply_method_return(m, NULL);
+
+ } else if (sd_bus_message_is_method_call(m, "org.freedesktop.DBus", "RemoveMatch")) {
+ const char *match;
+
+ r = sd_bus_message_read(m, "s", &match);
+ if (r < 0)
+ return r;
+
+ r = sd_bus_remove_match(a, match, NULL, NULL);
+ if (r < 0)
+ return r;
+
+ return sd_bus_reply_method_return(m, NULL);
+ } else
+ return 0;
+
+ return r;
+}
+