diff options
Diffstat (limited to 'ui')
-rw-r--r-- | ui/ncurses/generic-main.c | 13 | ||||
-rw-r--r-- | ui/ncurses/nc-cui.c | 55 | ||||
-rw-r--r-- | ui/ncurses/nc-cui.h | 2 |
3 files changed, 59 insertions, 11 deletions
diff --git a/ui/ncurses/generic-main.c b/ui/ncurses/generic-main.c index 27744d4..7062796 100644 --- a/ui/ncurses/generic-main.c +++ b/ui/ncurses/generic-main.c @@ -49,8 +49,8 @@ static void print_usage(void) { print_version(); printf( -"%s: petitboot-nc [-h, --help] [-l, --log log-file]\n" -" [-s, --start-daemon] [-v, --verbose] [-V, --version]\n", +"%s: petitboot-nc [-h, --help] [-l, --log log-file] [-s, --start-daemon]\n" +" [-t, --timeout] [-v, --verbose] [-V, --version]\n", _("Usage")); } @@ -68,6 +68,7 @@ struct opts { enum opt_value show_help; const char *log_file; enum opt_value start_daemon; + enum opt_value timeout; enum opt_value verbose; enum opt_value show_version; }; @@ -82,11 +83,12 @@ static int opts_parse(struct opts *opts, int argc, char *argv[]) {"help", no_argument, NULL, 'h'}, {"log", required_argument, NULL, 'l'}, {"start-daemon", no_argument, NULL, 's'}, + {"timeout", no_argument, NULL, 't'}, {"verbose", no_argument, NULL, 'v'}, {"version", no_argument, NULL, 'V'}, { NULL, 0, NULL, 0}, }; - static const char short_options[] = "dhl:svV"; + static const char short_options[] = "dhl:stvV"; static const struct opts default_values = { 0 }; *opts = default_values; @@ -108,6 +110,9 @@ static int opts_parse(struct opts *opts, int argc, char *argv[]) case 's': opts->start_daemon = opt_yes; break; + case 't': + opts->timeout = opt_yes; + break; case 'v': opts->verbose = opt_yes; break; @@ -244,7 +249,7 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - cui = cui_init(NULL, NULL, opts.start_daemon); + cui = cui_init(NULL, NULL, opts.start_daemon, opts.timeout); if (!cui) return EXIT_FAILURE; diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index 6888fa7..a2de48e 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -423,7 +423,7 @@ static int cui_process_key(void *arg) if (c == ERR) break; - if (!cui->has_input) { + if (!cui->has_input && cui->client) { pb_log("UI input received (key = %d), aborting " "default boot\n", c); discover_client_cancel_default(cui->client); @@ -798,13 +798,15 @@ static int menu_lang_execute(struct pmenu_item *item) static int menu_reinit_execute(struct pmenu_item *item) { - cui_send_reinit(cui_from_item(item)); + if (cui_from_item(item)->client) + cui_send_reinit(cui_from_item(item)); return 0; } static int menu_add_url_execute(struct pmenu_item *item) { - cui_show_add_url(cui_from_item(item)); + if (cui_from_item(item)->client) + cui_show_add_url(cui_from_item(item)); return 0; } @@ -894,6 +896,42 @@ static struct discover_client_ops cui_client_ops = { .update_config = cui_update_config, }; +/* cui_server_wait - Connect to the discover server. + * @arg: Pointer to the cui instance. + * + * A timeout callback that attempts to connect to the discover server; on + * failure it registers itself with a one second timeout to try again. + * On success the cui->client struct will be set. + * + * Since this updates the status line when called it must not be called + * before the UI is ready. + */ +static int cui_server_wait(void *arg) +{ + struct cui *cui = cui_from_arg(arg); + + if (cui->client) { + pb_debug("We already have a server!\n"); + return 0; + } + + /* We haven't yet connected to the server */ + pb_log("Trying to connect...\n"); + cui->client = discover_client_init(cui->waitset, + &cui_client_ops, cui); + + if (!cui->client) { + waiter_register_timeout(cui->waitset, 1000, cui_server_wait, + cui); + nc_scr_status_printf(cui->current, "Info: Waiting for server"); + } else { + nc_scr_status_printf(cui->current, "Info: Connected to server!"); + talloc_steal(cui, cui->client); + } + + return 0; +} + /** * cui_init - Setup the cui instance. * @platform_info: A value for the struct cui platform_info member. @@ -905,7 +943,7 @@ static struct discover_client_ops cui_client_ops = { */ struct cui *cui_init(void* platform_info, - int (*js_map)(const struct js_event *e), int start_daemon) + int (*js_map)(const struct js_event *e), int start_daemon, int timeout) { struct cui *cui; unsigned int i; @@ -926,7 +964,7 @@ struct cui *cui_init(void* platform_info, /* Loop here for scripts that just started the server. */ retry_start: - for (i = start_daemon ? 2 : 15; i; i--) { + for (i = start_daemon ? 2 : 15; i && timeout; i--) { cui->client = discover_client_init(cui->waitset, &cui_client_ops, cui); if (cui->client || !i) @@ -953,7 +991,12 @@ retry_start: goto fail_client_init; } - if (!cui->client) { + if (!cui->client && !timeout) { + /* Have the first timeout fire immediately so we can check + * for the server as soon as the UI is ready */ + waiter_register_timeout(cui->waitset, 0, + cui_server_wait, cui); + } else if (!cui->client) { pb_log("%s: discover_client_init failed.\n", __func__); fprintf(stderr, _("%s: error: discover_client_init failed.\n"), __func__); diff --git a/ui/ncurses/nc-cui.h b/ui/ncurses/nc-cui.h index afdb3c8..b00d251 100644 --- a/ui/ncurses/nc-cui.h +++ b/ui/ncurses/nc-cui.h @@ -72,7 +72,7 @@ struct cui { struct cui *cui_init(void* platform_info, int (*js_map)(const struct js_event *e), - int start_daemon); + int start_daemon, int timeout); struct nc_scr *cui_set_current(struct cui *cui, struct nc_scr *scr); int cui_run(struct cui *cui); void cui_item_edit(struct pmenu_item *item); |