From: Yu Watanabe Date: Sat, 21 Dec 2024 21:03:52 +0000 (+0900) Subject: udevadm-control: use varlink to send commands X-Git-Tag: v258-rc1~1675^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4e4c2fcfb63fe58b234a089d57c87db038157db0;p=thirdparty%2Fsystemd.git udevadm-control: use varlink to send commands --- diff --git a/src/udev/udev-varlink.c b/src/udev/udev-varlink.c index 8a7b48817ac..8faadb8bcf6 100644 --- a/src/udev/udev-varlink.c +++ b/src/udev/udev-varlink.c @@ -163,3 +163,23 @@ int manager_start_varlink_server(Manager *manager) { manager->varlink_server = TAKE_PTR(v); return 0; } + +int udev_varlink_connect(sd_varlink **ret, usec_t timeout) { + _cleanup_(sd_varlink_flush_close_unrefp) sd_varlink *link = NULL; + int r; + + assert(ret); + + r = sd_varlink_connect_address(&link, UDEV_VARLINK_ADDRESS); + if (r < 0) + return r; + + (void) sd_varlink_set_description(link, "udev"); + + r = sd_varlink_set_relative_timeout(link, timeout); + if (r < 0) + return r; + + *ret = TAKE_PTR(link); + return 0; +} diff --git a/src/udev/udev-varlink.h b/src/udev/udev-varlink.h index c4e3251768d..759a4460ab6 100644 --- a/src/udev/udev-varlink.h +++ b/src/udev/udev-varlink.h @@ -1,6 +1,11 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include "sd-varlink.h" + +#include "time-util.h" + typedef struct Manager Manager; int manager_start_varlink_server(Manager *manager); +int udev_varlink_connect(sd_varlink **ret, usec_t timeout); diff --git a/src/udev/udevadm-control.c b/src/udev/udevadm-control.c index 29dc88330c6..3ccc6213570 100644 --- a/src/udev/udevadm-control.c +++ b/src/udev/udevadm-control.c @@ -9,6 +9,7 @@ #include #include "creds-util.h" +#include "errno-util.h" #include "parse-util.h" #include "process-util.h" #include "static-destruct.h" @@ -17,6 +18,8 @@ #include "time-util.h" #include "udevadm.h" #include "udev-ctrl.h" +#include "udev-varlink.h" +#include "varlink-util.h" #include "virt.h" static char **arg_env = NULL; @@ -174,7 +177,7 @@ static int parse_argv(int argc, char *argv[]) { return 1; } -static int send_control_commands(void) { +static int send_control_commands_via_ctrl(void) { _cleanup_(udev_ctrl_unrefp) UdevCtrl *uctrl = NULL; int r; @@ -238,6 +241,64 @@ static int send_control_commands(void) { return 0; } +static int send_control_commands(void) { + _cleanup_(sd_varlink_flush_close_unrefp) sd_varlink *link = NULL; + int r; + + r = udev_varlink_connect(&link, arg_timeout); + if (ERRNO_IS_NEG_DISCONNECT(r) || r == -ENOENT) { + log_debug_errno(r, "Failed to connect to udev via varlink, falling back to use legacy control socket, ignoring: %m"); + return send_control_commands_via_ctrl(); + } + if (r < 0) + return log_error_errno(r, "Failed to connect to udev via varlink: %m"); + + if (arg_exit) + return varlink_call_and_log(link, "io.systemd.Udev.Exit", /* parameters = */ NULL, /* reply = */ NULL); + + if (arg_log_level >= 0) { + r = varlink_callbo_and_log(link, "io.systemd.service.SetLogLevel", /* reply = */ NULL, + SD_JSON_BUILD_PAIR_INTEGER("level", arg_log_level)); + if (r < 0) + return r; + } + + if (arg_start_exec_queue >= 0) { + r = varlink_call_and_log(link, arg_start_exec_queue ? "io.systemd.Udev.StartExecQueue" : "io.systemd.Udev.StopExecQueue", + /* parameters = */ NULL, /* reply = */ NULL); + if (r < 0) + return r; + } + + if (arg_reload) { + r = varlink_call_and_log(link, "io.systemd.service.Reload", /* parameters = */ NULL, /* reply = */ NULL); + if (r < 0) + return r; + } + + if (!strv_isempty(arg_env)) { + r = varlink_callbo_and_log(link, "io.systemd.Udev.SetEnvironment", /* reply = */ NULL, + SD_JSON_BUILD_PAIR_STRV("assignments", arg_env)); + if (r < 0) + return r; + } + + if (arg_max_children >= 0) { + r = varlink_callbo_and_log(link, "io.systemd.Udev.SetChildrenMax", /* reply = */ NULL, + SD_JSON_BUILD_PAIR_UNSIGNED("number", arg_max_children)); + if (r < 0) + return r; + } + + if (arg_ping) { + r = varlink_call_and_log(link, "io.systemd.service.Ping", /* parameters = */ NULL, /* reply = */ NULL); + if (r < 0) + return r; + } + + return 0; +} + int control_main(int argc, char *argv[], void *userdata) { int r;