From 82d40110aeeb90f31a2b980c710118b8495b5ee5 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 28 Jun 2024 19:40:27 +0200 Subject: [PATCH] efi: add file_handle_read() helper that reads from a file handle --- src/boot/efi/util.c | 35 +++++++++++++++++++++++++---------- src/boot/efi/util.h | 1 + 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c index aafaf06e98b..ae605bf5a50 100644 --- a/src/boot/efi/util.c +++ b/src/boot/efi/util.c @@ -105,26 +105,19 @@ EFI_STATUS chunked_read(EFI_FILE *file, size_t *size, void *buf) { return EFI_SUCCESS; } -EFI_STATUS file_read( - EFI_FILE *dir, - const char16_t *name, +EFI_STATUS file_handle_read( + EFI_FILE *handle, uint64_t offset, size_t size, char **ret, size_t *ret_size) { - _cleanup_(file_closep) EFI_FILE *handle = NULL; _cleanup_free_ char *buf = NULL; EFI_STATUS err; - assert(dir); - assert(name); + assert(handle); assert(ret); - err = dir->Open(dir, &handle, (char16_t*) name, EFI_FILE_MODE_READ, 0ULL); - if (err != EFI_SUCCESS) - return err; - if (size == 0) { _cleanup_free_ EFI_FILE_INFO *info = NULL; @@ -165,6 +158,28 @@ EFI_STATUS file_read( return err; } +EFI_STATUS file_read( + EFI_FILE *dir, + const char16_t *name, + uint64_t offset, + size_t size, + char **ret, + size_t *ret_size) { + + EFI_STATUS err; + + assert(dir); + assert(name); + assert(ret); + + _cleanup_(file_closep) EFI_FILE *handle = NULL; + err = dir->Open(dir, &handle, (char16_t*) name, EFI_FILE_MODE_READ, 0ULL); + if (err != EFI_SUCCESS) + return err; + + return file_handle_read(handle, offset, size, ret, ret_size); +} + void print_at(size_t x, size_t y, size_t attr, const char16_t *str) { assert(str); ST->ConOut->SetCursorPosition(ST->ConOut, x, y); diff --git a/src/boot/efi/util.h b/src/boot/efi/util.h index dc16f3fb767..d8d695ea795 100644 --- a/src/boot/efi/util.h +++ b/src/boot/efi/util.h @@ -87,6 +87,7 @@ char16_t *mangle_stub_cmdline(char16_t *cmdline); EFI_STATUS chunked_read(EFI_FILE *file, size_t *size, void *buf); EFI_STATUS file_read(EFI_FILE *dir, const char16_t *name, uint64_t offset, size_t size, char **content, size_t *content_size); +EFI_STATUS file_handle_read(EFI_FILE *handle, uint64_t offset, size_t size, char **ret, size_t *ret_size); static inline void file_closep(EFI_FILE **handle) { if (!*handle) -- 2.47.3