]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
busctl: use Monitoring interface (#3245)
authorLars Uebernickel <lars@uebernic.de>
Sat, 14 May 2016 20:10:22 +0000 (22:10 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sat, 14 May 2016 20:10:22 +0000 (16:10 -0400)
This is now the recommended way to do monitoring by upstream D-Bus.
It's also allowed in the default policy, whereas eavesdrop is not
anymore, which effectively broke busctl on many systems.

src/libsystemd/sd-bus/busctl.c

index 6fdb474b5ec733511b453a7b858b9abba00b7e61..bfe967bfb05233eb542ce89c7b4210bb1065e1f0 100644 (file)
@@ -1079,10 +1079,21 @@ static int message_pcap(sd_bus_message *m, FILE *f) {
 }
 
 static int monitor(sd_bus *bus, char *argv[], int (*dump)(sd_bus_message *m, FILE *f)) {
-        bool added_something = false;
+        _cleanup_(sd_bus_message_unrefp) sd_bus_message *message = NULL;
+        _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         char **i;
+        uint32_t flags = 0;
         int r;
 
+        /* upgrade connection; it's not used for anything else after this call */
+        r = sd_bus_message_new_method_call(bus, &message, "org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus.Monitoring", "BecomeMonitor");
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_open_container(message, 'a', "s");
+        if (r < 0)
+                return bus_log_create_error(r);
+
         STRV_FOREACH(i, argv+1) {
                 _cleanup_free_ char *m = NULL;
 
@@ -1095,34 +1106,38 @@ static int monitor(sd_bus *bus, char *argv[], int (*dump)(sd_bus_message *m, FIL
                 if (!m)
                         return log_oom();
 
-                r = sd_bus_add_match(bus, NULL, m, NULL, NULL);
+                r = sd_bus_message_append_basic(message, 's', m);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add match: %m");
+                        return bus_log_create_error(r);
 
                 free(m);
                 m = strjoin("destination='", *i, "'", NULL);
                 if (!m)
                         return log_oom();
 
-                r = sd_bus_add_match(bus, NULL, m, NULL, NULL);
+                r = sd_bus_message_append_basic(message, 's', m);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add match: %m");
-
-                added_something = true;
+                        return bus_log_create_error(r);
         }
 
         STRV_FOREACH(i, arg_matches) {
-                r = sd_bus_add_match(bus, NULL, *i, NULL, NULL);
+                r = sd_bus_message_append_basic(message, 's', *i);
                 if (r < 0)
-                        return log_error_errno(r, "Failed to add match: %m");
-
-                added_something = true;
+                        return bus_log_create_error(r);
         }
 
-        if (!added_something) {
-                r = sd_bus_add_match(bus, NULL, "", NULL, NULL);
-                if (r < 0)
-                        return log_error_errno(r, "Failed to add match: %m");
+        r = sd_bus_message_close_container(message);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_message_append_basic(message, 'u', &flags);
+        if (r < 0)
+                return bus_log_create_error(r);
+
+        r = sd_bus_call(bus, message, arg_timeout, &error, NULL);
+        if (r < 0) {
+                log_error("%s", bus_error_message(&error, r));
+                return r;
         }
 
         log_info("Monitoring bus message stream.");