#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"
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);
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,
#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);
#include "bitfield.h"
#include "cgroup.h"
#include "condition.h"
+#include "dbus-job.h"
#include "execute.h"
#include "format-util.h"
#include "install.h"
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,
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));
+}
#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);
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",
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,
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,
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",
/* 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);