From dd82626a0df2ef5f03c9ebdd527af46ad5439aff Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Oct 16 2020 03:24:37 +0000 Subject: Merge pull request #17361 from keszybz/oomd-introspection-stub Implement --version,--bus-introspect in oomd, add man page for the dbus api --- diff --git a/man/org.freedesktop.oom1.xml b/man/org.freedesktop.oom1.xml new file mode 100644 index 0000000..289a7b6 --- /dev/null +++ b/man/org.freedesktop.oom1.xml @@ -0,0 +1,74 @@ + + + + + + + org.freedesktop.oom1 + systemd + + + + org.freedesktop.oom1 + 5 + + + + org.freedesktop.oom1 + The D-Bus interface of systemd-oomd + + + + Introduction + + + systemd-oomd.service8 + is a system service which implements a userspace out-of-memory (OOM) killer. This page describes the + D-Bus interface. + + + + The Manager Object + + The service exposes the following interfaces on the Manager object on the bus: + + +node /org/freedesktop/oom1 { + interface org.freedesktop.oom1.Manager { + methods: + DumpByFileDescriptor(out h fd); + }; + interface org.freedesktop.DBus.Peer { ... }; + interface org.freedesktop.DBus.Introspectable { ... }; + interface org.freedesktop.DBus.Properties { ... }; +}; + + + + + + + + + + + + + + + + Methods + + ... + + + + + Versioning + + These D-Bus interfaces follow + the usual interface versioning guidelines. + + diff --git a/man/rules/meson.build b/man/rules/meson.build index 806561a..cc3c2ef 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -54,6 +54,7 @@ manpages = [ ['org.freedesktop.locale1', '5', [], 'ENABLE_LOCALED'], ['org.freedesktop.login1', '5', [], 'ENABLE_LOGIND'], ['org.freedesktop.machine1', '5', [], 'ENABLE_MACHINED'], + ['org.freedesktop.oom1', '5', [], 'ENABLE_OOMD'], ['org.freedesktop.resolve1', '5', [], 'ENABLE_RESOLVE'], ['org.freedesktop.systemd1', '5', [], ''], ['org.freedesktop.timedate1', '5', [], 'ENABLE_TIMEDATED'], diff --git a/src/oom/oomd-manager-bus.c b/src/oom/oomd-manager-bus.c index 67c5fbf..0f39a60 100644 --- a/src/oom/oomd-manager-bus.c +++ b/src/oom/oomd-manager-bus.c @@ -29,8 +29,19 @@ static int bus_method_dump_by_fd(sd_bus_message *message, void *userdata, sd_bus return sd_bus_reply_method_return(message, "h", fd); } -const sd_bus_vtable manager_vtable[] = { +static const sd_bus_vtable manager_vtable[] = { SD_BUS_VTABLE_START(0), - SD_BUS_METHOD("DumpByFileDescriptor", NULL, "h", bus_method_dump_by_fd, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD_WITH_NAMES("DumpByFileDescriptor", + NULL,, + "h", + SD_BUS_PARAM(fd), + bus_method_dump_by_fd, + SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_VTABLE_END }; + +const BusObjectImplementation manager_object = { + "/org/freedesktop/oom1", + "org.freedesktop.oom1.Manager", + .vtables = BUS_VTABLES(manager_vtable), +}; diff --git a/src/oom/oomd-manager-bus.h b/src/oom/oomd-manager-bus.h index 60ccf3b..6dd576d 100644 --- a/src/oom/oomd-manager-bus.h +++ b/src/oom/oomd-manager-bus.h @@ -1,8 +1,8 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #pragma once -#include "sd-bus.h" +#include "bus-object.h" typedef struct Manager Manager; -extern const sd_bus_vtable manager_vtable[]; +extern const BusObjectImplementation manager_object; diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c index 49b57a8..9eb8ab9 100644 --- a/src/oom/oomd-manager.c +++ b/src/oom/oomd-manager.c @@ -455,9 +455,9 @@ static int manager_connect_bus(Manager *m) { if (r < 0) return log_error_errno(r, "Failed to connect to bus: %m"); - r = sd_bus_add_object_vtable(m->bus, NULL, "/org/freedesktop/oom1", "org.freedesktop.oom1.Manager", manager_vtable, m); + r = bus_add_implementation(m->bus, &manager_object, m); if (r < 0) - return log_error_errno(r, "Failed to add manager object vtable: %m"); + return r; r = bus_log_control_api_register(m->bus); if (r < 0) diff --git a/src/oom/oomd.c b/src/oom/oomd.c index 0b611ef..2c0031a 100644 --- a/src/oom/oomd.c +++ b/src/oom/oomd.c @@ -2,12 +2,15 @@ #include +#include "bus-log-control-api.h" +#include "bus-object.h" #include "cgroup-util.h" #include "conf-parser.h" #include "daemon-util.h" #include "log.h" #include "main-func.h" #include "oomd-manager.h" +#include "oomd-manager-bus.h" #include "parse-util.h" #include "pretty-print.c" #include "psi-util.h" @@ -43,25 +46,31 @@ static int help(void) { return log_oom(); printf("%s [OPTIONS...]\n\n" - "Run the userspace out-of-memory (OOM) killer.\n\n" - " -h --help Show this help\n" - " --dry-run Log write/destructive actions instead of doing them\n" - "\nSee the %s for details.\n" - , program_invocation_short_name - , link - ); + "Run the userspace out-of-memory (OOM) killer.\n\n" + " -h --help Show this help\n" + " --version Show package version\n" + " --dry-run Only print destructive actions instead of doing them\n" + " --bus-introspect=PATH Write D-Bus XML introspection data\n" + "\nSee the %s for details.\n" + , program_invocation_short_name + , link + ); return 0; } static int parse_argv(int argc, char *argv[]) { enum { + ARG_VERSION = 0x100, ARG_DRY_RUN, + ARG_BUS_INTROSPECT, }; static const struct option options[] = { - { "help", no_argument, NULL, 'h' }, - { "dry-run", no_argument, NULL, ARG_DRY_RUN }, + { "help", no_argument, NULL, 'h' }, + { "version", no_argument, NULL, ARG_VERSION }, + { "dry-run", no_argument, NULL, ARG_DRY_RUN }, + { "bus-introspect", required_argument, NULL, ARG_BUS_INTROSPECT }, {} }; @@ -74,20 +83,34 @@ static int parse_argv(int argc, char *argv[]) { switch (c) { - case 'h': - return help(); + case 'h': + return help(); - case ARG_DRY_RUN: - arg_dry_run = true; - break; + case ARG_VERSION: + return version(); - case '?': - return -EINVAL; + case ARG_DRY_RUN: + arg_dry_run = true; + break; - default: - assert_not_reached("Invalid option passed."); + case ARG_BUS_INTROSPECT: + return bus_introspect_implementations( + stdout, + optarg, + BUS_IMPLEMENTATIONS(&manager_object, + &log_control_object)); + + case '?': + return -EINVAL; + + default: + assert_not_reached("Unknown option code."); } + if (optind < argc) + return log_error_errno(SYNTHETIC_ERRNO(EINVAL), + "This program takes no arguments."); + return 1; }