From: Mike Yuan Date: Fri, 16 Jan 2026 20:00:30 +0000 (+0100) Subject: core/varlink-manager: move varlink_unit_queue_job_one() to varlink-unit X-Git-Tag: v260-rc1~286^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7228da61b9bb894839664ce733a0bec450fbdec2;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/core/varlink-manager.c b/src/core/varlink-manager.c index f1b6f8c0e64..25140bf465c 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 c84c652e554..e5111eb58dc 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 2d3f02d4c0b..210added603 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 e60d5a5b9bc..0913d8f0092 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 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); + +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); diff --git a/src/shared/varlink-io.systemd.Manager.c b/src/shared/varlink-io.systemd.Manager.c index ecae5a0924b..79c5c7e7168 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 f8e255dd5b9..19d384dd913 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);