+ /* if the mountpoint doesn't have a trailing slash, ensure that
+ * the path starts with one (so we don't match a "/mnt/sda1/foo" path
+ * on a "/mnt/sda" mountpoint) */
+ return bd_info->mountpoint[len-1] == '/' || path[len] == '/';
+}
+
+
+static void boot_editor_find_device(struct boot_editor *boot_editor,
+ struct pb_boot_data *bd, const struct system_info *sysinfo)
+{
+ struct blockdev_info *bd_info, *tmp;
+ unsigned int i, len;
+
+ if (!sysinfo || !sysinfo->n_blockdevs)
+ return;
+
+ /* find the device for our boot image, by finding the longest
+ * matching blockdev's mountpoint */
+ for (len = 0, i = 0, bd_info = NULL; i < sysinfo->n_blockdevs; i++) {
+ tmp = sysinfo->blockdevs[i];
+ if (!path_on_device(tmp, bd->image))
+ continue;
+ if (strlen(tmp->mountpoint) <= len)
+ continue;
+ bd_info = tmp;
+ len = strlen(tmp->mountpoint);
+ }
+
+ if (!bd_info)
+ return;
+
+ /* ensure that other paths are on this device */
+ if (bd->initrd && !path_on_device(bd_info, bd->initrd))
+ return;
+
+ if (bd->dtb && !path_on_device(bd_info, bd->dtb))
+ return;
+
+ /* ok, we match; preselect the device option, and remove the common
+ * prefix */
+ boot_editor->selected_device = bd_info->name;
+ boot_editor->image += len;
+
+ if (boot_editor->initrd)
+ boot_editor->initrd += len;
+ if (boot_editor->dtb)
+ boot_editor->dtb += len;
+}
+
+static void boot_editor_setup_widgets(struct boot_editor *boot_editor,
+ const struct system_info *sysinfo)
+{
+ struct nc_widgetset *set;
+ int field_size;
+
+ field_size = COLS - 1 - boot_editor->field_x;
+
+ boot_editor->widgetset = set = widgetset_create(boot_editor,
+ boot_editor->scr.main_ncw,
+ boot_editor->pad);
+
+ widgetset_set_widget_focus(boot_editor->widgetset,
+ boot_editor_widget_focus, boot_editor);
+
+ boot_editor->widgets.device_l = widget_new_label(set, 0, 0, "Device:");
+ boot_editor->widgets.device_f = widget_new_select(set, 0, 0,
+ field_size);
+ widget_select_on_change(boot_editor->widgets.device_f,
+ boot_editor_device_select_change, boot_editor);
+
+ boot_editor_populate_device_select(boot_editor, sysinfo);
+
+ boot_editor->widgets.image_l = widget_new_label(set, 0, 0,
+ "Kernel:");
+ boot_editor->widgets.image_f = widget_new_textbox(set, 0, 0,
+ field_size, boot_editor->image);
+
+ boot_editor->widgets.initrd_l = widget_new_label(set, 0, 0,
+ "Initrd:");
+ boot_editor->widgets.initrd_f = widget_new_textbox(set, 0, 0,
+ field_size,
+ boot_editor->initrd);
+
+ boot_editor->widgets.dtb_l = widget_new_label(set, 0, 0,
+ "Device tree:");
+ boot_editor->widgets.dtb_f = widget_new_textbox(set, 0, 0,
+ field_size, boot_editor->dtb);
+
+ boot_editor->widgets.args_l = widget_new_label(set, 0, 0,
+ "Boot arguments:");
+ boot_editor->widgets.args_f = widget_new_textbox(set, 0, 0,
+ field_size, boot_editor->args);
+
+ boot_editor->widgets.ok_b = widget_new_button(set, 0, 0, 6,
+ "OK", ok_click, boot_editor);
+ boot_editor->widgets.help_b = widget_new_button(set, 0, 0, 6,
+ "Help", help_click, boot_editor);
+ boot_editor->widgets.cancel_b = widget_new_button(set, 0, 0, 6,
+ "Cancel", cancel_click, boot_editor);
+}