summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dbus-unit.c3
-rw-r--r--src/load-fragment.c1
-rw-r--r--src/unit.c6
-rw-r--r--src/unit.h3
4 files changed, 11 insertions, 2 deletions
diff --git a/src/dbus-unit.c b/src/dbus-unit.c
index e3e1be12ad..5c474c0c1e 100644
--- a/src/dbus-unit.c
+++ b/src/dbus-unit.c
@@ -281,6 +281,9 @@ static DBusHandlerResult bus_unit_message_dispatch(Unit *u, DBusMessage *message
int r;
char *path;
+ if (job_type == JOB_START && u->meta.only_by_dependency)
+ return bus_send_error_reply(m, message, NULL, -EPERM);
+
if (!dbus_message_get_args(
message,
&error,
diff --git a/src/load-fragment.c b/src/load-fragment.c
index 3ebea4316f..70b69233c7 100644
--- a/src/load-fragment.c
+++ b/src/load-fragment.c
@@ -1268,6 +1268,7 @@ static int load_from_path(Unit *u, const char *path) {
{ "After", config_parse_deps, UINT_TO_PTR(UNIT_AFTER), "Unit" },
{ "RecursiveStop", config_parse_bool, &u->meta.recursive_stop, "Unit" },
{ "StopWhenUnneeded", config_parse_bool, &u->meta.stop_when_unneeded, "Unit" },
+ { "OnlyByDependency", config_parse_bool, &u->meta.only_by_dependency, "Unit" },
{ "PIDFile", config_parse_path, &u->service.pid_file, "Service" },
{ "ExecStartPre", config_parse_exec, u->service.exec_command+SERVICE_EXEC_START_PRE, "Service" },
diff --git a/src/unit.c b/src/unit.c
index 012edd47a8..b38be317ee 100644
--- a/src/unit.c
+++ b/src/unit.c
@@ -593,7 +593,8 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
"%s\tActive Enter Timestamp: %s\n"
"%s\tActive Exit Timestamp: %s\n"
"%s\tInactive Enter Timestamp: %s\n"
- "%s\tGC Check Good: %s\n",
+ "%s\tGC Check Good: %s\n"
+ "%s\tOnly By Dependency: %s\n",
prefix, u->meta.id,
prefix, unit_description(u),
prefix, strna(u->meta.instance),
@@ -603,7 +604,8 @@ void unit_dump(Unit *u, FILE *f, const char *prefix) {
prefix, strna(format_timestamp(timestamp2, sizeof(timestamp2), u->meta.active_enter_timestamp)),
prefix, strna(format_timestamp(timestamp3, sizeof(timestamp3), u->meta.active_exit_timestamp)),
prefix, strna(format_timestamp(timestamp4, sizeof(timestamp4), u->meta.inactive_enter_timestamp)),
- prefix, yes_no(unit_check_gc(u)));
+ prefix, yes_no(unit_check_gc(u)),
+ prefix, yes_no(u->meta.only_by_dependency));
SET_FOREACH(t, u->meta.names, i)
fprintf(f, "%s\tName: %s\n", prefix, t);
diff --git a/src/unit.h b/src/unit.h
index 8f9d9e9860..d8be185c5c 100644
--- a/src/unit.h
+++ b/src/unit.h
@@ -136,6 +136,9 @@ struct Meta {
UnitLoadState load_state;
Unit *merged_into;
+ /* Refuse manual starting, allow starting only indirectly via dependency. */
+ bool only_by_dependency;
+
char *id; /* One name is special because we use it for identification. Points to an entry in the names set */
char *instance;