summaryrefslogtreecommitdiffstats
path: root/ui/ncurses
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-03-11 13:43:48 +0800
committerJeremy Kerr <jk@ozlabs.org>2013-04-16 11:41:46 +0800
commitbd06734362bb727b09b943688d9b69aa0a84590d (patch)
tree476072cae1d0d28b286928c5fba589bde4a2d9aa /ui/ncurses
parentb838cf777ed3d21b166f8daddd4b11fc75e07307 (diff)
downloadtalos-petitboot-bd06734362bb727b09b943688d9b69aa0a84590d.tar.gz
talos-petitboot-bd06734362bb727b09b943688d9b69aa0a84590d.zip
protocol: Separate device add from boot-option add messages
We want to cater for situations where boot options may be discovered some time after we get notificiation about devices. For instance, discovering boot options from DHCP configuration parameters. In this case, we'll need to notify UIs of boot options appear some time after the device (and/or other boot options on the same device) has appeared. This change adds a new protocol message type, PB_PROTOCOL_ACTION_BOOT_OPTION_ADD. We also rename PB_PROTOCOL_ACTION_ADD to make it clear that it is just for devices. The discover server is updated to send boot option add events at device discover time, but we are now able to decouple this later. We also update the clients to handle the boot option add events separately. Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'ui/ncurses')
-rw-r--r--ui/ncurses/nc-cui.c90
1 files changed, 39 insertions, 51 deletions
diff --git a/ui/ncurses/nc-cui.c b/ui/ncurses/nc-cui.c
index 2d4dea5..c26819f 100644
--- a/ui/ncurses/nc-cui.c
+++ b/ui/ncurses/nc-cui.c
@@ -142,7 +142,7 @@ static int cui_boot(struct pmenu_item *item)
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);
@@ -354,16 +354,18 @@ 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;
+ char *name;
+ 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);
@@ -377,57 +379,42 @@ 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() */
+ /* Save the item in opt->ui_info for cui_device_remove() */
- opt->ui_info = i = pmenu_item_alloc(cui->main);
+ opt->ui_info = i = pmenu_item_alloc(cui->main);
- i->on_edit = cui_boot_editor_run;
- i->on_execute = cui_boot;
- i->data = cod = talloc(i, struct cui_opt_data);
-
- 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);
-
- name = cui_make_item_name(i, cod);
- pmenu_item_setup(cui->main, i, insert_pt, name);
-
- insert_pt++;
-
- 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 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);
- }
+ i->on_edit = cui_boot_editor_run;
+ i->on_execute = cui_boot;
+ i->data = cod = talloc(i, struct cui_opt_data);
+
+ 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);
+
+ 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);
+
+ name = cui_make_item_name(i, cod);
+ pmenu_item_setup(cui->main, i, insert_pt, name);
+
+ 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 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)
@@ -506,7 +493,8 @@ static void cui_device_remove(struct device *dev, void *arg)
}
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,
};
OpenPOWER on IntegriCloud