static struct pmenu *main_menu_init(struct cui *cui);
static struct pmenu *plugin_menu_init(struct cui *cui);
+static void cui_cancel_autoboot_on_exit(struct cui *cui);
+
static bool lockdown_active(void)
{
bool lockdown = false;
struct cui *cui = cui_from_pmenu(menu);
char *sh_cmd;
+ cui_cancel_autoboot_on_exit(cui);
+
sh_cmd = talloc_asprintf(cui,
"echo \"Exiting petitboot. Type 'exit' to return.\";\
echo \"You may run 'pb-sos' to gather diagnostic data\";\
return NULL;
}
+ m->n_hot_keys = 1;
+ m->hot_keys = talloc_array(m, hot_key_fn, m->n_hot_keys);
+ if (!m->hot_keys) {
+ pb_log("%s: failed to allocate hot_keys\n", __func__);
+ talloc_free(m);
+ return NULL;
+ }
+ m->hot_keys[0] = pmenu_main_hot_keys;
m->on_new = cui_item_new;
m->scr.frame.ltitle = talloc_asprintf(m,
int result;
m = pmenu_init(cui, 2, cui_plugin_menu_exit);
- m->on_new = cui_item_new;
m->scr.frame.ltitle = talloc_asprintf(m, _("Petitboot Plugins"));
m->scr.frame.rtitle = talloc_asprintf(m, NULL);
m->scr.frame.help = talloc_strdup(m,
.update_config = cui_update_config,
};
-/* cui_server_wait_on_exit - On exit spin until the server is available.
- *
- * If the program exits before connecting to the server autoboot won't be
- * cancelled even though there has been keyboard activity. This function is
- * called by a child process which will spin until the server is connected and
- * told to cancel autoboot.
- *
- * Processes exiting from this function will not carry out the cui_atexit()
- * steps.
- */
-static void cui_server_wait_on_exit(struct cui *cui)
-{
- cui_detached = true;
-
- while (!cui->client) {
- cui->client = discover_client_init(cui->waitset,
- &cui_client_ops, cui);
- if (!cui->client)
- sleep(1);
- }
-
- talloc_steal(cui, cui->client);
- discover_client_cancel_default(cui->client);
-}
-
/* cui_server_wait - Connect to the discover server.
* @arg: Pointer to the cui instance.
*
return NULL;
}
+/**
+ * cui_cancel_autoboot_on_exit - On exit spin until the server is available.
+ *
+ * If the program exits before connecting to the server autoboot won't be
+ * cancelled even though there has been keyboard activity. A child is forked
+ * which will spin until the server is connected and told to cancel autoboot.
+ */
+static void cui_cancel_autoboot_on_exit(struct cui *cui)
+{
+ pid_t pid;
+
+ if (!cui->client) {
+ /* Fork a child to tell the server to cancel autoboot */
+ pid = fork();
+ if (!pid) {
+ cui_detached = true;
+
+ /* Loop until connection established */
+ while (!cui->client) {
+ cui->client = discover_client_init(cui->waitset,
+ &cui_client_ops, cui);
+ if (!cui->client)
+ sleep(1);
+ }
+
+ talloc_steal(cui, cui->client);
+ discover_client_cancel_default(cui->client);
+ exit(EXIT_SUCCESS);
+ }
+ if (pid < 0)
+ pb_log("Failed to fork child on exit: %m\n");
+ } else
+ discover_client_cancel_default(cui->client);
+}
+
/**
* cui_run - The main cui program loop.
* @cui: The cui instance.
int cui_run(struct cui *cui)
{
- pid_t pid;
-
assert(main);
cui->current = &cui->main->scr;
}
}
- cui_atexit();
+ cui_cancel_autoboot_on_exit(cui);
- if (!cui->client) {
- /* Fork a child to tell the server to cancel autoboot */
- pid = fork();
- if (!pid) {
- cui_server_wait_on_exit(cui);
- exit(EXIT_SUCCESS);
- }
- if (pid < 0)
- pb_log("Failed to fork child on exit: %m\n");
- }
+ cui_atexit();
return cui->abort ? 0 : -1;
}