X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-cui.c;h=167c2bb4eee4e13c996fc462ae2b56628ffe64a0;hp=fafa29315a2de6657c46fe84b8671ef454fb699c;hb=30b2ac42df8827f2181c7294b2a628bbcc1cfef8;hpb=c62667e5c78ea212e5ac49244e9792954a1d8f71 diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c index fafa293..167c2bb 100644 --- a/ui/ncurses/nc-cui.c +++ b/ui/ncurses/nc-cui.c @@ -25,6 +25,7 @@ #include #include "log/log.h" +#include "pb-protocol/pb-protocol.h" #include "talloc/talloc.h" #include "waiter/waiter.h" #include "ui/common/discover-client.h" @@ -59,35 +60,6 @@ void cui_resize(struct cui *cui) cui->resize = 1; } -/** - * cui_make_item_name - Format the menu item name srting. - * - * Returns a talloc string. - */ - -static char *cui_make_item_name(struct pmenu_item *i, struct cui_opt_data *cod) -{ - char *name; - - assert(cod->name); - assert(cod->bd); - - name = talloc_asprintf(i, "%s:", cod->name); - - if (cod->bd->image) - name = talloc_asprintf_append(name, " %s", cod->bd->image); - - if (cod->bd->initrd) - name = talloc_asprintf_append(name, " initrd=%s", - cod->bd->initrd); - - if (cod->bd->args) - name = talloc_asprintf_append(name, " %s", cod->bd->args); - - DBGS("@%s@\n", name); - return name; -} - /** * cui_on_exit - A generic main menu ESC callback. */ @@ -137,20 +109,21 @@ static int cui_boot(struct pmenu_item *item) assert(cui->current == &cui->main->scr); pb_log("%s: %s\n", __func__, cod->name); + if (!cod->opt) { + pb_log("%s: missing opt?\n", __func__); + return -1; + } + nc_scr_status_printf(cui->current, "Booting %s...", cod->name); def_prog_mode(); - result = discover_client_boot(cui->client, cod->dev, cod->opt, cod->bd); + result = discover_client_boot(cui->client, NULL, cod->opt, cod->bd); reset_prog_mode(); redrawwin(cui->current->main_ncw); - if (!result) { - clear(); - mvaddstr(1, 0, "system is going down now..."); - refresh(); - } else { + if (result) { nc_scr_status_printf(cui->current, "Failed: boot %s", cod->bd->image); } @@ -170,7 +143,6 @@ static void cui_boot_editor_on_exit(struct boot_editor *boot_editor, enum boot_e if (boot_editor_result == boot_editor_update) { struct pmenu_item *i = pmenu_find_selected(cui->main); struct cui_opt_data *cod = cod_from_item(i); - char *name; assert(bd); @@ -178,8 +150,7 @@ static void cui_boot_editor_on_exit(struct boot_editor *boot_editor, enum boot_e talloc_free(cod->bd); cod->bd = bd; - name = cui_make_item_name(i, cod); - pmenu_item_replace(i, name); + pmenu_item_replace(i, cod->name); /* FIXME: need to make item visible somehow */ set_current_item(cui->main->ncm, i->nci); @@ -353,16 +324,17 @@ void cui_on_open(struct pmenu *menu) * menu_items into the main menu. Redraws the main menu if it is active. */ -static int cui_device_add(struct device *dev, void *arg) +static int cui_boot_option_add(struct device *dev, struct boot_option *opt, + void *arg) { struct cui *cui = cui_from_arg(arg); - int result; - struct boot_option *opt; - unsigned int o_count; /* device opts */ + struct cui_opt_data *cod; unsigned int insert_pt; + struct pmenu_item *i; ITEM *selected; + int result; - pb_log("%s: %p %s\n", __func__, dev, dev->id); + pb_log("%s: %p %s\n", __func__, opt, opt->id); selected = current_item(cui->main->ncm); @@ -376,57 +348,41 @@ static int cui_device_add(struct device *dev, void *arg) if (result) pb_log("%s: set_menu_items failed: %d\n", __func__, result); - o_count = 0; - list_for_each_entry(&dev->boot_options, opt, list) - o_count++; - /* Insert new items at insert_pt. */ + insert_pt = pmenu_grow(cui->main, 1); - insert_pt = pmenu_grow(cui->main, o_count); - - list_for_each_entry(&dev->boot_options, opt, list) { - struct pmenu_item *i; - struct cui_opt_data *cod; - char *name; - - /* Save the item in opt->ui_info for cui_device_remove() */ - - opt->ui_info = i = pmenu_item_alloc(cui->main); + /* Save the item in opt->ui_info for cui_device_remove() */ - i->on_edit = cui_boot_editor_run; - i->on_execute = cui_boot; - i->data = cod = talloc(i, struct cui_opt_data); + opt->ui_info = i = pmenu_item_alloc(cui->main); - cod->dev = dev; - cod->opt = opt; - cod->opt_hash = pb_opt_hash(dev, opt); - cod->name = opt->name; - cod->bd = talloc(i, struct pb_boot_data); - - cod->bd->image = talloc_strdup(cod->bd, opt->boot_image_file); - cod->bd->initrd = talloc_strdup(cod->bd, opt->initrd_file); - cod->bd->args = talloc_strdup(cod->bd, opt->boot_args); + i->on_edit = cui_boot_editor_run; + i->on_execute = cui_boot; + i->data = cod = talloc(i, struct cui_opt_data); - name = cui_make_item_name(i, cod); - pmenu_item_setup(cui->main, i, insert_pt, name); + cod->opt = opt; + cod->dev = dev; + cod->opt_hash = pb_opt_hash(dev, opt); + cod->name = opt->name; + cod->bd = talloc(i, struct pb_boot_data); - insert_pt++; + cod->bd->image = talloc_strdup(cod->bd, opt->boot_image_file); + cod->bd->initrd = talloc_strdup(cod->bd, opt->initrd_file); + cod->bd->args = talloc_strdup(cod->bd, opt->boot_args); - pb_log("%s: adding opt '%s'\n", __func__, cod->name); - pb_log(" image '%s'\n", cod->bd->image); - pb_log(" initrd '%s'\n", cod->bd->initrd); - pb_log(" args '%s'\n", cod->bd->args); + pmenu_item_setup(cui->main, i, insert_pt, cod->name); - /* If this is the default_item select it and start timer. */ + pb_log("%s: adding opt '%s'\n", __func__, cod->name); + pb_log(" image '%s'\n", cod->bd->image); + pb_log(" initrd '%s'\n", cod->bd->initrd); + pb_log(" args '%s'\n", cod->bd->args); - if (cod->opt_hash == cui->default_item) { - selected = i->nci; - ui_timer_kick(&cui->timer); - } + /* If this is the default_item select it and start timer. */ + if (cod->opt_hash == cui->default_item) { + selected = i->nci; + ui_timer_kick(&cui->timer); } /* Re-attach the items array. */ - result = set_menu_items(cui->main->ncm, cui->main->items); if (result) @@ -504,9 +460,22 @@ static void cui_device_remove(struct device *dev, void *arg) cui->current->post(cui->current); } +static void cui_update_status(struct boot_status *status, void *arg) +{ + struct cui *cui = cui_from_arg(arg); + + nc_scr_status_printf(cui->current, + "%s: %s", + status->type == BOOT_STATUS_ERROR ? "Error" : "Info", + status->message); + +} + static struct discover_client_ops cui_client_ops = { - .device_add = cui_device_add, + .device_add = NULL, + .boot_option_add = cui_boot_option_add, .device_remove = cui_device_remove, + .update_status = cui_update_status, }; /** @@ -520,7 +489,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_deamon, int dry_run) + int (*js_map)(const struct js_event *e), int start_deamon) { struct cui *cui; unsigned int i; @@ -536,7 +505,6 @@ struct cui *cui_init(void* platform_info, cui->c_sig = pb_cui_sig; cui->platform_info = platform_info; cui->timer.handle_timeout = cui_handle_timeout; - cui->dry_run = dry_run; cui->waitset = waitset_create(cui); /* Loop here for scripts that just started the server. */