efi_loader: create boot options without file path
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 11 Jun 2022 05:22:08 +0000 (05:22 +0000)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Sun, 12 Jun 2022 11:02:34 +0000 (13:02 +0200)
Allow the efidebug command to create boot options without file path, e.g.

    efidebug boot add -b 0001 'short dev only' host 0:1 ''
    efidebug boot add -B 0002 'long dev only' host 0:1 ''

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
lib/efi_loader/efi_bootmgr.c
lib/efi_loader/efi_device_path.c

index 9b65f34..234073e 100644 (file)
@@ -46,7 +46,6 @@ struct efi_device_path *expand_media_path(struct efi_device_path *device_path)
 {
        struct efi_device_path *dp, *rem, *full_path;
        efi_handle_t handle;
-       efi_status_t ret;
 
        if (!device_path)
                return NULL;
@@ -59,7 +58,7 @@ struct efi_device_path *expand_media_path(struct efi_device_path *device_path)
        dp = device_path;
        handle = efi_dp_find_obj(dp, &efi_simple_file_system_protocol_guid,
                                 &rem);
-       if (ret == EFI_SUCCESS) {
+       if (handle) {
                if (rem->type == DEVICE_PATH_TYPE_END) {
                        dp = efi_dp_from_file(NULL, 0,
                                              "/EFI/BOOT/" BOOTEFI_NAME);
index 50a988c..171661b 100644 (file)
@@ -973,9 +973,22 @@ static void path_to_uefi(void *uefi, const char *src)
        *pos = 0;
 }
 
-/*
- * If desc is NULL, this creates a path with only the file component,
- * otherwise it creates a full path with both device and file components
+/**
+ * efi_dp_from_file() - create device path for file
+ *
+ * The function creates a device path from the block descriptor @desc and the
+ * partition number @part and appends a device path node created describing the
+ * file path @path.
+ *
+ * If @desc is NULL, the device path will not contain nodes describing the
+ * partition.
+ * If @path is an empty string "", the device path will not contain a node
+ * for the file path.
+ *
+ * @desc:      block device descriptor or NULL
+ * @part:      partition number
+ * @path:      file path on partition or ""
+ * Return:     device path or NULL in case of an error
  */
 struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
                const char *path)
@@ -1002,12 +1015,14 @@ struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
                buf = dp_part_fill(buf, desc, part);
 
        /* add file-path: */
-       fp = buf;
-       fp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
-       fp->dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH;
-       fp->dp.length = (u16)fpsize;
-       path_to_uefi(fp->str, path);
-       buf += fpsize;
+       if (*path) {
+               fp = buf;
+               fp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
+               fp->dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH;
+               fp->dp.length = (u16)fpsize;
+               path_to_uefi(fp->str, path);
+               buf += fpsize;
+       }
 
        *((struct efi_device_path *)buf) = END;