summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranck Bui <fbui@suse.com>2016-11-14 17:37:40 +0100
committerFranck Bui <fbui@suse.com>2016-11-17 18:16:51 +0100
commitc891efaf8a37aa13d91835fb8d194f6dd750a78f (patch)
tree1753c3cfdea38a982f8fe866dc11fddb1925ae42
parent63d77c9254aee1f965df5574c98c2fa83b50567c (diff)
core: confirm_spawn: always accept units with same_pgrp set for now
For some reasons units remaining in the same process group as PID 1 (same_pgrp=true) fail to acquire the console even if it's not taken by anyone. So always accept for units with same_pgrp set for now.
-rw-r--r--src/core/execute.c2
-rw-r--r--src/core/unit.c11
-rw-r--r--src/core/unit.h2
3 files changed, 14 insertions, 1 deletions
diff --git a/src/core/execute.c b/src/core/execute.c
index c7b324ffa8..53aed1f287 100644
--- a/src/core/execute.c
+++ b/src/core/execute.c
@@ -2385,7 +2385,7 @@ static int exec_child(
exec_context_tty_reset(context, params);
- if (!manager_is_confirm_spawn_disabled(unit->manager)) {
+ if (unit_shall_confirm_spawn(unit)) {
const char *vc = params->confirm_spawn;
_cleanup_free_ char *cmdline = NULL;
diff --git a/src/core/unit.c b/src/core/unit.c
index bba0f5d357..7b78ba9a9e 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1515,6 +1515,17 @@ int unit_start_limit_test(Unit *u) {
return emergency_action(u->manager, u->start_limit_action, u->reboot_arg, "unit failed");
}
+bool unit_shall_confirm_spawn(Unit *u) {
+
+ if (manager_is_confirm_spawn_disabled(u->manager))
+ return false;
+
+ /* For some reasons units remaining in the same process group
+ * as PID 1 fail to acquire the console even if it's not used
+ * by any process. So skip the confirmation question for them. */
+ return !unit_get_exec_context(u)->same_pgrp;
+}
+
/* Errors:
* -EBADR: This unit type does not support starting.
* -EALREADY: Unit is already started.
diff --git a/src/core/unit.h b/src/core/unit.h
index 991543664b..1ef92f3263 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -654,6 +654,8 @@ void unit_notify_user_lookup(Unit *u, uid_t uid, gid_t gid);
int unit_set_invocation_id(Unit *u, sd_id128_t id);
int unit_acquire_invocation_id(Unit *u);
+bool unit_shall_confirm_spawn(Unit *u);
+
/* Macros which append UNIT= or USER_UNIT= to the message */
#define log_unit_full(unit, level, error, ...) \