diff --git a/src/bootctl/bootctl.c b/src/bootctl/bootctl.c index 98721347f4e..7befb8c6e25 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 352fd28b0db..4f0563a1c09 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 b24a84eaa64..7635aee37ca 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/fuzz/fuzz-varlink.c b/src/fuzz/fuzz-varlink.c index 2342e34d8f7..2497fe3b9e7 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/home/homed-manager.c b/src/home/homed-manager.c index 6f5b6feda2d..de7c3d8dbe1 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 cc538ce979e..ba50b59f922 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 a0c40cc3d03..db081205ab7 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 9377ff8c795..bebc1e584c5 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/libsystemd.sym b/src/libsystemd/libsystemd.sym index 0b948b86a2b..a76dc7e4ae0 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 150ce4eddab..7038cba5db5 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 @@ -70,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; @@ -80,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); @@ -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)); } @@ -3035,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; @@ -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; @@ -3429,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; @@ -3835,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/libsystemd/sd-varlink/varlink-internal.h b/src/libsystemd/sd-varlink/varlink-internal.h index b184ac77546..377f8cfae45 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/libsystemd/sd-varlink/varlink-util.c b/src/libsystemd/sd-varlink/varlink-util.c index b16d4bddb6c..765108515c4 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 3f532bf140b..351f3951b07 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 616b972b379..3385aa8a178 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 6ffb36167af..af46287fcf8 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 9fe8e607698..546dae0739e 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 e8929ad6b3c..21fc2d9088c 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 7437a6e889b..baa88a2f2a0 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 1bf39caf43d..6bdb5418b53 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 d824914ae79..25d76151b10 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 456347fd7ed..107f722e7d8 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 a87e4afcb37..6401fc4c0ff 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/systemd/sd-varlink.h b/src/systemd/sd-varlink.h index fbf575ffdf6..816b9b0ebfe 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); @@ -244,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); diff --git a/src/test/test-varlink-idl.c b/src/test/test-varlink-idl.c index c54b24aa8b4..182d59bd206 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 40d972b6b64..bd1d9405851 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 b7a2bf798c5..1e36face408 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)