]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: make all our Varlink APIs introspectable
authorLennart Poettering <lennart@poettering.net>
Fri, 22 Sep 2023 20:41:56 +0000 (22:41 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 6 Oct 2023 09:49:38 +0000 (11:49 +0200)
20 files changed:
src/core/core-varlink.c
src/home/homed-manager.c
src/journal/journald-server.c
src/machine/machined-varlink.c
src/oom/oomd-manager.c
src/resolve/resolved-varlink.c
src/shared/meson.build
src/shared/varlink-io.systemd.Journal.c [new file with mode: 0644]
src/shared/varlink-io.systemd.Journal.h [new file with mode: 0644]
src/shared/varlink-io.systemd.ManagedOOM.c [new file with mode: 0644]
src/shared/varlink-io.systemd.ManagedOOM.h [new file with mode: 0644]
src/shared/varlink-io.systemd.Resolve.Monitor.c [new file with mode: 0644]
src/shared/varlink-io.systemd.Resolve.Monitor.h [new file with mode: 0644]
src/shared/varlink-io.systemd.Resolve.c [new file with mode: 0644]
src/shared/varlink-io.systemd.Resolve.h [new file with mode: 0644]
src/shared/varlink-io.systemd.UserDatabase.c [new file with mode: 0644]
src/shared/varlink-io.systemd.UserDatabase.h [new file with mode: 0644]
src/shared/varlink-io.systemd.oom.c [new file with mode: 0644]
src/shared/varlink-io.systemd.oom.h [new file with mode: 0644]
src/userdb/userwork.c

index 1ff4a93ccedfe3e5ec44ba4eca1334cca1bfdb80..b0b15d242ccd7e07090affe1206d75dd08c45b36 100644 (file)
@@ -5,6 +5,8 @@
 #include "strv.h"
 #include "user-util.h"
 #include "varlink.h"
+#include "varlink-io.systemd.UserDatabase.h"
+#include "varlink-io.systemd.ManagedOOM.h"
 
 typedef struct LookupParameters {
         const char *user_name;
@@ -600,6 +602,13 @@ int manager_setup_varlink_server(Manager *m, VarlinkServer **ret) {
 
         varlink_server_set_userdata(s, m);
 
+        r = varlink_server_add_interface_many(
+                        s,
+                        &vl_interface_io_systemd_UserDatabase,
+                        &vl_interface_io_systemd_ManagedOOM);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add interfaces to varlink server: %m");
+
         r = varlink_server_bind_method_many(
                         s,
                         "io.systemd.UserDatabase.GetUserRecord",  vl_method_get_user_record,
index 903207b50f0b5fba8d5a56f79305ab9531d02410..c4525310fc20ff7944a644d6634edbf5d96a0bed 100644 (file)
@@ -53,6 +53,7 @@
 #include "user-record-util.h"
 #include "user-record.h"
 #include "user-util.h"
+#include "varlink-io.systemd.UserDatabase.h"
 
 /* Where to look for private/public keys that are used to sign the user records. We are not using
  * CONF_PATHS_NULSTR() here since we want to insert /var/lib/systemd/home/ in the middle. And we insert that
@@ -1003,6 +1004,10 @@ static int manager_bind_varlink(Manager *m) {
 
         varlink_server_set_userdata(m->varlink_server, m);
 
+        r = varlink_server_add_interface(m->varlink_server, &vl_interface_io_systemd_UserDatabase);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add UserDatabase interface to varlink server: %m");
+
         r = varlink_server_bind_method_many(
                         m->varlink_server,
                         "io.systemd.UserDatabase.GetUserRecord",  vl_method_get_user_record,
index 615b3c6c6b10e88909a6835da36151973aae531d..371338211aa2cda2ed621ff105b84742af34f7f5 100644 (file)
@@ -58,6 +58,7 @@
 #include "syslog-util.h"
 #include "uid-alloc-range.h"
 #include "user-util.h"
+#include "varlink-io.systemd.Journal.h"
 
 #define USER_JOURNALS_MAX 1024
 
@@ -2224,6 +2225,10 @@ static int server_open_varlink(Server *s, const char *socket, int fd) {
 
         varlink_server_set_userdata(s->varlink_server, s);
 
+        r = varlink_server_add_interface(s->varlink_server, &vl_interface_io_systemd_Journal);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add Journal interface to varlink server: %m");
+
         r = varlink_server_bind_method_many(
                         s->varlink_server,
                         "io.systemd.Journal.Synchronize",   vl_method_synchronize,
index ec625ad7b4fbc093e6c2d96965e07a545f9889cf..4b72ee9b0a3eaa5033b8d99b1553c6b0f1d9f703 100644 (file)
@@ -5,6 +5,7 @@
 #include "mkdir.h"
 #include "user-util.h"
 #include "varlink.h"
+#include "varlink-io.systemd.UserDatabase.h"
 
 typedef struct LookupParameters {
         const char *user_name;
@@ -392,6 +393,10 @@ int manager_varlink_init(Manager *m) {
 
         varlink_server_set_userdata(s, m);
 
+        r = varlink_server_add_interface(s, &vl_interface_io_systemd_UserDatabase);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add UserDatabase interface to varlink server: %m");
+
         r = varlink_server_bind_method_many(
                         s,
                         "io.systemd.UserDatabase.GetUserRecord",  vl_method_get_user_record,
index 49896ea7f110be9b96eb46c0fa0ba1ceb6fd984b..75918a5fe7e13afc44890de0874db2e0e52b5150 100644 (file)
@@ -15,6 +15,7 @@
 #include "oomd-manager.h"
 #include "path-util.h"
 #include "percent-util.h"
+#include "varlink-io.systemd.oom.h"
 
 typedef struct ManagedOOMMessage {
         ManagedOOMMode mode;
@@ -733,6 +734,10 @@ static int manager_varlink_init(Manager *m, int fd) {
 
         varlink_server_set_userdata(s, m);
 
+        r = varlink_server_add_interface(s, &vl_interface_io_systemd_oom);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add oom interface to varlink server: %m");
+
         r = varlink_server_bind_method(s, "io.systemd.oom.ReportManagedOOMCGroups", process_managed_oom_request);
         if (r < 0)
                 return log_error_errno(r, "Failed to register varlink method: %m");
index 83b8e52807b4057319fbbe3f08c0127d07043feb..c9bb616acbf18fa79839396dc0de63913e3bfe49 100644 (file)
@@ -5,6 +5,8 @@
 #include "resolved-dns-synthesize.h"
 #include "resolved-varlink.h"
 #include "socket-netlink.h"
+#include "varlink-io.systemd.Resolve.h"
+#include "varlink-io.systemd.Resolve.Monitor.h"
 
 typedef struct LookupParameters {
         int ifindex;
@@ -699,6 +701,10 @@ static int varlink_monitor_server_init(Manager *m) {
 
         varlink_server_set_userdata(server, m);
 
+        r = varlink_server_add_interface(server, &vl_interface_io_systemd_Resolve_Monitor);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add Resolve.Monitor interface to varlink server: %m");
+
         r = varlink_server_bind_method_many(
                         server,
                         "io.systemd.Resolve.Monitor.SubscribeQueryResults", vl_method_subscribe_query_results,
@@ -741,6 +747,10 @@ static int varlink_main_server_init(Manager *m) {
 
         varlink_server_set_userdata(s, m);
 
+        r = varlink_server_add_interface(s, &vl_interface_io_systemd_Resolve);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add Resolve interface to varlink server: %m");
+
         r = varlink_server_bind_method_many(
                         s,
                         "io.systemd.Resolve.ResolveHostname",  vl_method_resolve_hostname,
index 429789b045292ea30f04720557137b29e53dfaa4..9d29c32dff7f1344d46469ea5b7110afe178c728 100644 (file)
@@ -168,6 +168,12 @@ shared_sources = files(
         'varlink.c',
         'varlink-idl.c',
         'varlink-io.systemd.c',
+        'varlink-io.systemd.Journal.c',
+        'varlink-io.systemd.ManagedOOM.c',
+        'varlink-io.systemd.Resolve.Monitor.c',
+        'varlink-io.systemd.Resolve.c',
+        'varlink-io.systemd.UserDatabase.c',
+        'varlink-io.systemd.oom.c',
         'varlink-org.varlink.service.c',
         'verb-log-control.c',
         'verbs.c',
diff --git a/src/shared/varlink-io.systemd.Journal.c b/src/shared/varlink-io.systemd.Journal.c
new file mode 100644 (file)
index 0000000..b93fb72
--- /dev/null
@@ -0,0 +1,19 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "varlink-io.systemd.Journal.h"
+
+static VARLINK_DEFINE_METHOD(Synchronize);
+static VARLINK_DEFINE_METHOD(Rotate);
+static VARLINK_DEFINE_METHOD(FlushToVar);
+static VARLINK_DEFINE_METHOD(RelinquishVar);
+
+static VARLINK_DEFINE_ERROR(NotSupportedByNamespaces);
+
+VARLINK_DEFINE_INTERFACE(
+                io_systemd_Journal,
+                "io.systemd.Journal",
+                &vl_method_Synchronize,
+                &vl_method_Rotate,
+                &vl_method_FlushToVar,
+                &vl_method_RelinquishVar,
+                &vl_error_NotSupportedByNamespaces);
diff --git a/src/shared/varlink-io.systemd.Journal.h b/src/shared/varlink-io.systemd.Journal.h
new file mode 100644 (file)
index 0000000..0bc94a7
--- /dev/null
@@ -0,0 +1,6 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include "varlink-idl.h"
+
+extern const VarlinkInterface vl_interface_io_systemd_Journal;
diff --git a/src/shared/varlink-io.systemd.ManagedOOM.c b/src/shared/varlink-io.systemd.ManagedOOM.c
new file mode 100644 (file)
index 0000000..7cc5721
--- /dev/null
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "varlink-io.systemd.ManagedOOM.h"
+
+/* Pull in vl_type_ControlGroup, since both interfaces need it */
+#include "varlink-io.systemd.oom.h"
+
+/* This is PID1's Varlink service, where PID 1 is the server and oomd is the client.
+ *
+ * Compare with io.systemd.oom where the client/server roles of oomd and the service manager are swapped! */
+
+static VARLINK_DEFINE_METHOD(
+                SubscribeManagedOOMCGroups,
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(cgroups, ControlGroup, VARLINK_ARRAY));
+
+VARLINK_DEFINE_INTERFACE(
+                io_systemd_ManagedOOM,
+                "io.systemd.ManagedOOM",
+                &vl_method_SubscribeManagedOOMCGroups,
+                &vl_type_ControlGroup);
diff --git a/src/shared/varlink-io.systemd.ManagedOOM.h b/src/shared/varlink-io.systemd.ManagedOOM.h
new file mode 100644 (file)
index 0000000..2c8bf54
--- /dev/null
@@ -0,0 +1,6 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include "varlink-idl.h"
+
+extern const VarlinkInterface vl_interface_io_systemd_ManagedOOM;
diff --git a/src/shared/varlink-io.systemd.Resolve.Monitor.c b/src/shared/varlink-io.systemd.Resolve.Monitor.c
new file mode 100644 (file)
index 0000000..179b9bc
--- /dev/null
@@ -0,0 +1,136 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "varlink-io.systemd.Resolve.Monitor.h"
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                ResourceKey,
+                VARLINK_DEFINE_FIELD(class, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(type, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(name, VARLINK_STRING, 0));
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                ResourceRecord,
+                VARLINK_DEFINE_FIELD_BY_TYPE(key, ResourceKey, 0),
+                VARLINK_DEFINE_FIELD(priority, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(weight, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(port, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(name, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(cpu, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(os, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(items, VARLINK_STRING, VARLINK_NULLABLE|VARLINK_ARRAY),
+                VARLINK_DEFINE_FIELD(address, VARLINK_INT, VARLINK_NULLABLE|VARLINK_ARRAY),
+                VARLINK_DEFINE_FIELD(mname, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(rname, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(serial, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(refresh, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(expire, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(minimum, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(exchange, VARLINK_STRING, VARLINK_NULLABLE));
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                Answer,
+                VARLINK_DEFINE_FIELD_BY_TYPE(rr, ResourceRecord, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(raw, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE));
+
+VARLINK_DEFINE_METHOD(
+                SubscribeQueryResults,
+                /* First reply */
+                VARLINK_DEFINE_OUTPUT(ready, VARLINK_BOOL, VARLINK_NULLABLE),
+                /* Subsequent replies */
+                VARLINK_DEFINE_OUTPUT(state, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_OUTPUT(rcode, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_OUTPUT(errno, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(question, ResourceKey, VARLINK_NULLABLE|VARLINK_ARRAY),
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(collectedQuestions, ResourceKey, VARLINK_NULLABLE|VARLINK_ARRAY),
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(answer, Answer, VARLINK_NULLABLE|VARLINK_ARRAY));
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                CacheEntry,
+                VARLINK_DEFINE_FIELD_BY_TYPE(key, ResourceKey, 0),
+                VARLINK_DEFINE_FIELD_BY_TYPE(rrs, ResourceRecord, VARLINK_NULLABLE|VARLINK_ARRAY),
+                VARLINK_DEFINE_FIELD(type, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(until, VARLINK_INT, 0));
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                ScopeCache,
+                VARLINK_DEFINE_FIELD(protocol, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(family, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(ifname, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD_BY_TYPE(cache, CacheEntry, VARLINK_ARRAY));
+
+VARLINK_DEFINE_METHOD(
+                DumpCache,
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(dump, ScopeCache, VARLINK_ARRAY));
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                ServerState,
+                VARLINK_DEFINE_FIELD(Server, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(Type, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(Interface, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(InterfaceIndex, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(VerifiedFeatureLevel, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(PossibleFeatureLevel, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(DNSSECMode, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(DNSSECSupported, VARLINK_BOOL, 0),
+                VARLINK_DEFINE_FIELD(ReceivedUDPFragmentMax, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(FailedUDPAttempts, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(FailedTCPAttempts, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(PacketTruncated, VARLINK_BOOL, 0),
+                VARLINK_DEFINE_FIELD(PacketBadOpt, VARLINK_BOOL, 0),
+                VARLINK_DEFINE_FIELD(PacketRRSIGMissing, VARLINK_BOOL, 0),
+                VARLINK_DEFINE_FIELD(PacketInvalid, VARLINK_BOOL, 0),
+                VARLINK_DEFINE_FIELD(PacketDoOff, VARLINK_BOOL, 0));
+
+VARLINK_DEFINE_METHOD(
+                DumpServerState,
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(dump, ServerState, VARLINK_ARRAY));
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                TransactionStatistics,
+                VARLINK_DEFINE_FIELD(currentTransactions, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(totalTransactions, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(totalTimeouts, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(totalTimeoutsServedStale, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(totalFailedResponses, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(totalFailedResponsesServedStale, VARLINK_INT, 0));
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                CacheStatistics,
+                VARLINK_DEFINE_FIELD(size, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(hits, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(misses, VARLINK_INT, 0));
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                DnssecStatistics,
+                VARLINK_DEFINE_FIELD(secure, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(insecure, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(bogus, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(indeterminate, VARLINK_INT, 0));
+
+VARLINK_DEFINE_METHOD(
+                DumpStatistics,
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(transactions, TransactionStatistics, 0),
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(cache, CacheStatistics, 0),
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(dnssec, DnssecStatistics, 0));
+
+VARLINK_DEFINE_METHOD(ResetStatistics);
+
+VARLINK_DEFINE_INTERFACE(
+                io_systemd_Resolve_Monitor,
+                "io.systemd.Resolve.Monitor",
+                &vl_method_SubscribeQueryResults,
+                &vl_method_DumpCache,
+                &vl_method_DumpServerState,
+                &vl_method_DumpStatistics,
+                &vl_method_ResetStatistics,
+                &vl_type_ResourceKey,
+                &vl_type_ResourceRecord,
+                &vl_type_Answer,
+                &vl_type_CacheEntry,
+                &vl_type_ScopeCache,
+                &vl_type_TransactionStatistics,
+                &vl_type_CacheStatistics,
+                &vl_type_DnssecStatistics,
+                &vl_type_ServerState);
diff --git a/src/shared/varlink-io.systemd.Resolve.Monitor.h b/src/shared/varlink-io.systemd.Resolve.Monitor.h
new file mode 100644 (file)
index 0000000..a133ec3
--- /dev/null
@@ -0,0 +1,6 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include "varlink-idl.h"
+
+extern const VarlinkInterface vl_interface_io_systemd_Resolve_Monitor;
diff --git a/src/shared/varlink-io.systemd.Resolve.c b/src/shared/varlink-io.systemd.Resolve.c
new file mode 100644 (file)
index 0000000..0d8ad28
--- /dev/null
@@ -0,0 +1,76 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "varlink-io.systemd.Resolve.h"
+
+static VARLINK_DEFINE_STRUCT_TYPE(
+                ResolvedAddress,
+                VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(family, VARLINK_INT, 0),
+                VARLINK_DEFINE_FIELD(address, VARLINK_INT, VARLINK_ARRAY));
+
+static VARLINK_DEFINE_METHOD(
+                ResolveHostname,
+                VARLINK_DEFINE_INPUT(ifindex, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_INPUT(name, VARLINK_STRING, 0),
+                VARLINK_DEFINE_INPUT(family, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_INPUT(flags, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(addresses, ResolvedAddress, VARLINK_ARRAY),
+                VARLINK_DEFINE_OUTPUT(name, VARLINK_STRING, 0),
+                VARLINK_DEFINE_OUTPUT(flags, VARLINK_INT, 0));
+
+static VARLINK_DEFINE_STRUCT_TYPE(
+                ResolvedName,
+                VARLINK_DEFINE_FIELD(ifindex, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_FIELD(name, VARLINK_STRING, 0));
+
+static VARLINK_DEFINE_METHOD(
+                ResolveAddress,
+                VARLINK_DEFINE_INPUT(ifindex, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_INPUT(family, VARLINK_INT, 0),
+                VARLINK_DEFINE_INPUT(address, VARLINK_INT, VARLINK_ARRAY),
+                VARLINK_DEFINE_INPUT(flags, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_OUTPUT_BY_TYPE(names, ResolvedName, VARLINK_ARRAY),
+                VARLINK_DEFINE_OUTPUT(flags, VARLINK_INT, 0));
+
+static VARLINK_DEFINE_ERROR(NoNameServers);
+static VARLINK_DEFINE_ERROR(NoSuchResourceRecord);
+static VARLINK_DEFINE_ERROR(QueryTimedOut);
+static VARLINK_DEFINE_ERROR(MaxAttemptsReached);
+static VARLINK_DEFINE_ERROR(InvalidReply);
+static VARLINK_DEFINE_ERROR(QueryAborted);
+static VARLINK_DEFINE_ERROR(
+                DNSSECValidationFailed,
+                VARLINK_DEFINE_FIELD(result, VARLINK_STRING, 0));
+static VARLINK_DEFINE_ERROR(NoTrustAnchor);
+static VARLINK_DEFINE_ERROR(ResourceRecordTypeUnsupported);
+static VARLINK_DEFINE_ERROR(NetworkDown);
+static VARLINK_DEFINE_ERROR(NoSource);
+static VARLINK_DEFINE_ERROR(StubLoop);
+static VARLINK_DEFINE_ERROR(
+                DNSError,
+                VARLINK_DEFINE_FIELD(rcode, VARLINK_INT, 0));
+static VARLINK_DEFINE_ERROR(CNAMELoop);
+static VARLINK_DEFINE_ERROR(BadAddressSize);
+
+VARLINK_DEFINE_INTERFACE(
+                io_systemd_Resolve,
+                "io.systemd.Resolve",
+                &vl_method_ResolveHostname,
+                &vl_method_ResolveAddress,
+                &vl_type_ResolvedAddress,
+                &vl_type_ResolvedName,
+                &vl_error_NoNameServers,
+                &vl_error_NoSuchResourceRecord,
+                &vl_error_QueryTimedOut,
+                &vl_error_MaxAttemptsReached,
+                &vl_error_InvalidReply,
+                &vl_error_QueryAborted,
+                &vl_error_DNSSECValidationFailed,
+                &vl_error_NoTrustAnchor,
+                &vl_error_ResourceRecordTypeUnsupported,
+                &vl_error_NetworkDown,
+                &vl_error_NoSource,
+                &vl_error_StubLoop,
+                &vl_error_DNSError,
+                &vl_error_CNAMELoop,
+                &vl_error_BadAddressSize);
diff --git a/src/shared/varlink-io.systemd.Resolve.h b/src/shared/varlink-io.systemd.Resolve.h
new file mode 100644 (file)
index 0000000..5c7ed39
--- /dev/null
@@ -0,0 +1,6 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include "varlink-idl.h"
+
+extern const VarlinkInterface vl_interface_io_systemd_Resolve;
diff --git a/src/shared/varlink-io.systemd.UserDatabase.c b/src/shared/varlink-io.systemd.UserDatabase.c
new file mode 100644 (file)
index 0000000..a640d2e
--- /dev/null
@@ -0,0 +1,46 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "varlink-io.systemd.UserDatabase.h"
+
+static VARLINK_DEFINE_METHOD(
+                GetUserRecord,
+                VARLINK_DEFINE_INPUT(uid, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_INPUT(userName, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_INPUT(service, VARLINK_STRING, 0),
+                VARLINK_DEFINE_OUTPUT(record, VARLINK_OBJECT, 0),
+                VARLINK_DEFINE_OUTPUT(incomplete, VARLINK_BOOL, 0));
+
+static VARLINK_DEFINE_METHOD(
+                GetGroupRecord,
+                VARLINK_DEFINE_INPUT(gid, VARLINK_INT, VARLINK_NULLABLE),
+                VARLINK_DEFINE_INPUT(groupName, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_INPUT(service, VARLINK_STRING, 0),
+                VARLINK_DEFINE_OUTPUT(record, VARLINK_OBJECT, 0),
+                VARLINK_DEFINE_OUTPUT(incomplete, VARLINK_BOOL, 0));
+
+static VARLINK_DEFINE_METHOD(
+                GetMemberships,
+                VARLINK_DEFINE_INPUT(userName, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_INPUT(groupName, VARLINK_STRING, VARLINK_NULLABLE),
+                VARLINK_DEFINE_INPUT(service, VARLINK_STRING, 0),
+                VARLINK_DEFINE_OUTPUT(userName, VARLINK_STRING, 0),
+                VARLINK_DEFINE_OUTPUT(groupName, VARLINK_STRING, 0));
+
+static VARLINK_DEFINE_ERROR(NoRecordFound);
+static VARLINK_DEFINE_ERROR(BadService);
+static VARLINK_DEFINE_ERROR(ServiceNotAvailable);
+static VARLINK_DEFINE_ERROR(ConflictingRecordNotFound);
+static VARLINK_DEFINE_ERROR(EnumerationNotSupported);
+
+/* As per https://systemd.io/USER_GROUP_API/ */
+VARLINK_DEFINE_INTERFACE(
+                io_systemd_UserDatabase,
+                "io.systemd.UserDatabase",
+                &vl_method_GetUserRecord,
+                &vl_method_GetGroupRecord,
+                &vl_method_GetMemberships,
+                &vl_error_NoRecordFound,
+                &vl_error_BadService,
+                &vl_error_ServiceNotAvailable,
+                &vl_error_ConflictingRecordNotFound,
+                &vl_error_EnumerationNotSupported);
diff --git a/src/shared/varlink-io.systemd.UserDatabase.h b/src/shared/varlink-io.systemd.UserDatabase.h
new file mode 100644 (file)
index 0000000..346ca84
--- /dev/null
@@ -0,0 +1,6 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include "varlink-idl.h"
+
+extern const VarlinkInterface vl_interface_io_systemd_UserDatabase;
diff --git a/src/shared/varlink-io.systemd.oom.c b/src/shared/varlink-io.systemd.oom.c
new file mode 100644 (file)
index 0000000..e1da3fa
--- /dev/null
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include "varlink-io.systemd.oom.h"
+
+/* This is oomd's Varlink service, where oomd is server and systemd --user is the client.
+ *
+ * Compare with io.systemd.ManagedOOM where the client/server roles of the service manager and oomd are
+ * swapped! */
+
+VARLINK_DEFINE_STRUCT_TYPE(
+                ControlGroup,
+                VARLINK_DEFINE_FIELD(mode, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(path, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(property, VARLINK_STRING, 0),
+                VARLINK_DEFINE_FIELD(limit, VARLINK_INT, VARLINK_NULLABLE));
+
+static VARLINK_DEFINE_METHOD(
+                ReportManagedOOMCGroups,
+                VARLINK_DEFINE_INPUT_BY_TYPE(cgroups, ControlGroup, VARLINK_ARRAY));
+
+VARLINK_DEFINE_INTERFACE(
+                io_systemd_oom,
+                "io.systemd.oom",
+                &vl_method_ReportManagedOOMCGroups,
+                &vl_type_ControlGroup);
diff --git a/src/shared/varlink-io.systemd.oom.h b/src/shared/varlink-io.systemd.oom.h
new file mode 100644 (file)
index 0000000..911dbc2
--- /dev/null
@@ -0,0 +1,7 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+#pragma once
+
+#include "varlink-idl.h"
+
+extern const VarlinkSymbol vl_type_ControlGroup;
+extern const VarlinkInterface vl_interface_io_systemd_oom;
index 9fccadc9501a263f446c629436ccbbfb056a5ce0..7413378bcba4aeedc7af35d167ab15d38e33a64c 100644 (file)
@@ -18,6 +18,7 @@
 #include "user-util.h"
 #include "userdb.h"
 #include "varlink.h"
+#include "varlink-io.systemd.UserDatabase.h"
 
 #define ITERATIONS_MAX 64U
 #define RUNTIME_MAX_USEC (5 * USEC_PER_MINUTE)
@@ -483,6 +484,10 @@ static int run(int argc, char *argv[]) {
         if (r < 0)
                 return log_error_errno(r, "Failed to allocate server: %m");
 
+        r = varlink_server_add_interface(server, &vl_interface_io_systemd_UserDatabase);
+        if (r < 0)
+                return log_error_errno(r, "Failed to add UserDatabase interface to varlink server: %m");
+
         r = varlink_server_bind_method_many(
                         server,
                         "io.systemd.UserDatabase.GetUserRecord",  vl_method_get_user_record,