From ddc543bed89080df0e5e66c8460759a3afff7837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 15 Oct 2020 15:03:07 +0200 Subject: [PATCH 1/3] oomd: check number of arguments, add --version, fix indentation --- src/oom/oomd.c | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/oom/oomd.c b/src/oom/oomd.c index 0b611efd57..43e1feaa20 100644 --- a/src/oom/oomd.c +++ b/src/oom/oomd.c @@ -43,25 +43,28 @@ 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" + "\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, }; 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 }, {} }; @@ -74,20 +77,27 @@ 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 '?': + 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; } From c9a00f5a3bccf8b43e0d7672185da8df5ff0fdfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 15 Oct 2020 15:03:49 +0200 Subject: [PATCH 2/3] oomd: add names to dbus parameters and implement --bus-introspection --- src/oom/oomd-manager-bus.c | 15 +++++++++++++-- src/oom/oomd-manager-bus.h | 4 ++-- src/oom/oomd-manager.c | 4 ++-- src/oom/oomd.c | 13 +++++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/oom/oomd-manager-bus.c b/src/oom/oomd-manager-bus.c index 67c5fbf92f..0f39a60d9e 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 60ccf3b373..6dd576d5af 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 49b57a86a4..9eb8ab9f5a 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 43e1feaa20..2c0031aeac 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" @@ -47,6 +50,7 @@ static int help(void) { " -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 @@ -59,12 +63,14 @@ 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' }, { "version", no_argument, NULL, ARG_VERSION }, { "dry-run", no_argument, NULL, ARG_DRY_RUN }, + { "bus-introspect", required_argument, NULL, ARG_BUS_INTROSPECT }, {} }; @@ -87,6 +93,13 @@ static int parse_argv(int argc, char *argv[]) { arg_dry_run = true; break; + case ARG_BUS_INTROSPECT: + return bus_introspect_implementations( + stdout, + optarg, + BUS_IMPLEMENTATIONS(&manager_object, + &log_control_object)); + case '?': return -EINVAL; From 699a810b3f4c34a489d818c15d001156ec470e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 15 Oct 2020 15:08:31 +0200 Subject: [PATCH 3/3] man: add org.freedesktop.oom1(5) stub --- man/org.freedesktop.oom1.xml | 74 ++++++++++++++++++++++++++++++++++++ man/rules/meson.build | 1 + 2 files changed, 75 insertions(+) create mode 100644 man/org.freedesktop.oom1.xml diff --git a/man/org.freedesktop.oom1.xml b/man/org.freedesktop.oom1.xml new file mode 100644 index 0000000000..289a7b6e89 --- /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 806561a412..cc3c2ef5e3 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'],