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);