diff --git a/src/boot/efi/efi-string.c b/src/boot/efi/efi-string.c index 87beb85286..aee98a81e1 100644 --- a/src/boot/efi/efi-string.c +++ b/src/boot/efi/efi-string.c @@ -41,12 +41,13 @@ DEFINE_STRNLEN(char16_t, strnlen16); (_c >= 'A' && _c <= 'Z') ? _c + ('a' - 'A') : _c; \ }) -#define DEFINE_STRTOLOWER(type, name) \ - void name(type *s) { \ - if (!s) \ - return; \ - for (; *s; s++) \ - *s = TOLOWER(*s); \ +#define DEFINE_STRTOLOWER(type, name) \ + type* name(type *s) { \ + if (!s) \ + return NULL; \ + for (type *p = s; *p; p++) \ + *p = TOLOWER(*p); \ + return s; \ } DEFINE_STRTOLOWER(char, strtolower8); diff --git a/src/boot/efi/efi-string.h b/src/boot/efi/efi-string.h index c7c49a07aa..9a0f89d904 100644 --- a/src/boot/efi/efi-string.h +++ b/src/boot/efi/efi-string.h @@ -23,8 +23,8 @@ static inline size_t strsize16(const char16_t *s) { return s ? (strlen16(s) + 1) * sizeof(*s) : 0; } -void strtolower8(char *s); -void strtolower16(char16_t *s); +char* strtolower8(char *s); +char16_t* strtolower16(char16_t *s); int strncmp8(const char *s1, const char *s2, size_t n); int strncmp16(const char16_t *s1, const char16_t *s2, size_t n); diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c index aafaf06e98..ae605bf5a5 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 dc16f3fb76..d8d695ea79 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)