From: Yu Watanabe Date: Sun, 27 Apr 2025 13:42:31 +0000 (+0900) Subject: busctl: split out bus_message_dump() X-Git-Tag: v258-rc1~713^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3e45c68aba71792e06842158482d132e57a646b0;p=thirdparty%2Fsystemd.git busctl: split out bus_message_dump() No functional change, just refactoring. --- diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c index a4d5a60f8df..62191262f79 100644 --- a/src/busctl/busctl.c +++ b/src/busctl/busctl.c @@ -1694,6 +1694,73 @@ static int message_append_cmdline(sd_bus_message *m, const char *signature, FDSe return 0; } +static int bus_message_dump(sd_bus_message *m, uint64_t flags) { + const char *contents; + int r; + + assert(m); + + r = sd_bus_message_rewind(m, !FLAGS_SET(flags, SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY)); + if (r < 0) + return log_error_errno(r, "Failed to rewind: %m"); + + if (FLAGS_SET(flags, SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY)) { + r = sd_bus_message_peek_type(m, /* ret_type = */ NULL, &contents); + if (r < 0) + return bus_log_parse_error(r); + + r = sd_bus_message_enter_container(m, 'v', contents); + if (r < 0) + return bus_log_parse_error(r); + } else { + r = sd_bus_message_is_empty(m); + if (r < 0) + return bus_log_parse_error(r); + if (r > 0 || arg_quiet) + return 0; + } + + if (sd_json_format_enabled(arg_json_format_flags)) { + _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; + + if (arg_json_format_flags & (SD_JSON_FORMAT_PRETTY|SD_JSON_FORMAT_PRETTY_AUTO)) + pager_open(arg_pager_flags); + + r = sd_bus_message_dump_json(m, flags, &v); + if (r < 0) + return log_error_errno(r, "Failed to dump DBus message to JSON object: %m"); + + r = sd_json_variant_dump(v, arg_json_format_flags, NULL, NULL); + if (r < 0) + return log_error_errno(r, "Failed to dump JSON object: %m"); + + } else if (arg_verbose) { + pager_open(arg_pager_flags); + + r = sd_bus_message_dump(m, NULL, flags); + if (r < 0) + return log_error_errno(r, "Failed to dump DBus message: %m"); + } else { + + fputs(FLAGS_SET(flags, SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY) ? contents : sd_bus_message_get_signature(m, true), stdout); + fputc(' ', stdout); + + r = format_cmdline(m, stdout, /* needs_space = */ false); + if (r < 0) + return bus_log_parse_error(r); + + fputc('\n', stdout); + } + + if (FLAGS_SET(flags, SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY)) { + r = sd_bus_message_exit_container(m); + if (r < 0) + return bus_log_parse_error(r); + } + + return 0; +} + static int call(int argc, char **argv, void *userdata) { _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; @@ -1758,43 +1825,7 @@ static int call(int argc, char **argv, void *userdata) { return log_error_errno(r, "Call failed: %s", bus_error_message(&error, r)); } - r = sd_bus_message_is_empty(reply); - if (r < 0) - return bus_log_parse_error(r); - if (r > 0 || arg_quiet) - return 0; - - if (sd_json_format_enabled(arg_json_format_flags)) { - _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; - - if (arg_json_format_flags & (SD_JSON_FORMAT_PRETTY|SD_JSON_FORMAT_PRETTY_AUTO)) - pager_open(arg_pager_flags); - - r = sd_bus_message_dump_json(reply, /* flags = */ 0, &v); - if (r < 0) - return r; - - sd_json_variant_dump(v, arg_json_format_flags, NULL, NULL); - - } else if (arg_verbose) { - pager_open(arg_pager_flags); - - r = sd_bus_message_dump(reply, stdout, 0); - if (r < 0) - return log_error_errno(r, "Failed to dump dbus message: %m"); - } else { - - fputs(sd_bus_message_get_signature(reply, true), stdout); - fputc(' ', stdout); - - r = format_cmdline(reply, stdout, false); - if (r < 0) - return bus_log_parse_error(r); - - fputc('\n', stdout); - } - - return 0; + return bus_message_dump(reply, /* flags = */ 0); } static int emit_signal(int argc, char **argv, void *userdata) { @@ -1853,8 +1884,6 @@ static int get_property(int argc, char **argv, void *userdata) { STRV_FOREACH(i, argv + 4) { _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; - const char *contents = NULL; - char type; r = sd_bus_call_method(bus, argv[1], argv[2], "org.freedesktop.DBus.Properties", "Get", @@ -1866,98 +1895,17 @@ static int get_property(int argc, char **argv, void *userdata) { bus_error_message(&error, r)); } - r = sd_bus_message_peek_type(reply, &type, &contents); - if (r < 0) - return bus_log_parse_error(r); - - r = sd_bus_message_enter_container(reply, 'v', contents); - if (r < 0) - return bus_log_parse_error(r); - - if (sd_json_format_enabled(arg_json_format_flags)) { - _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; - - if (arg_json_format_flags & (SD_JSON_FORMAT_PRETTY|SD_JSON_FORMAT_PRETTY_AUTO)) - pager_open(arg_pager_flags); - - r = sd_bus_message_dump_json(reply, SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY, &v); - if (r < 0) - return r; - - sd_json_variant_dump(v, arg_json_format_flags, NULL, NULL); - - } else if (arg_verbose) { - pager_open(arg_pager_flags); - - r = sd_bus_message_dump(reply, stdout, SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY); - if (r < 0) - return r; - } else { - fputs(contents, stdout); - fputc(' ', stdout); - - r = format_cmdline(reply, stdout, false); - if (r < 0) - return bus_log_parse_error(r); - - fputc('\n', stdout); - } - - r = sd_bus_message_exit_container(reply); - if (r < 0) - return bus_log_parse_error(r); - } - - return 0; -} - -static int on_bus_signal_impl(sd_bus_message *msg) { - int r; - - assert(msg); - - r = sd_bus_message_is_empty(msg); - if (r < 0) - return bus_log_parse_error(r); - if (r > 0 || arg_quiet) - return 0; - - if (!FLAGS_SET(arg_json_format_flags, SD_JSON_FORMAT_OFF)) { - _cleanup_(sd_json_variant_unrefp) sd_json_variant *v = NULL; - - if (arg_json_format_flags & (SD_JSON_FORMAT_PRETTY|SD_JSON_FORMAT_PRETTY_AUTO)) - pager_open(arg_pager_flags); - - r = sd_bus_message_dump_json(msg, /* flags = */ 0, &v); + r = bus_message_dump(reply, SD_BUS_MESSAGE_DUMP_SUBTREE_ONLY); if (r < 0) return r; - - sd_json_variant_dump(v, arg_json_format_flags, NULL, NULL); - - } else if (arg_verbose) { - pager_open(arg_pager_flags); - - r = sd_bus_message_dump(msg, stdout, 0); - if (r < 0) - return log_error_errno(r, "Failed to dump dbus message: %m\n"); - } else { - - fputs(sd_bus_message_get_signature(msg, true), stdout); - fputc(' ', stdout); - - r = format_cmdline(msg, stdout, false); - if (r < 0) - return bus_log_parse_error(r); - - fputc('\n', stdout); } return 0; } static int on_bus_signal(sd_bus_message *msg, void *userdata, sd_bus_error *ret_error) { - sd_event *e = sd_bus_get_event(sd_bus_message_get_bus(ASSERT_PTR(msg))); - return sd_event_exit(e, on_bus_signal_impl(msg)); + return sd_event_exit(sd_bus_get_event(sd_bus_message_get_bus(ASSERT_PTR(msg))), + bus_message_dump(msg, /* flags = */ 0)); } static int wait_signal(int argc, char **argv, void *userdata) {