Hi Sughosh [...]
> + > static struct eficonfig_item select_file_menu_items[] = { > {"Select File", eficonfig_process_select_file}, > {"Clear", eficonfig_process_clear_file_selection}, > @@ -1042,16 +1101,30 @@ static struct eficonfig_item select_file_menu_items[] > = { > efi_status_t eficonfig_process_show_file_option(void *data) > { > efi_status_t ret; > + unsigned int menu_count; > struct efimenu *efi_menu; > + struct eficonfig_item *menu_items; > + struct eficonfig_select_file_info *file_info = data; > + > + menu_items = file_info->boot_file_option ? > select_boot_file_menu_items : > + select_file_menu_items; Why do we need boot_file_option? Won't the len of the URI be 0 if it's a file? [...] > > +/** > + * fill_dp_uri() - copy the URI string in the device path > + * @dp: pointer to the URI device path > + * @uri_str: URI string to be copied > + * > + * Copy the passed URI string to the URI device path. This > + * requires utf8_utf16_strcpy() to copy the u16 string to > + * the u8 array in the device path structure. > + * > + * Return: None > + */ > +static void fill_dp_uri(struct efi_device_path *dp, u16 **uri_str) > +{ > + u16 *p = *uri_str; > + struct efi_device_path_uri *uridp; > + > + uridp = (struct efi_device_path_uri *)dp; > + > + utf8_utf16_strcpy(&p, uridp->uri); > +} > + > /** > * fill_file_info() - fill the file info from efi_device_path structure > * > @@ -1392,10 +1486,13 @@ static efi_status_t eficonfig_edit_boot_option(u16 > *varname, struct eficonfig_bo > size_t len; > efi_status_t ret; > char *tmp = NULL, *p; > + u16 *current_path = NULL; > struct efi_load_option lo = {0}; > efi_uintn_t dp_size; > struct efi_device_path *dp = NULL; > efi_uintn_t size = load_option_size; > + struct efi_device_path *dp_volume = NULL; > + struct efi_device_path *uri_dp = NULL; > struct efi_device_path *device_dp = NULL; > struct efi_device_path *initrd_dp = NULL; > struct efi_device_path *fdt_dp = NULL; > @@ -1464,6 +1561,14 @@ static efi_status_t eficonfig_edit_boot_option(u16 > *varname, struct eficonfig_bo > goto out; > } > > + bo->file_info.uri = calloc(1, EFICONFIG_URI_MAX * sizeof(u16)); > + if (!bo->file_info.uri) { > + ret = EFI_OUT_OF_RESOURCES; > + goto out; > + } > + > + bo->file_info.boot_file_option = true; > + > /* copy the preset value */ > if (load_option) { > ret = efi_deserialize_load_option(&lo, load_option, &size); > @@ -1481,7 +1586,10 @@ static efi_status_t eficonfig_edit_boot_option(u16 > *varname, struct eficonfig_bo > u16_strcpy(bo->description, lo.label); > > /* EFI image file path is a first instance */ > - if (lo.file_path) > + if (lo.file_path && EFI_DP_TYPE(lo.file_path, > MESSAGING_DEVICE, > + MSG_URI)) > + fill_dp_uri(lo.file_path, &bo->file_info.uri); > + else This else does something different now. Shouldn't it be else if (lo.file_path)> > fill_file_info(lo.file_path, &bo->file_info, > device_dp); > [...] Thanks /Ilias