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'],
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 0b611efd57..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"
@@ -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;
}