]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: use emergency_action for ctr+alt+del burst 4428/head
authorLukas Nykryn <lnykryn@redhat.com>
Tue, 18 Oct 2016 10:16:32 +0000 (12:16 +0200)
committerLukas Nykryn <lnykryn@redhat.com>
Fri, 21 Oct 2016 13:13:50 +0000 (15:13 +0200)
Fixes #4306

man/systemd-system.conf.xml
src/core/main.c
src/core/manager.c
src/core/manager.h

index 1d995f143e1660b77835f0652308366cff5eab31..80cad7f09cca4a1e125106963a4d01ed60922654 100644 (file)
 
         <listitem><para>Defines what action will be performed
         if user presses Ctrl-Alt-Delete more than 7 times in 2s.
-        Can be set to <literal>reboot-force</literal>, <literal>poweroff-force</literal>
-        or disabled with <literal>ignore</literal>. Defaults to
+        Can be set to <literal>reboot-force</literal>, <literal>poweroff-force</literal>,
+        <literal>reboot-immediate</literal>, <literal>poweroff-immediate</literal>
+        or disabled with <literal>none</literal>. Defaults to
         <literal>reboot-force</literal>.
         </para></listitem>
       </varlistentry>
index cf3c640a738b4c53ab3ceaeb9daa80dc04d4272e..b635a633a78424aacd7d549247b084f99293fbcb 100644 (file)
@@ -89,6 +89,7 @@
 #include "user-util.h"
 #include "virt.h"
 #include "watchdog.h"
+#include "emergency-action.h"
 
 static enum {
         ACTION_RUN,
@@ -131,7 +132,7 @@ static bool arg_default_memory_accounting = false;
 static bool arg_default_tasks_accounting = true;
 static uint64_t arg_default_tasks_max = UINT64_MAX;
 static sd_id128_t arg_machine_id = {};
-static CADBurstAction arg_cad_burst_action = CAD_BURST_ACTION_REBOOT;
+static EmergencyAction arg_cad_burst_action = EMERGENCY_ACTION_REBOOT_FORCE;
 
 noreturn static void freeze_or_reboot(void) {
 
@@ -649,8 +650,6 @@ static int config_parse_join_controllers(const char *unit,
         return 0;
 }
 
-static DEFINE_CONFIG_PARSE_ENUM(config_parse_cad_burst_action, cad_burst_action, CADBurstAction, "Failed to parse service restart specifier");
-
 static int parse_config_file(void) {
 
         const ConfigTableItem items[] = {
@@ -705,7 +704,7 @@ static int parse_config_file(void) {
                 { "Manager", "DefaultMemoryAccounting",   config_parse_bool,             0, &arg_default_memory_accounting         },
                 { "Manager", "DefaultTasksAccounting",    config_parse_bool,             0, &arg_default_tasks_accounting          },
                 { "Manager", "DefaultTasksMax",           config_parse_tasks_max,        0, &arg_default_tasks_max                 },
-                { "Manager", "CtrlAltDelBurstAction",     config_parse_cad_burst_action, 0, &arg_cad_burst_action},
+                { "Manager", "CtrlAltDelBurstAction",     config_parse_emergency_action, 0, &arg_cad_burst_action                  },
                 {}
         };
 
index 65f163de319a97d0acfe81828e836b4c9fc1f0c7..ffccfdcd5e6e7cc506355c5422846803073bc7a6 100644 (file)
@@ -1911,28 +1911,11 @@ static void manager_handle_ctrl_alt_del(Manager *m) {
          * 7 times within 2s, we reboot/shutdown immediately,
          * unless it was disabled in system.conf */
 
-        if (ratelimit_test(&m->ctrl_alt_del_ratelimit) || m->cad_burst_action == CAD_BURST_ACTION_IGNORE)
+        if (ratelimit_test(&m->ctrl_alt_del_ratelimit) || m->cad_burst_action == EMERGENCY_ACTION_NONE)
                 manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY);
-        else {
-                switch (m->cad_burst_action) {
-
-                case CAD_BURST_ACTION_REBOOT:
-                        m->exit_code = MANAGER_REBOOT;
-                        break;
-
-                case CAD_BURST_ACTION_POWEROFF:
-                        m->exit_code = MANAGER_POWEROFF;
-                        break;
-
-                default:
-                        assert_not_reached("Unknown action.");
-                }
-
-                log_notice("Ctrl-Alt-Del was pressed more than 7 times within 2s, performing immediate %s.",
-                                cad_burst_action_to_string(m->cad_burst_action));
-                status_printf(NULL, true, false, "Ctrl-Alt-Del was pressed more than 7 times within 2s, performing immediate %s.",
-                                cad_burst_action_to_string(m->cad_burst_action));
-        }
+        else
+                emergency_action(m, m->cad_burst_action, NULL,
+                                "Ctrl-Alt-Del was pressed more than 7 times within 2s");
 }
 
 static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) {
@@ -3590,11 +3573,3 @@ static const char *const manager_state_table[_MANAGER_STATE_MAX] = {
 };
 
 DEFINE_STRING_TABLE_LOOKUP(manager_state, ManagerState);
-
-static const char *const cad_burst_action_table[_CAD_BURST_ACTION_MAX] = {
-        [CAD_BURST_ACTION_IGNORE] = "ignore",
-        [CAD_BURST_ACTION_REBOOT] = "reboot-force",
-        [CAD_BURST_ACTION_POWEROFF] = "poweroff-force",
-};
-
-DEFINE_STRING_TABLE_LOOKUP(cad_burst_action, CADBurstAction);
index 29fe14e10befb29f8528d7231db492aa683b5e91..35172fdba9886d6bee05f98fe0b35a84c6091be2 100644 (file)
@@ -62,14 +62,6 @@ typedef enum ManagerExitCode {
         _MANAGER_EXIT_CODE_INVALID = -1
 } ManagerExitCode;
 
-typedef enum CADBurstAction {
-        CAD_BURST_ACTION_IGNORE,
-        CAD_BURST_ACTION_REBOOT,
-        CAD_BURST_ACTION_POWEROFF,
-        _CAD_BURST_ACTION_MAX,
-        _CAD_BURST_ACTION_INVALID = -1
-} CADBurstAction;
-
 typedef enum StatusType {
         STATUS_TYPE_EPHEMERAL,
         STATUS_TYPE_NORMAL,
@@ -315,7 +307,7 @@ struct Manager {
 
         /* When the user hits C-A-D more than 7 times per 2s, do something immediately... */
         RateLimit ctrl_alt_del_ratelimit;
-        CADBurstAction cad_burst_action;
+        EmergencyAction cad_burst_action;
 
         const char *unit_log_field;
         const char *unit_log_format_string;
@@ -411,6 +403,3 @@ void manager_deserialize_gid_refs_one(Manager *m, const char *value);
 
 const char *manager_state_to_string(ManagerState m) _const_;
 ManagerState manager_state_from_string(const char *s) _pure_;
-
-const char *cad_burst_action_to_string(CADBurstAction a) _const_;
-CADBurstAction cad_burst_action_from_string(const char *s) _pure_;