]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
busctl: support json mode also for 'busctl monitor'
authorLennart Poettering <lennart@poettering.net>
Tue, 27 Nov 2018 19:07:58 +0000 (20:07 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 28 Nov 2018 07:38:55 +0000 (08:38 +0100)
src/busctl/busctl.c

index 04c0b73fd2fe4465538b022590d3750bdcc1edfd..aa96fd12a9612ea7967106cb0f11085267c261c1 100644 (file)
@@ -8,6 +8,7 @@
 #include "alloc-util.h"
 #include "bus-dump.h"
 #include "bus-internal.h"
+#include "bus-message.h"
 #include "bus-signature.h"
 #include "bus-type.h"
 #include "bus-util.h"
@@ -62,6 +63,9 @@ STATIC_DESTRUCTOR_REGISTER(arg_matches, strv_freep);
 #define NAME_IS_ACQUIRED INT_TO_PTR(1)
 #define NAME_IS_ACTIVATABLE INT_TO_PTR(2)
 
+static int json_transform_message(sd_bus_message *m, JsonVariant **ret);
+static void json_dump_with_flags(JsonVariant *v, FILE *f);
+
 static int acquire_bus(bool set_monitor, sd_bus **ret) {
         _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
         int r;
@@ -1132,6 +1136,43 @@ static int message_pcap(sd_bus_message *m, FILE *f) {
         return bus_message_pcap_frame(m, arg_snaplen, f);
 }
 
+static int message_json(sd_bus_message *m, FILE *f) {
+        _cleanup_(json_variant_unrefp) JsonVariant *v = NULL, *w = NULL;
+        char e[2];
+        int r;
+
+        r = json_transform_message(m, &v);
+        if (r < 0)
+                return r;
+
+        e[0] = m->header->endian;
+        e[1] = 0;
+
+        r = json_build(&w, JSON_BUILD_OBJECT(
+                                       JSON_BUILD_PAIR("type", JSON_BUILD_STRING(bus_message_type_to_string(m->header->type))),
+                                       JSON_BUILD_PAIR("endian", JSON_BUILD_STRING(e)),
+                                       JSON_BUILD_PAIR("flags", JSON_BUILD_INTEGER(m->header->flags)),
+                                       JSON_BUILD_PAIR("version", JSON_BUILD_INTEGER(m->header->version)),
+                                       JSON_BUILD_PAIR("priority", JSON_BUILD_INTEGER(m->priority)),
+                                       JSON_BUILD_PAIR("cookie", JSON_BUILD_INTEGER(BUS_MESSAGE_COOKIE(m))),
+                                       JSON_BUILD_PAIR("reply_cookie", JSON_BUILD_INTEGER(m->reply_cookie)),
+                                       JSON_BUILD_PAIR("sender", JSON_BUILD_STRING(m->sender)),
+                                       JSON_BUILD_PAIR("destination", JSON_BUILD_STRING(m->destination)),
+                                       JSON_BUILD_PAIR("path", JSON_BUILD_STRING(m->path)),
+                                       JSON_BUILD_PAIR("interface", JSON_BUILD_STRING(m->interface)),
+                                       JSON_BUILD_PAIR("member", JSON_BUILD_STRING(m->member)),
+                                       JSON_BUILD_PAIR("monotonic", JSON_BUILD_INTEGER(m->monotonic)),
+                                       JSON_BUILD_PAIR("realtime", JSON_BUILD_INTEGER(m->realtime)),
+                                       JSON_BUILD_PAIR("seqnum", JSON_BUILD_INTEGER(m->seqnum)),
+                                       JSON_BUILD_PAIR("error_name", JSON_BUILD_STRING(m->error.name)),
+                                       JSON_BUILD_PAIR("payload", JSON_BUILD_VARIANT(v))));
+        if (r < 0)
+                return log_error_errno(r, "Failed to build JSON object: %m");
+
+        json_dump_with_flags(w, f);
+        return 0;
+}
+
 static int monitor(int argc, char **argv, int (*dump)(sd_bus_message *m, FILE *f)) {
         _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
         _cleanup_(sd_bus_message_unrefp) sd_bus_message *message = NULL;
@@ -1251,7 +1292,7 @@ static int monitor(int argc, char **argv, int (*dump)(sd_bus_message *m, FILE *f
 }
 
 static int verb_monitor(int argc, char **argv, void *userdata) {
-        return monitor(argc, argv, message_dump);
+        return monitor(argc, argv, arg_json != JSON_OFF ? message_json : message_dump);
 }
 
 static int verb_capture(int argc, char **argv, void *userdata) {
@@ -2038,7 +2079,7 @@ static int get_property(int argc, char **argv, void *userdata) {
 
                         json_dump_with_flags(v, stdout);
 
-                } else if (arg_verbose)  {
+                } else if (arg_verbose) {
                         (void) pager_open(arg_pager_flags);
 
                         r = bus_message_dump(reply, stdout, BUS_MESSAGE_DUMP_SUBTREE_ONLY);