From 058bccbecb7e5f34eceaa6152698f463a5227342 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 12 Oct 2024 09:49:23 +0900 Subject: [PATCH] bus-message-util: introduce bus_message_dump_fd() and _string() Then, use them in analyze and oomctl. --- src/analyze/analyze-dump.c | 22 +++++---------------- src/analyze/analyze-malloc.c | 3 ++- src/analyze/analyze.c | 17 ----------------- src/analyze/analyze.h | 2 -- src/oom/oomctl.c | 10 ++-------- src/shared/bus-message-util.c | 36 ++++++++++++++++++++++++++++++++++- src/shared/bus-message-util.h | 3 +++ 7 files changed, 47 insertions(+), 46 deletions(-) diff --git a/src/analyze/analyze-dump.c b/src/analyze/analyze-dump.c index f1bcb5b13c5..4ca6278d6ac 100644 --- a/src/analyze/analyze-dump.c +++ b/src/analyze/analyze-dump.c @@ -6,13 +6,12 @@ #include "analyze.h" #include "bus-error.h" #include "bus-locator.h" +#include "bus-message-util.h" #include "bus-util.h" -#include "copy.h" static int dump_string(sd_bus *bus) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; - const char *text; int r; assert(bus); @@ -21,12 +20,7 @@ static int dump_string(sd_bus *bus) { if (r < 0) return log_error_errno(r, "Failed to call Dump: %s", bus_error_message(&error, r)); - r = sd_bus_message_read(reply, "s", &text); - if (r < 0) - return bus_log_parse_error(r); - - fputs(text, stdout); - return 0; + return bus_message_dump_string(reply); } static int dump_fd(sd_bus *bus) { @@ -43,13 +37,12 @@ static int dump_fd(sd_bus *bus) { return log_error_errno(r, "Failed to call DumpByFileDescriptor: %s", bus_error_message(&error, r)); - return dump_fd_reply(reply); + return bus_message_dump_fd(reply); } static int dump_patterns_string(sd_bus *bus, char **patterns) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL, *m = NULL; - const char *text; int r; if (strv_isempty(patterns)) @@ -68,12 +61,7 @@ static int dump_patterns_string(sd_bus *bus, char **patterns) { return log_error_errno(r, "Failed to call DumpUnitsMatchingPatterns: %s", bus_error_message(&error, r)); - r = sd_bus_message_read(reply, "s", &text); - if (r < 0) - return bus_log_parse_error(r); - - fputs(text, stdout); - return 0; + return bus_message_dump_string(reply); } static int dump_patterns_fd(sd_bus *bus, char **patterns) { @@ -97,7 +85,7 @@ static int dump_patterns_fd(sd_bus *bus, char **patterns) { return log_error_errno(r, "Failed to call DumpUnitsMatchingPatternsByFileDescriptor: %s", bus_error_message(&error, r)); - return dump_fd_reply(reply); + return bus_message_dump_fd(reply); } static int mangle_patterns(char **args, char ***ret) { diff --git a/src/analyze/analyze-malloc.c b/src/analyze/analyze-malloc.c index 514526d1425..9eb234e6690 100644 --- a/src/analyze/analyze-malloc.c +++ b/src/analyze/analyze-malloc.c @@ -6,6 +6,7 @@ #include "analyze.h" #include "bus-error.h" #include "bus-internal.h" +#include "bus-message-util.h" static int dump_malloc_info(sd_bus *bus, char *service) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; @@ -26,7 +27,7 @@ static int dump_malloc_info(sd_bus *bus, char *service) { if (r < 0) return log_error_errno(r, "Failed to call GetMallocInfo on '%s': %s", service, bus_error_message(&error, r)); - return dump_fd_reply(reply); + return bus_message_dump_fd(reply); } int verb_malloc(int argc, char *argv[], void *userdata) { diff --git a/src/analyze/analyze.c b/src/analyze/analyze.c index 24188311ff4..5aba273ca6c 100644 --- a/src/analyze/analyze.c +++ b/src/analyze/analyze.c @@ -179,23 +179,6 @@ void time_parsing_hint(const char *p, bool calendar, bool timestamp, bool timesp "Use 'systemd-analyze timespan \"%s\"' instead?", p); } -int dump_fd_reply(sd_bus_message *message) { - int fd, r; - - assert(message); - - r = sd_bus_message_read(message, "h", &fd); - if (r < 0) - return bus_log_parse_error(r); - - fflush(stdout); - r = copy_bytes(fd, STDOUT_FILENO, UINT64_MAX, 0); - if (r < 0) - return r; - - return 1; /* Success */ -} - static int help(int argc, char *argv[], void *userdata) { _cleanup_free_ char *link = NULL, *dot_link = NULL; int r; diff --git a/src/analyze/analyze.h b/src/analyze/analyze.h index 48d9fabbd04..959b8a1b850 100644 --- a/src/analyze/analyze.h +++ b/src/analyze/analyze.h @@ -57,5 +57,3 @@ int acquire_bus(sd_bus **bus, bool *use_full_bus); int bus_get_unit_property_strv(sd_bus *bus, const char *path, const char *property, char ***strv); void time_parsing_hint(const char *p, bool calendar, bool timestamp, bool timespan); - -int dump_fd_reply(sd_bus_message *message); diff --git a/src/oom/oomctl.c b/src/oom/oomctl.c index 00914f35df4..b206a78c3da 100644 --- a/src/oom/oomctl.c +++ b/src/oom/oomctl.c @@ -6,7 +6,7 @@ #include "build.h" #include "bus-error.h" #include "bus-locator.h" -#include "copy.h" +#include "bus-message-util.h" #include "main-func.h" #include "pretty-print.h" #include "terminal-util.h" @@ -47,7 +47,6 @@ static int dump_state(int argc, char *argv[], void *userdata) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; _cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL; _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL; - int fd = -EBADF; int r; r = sd_bus_open_system(&bus); @@ -60,12 +59,7 @@ static int dump_state(int argc, char *argv[], void *userdata) { if (r < 0) return log_error_errno(r, "Failed to dump context: %s", bus_error_message(&error, r)); - r = sd_bus_message_read(reply, "h", &fd); - if (r < 0) - return bus_log_parse_error(r); - - fflush(stdout); - return copy_bytes(fd, STDOUT_FILENO, UINT64_MAX, 0); + return bus_message_dump_fd(reply); } static int parse_argv(int argc, char *argv[]) { diff --git a/src/shared/bus-message-util.c b/src/shared/bus-message-util.c index 53f63508ebc..d8c483ef62b 100644 --- a/src/shared/bus-message-util.c +++ b/src/shared/bus-message-util.c @@ -1,7 +1,10 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include "bus-message-util.h" +#include +#include "bus-message-util.h" +#include "bus-util.h" +#include "copy.h" #include "resolve-util.h" int bus_message_read_ifindex(sd_bus_message *message, sd_bus_error *error, int *ret) { @@ -183,3 +186,34 @@ clear: return r; } + +int bus_message_dump_string(sd_bus_message *message) { + const char *s; + int r; + + assert(message); + + r = sd_bus_message_read(message, "s", &s); + if (r < 0) + return bus_log_parse_error(r); + + fputs(s, stdout); + return 0; +} + +int bus_message_dump_fd(sd_bus_message *message) { + int fd, r; + + assert(message); + + r = sd_bus_message_read(message, "h", &fd); + if (r < 0) + return bus_log_parse_error(r); + + fflush(stdout); + r = copy_bytes(fd, STDOUT_FILENO, UINT64_MAX, 0); + if (r < 0) + return log_error_errno(r, "Failed to dump contents in received file descriptor: %m"); + + return 0; +} diff --git a/src/shared/bus-message-util.h b/src/shared/bus-message-util.h index b82c0830a07..50025766c2e 100644 --- a/src/shared/bus-message-util.h +++ b/src/shared/bus-message-util.h @@ -16,3 +16,6 @@ int bus_message_read_dns_servers( bool extended, struct in_addr_full ***ret_dns, size_t *ret_n_dns); + +int bus_message_dump_string(sd_bus_message *message); +int bus_message_dump_fd(sd_bus_message *message); -- 2.47.3