]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: add 'c' in confirmation_spawn to resume the boot process
authorFranck Bui <fbui@suse.com>
Tue, 15 Nov 2016 08:29:04 +0000 (09:29 +0100)
committerFranck Bui <fbui@suse.com>
Thu, 17 Nov 2016 17:16:50 +0000 (18:16 +0100)
NEWS
src/core/execute.c
src/core/manager.c
src/core/manager.h

diff --git a/NEWS b/NEWS
index 5cb1151b6e875f9e506083fe298eb1ac0b96338d..7ca129db8016d4e1af302fffea34f05163f69236 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@ CHANGES WITH 233 in spe
         * The confirmation spawn prompt has been reworked to offer the
           following choices:
 
+           (c)ontinue, proceed without asking anymore
            (D)ump, show the state of the unit
            (f)ail, don't execute the command and pretend it failed
            (h)elp
index 6a7ad66a2118ea739f28315168d548dd0b0ee7fd..10f73ee9b5798efcab43ac9a244fdc9b51e5da80 100644 (file)
@@ -732,6 +732,12 @@ static int ask_for_confirmation(const char *vc, Unit *u, const char *cmdline) {
                 return CONFIRM_EXECUTE;
         }
 
+        /* confirm_spawn might have been disabled while we were sleeping. */
+        if (manager_is_confirm_spawn_disabled(u->manager)) {
+                r = 1;
+                goto restore_stdio;
+        }
+
         e = ellipsize(cmdline, 60, 100);
         if (!e) {
                 log_oom();
@@ -740,7 +746,7 @@ static int ask_for_confirmation(const char *vc, Unit *u, const char *cmdline) {
         }
 
         for (;;) {
-                r = ask_char(&c, "yfshiDj", "Execute %s? [y, f, s – h for help] ", e);
+                r = ask_char(&c, "yfshiDjc", "Execute %s? [y, f, s – h for help] ", e);
                 if (r < 0) {
                         write_confirm_error_fd(r, STDOUT_FILENO);
                         r = CONFIRM_EXECUTE;
@@ -748,6 +754,11 @@ static int ask_for_confirmation(const char *vc, Unit *u, const char *cmdline) {
                 }
 
                 switch (c) {
+                case 'c':
+                        printf("Resuming normal execution.\n");
+                        manager_disable_confirm_spawn();
+                        r = 1;
+                        break;
                 case 'D':
                         unit_dump(u, stdout, "  ");
                         continue; /* ask again */
@@ -756,7 +767,8 @@ static int ask_for_confirmation(const char *vc, Unit *u, const char *cmdline) {
                         r = CONFIRM_PRETEND_FAILURE;
                         break;
                 case 'h':
-                        printf("  D - dump, show the state of the unit\n"
+                        printf("  c - continue, proceed without asking anymore\n"
+                               "  D - dump, show the state of the unit\n"
                                "  f - fail, don't execute the command and pretend it failed\n"
                                "  h - help\n"
                                "  i - info, show a short summary of the unit\n"
@@ -2373,7 +2385,7 @@ static int exec_child(
 
         exec_context_tty_reset(context, params);
 
-        if (params->confirm_spawn) {
+        if (!manager_is_confirm_spawn_disabled(unit->manager)) {
                 const char *vc = params->confirm_spawn;
                 _cleanup_free_ char *cmdline = NULL;
 
index 6ffbbd73894ca7ee0c214e1767d1a551eed1b49c..b49e3b593a6478cbc83cbefb299baa165430a707 100644 (file)
@@ -114,7 +114,7 @@ static void manager_watch_jobs_in_progress(Manager *m) {
         /* We do not want to show the cylon animation if the user
          * needs to confirm service executions otherwise confirmation
          * messages will be screwed by the cylon animation. */
-        if (m->confirm_spawn)
+        if (!manager_is_confirm_spawn_disabled(m))
                 return;
 
         if (m->jobs_in_progress_event_source)
@@ -3218,6 +3218,17 @@ void manager_set_first_boot(Manager *m, bool b) {
         m->first_boot = b;
 }
 
+void manager_disable_confirm_spawn(void) {
+        (void) touch("/run/systemd/confirm_spawn_disabled");
+}
+
+bool manager_is_confirm_spawn_disabled(Manager *m) {
+        if (!m->confirm_spawn)
+                return true;
+
+        return access("/run/systemd/confirm_spawn_disabled", F_OK) >= 0;
+}
+
 void manager_status_printf(Manager *m, StatusType type, const char *status, const char *format, ...) {
         va_list ap;
 
index 8b3db6e48b015b70813f8f4b8b4df48c6259dee0..4f17f1eea5ba7735c4f15dc57aa01a7cb7cea9d3 100644 (file)
@@ -405,3 +405,5 @@ const char *manager_state_to_string(ManagerState m) _const_;
 ManagerState manager_state_from_string(const char *s) _pure_;
 
 const char *manager_get_confirm_spawn(Manager *m);
+bool manager_is_confirm_spawn_disabled(Manager *m);
+void manager_disable_confirm_spawn(void);