diff options
authorBrett Grandbois <>2018-08-27 08:17:20 +1000
committerSamuel Mendoza-Jonas <>2018-08-28 13:46:05 +1000
commitc4be9490a5d94b662370576157b6e0ed73f2fe77 (patch)
parent7f5a99f015cb1f48f73acb921beced6daf9fa15d (diff)
ui/ncurses: in lockdown ensure system reboot in ncurses menu exit
In a lockdown situation in the ncurses menu there is a switch to replace the 'Exit to shell' option with 'Reboot', so the intent seems to be to not allow the user the option to exit to shell in a lockdown situation. However the associated foreced reboot logic is in the process atexit so is only triggered when completely exiting the menu system. The default menu item logic to exit to shell is still in place though so the menu exit never occurs and shell access is still available. Add a switch to a different menu exit callback to force a menu abort using the same mechanism as a signal in lockdown situations so the shell can never be entered. This also affects the 'x' or esc shortcut keys. Signed-off-by: Brett Grandbois <> Signed-off-by: Samuel Mendoza-Jonas <>
2 files changed, 13 insertions, 1 deletions
diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c
index 3abeac3..d3e00aa 100644
--- a/ui/ncurses/nc-cui.c
+++ b/ui/ncurses/nc-cui.c
@@ -220,6 +220,17 @@ void cui_on_exit(struct pmenu *menu)
+ * cui_abort_on_exit - Force an exit of the main loop on menu exit.
+ * This is mainly for lockdown situations where
+ * the exit then triggers an expected reboot.
+ */
+void cui_abort_on_exit(struct pmenu *menu)
+ struct cui *cui = cui_from_pmenu(menu);
+ cui->abort = 1;
* cui_run_cmd - A generic cb to run the supplied command.
@@ -1298,7 +1309,7 @@ static struct pmenu *main_menu_init(struct cui *cui)
int result;
bool lockdown = lockdown_active();
- m = pmenu_init(cui, 9, cui_on_exit);
+ m = pmenu_init(cui, 9, lockdown ? cui_abort_on_exit : cui_on_exit);
if (!m) {
return NULL;
diff --git a/ui/ncurses/nc-cui.h b/ui/ncurses/nc-cui.h
index 4997f4b..d26883b 100644
--- a/ui/ncurses/nc-cui.h
+++ b/ui/ncurses/nc-cui.h
@@ -107,6 +107,7 @@ void cui_send_reinit(struct cui *cui);
void cui_abort(struct cui *cui);
void cui_resize(struct cui *cui);
void cui_on_exit(struct pmenu *menu);
+void cui_abort_on_exit(struct pmenu *menu);
void cui_on_open(struct pmenu *menu);
int cui_run_cmd(struct cui *cui, const char **cmd_argv);
int cui_run_cmd_from_item(struct pmenu_item *item);
OpenPOWER on IntegriCloud