From 7228da61b9bb894839664ce733a0bec450fbdec2 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Fri, 16 Jan 2026 21:00:30 +0100 Subject: [PATCH] core/varlink-manager: move varlink_unit_queue_job_one() to varlink-unit It's quite likely that we'll introduce StartUnit() and alike for varlink in the future, so the job enqueuing interface should be generic. On top of that, the errors really belong to Unit rather than Manager. --- src/core/varlink-manager.c | 38 +----------------- src/core/varlink-manager.h | 2 - src/core/varlink-unit.c | 51 +++++++++++++++++++++---- src/core/varlink-unit.h | 13 ++++++- src/shared/varlink-io.systemd.Manager.c | 8 ---- src/shared/varlink-io.systemd.Unit.c | 17 ++++++--- 6 files changed, 69 insertions(+), 60 deletions(-) diff --git a/src/core/varlink-manager.c b/src/core/varlink-manager.c index f1b6f8c0e6..25140bf465 100644 --- a/src/core/varlink-manager.c +++ b/src/core/varlink-manager.c @@ -10,7 +10,6 @@ #include "build.h" #include "bus-polkit.h" #include "confidential-virt.h" -#include "dbus-job.h" #include "errno-util.h" #include "glyph-util.h" #include "json-util.h" @@ -304,41 +303,6 @@ int vl_method_reexecute_manager(sd_varlink *link, sd_json_variant *parameters, s return 1; } -static int varlink_manager_queue_job_one( - sd_varlink *link, - Unit *u, - JobType type, - JobMode mode, - bool reload_if_possible, - uint32_t *ret_job_id) { - - int r; - - assert(u); - - r = unit_queue_job_check_and_mangle_type(u, &type, reload_if_possible); - if (r == -ENOENT) - return varlink_error_no_such_unit(link, "name"); - if (r == -ELIBEXEC) - return sd_varlink_errorb(link, VARLINK_ERROR_MANAGER_ONLY_BY_DEPENDENCY); - if (r == -ESHUTDOWN) - return sd_varlink_errorb(link, VARLINK_ERROR_MANAGER_BUS_SHUTTING_DOWN); - if (r < 0) - return r; - - Job *j; - r = manager_add_job(u->manager, type, u, mode, /* reterr_error= */ NULL, &j); - if (r < 0) - return r; - - /* Before we send the method reply, force out the announcement JobNew for this job */ - bus_job_send_pending_change_signal(j, /* including_new= */ true); - - if (ret_job_id) - *ret_job_id = j->id; - - return 0; -} int vl_method_enqueue_marked_jobs_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) { Manager *manager = ASSERT_PTR(userdata); @@ -382,7 +346,7 @@ int vl_method_enqueue_marked_jobs_manager(sd_varlink *link, sd_json_variant *par r = mac_selinux_unit_access_check_varlink(u, link, job_type_to_access_method(JOB_TRY_RESTART)); if (r >= 0) - r = varlink_manager_queue_job_one( + r = varlink_unit_queue_job_one( link, u, JOB_TRY_RESTART, diff --git a/src/core/varlink-manager.h b/src/core/varlink-manager.h index c84c652e55..e5111eb58d 100644 --- a/src/core/varlink-manager.h +++ b/src/core/varlink-manager.h @@ -4,8 +4,6 @@ #include "core-forward.h" #define VARLINK_ERROR_MANAGER_RATE_LIMIT_REACHED "io.systemd.Manager.RateLimitReached" -#define VARLINK_ERROR_MANAGER_ONLY_BY_DEPENDENCY "io.systemd.Manager.OnlyByDependency" -#define VARLINK_ERROR_MANAGER_BUS_SHUTTING_DOWN "io.systemd.Manager.BusShuttingDown" int vl_method_describe_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata); int vl_method_reexecute_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata); diff --git a/src/core/varlink-unit.c b/src/core/varlink-unit.c index 2d3f02d4c0..210added60 100644 --- a/src/core/varlink-unit.c +++ b/src/core/varlink-unit.c @@ -5,6 +5,7 @@ #include "bitfield.h" #include "cgroup.h" #include "condition.h" +#include "dbus-job.h" #include "execute.h" #include "format-util.h" #include "install.h" @@ -382,13 +383,6 @@ static void unit_lookup_parameters_done(UnitLookupParameters *p) { pidref_done(&p->pidref); } -int varlink_error_no_such_unit(sd_varlink *v, const char *name) { - return sd_varlink_errorbo( - ASSERT_PTR(v), - VARLINK_ERROR_UNIT_NO_SUCH_UNIT, - JSON_BUILD_PAIR_STRING_NON_EMPTY("parameter", name)); -} - static int varlink_error_conflict_lookup_parameters(sd_varlink *v, const UnitLookupParameters *p) { log_debug_errno( ESRCH, @@ -511,3 +505,46 @@ int vl_method_list_units(sd_varlink *link, sd_json_variant *parameters, sd_varli return sd_varlink_error(link, "io.systemd.Manager.NoSuchUnit", NULL); } + +int varlink_unit_queue_job_one( + sd_varlink *link, + Unit *u, + JobType type, + JobMode mode, + bool reload_if_possible, + uint32_t *ret_job_id) { + + int r; + + assert(u); + + r = unit_queue_job_check_and_mangle_type(u, &type, reload_if_possible); + if (r == -ENOENT) + return varlink_error_no_such_unit(link, "name"); + if (r == -ELIBEXEC) + return sd_varlink_error(link, VARLINK_ERROR_UNIT_ONLY_BY_DEPENDENCY); + if (r == -ESHUTDOWN) + return sd_varlink_error(link, VARLINK_ERROR_UNIT_DBUS_SHUTTING_DOWN); + if (r < 0) + return r; + + Job *j; + r = manager_add_job(u->manager, type, u, mode, /* reterr_error= */ NULL, &j); + if (r < 0) + return r; + + /* Before we send the method reply, force out the announcement JobNew for this job */ + bus_job_send_pending_change_signal(j, /* including_new= */ true); + + if (ret_job_id) + *ret_job_id = j->id; + + return 0; +} + +int varlink_error_no_such_unit(sd_varlink *v, const char *name) { + return sd_varlink_errorbo( + ASSERT_PTR(v), + VARLINK_ERROR_UNIT_NO_SUCH_UNIT, + JSON_BUILD_PAIR_STRING_NON_EMPTY("parameter", name)); +} diff --git a/src/core/varlink-unit.h b/src/core/varlink-unit.h index e60d5a5b9b..0913d8f009 100644 --- a/src/core/varlink-unit.h +++ b/src/core/varlink-unit.h @@ -4,6 +4,17 @@ #include "core-forward.h" #define VARLINK_ERROR_UNIT_NO_SUCH_UNIT "io.systemd.Unit.NoSuchUnit" +#define VARLINK_ERROR_UNIT_ONLY_BY_DEPENDENCY "io.systemd.Unit.OnlyByDependency" +#define VARLINK_ERROR_UNIT_DBUS_SHUTTING_DOWN "io.systemd.Unit.DBusShuttingDown" + +int vl_method_list_units(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata); + +int varlink_unit_queue_job_one( + sd_varlink *link, + Unit *u, + JobType type, + JobMode mode, + bool reload_if_possible, + uint32_t *ret_job_id); int varlink_error_no_such_unit(sd_varlink *v, const char *name); -int vl_method_list_units(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata); diff --git a/src/shared/varlink-io.systemd.Manager.c b/src/shared/varlink-io.systemd.Manager.c index ecae5a0924..79c5c7e716 100644 --- a/src/shared/varlink-io.systemd.Manager.c +++ b/src/shared/varlink-io.systemd.Manager.c @@ -188,10 +188,6 @@ static SD_VARLINK_DEFINE_METHOD( static SD_VARLINK_DEFINE_ERROR(RateLimitReached); -static SD_VARLINK_DEFINE_ERROR(OnlyByDependency); - -static SD_VARLINK_DEFINE_ERROR(BusShuttingDown); - SD_VARLINK_DEFINE_INTERFACE( io_systemd_Manager, "io.systemd.Manager", @@ -203,10 +199,6 @@ SD_VARLINK_DEFINE_INTERFACE( SD_VARLINK_SYMBOL_COMMENT("Enqueue all marked jobs"), &vl_method_EnqueueMarkedJobs, &vl_error_RateLimitReached, - SD_VARLINK_SYMBOL_COMMENT("Unit operation may be requested by dependency only"), - &vl_error_OnlyByDependency, - SD_VARLINK_SYMBOL_COMMENT("Operation refused, the bus is shutting down"), - &vl_error_BusShuttingDown, &vl_type_ManagerContext, &vl_type_ManagerRuntime, &vl_type_Timestamp, diff --git a/src/shared/varlink-io.systemd.Unit.c b/src/shared/varlink-io.systemd.Unit.c index f8e255dd5b..19d384dd91 100644 --- a/src/shared/varlink-io.systemd.Unit.c +++ b/src/shared/varlink-io.systemd.Unit.c @@ -1003,10 +1003,6 @@ static SD_VARLINK_DEFINE_STRUCT_TYPE( SD_VARLINK_FIELD_COMMENT("The cgroup runtime of the unit"), SD_VARLINK_DEFINE_FIELD_BY_TYPE(CGroup, CGroupRuntime, SD_VARLINK_NULLABLE)); -static SD_VARLINK_DEFINE_ERROR( - NoSuchUnit, - SD_VARLINK_DEFINE_FIELD(parameter, SD_VARLINK_STRING, SD_VARLINK_NULLABLE)); - static SD_VARLINK_DEFINE_METHOD_FULL( List, SD_VARLINK_SUPPORTS_MORE, @@ -1023,6 +1019,13 @@ static SD_VARLINK_DEFINE_METHOD_FULL( SD_VARLINK_FIELD_COMMENT("Runtime information of the unit"), SD_VARLINK_DEFINE_OUTPUT_BY_TYPE(runtime, UnitRuntime, 0)); +static SD_VARLINK_DEFINE_ERROR( + NoSuchUnit, + SD_VARLINK_DEFINE_FIELD(parameter, SD_VARLINK_STRING, SD_VARLINK_NULLABLE)); + +static SD_VARLINK_DEFINE_ERROR(OnlyByDependency); +static SD_VARLINK_DEFINE_ERROR(DBusShuttingDown); + SD_VARLINK_DEFINE_INTERFACE( io_systemd_Unit, "io.systemd.Unit", @@ -1087,4 +1090,8 @@ SD_VARLINK_DEFINE_INTERFACE( /* Errors */ SD_VARLINK_SYMBOL_COMMENT("No matching unit found"), - &vl_error_NoSuchUnit); + &vl_error_NoSuchUnit, + SD_VARLINK_SYMBOL_COMMENT("Job for the unit may only be enqueued by dependencies"), + &vl_error_OnlyByDependency, + SD_VARLINK_SYMBOL_COMMENT("A unit that requires D-Bus cannot be started as D-Bus is shutting down"), + &vl_error_DBusShuttingDown);