From 29f63c67b01f8db9f088daa5d25b345cc697688d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 9 Dec 2024 20:08:33 +0100 Subject: [PATCH 1/3] sd-varlink: add sd_varlink_server_set_info Fixes https://github.com/systemd/systemd/issues/35508. As reported in the bug, the values were hardcoded for the systemd project. https://varlink.org/Service lists vendor, product, version, url, and interfaces as the mandatory parameters, so add an interface to set the first four. The last field is set automatically based on the registered interfaces as before. If the values are not filled in, we return empty strings. With NULL, 'varlinkctl info' would say: (string):1:25: Object field 'vendor' has wrong type null, expected string. --- src/fuzz/fuzz-varlink.c | 1 + src/libsystemd/libsystemd.sym | 1 + src/libsystemd/sd-varlink/sd-varlink.c | 46 +++++++++++++++----- src/libsystemd/sd-varlink/varlink-internal.h | 5 +++ src/systemd/sd-varlink.h | 7 +++ 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/fuzz/fuzz-varlink.c b/src/fuzz/fuzz-varlink.c index 2342e34d8f..2497fe3b9e 100644 --- a/src/fuzz/fuzz-varlink.c +++ b/src/fuzz/fuzz-varlink.c @@ -102,6 +102,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { /* Test one: write the data as method call to a server */ assert_se(socketpair(AF_UNIX, SOCK_STREAM, 0, server_pair) >= 0); assert_se(sd_varlink_server_new(&s, 0) >= 0); + assert_se(sd_varlink_server_set_info(s, "Vendor", "Product", "Version", "URL") >= 0); assert_se(sd_varlink_server_set_description(s, "myserver") >= 0); assert_se(sd_varlink_server_attach_event(s, e, 0) >= 0); assert_se(sd_varlink_server_add_connection(s, server_pair[0], NULL) >= 0); diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index 0b948b86a2..a76dc7e4ae 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -1037,6 +1037,7 @@ global: sd_varlink_server_set_connections_max; sd_varlink_server_set_connections_per_uid_max; sd_varlink_server_set_description; + sd_varlink_server_set_info; sd_varlink_server_set_exit_on_idle; sd_varlink_server_set_userdata; sd_varlink_server_shutdown; diff --git a/src/libsystemd/sd-varlink/sd-varlink.c b/src/libsystemd/sd-varlink/sd-varlink.c index 150ce4edda..5e9999deaf 100644 --- a/src/libsystemd/sd-varlink/sd-varlink.c +++ b/src/libsystemd/sd-varlink/sd-varlink.c @@ -31,7 +31,6 @@ #include "varlink-internal.h" #include "varlink-io.systemd.h" #include "varlink-org.varlink.service.h" -#include "version.h" #define VARLINK_DEFAULT_CONNECTIONS_MAX 4096U #define VARLINK_DEFAULT_CONNECTIONS_PER_UID_MAX 1024U @@ -1193,20 +1192,16 @@ static int generic_method_get_info( void *userdata) { _cleanup_strv_free_ char **interfaces = NULL; - _cleanup_free_ char *product = NULL; int r; assert(link); + assert(link->server); if (sd_json_variant_elements(parameters) != 0) return sd_varlink_error_invalid_parameter(link, parameters); - product = strjoin("systemd (", program_invocation_short_name, ")"); - if (!product) - return -ENOMEM; - sd_varlink_interface *interface; - HASHMAP_FOREACH(interface, ASSERT_PTR(link->server)->interfaces) { + HASHMAP_FOREACH(interface, link->server->interfaces) { r = strv_extend(&interfaces, interface->name); if (r < 0) return r; @@ -1216,10 +1211,10 @@ static int generic_method_get_info( return sd_varlink_replybo( link, - SD_JSON_BUILD_PAIR_STRING("vendor", "The systemd Project"), - SD_JSON_BUILD_PAIR_STRING("product", product), - SD_JSON_BUILD_PAIR_STRING("version", PROJECT_VERSION_FULL " (" GIT_VERSION ")"), - SD_JSON_BUILD_PAIR_STRING("url", "https://systemd.io/"), + SD_JSON_BUILD_PAIR_STRING("vendor", strempty(link->server->vendor)), + SD_JSON_BUILD_PAIR_STRING("product", strempty(link->server->product)), + SD_JSON_BUILD_PAIR_STRING("version", strempty(link->server->version)), + SD_JSON_BUILD_PAIR_STRING("url", strempty(link->server->url)), SD_JSON_BUILD_PAIR_STRV("interfaces", interfaces)); } @@ -3262,12 +3257,41 @@ static sd_varlink_server* varlink_server_destroy(sd_varlink_server *s) { sd_event_unref(s->event); free(s->description); + free(s->vendor); + free(s->product); + free(s->version); + free(s->url); return mfree(s); } DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_varlink_server, sd_varlink_server, varlink_server_destroy); +_public_ int sd_varlink_server_set_info( + sd_varlink_server *s, + const char *vendor, + const char *product, + const char *version, + const char *url) { + + assert_return(s, -EINVAL); + + _cleanup_free_ char + *a = vendor ? strdup(vendor) : NULL, + *b = product ? strdup(product) : NULL, + *c = version ? strdup(version) : NULL, + *d = url ? strdup(url) : NULL; + if ((vendor && !a) || (product && !b) || (version && !c) || (url && !d)) + return log_oom_debug(); + + free_and_replace(s->vendor, a); + free_and_replace(s->product, b); + free_and_replace(s->version, c); + free_and_replace(s->url, d); + + return 0; +} + static int validate_connection(sd_varlink_server *server, const struct ucred *ucred) { int allowed = -1; diff --git a/src/libsystemd/sd-varlink/varlink-internal.h b/src/libsystemd/sd-varlink/varlink-internal.h index b184ac7754..377f8cfae4 100644 --- a/src/libsystemd/sd-varlink/varlink-internal.h +++ b/src/libsystemd/sd-varlink/varlink-internal.h @@ -222,7 +222,12 @@ struct sd_varlink_server { Hashmap *by_uid; /* UID_TO_PTR(uid) → UINT_TO_PTR(n_connections) */ void *userdata; + char *description; + char *vendor; + char *product; + char *version; + char *url; unsigned connections_max; unsigned connections_per_uid_max; diff --git a/src/systemd/sd-varlink.h b/src/systemd/sd-varlink.h index fbf575ffdf..833977d8b2 100644 --- a/src/systemd/sd-varlink.h +++ b/src/systemd/sd-varlink.h @@ -219,6 +219,13 @@ int sd_varlink_server_new(sd_varlink_server **ret, sd_varlink_server_flags_t fla sd_varlink_server* sd_varlink_server_ref(sd_varlink_server *s); sd_varlink_server* sd_varlink_server_unref(sd_varlink_server *s); +int sd_varlink_server_set_info( + sd_varlink_server *s, + const char *vendor, + const char *product, + const char *version, + const char *url); + /* Add addresses or fds to listen on */ int sd_varlink_server_listen_address(sd_varlink_server *s, const char *address, mode_t mode); int sd_varlink_server_listen_fd(sd_varlink_server *s, int fd); From fd409ff0e0d0449e298cc8c6ff915e29a0f36033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 9 Dec 2024 20:23:29 +0100 Subject: [PATCH 2/3] various: set info on varlink server object The values that were previously hardcoded in sd-varlink.c are now defined in new varlink_set_info_systemd() and that function is called everywhere where we create a server. --- src/bootctl/bootctl.c | 3 +- src/core/core-varlink.c | 6 ++-- src/creds/creds.c | 6 +++- src/home/homed-manager.c | 10 +++--- src/hostname/hostnamed.c | 8 +++-- src/import/importd.c | 8 ++--- src/journal/journald-server.c | 10 +++--- src/libsystemd/sd-varlink/varlink-util.c | 40 ++++++++++++++++++++++++ src/libsystemd/sd-varlink/varlink-util.h | 7 +++++ src/machine/machined-varlink.c | 9 ++---- src/mountfsd/mountwork.c | 3 +- src/network/networkd-manager-varlink.c | 5 ++- src/nsresourced/nsresourcework.c | 5 +-- src/oom/oomd-manager.c | 5 ++- src/pcrextend/pcrextend.c | 3 +- src/pcrlock/pcrlock.c | 3 +- src/resolve/resolved-varlink.c | 9 ++---- src/sysext/sysext.c | 3 +- src/test/test-varlink-idl.c | 2 ++ src/test/test-varlink.c | 5 ++- src/userdb/userwork.c | 5 +-- 21 files changed, 107 insertions(+), 48 deletions(-) diff --git a/src/bootctl/bootctl.c b/src/bootctl/bootctl.c index 98721347f4..7befb8c6e2 100644 --- a/src/bootctl/bootctl.c +++ b/src/bootctl/bootctl.c @@ -27,6 +27,7 @@ #include "pretty-print.h" #include "utf8.h" #include "varlink-io.systemd.BootControl.h" +#include "varlink-util.h" #include "verbs.h" #include "virt.h" @@ -656,7 +657,7 @@ static int run(int argc, char *argv[]) { /* Invocation as Varlink service */ - r = sd_varlink_server_new(&varlink_server, SD_VARLINK_SERVER_ROOT_ONLY); + r = varlink_server_new(&varlink_server, SD_VARLINK_SERVER_ROOT_ONLY, NULL); if (r < 0) return log_error_errno(r, "Failed to allocate Varlink server: %m"); diff --git a/src/core/core-varlink.c b/src/core/core-varlink.c index 352fd28b0d..4f0563a1c0 100644 --- a/src/core/core-varlink.c +++ b/src/core/core-varlink.c @@ -582,11 +582,9 @@ int manager_setup_varlink_server(Manager *m) { if (!MANAGER_IS_SYSTEM(m)) return -EINVAL; - r = sd_varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA, m); if (r < 0) - return log_debug_errno(r, "Failed to allocate varlink server object: %m"); - - sd_varlink_server_set_userdata(s, m); + return log_debug_errno(r, "Failed to allocate Varlink server: %m"); r = sd_varlink_server_add_interface_many( s, diff --git a/src/creds/creds.c b/src/creds/creds.c index b24a84eaa6..7635aee37c 100644 --- a/src/creds/creds.c +++ b/src/creds/creds.c @@ -32,6 +32,7 @@ #include "user-util.h" #include "varlink-io.systemd.Credentials.h" #include "verbs.h" +#include "varlink-util.h" typedef enum TranscodeMode { TRANSCODE_OFF, @@ -1378,7 +1379,10 @@ static int run(int argc, char *argv[]) { /* Invocation as Varlink service */ - r = sd_varlink_server_new(&varlink_server, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA|SD_VARLINK_SERVER_INPUT_SENSITIVE); + r = varlink_server_new( + &varlink_server, + SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA|SD_VARLINK_SERVER_INPUT_SENSITIVE, + NULL); if (r < 0) return log_error_errno(r, "Failed to allocate Varlink server: %m"); diff --git a/src/home/homed-manager.c b/src/home/homed-manager.c index 6f5b6feda2..de7c3d8dbe 100644 --- a/src/home/homed-manager.c +++ b/src/home/homed-manager.c @@ -55,6 +55,7 @@ #include "user-record.h" #include "user-util.h" #include "varlink-io.systemd.UserDatabase.h" +#include "varlink-util.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 @@ -1004,11 +1005,12 @@ static int manager_bind_varlink(Manager *m) { assert(m); assert(!m->varlink_server); - r = sd_varlink_server_new(&m->varlink_server, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA|SD_VARLINK_SERVER_INPUT_SENSITIVE); + r = varlink_server_new( + &m->varlink_server, + SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA|SD_VARLINK_SERVER_INPUT_SENSITIVE, + m); if (r < 0) - return log_error_errno(r, "Failed to allocate varlink server object: %m"); - - sd_varlink_server_set_userdata(m->varlink_server, m); + return log_error_errno(r, "Failed to allocate varlink server: %m"); r = sd_varlink_server_add_interface(m->varlink_server, &vl_interface_io_systemd_UserDatabase); if (r < 0) diff --git a/src/hostname/hostnamed.c b/src/hostname/hostnamed.c index cc538ce979..ba50b59f92 100644 --- a/src/hostname/hostnamed.c +++ b/src/hostname/hostnamed.c @@ -40,6 +40,7 @@ #include "user-util.h" #include "utf8.h" #include "varlink-io.systemd.Hostname.h" +#include "varlink-util.h" #include "virt.h" #define VALID_DEPLOYMENT_CHARS (DIGITS LETTERS "-.:") @@ -1648,12 +1649,13 @@ static int connect_varlink(Context *c) { assert(c->event); assert(!c->varlink_server); - r = sd_varlink_server_new(&c->varlink_server, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new( + &c->varlink_server, + SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA, + c); if (r < 0) return log_error_errno(r, "Failed to allocate Varlink server: %m"); - sd_varlink_server_set_userdata(c->varlink_server, c); - r = sd_varlink_server_add_interface(c->varlink_server, &vl_interface_io_systemd_Hostname); if (r < 0) return log_error_errno(r, "Failed to add Hostname interface to Varlink server: %m"); diff --git a/src/import/importd.c b/src/import/importd.c index a0c40cc3d0..db081205ab 100644 --- a/src/import/importd.c +++ b/src/import/importd.c @@ -1969,11 +1969,11 @@ static int manager_connect_varlink(Manager *m) { assert(m->event); assert(!m->varlink_server); - r = sd_varlink_server_new(&m->varlink_server, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new(&m->varlink_server, + SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA, + m); if (r < 0) - return log_error_errno(r, "Failed to allocate Varlink server: %m"); - - sd_varlink_server_set_userdata(m->varlink_server, m); + return log_error_errno(r, "Failed to allocate varlink server object: %m"); r = sd_varlink_server_add_interface(m->varlink_server, &vl_interface_io_systemd_Import); if (r < 0) diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c index 9377ff8c79..bebc1e584c 100644 --- a/src/journal/journald-server.c +++ b/src/journal/journald-server.c @@ -64,6 +64,7 @@ #include "uid-classification.h" #include "user-util.h" #include "varlink-io.systemd.Journal.h" +#include "varlink-util.h" #define USER_JOURNALS_MAX 1024 @@ -2326,11 +2327,12 @@ static int server_open_varlink(Server *s, const char *socket, int fd) { assert(s); - r = sd_varlink_server_new(&s->varlink_server, SD_VARLINK_SERVER_ROOT_ONLY|SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new( + &s->varlink_server, + SD_VARLINK_SERVER_ROOT_ONLY|SD_VARLINK_SERVER_INHERIT_USERDATA, + s); if (r < 0) - return r; - - sd_varlink_server_set_userdata(s->varlink_server, s); + return log_error_errno(r, "Failed to allocate varlink server object: %m"); r = sd_varlink_server_add_interface(s->varlink_server, &vl_interface_io_systemd_Journal); if (r < 0) diff --git a/src/libsystemd/sd-varlink/varlink-util.c b/src/libsystemd/sd-varlink/varlink-util.c index b16d4bddb6..765108515c 100644 --- a/src/libsystemd/sd-varlink/varlink-util.c +++ b/src/libsystemd/sd-varlink/varlink-util.c @@ -1,8 +1,11 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include "alloc-util.h" #include "errno-util.h" +#include "string-util.h" #include "varlink-internal.h" #include "varlink-util.h" +#include "version.h" int varlink_get_peer_pidref(sd_varlink *v, PidRef *ret) { int r; @@ -133,3 +136,40 @@ int varlink_many_error(Set *s, const char *error_id, sd_json_variant *parameters return r; } + +int varlink_set_info_systemd(sd_varlink_server *server) { + _cleanup_free_ char *product = NULL; + + product = strjoin("systemd (", program_invocation_short_name, ")"); + if (!product) + return -ENOMEM; + + return sd_varlink_server_set_info( + server, + "The systemd Project", + product, + PROJECT_VERSION_FULL " (" GIT_VERSION ")", + "https://systemd.io/"); +} + +int varlink_server_new( + sd_varlink_server **ret, + sd_varlink_server_flags_t flags, + void *userdata) { + + _cleanup_(sd_varlink_server_unrefp) sd_varlink_server *s = NULL; + int r; + + r = sd_varlink_server_new(&s, flags); + if (r < 0) + return log_debug_errno(r, "Failed to allocate varlink server object: %m"); + + r = varlink_set_info_systemd(s); + if (r < 0) + return log_debug_errno(r, "Failed to configure varlink server object: %m"); + + sd_varlink_server_set_userdata(s, userdata); + + *ret = TAKE_PTR(s); + return 0; +} diff --git a/src/libsystemd/sd-varlink/varlink-util.h b/src/libsystemd/sd-varlink/varlink-util.h index 3f532bf140..351f3951b0 100644 --- a/src/libsystemd/sd-varlink/varlink-util.h +++ b/src/libsystemd/sd-varlink/varlink-util.h @@ -18,3 +18,10 @@ int varlink_many_notifyb(Set *s, ...); varlink_many_notifyb((s), SD_JSON_BUILD_OBJECT(__VA_ARGS__)) int varlink_many_reply(Set *s, sd_json_variant *parameters); int varlink_many_error(Set *s, const char *error_id, sd_json_variant *parameters); + +int varlink_set_info_systemd(sd_varlink_server *server); + +int varlink_server_new( + sd_varlink_server **ret, + sd_varlink_server_flags_t flags, + void *userdata); diff --git a/src/machine/machined-varlink.c b/src/machine/machined-varlink.c index 616b972b37..3385aa8a17 100644 --- a/src/machine/machined-varlink.c +++ b/src/machine/machined-varlink.c @@ -17,6 +17,7 @@ #include "varlink-io.systemd.Machine.h" #include "varlink-io.systemd.MachineImage.h" #include "varlink-io.systemd.UserDatabase.h" +#include "varlink-util.h" typedef struct LookupParameters { const char *user_name; @@ -712,12 +713,10 @@ static int manager_varlink_init_userdb(Manager *m) { if (m->varlink_userdb_server) return 0; - r = sd_varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA, m); if (r < 0) return log_error_errno(r, "Failed to allocate varlink server object: %m"); - sd_varlink_server_set_userdata(s, m); - r = sd_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"); @@ -753,12 +752,10 @@ static int manager_varlink_init_machine(Manager *m) { if (m->varlink_machine_server) return 0; - r = sd_varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA, m); if (r < 0) return log_error_errno(r, "Failed to allocate varlink server object: %m"); - sd_varlink_server_set_userdata(s, m); - r = sd_varlink_server_add_interface_many( s, &vl_interface_io_systemd_Machine, diff --git a/src/mountfsd/mountwork.c b/src/mountfsd/mountwork.c index 6ffb36167a..af46287fcf 100644 --- a/src/mountfsd/mountwork.c +++ b/src/mountfsd/mountwork.c @@ -23,6 +23,7 @@ #include "stat-util.h" #include "user-util.h" #include "varlink-io.systemd.MountFileSystem.h" +#include "varlink-util.h" #define ITERATIONS_MAX 64U #define RUNTIME_MAX_USEC (5 * USEC_PER_MINUTE) @@ -595,7 +596,7 @@ static int run(int argc, char *argv[]) { if (r < 0) return log_error_errno(r, "Failed to turn off non-blocking mode for listening socket: %m"); - r = sd_varlink_server_new(&server, SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new(&server, SD_VARLINK_SERVER_INHERIT_USERDATA, NULL); if (r < 0) return log_error_errno(r, "Failed to allocate server: %m"); diff --git a/src/network/networkd-manager-varlink.c b/src/network/networkd-manager-varlink.c index 9fe8e60769..546dae0739 100644 --- a/src/network/networkd-manager-varlink.c +++ b/src/network/networkd-manager-varlink.c @@ -12,6 +12,7 @@ #include "networkd-manager-varlink.h" #include "stat-util.h" #include "varlink-io.systemd.Network.h" +#include "varlink-util.h" static int vl_method_get_states(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) { Manager *m = ASSERT_PTR(userdata); @@ -270,12 +271,10 @@ int manager_connect_varlink(Manager *m) { if (m->varlink_server) return 0; - r = sd_varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA, m); if (r < 0) return log_error_errno(r, "Failed to allocate varlink server object: %m"); - sd_varlink_server_set_userdata(s, m); - (void) sd_varlink_server_set_description(s, "varlink-api-network"); r = sd_varlink_server_add_interface(s, &vl_interface_io_systemd_Network); diff --git a/src/nsresourced/nsresourcework.c b/src/nsresourced/nsresourcework.c index e8929ad6b3..21fc2d9088 100644 --- a/src/nsresourced/nsresourcework.c +++ b/src/nsresourced/nsresourcework.c @@ -44,6 +44,7 @@ #include "userns-restrict.h" #include "varlink-io.systemd.NamespaceResource.h" #include "varlink-io.systemd.UserDatabase.h" +#include "varlink-util.h" #define ITERATIONS_MAX 64U #define RUNTIME_MAX_USEC (5 * USEC_PER_MINUTE) @@ -1689,9 +1690,9 @@ static int run(int argc, char *argv[]) { if (r < 0) return log_error_errno(r, "Failed to turn off non-blocking mode for listening socket: %m"); - r = sd_varlink_server_new(&server, SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new(&server, SD_VARLINK_SERVER_INHERIT_USERDATA, NULL); if (r < 0) - return log_error_errno(r, "Failed to allocate server: %m"); + return log_error_errno(r, "Failed to allocate varlink server: %m"); r = sd_varlink_server_add_interface_many( server, diff --git a/src/oom/oomd-manager.c b/src/oom/oomd-manager.c index 7437a6e889..baa88a2f2a 100644 --- a/src/oom/oomd-manager.c +++ b/src/oom/oomd-manager.c @@ -18,6 +18,7 @@ #include "path-util.h" #include "percent-util.h" #include "varlink-io.systemd.oom.h" +#include "varlink-util.h" typedef struct ManagedOOMMessage { ManagedOOMMode mode; @@ -720,12 +721,10 @@ static int manager_varlink_init(Manager *m, int fd) { assert(m); assert(!m->varlink_server); - r = sd_varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA, m); if (r < 0) return log_error_errno(r, "Failed to allocate varlink server object: %m"); - sd_varlink_server_set_userdata(s, m); - r = sd_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"); diff --git a/src/pcrextend/pcrextend.c b/src/pcrextend/pcrextend.c index 1bf39caf43..6bdb5418b5 100644 --- a/src/pcrextend/pcrextend.c +++ b/src/pcrextend/pcrextend.c @@ -20,6 +20,7 @@ #include "tpm2-pcr.h" #include "tpm2-util.h" #include "varlink-io.systemd.PCRExtend.h" +#include "varlink-util.h" static bool arg_graceful = false; static char *arg_tpm2_device = NULL; @@ -312,7 +313,7 @@ static int run(int argc, char *argv[]) { /* Invocation as Varlink service */ - r = sd_varlink_server_new(&varlink_server, SD_VARLINK_SERVER_ROOT_ONLY); + r = varlink_server_new(&varlink_server, SD_VARLINK_SERVER_ROOT_ONLY, NULL); if (r < 0) return log_error_errno(r, "Failed to allocate Varlink server: %m"); diff --git a/src/pcrlock/pcrlock.c b/src/pcrlock/pcrlock.c index d824914ae7..25d76151b1 100644 --- a/src/pcrlock/pcrlock.c +++ b/src/pcrlock/pcrlock.c @@ -53,6 +53,7 @@ #include "unit-name.h" #include "utf8.h" #include "varlink-io.systemd.PCRLock.h" +#include "varlink-util.h" #include "verbs.h" typedef enum RecoveryPinMode { @@ -5352,7 +5353,7 @@ static int run(int argc, char *argv[]) { /* Invocation as Varlink service */ - r = sd_varlink_server_new(&varlink_server, SD_VARLINK_SERVER_ROOT_ONLY); + r = varlink_server_new(&varlink_server, SD_VARLINK_SERVER_ROOT_ONLY, NULL); if (r < 0) return log_error_errno(r, "Failed to allocate Varlink server: %m"); diff --git a/src/resolve/resolved-varlink.c b/src/resolve/resolved-varlink.c index 456347fd7e..107f722e7d 100644 --- a/src/resolve/resolved-varlink.c +++ b/src/resolve/resolved-varlink.c @@ -9,6 +9,7 @@ #include "socket-netlink.h" #include "varlink-io.systemd.Resolve.h" #include "varlink-io.systemd.Resolve.Monitor.h" +#include "varlink-util.h" typedef struct LookupParameters { int ifindex; @@ -1361,12 +1362,10 @@ static int varlink_monitor_server_init(Manager *m) { if (m->varlink_monitor_server) return 0; - r = sd_varlink_server_new(&server, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA); + r = varlink_server_new(&server, SD_VARLINK_SERVER_ACCOUNT_UID|SD_VARLINK_SERVER_INHERIT_USERDATA, m); if (r < 0) return log_error_errno(r, "Failed to allocate varlink server object: %m"); - sd_varlink_server_set_userdata(server, m); - r = sd_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"); @@ -1407,12 +1406,10 @@ static int varlink_main_server_init(Manager *m) { if (m->varlink_server) return 0; - r = sd_varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID); + r = varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID, m); if (r < 0) return log_error_errno(r, "Failed to allocate varlink server object: %m"); - sd_varlink_server_set_userdata(s, m); - r = sd_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"); diff --git a/src/sysext/sysext.c b/src/sysext/sysext.c index a87e4afcb3..6401fc4c0f 100644 --- a/src/sysext/sysext.c +++ b/src/sysext/sysext.c @@ -52,6 +52,7 @@ #include "terminal-util.h" #include "user-util.h" #include "varlink-io.systemd.sysext.h" +#include "varlink-util.h" #include "verbs.h" typedef enum MutableMode { @@ -2568,7 +2569,7 @@ static int run(int argc, char *argv[]) { /* Invocation as Varlink service */ - r = sd_varlink_server_new(&varlink_server, SD_VARLINK_SERVER_ROOT_ONLY); + r = varlink_server_new(&varlink_server, SD_VARLINK_SERVER_ROOT_ONLY, NULL); if (r < 0) return log_error_errno(r, "Failed to allocate Varlink server: %m"); diff --git a/src/test/test-varlink-idl.c b/src/test/test-varlink-idl.c index c54b24aa8b..182d59bd20 100644 --- a/src/test/test-varlink-idl.c +++ b/src/test/test-varlink-idl.c @@ -29,6 +29,7 @@ #include "varlink-io.systemd.service.h" #include "varlink-io.systemd.sysext.h" #include "varlink-org.varlink.service.h" +#include "varlink-util.h" static SD_VARLINK_DEFINE_ENUM_TYPE( EnumTest, @@ -378,6 +379,7 @@ static void* server_thread(void *userdata) { _cleanup_(sd_event_unrefp) sd_event *event = NULL; assert_se(sd_varlink_server_new(&server, 0) >= 0); + assert_se(varlink_set_info_systemd(server) >= 0); assert_se(sd_varlink_server_add_interface(server, &vl_interface_xyz) >= 0); assert_se(sd_varlink_server_bind_method(server, "xyz.TestMethod", test_method) >= 0); assert_se(sd_varlink_server_bind_method(server, "xyz.Done", done_method) >= 0); diff --git a/src/test/test-varlink.c b/src/test/test-varlink.c index 40d972b6b6..bd1d940585 100644 --- a/src/test/test-varlink.c +++ b/src/test/test-varlink.c @@ -16,6 +16,7 @@ #include "tests.h" #include "tmpfile-util.h" #include "user-util.h" +#include "varlink-util.h" /* Let's pick some high value, that is higher than the largest listen() backlog, but leaves enough room below the typical RLIMIT_NOFILE value of 1024 so that we can process both sides of each socket in our @@ -359,7 +360,9 @@ TEST(chat) { assert_se(sd_event_source_set_priority(block_event, SD_EVENT_PRIORITY_IMPORTANT) >= 0); block_write_fd = TAKE_FD(block_fds[1]); - assert_se(sd_varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID) >= 0); + assert_se(varlink_server_new(&s, SD_VARLINK_SERVER_ACCOUNT_UID, NULL) >= 0); + assert_se(sd_varlink_server_set_info(s, "Vendor", "Product", "Version", "URL") >= 0); + assert_se(varlink_set_info_systemd(s) >= 0); assert_se(sd_varlink_server_set_description(s, "our-server") >= 0); assert_se(sd_varlink_server_bind_method(s, "io.test.PassFD", method_passfd) >= 0); diff --git a/src/userdb/userwork.c b/src/userdb/userwork.c index b7a2bf798c..1e36face40 100644 --- a/src/userdb/userwork.c +++ b/src/userdb/userwork.c @@ -20,6 +20,7 @@ #include "user-util.h" #include "userdb.h" #include "varlink-io.systemd.UserDatabase.h" +#include "varlink-util.h" #define ITERATIONS_MAX 64U #define RUNTIME_MAX_USEC (5 * USEC_PER_MINUTE) @@ -489,9 +490,9 @@ static int run(int argc, char *argv[]) { if (r < 0) return log_error_errno(r, "Failed to turn off non-blocking mode for listening socket: %m"); - r = sd_varlink_server_new(&server, 0); + r = varlink_server_new(&server, 0, NULL); if (r < 0) - return log_error_errno(r, "Failed to allocate server: %m"); + return log_error_errno(r, "Failed to allocate varlink server: %m"); r = sd_varlink_server_add_interface(server, &vl_interface_io_systemd_UserDatabase); if (r < 0) From 516a80b28490aabb8287283aa1d4a49900d8a866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 9 Dec 2024 20:54:08 +0100 Subject: [PATCH 3/3] sd-varlink: modernize pointer style in function signatures --- src/libsystemd/sd-varlink/sd-varlink.c | 10 +++++----- src/systemd/sd-varlink.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libsystemd/sd-varlink/sd-varlink.c b/src/libsystemd/sd-varlink/sd-varlink.c index 5e9999deaf..7038cba5db 100644 --- a/src/libsystemd/sd-varlink/sd-varlink.c +++ b/src/libsystemd/sd-varlink/sd-varlink.c @@ -69,7 +69,7 @@ DEFINE_PRIVATE_STRING_TABLE_LOOKUP_TO_STRING(varlink_state, VarlinkState); static int varlink_format_queue(sd_varlink *v); static void varlink_server_test_exit_on_idle(sd_varlink_server *s); -static VarlinkJsonQueueItem *varlink_json_queue_item_free(VarlinkJsonQueueItem *q) { +static VarlinkJsonQueueItem* varlink_json_queue_item_free(VarlinkJsonQueueItem *q) { if (!q) return NULL; @@ -79,7 +79,7 @@ static VarlinkJsonQueueItem *varlink_json_queue_item_free(VarlinkJsonQueueItem * return mfree(q); } -static VarlinkJsonQueueItem *varlink_json_queue_item_new(sd_json_variant *m, const int fds[], size_t n_fds) { +static VarlinkJsonQueueItem* varlink_json_queue_item_new(sd_json_variant *m, const int fds[], size_t n_fds) { VarlinkJsonQueueItem *q; assert(m); @@ -3030,7 +3030,7 @@ _public_ void sd_varlink_detach_event(sd_varlink *v) { v->event = sd_event_unref(v->event); } -_public_ sd_event *sd_varlink_get_event(sd_varlink *v) { +_public_ sd_event* sd_varlink_get_event(sd_varlink *v) { assert_return(v, NULL); return v->event; @@ -3453,7 +3453,7 @@ _public_ int sd_varlink_server_add_connection(sd_varlink_server *server, int fd, return sd_varlink_server_add_connection_pair(server, fd, fd, /* override_ucred= */ NULL, ret); } -VarlinkServerSocket *varlink_server_socket_free(VarlinkServerSocket *ss) { +VarlinkServerSocket* varlink_server_socket_free(VarlinkServerSocket *ss) { if (!ss) return NULL; @@ -3859,7 +3859,7 @@ _public_ int sd_varlink_server_detach_event(sd_varlink_server *s) { return 0; } -_public_ sd_event *sd_varlink_server_get_event(sd_varlink_server *s) { +_public_ sd_event* sd_varlink_server_get_event(sd_varlink_server *s) { assert_return(s, NULL); return s->event; diff --git a/src/systemd/sd-varlink.h b/src/systemd/sd-varlink.h index 833977d8b2..816b9b0ebf 100644 --- a/src/systemd/sd-varlink.h +++ b/src/systemd/sd-varlink.h @@ -251,7 +251,7 @@ void* sd_varlink_server_get_userdata(sd_varlink_server *s); int sd_varlink_server_attach_event(sd_varlink_server *v, sd_event *e, int64_t priority); int sd_varlink_server_detach_event(sd_varlink_server *v); -sd_event *sd_varlink_server_get_event(sd_varlink_server *v); +sd_event* sd_varlink_server_get_event(sd_varlink_server *v); int sd_varlink_server_loop_auto(sd_varlink_server *server);