]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
efi: add file_handle_read() helper that reads from a file handle 34228/head
authorLennart Poettering <lennart@poettering.net>
Fri, 28 Jun 2024 17:40:27 +0000 (19:40 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 2 Sep 2024 12:20:49 +0000 (14:20 +0200)
src/boot/efi/util.c
src/boot/efi/util.h

index aafaf06e98bfff907209deeb56654fe0775371da..ae605bf5a50b78a47a02b126b81ec69af9e0e99a 100644 (file)
@@ -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);
index dc16f3fb7678cb38565b85e844b1318e07244539..d8d695ea79541a795860fc5862bb7187e8cc238c 100644 (file)
@@ -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)