/** * efi_file_from_path() - open file via device path * * @fp: device path * @return: EFI_FILE_PROTOCOL for the file or NULL */ struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp) { struct efi_simple_file_system_protocol *v; struct efi_file_handle *f; efi_status_t ret; v = efi_fs_from_path(fp); if (!v) return NULL; EFI_CALL(ret = v->open_volume(v, &f)); if (ret != EFI_SUCCESS) return NULL; /* Skip over device-path nodes before the file path. */ while (fp && !EFI_DP_TYPE(fp, MEDIA_DEVICE, FILE_PATH)) fp = efi_dp_next(fp); /* * Step through the nodes of the directory path until the actual file * node is reached which is the final node in the device path. */ while (fp) { struct efi_device_path_file_path *fdp = container_of(fp, struct efi_device_path_file_path, dp); struct efi_file_handle *f2; if (!EFI_DP_TYPE(fp, MEDIA_DEVICE, FILE_PATH)) { printf("bad file path!\n"); f->close(f); return NULL; } EFI_CALL(ret = f->open(f, &f2, fdp->str, EFI_FILE_MODE_READ, 0)); if (ret != EFI_SUCCESS) return NULL; fp = efi_dp_next(fp); EFI_CALL(f->close(f)); f = f2; } return f; }
struct efi_file_handle *efi_file_from_path(struct efi_device_path *fp) { struct efi_simple_file_system_protocol *v; struct efi_file_handle *f; efi_status_t ret; v = efi_fs_from_path(fp); if (!v) return NULL; EFI_CALL(ret = v->open_volume(v, &f)); if (ret != EFI_SUCCESS) return NULL; /* skip over device-path nodes before the file path: */ while (fp && !EFI_DP_TYPE(fp, MEDIA_DEVICE, FILE_PATH)) fp = efi_dp_next(fp); while (fp) { struct efi_device_path_file_path *fdp = container_of(fp, struct efi_device_path_file_path, dp); struct efi_file_handle *f2; if (!EFI_DP_TYPE(fp, MEDIA_DEVICE, FILE_PATH)) { printf("bad file path!\n"); f->close(f); return NULL; } EFI_CALL(ret = f->open(f, &f2, (s16 *)fdp->str, EFI_FILE_MODE_READ, 0)); if (ret != EFI_SUCCESS) return NULL; fp = efi_dp_next(fp); EFI_CALL(f->close(f)); f = f2; } return f; }