]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/varlink-manager: move varlink_unit_queue_job_one() to varlink-unit
authorMike Yuan <me@yhndnzj.com>
Fri, 16 Jan 2026 20:00:30 +0000 (21:00 +0100)
committerMike Yuan <me@yhndnzj.com>
Fri, 23 Jan 2026 23:48:02 +0000 (00:48 +0100)
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
src/core/varlink-manager.h
src/core/varlink-unit.c
src/core/varlink-unit.h
src/shared/varlink-io.systemd.Manager.c
src/shared/varlink-io.systemd.Unit.c

index f1b6f8c0e6460a350b99b8fe0a5385d03260986c..25140bf465c36d063b83bd08b8bf81d6bc252341 100644 (file)
@@ -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,
index c84c652e5541827cc7ecdc50e0b34cf72983e95e..e5111eb58dc7a381806f3bda91c27d255ac1ceab 100644 (file)
@@ -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);
index 2d3f02d4c0b5fcbf385c46a2582226ac858c4a44..210added6035f2d16815950d55a8d8f71b9517ab 100644 (file)
@@ -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));
+}
index e60d5a5b9bc4182d5415ee83a6b7548c2f1e3e11..0913d8f00927daeb8954be2882db94e1d7870cd9 100644 (file)
@@ -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);
index ecae5a0924b5869481e88c8d0c58ec33b1e30216..79c5c7e7168fbf67067119ba0ba60cf2cd9e98be 100644 (file)
@@ -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,
index f8e255dd5b9aaab4bc3e57988b155407d0706b0d..19d384dd9135d8157da57b909299e412b38190bb 100644 (file)
@@ -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);