[systemd-devel] [PATCH 2/2] tests: Add test-bus-kernel-monitor
Lennart Poettering
lennart at poettering.net
Tue Dec 10 12:34:46 PST 2013
On Tue, 03.12.13 15:17, Lukasz Skalski (l.skalski at partner.samsung.com) wrote:
> test-bus-kernel-monitor is very simple program used to monitor all
> messages/signals going through a kdbus message bus. It allows
> monitor an arbitrary kernel bus given at --bus_path parameter and
> also monitor system and session kernel bus (implemented but disabled
> at this moment).
We already have this as supported tool in "busctl monitor". It would be great to
beef up that!
> ---
> Makefile.am | 12 ++
> src/libsystemd-bus/test-bus-kernel-monitor.c | 179 +++++++++++++++++++++++++++
> 2 files changed, 191 insertions(+)
> create mode 100644 src/libsystemd-bus/test-bus-kernel-monitor.c
>
> diff --git a/Makefile.am b/Makefile.am
> index 7c62414..a4752a2 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -2058,6 +2058,7 @@ tests += \
> test-bus-kernel \
> test-bus-kernel-bloom \
> test-bus-kernel-benchmark \
> + test-bus-kernel-monitor \
> test-bus-memfd \
> test-bus-zero-copy \
> test-bus-introspect \
> @@ -2202,6 +2203,17 @@ test_bus_kernel_benchmark_LDADD = \
> libsystemd-daemon-internal.la \
> libsystemd-shared.la
>
> +test_bus_kernel_monitor_SOURCES = \
> + src/libsystemd-bus/test-bus-kernel-monitor.c
> +
> +test_bus_kernel_monitor_LDADD = \
> + libsystemd-bus-internal.la \
> + libsystemd-id128-internal.la \
> + libsystemd-daemon-internal.la \
> + libsystemd-shared.la \
> + libsystemd-bus-dump.la \
> + libsystemd-capability.la
> +
> test_bus_memfd_SOURCES = \
> src/libsystemd-bus/test-bus-memfd.c
>
> diff --git a/src/libsystemd-bus/test-bus-kernel-monitor.c b/src/libsystemd-bus/test-bus-kernel-monitor.c
> new file mode 100644
> index 0000000..27642d2
> --- /dev/null
> +++ b/src/libsystemd-bus/test-bus-kernel-monitor.c
> @@ -0,0 +1,179 @@
> +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
> +
> +/***
> + This file is part of systemd.
> +
> + Copyright 2013 Lukasz Skalski
> +
> + systemd is free software; you can redistribute it and/or modify it
> + under the terms of the GNU Lesser General Public License as published by
> + the Free Software Foundation; either version 2.1 of the License, or
> + (at your option) any later version.
> +
> + systemd is distributed in the hope that it will be useful, but
> + WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public License
> + along with systemd; If not, see <http://www.gnu.org/licenses/>.
> +***/
> +
> +#include <getopt.h>
> +#include <signal.h>
> +
> +#include "log.h"
> +#include "sd-bus.h"
> +#include "bus-message.h"
> +#include "bus-kernel.h"
> +#include "bus-util.h"
> +#include "bus-dump.h"
> +
> +#define DEFAULT_BUS_KERNEL_PATH "kernel:path=/dev/kdbus/deine-mutter/bus"
> +
> +sd_bus *bus = NULL;
> +sd_bus_message *msg = NULL;
> +const char *arg_address = DEFAULT_BUS_KERNEL_PATH;
> +//static bool arg_user = false;
> +
> +
> +static int help(void) {
> +
> + printf("%s [OPTIONS...]\n\n"
> + "Monitor the kernel bus.\n\n"
> + " --help Show this help\n"
> + " --bus_path=PATH Path to the kernel bus (default: %s)\n",
> + //" --system Connect to system bus\n"
> + //" --user Connect to user bus\n"
> + program_invocation_short_name, DEFAULT_BUS_KERNEL_PATH);
> +
> + return 0;
> +}
> +
> +static int parse_argv(int argc, char *argv[]) {
> +
> + enum {
> + ARG_ADDRESS,
> + ARG_SYSTEM,
> + ARG_USER,
> + };
> +
> + static const struct option options[] = {
> + { "help", no_argument, NULL, 'h' },
> + { "bus_path", required_argument, NULL, ARG_ADDRESS },
> + { "system", no_argument, NULL, ARG_SYSTEM },
> + { "user", no_argument, NULL, ARG_USER },
> + {},
> + };
> +
> + int c;
> +
> + assert(argc >= 0);
> + assert(argv);
> +
> + while ((c = getopt_long(argc, argv, "", options, NULL)) >= 0) {
> +
> + switch (c) {
> +
> + case 'h':
> + return help();
> +
> + case ARG_ADDRESS:
> + arg_address = optarg;
> + break;
> +
> + /*
> + case ARG_USER:
> + arg_user = true;
> + break;
> +
> + case ARG_SYSTEM:
> + arg_user = false;
> + break;
> + */
> +
> + case '?':
> + return -EINVAL;
> +
> + default:
> + assert_not_reached("Unhandled option");
> + }
> + }
> +
> + return 1;
> +}
> +
> +static void do_exit(int sig_no) {
> +
> + sd_bus_unref(bus);
> + exit (EXIT_SUCCESS);
> +}
> +
> +int main(int argc, char *argv[]) {
> +
> + int r;
> +
> + log_set_max_level(LOG_DEBUG);
> +
> + if (signal(SIGINT, do_exit) == SIG_ERR)
> + return EXIT_TEST_SKIP;
> +
> + r = parse_argv(argc, argv);
> + if (r <= 0)
> + return EXIT_TEST_SKIP;
> +
> + if (arg_address) {
> + r = sd_bus_new(&bus);
> + if (r < 0) {
> + log_error("Failed to allocate bus: %s", strerror(-r));
> + return EXIT_TEST_SKIP;
> + }
> +
> + r = sd_bus_set_address(bus, arg_address);
> + if (r < 0) {
> + log_error("Failed to set address: %s", strerror(-r));
> + return EXIT_TEST_SKIP;
> + }
> +
> + r = sd_bus_start(bus);
> + if (r < 0) {
> + log_error("Failed to bus start: %s", strerror(-r));
> + return EXIT_TEST_SKIP;
> + }
> +
> + r = sd_bus_start(bus);
> + }
> + /*
> + else {
> + if (arg_user)
> + r = sd_bus_default_user(&bus);
> + else
> + r = sd_bus_default_system(&bus);
> + }
> + */
> +
> + r = bus_kernel_monitor(bus);
> + if (r < 0) {
> + log_error("Failed to enable monitor mode: %s", strerror(-r));
> + return EXIT_TEST_SKIP;
> + }
> +
> + r = sd_bus_add_match(bus,"", NULL, NULL);
> + assert_se(r >= 0);
> +
> + for(;;) {
> + r = sd_bus_process(bus, &msg);
> + assert_se(r >= 0);
> +
> + if (r == 0)
> + assert_se(sd_bus_wait(bus, (usec_t) -1) >= 0);
> + if (!msg)
> + continue;
> +
> + bus_message_dump(msg, stdout, true);
> + sd_bus_message_unref(msg);
> + msg = NULL;
> + }
> +
> + return 0;
> +}
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list