+5
-7
@@ -1,7 +1,5 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "bcd.h"
|
||||
#include "bootspec-fundamental.h"
|
||||
#include "console.h"
|
||||
@@ -1375,7 +1373,7 @@ static void config_entry_bump_counters(ConfigEntry *entry, EFI_FILE *root_dir) {
|
||||
if (err != EFI_SUCCESS)
|
||||
return;
|
||||
|
||||
err = get_file_info_harder(handle, &file_info, &file_info_size);
|
||||
err = get_file_info(handle, &file_info, &file_info_size);
|
||||
if (err != EFI_SUCCESS)
|
||||
return;
|
||||
|
||||
@@ -1648,7 +1646,7 @@ static void config_load_entries(
|
||||
for (;;) {
|
||||
_cleanup_free_ char *content = NULL;
|
||||
|
||||
err = readdir_harder(entries_dir, &f, &f_size);
|
||||
err = readdir(entries_dir, &f, &f_size);
|
||||
if (err != EFI_SUCCESS || !f)
|
||||
break;
|
||||
|
||||
@@ -2117,7 +2115,7 @@ static void config_entry_add_unified(
|
||||
size_t offs[_SECTION_MAX] = {}, szs[_SECTION_MAX] = {}, pos = 0;
|
||||
char *line, *key, *value;
|
||||
|
||||
err = readdir_harder(linux_dir, &f, &f_size);
|
||||
err = readdir(linux_dir, &f, &f_size);
|
||||
if (err != EFI_SUCCESS || !f)
|
||||
break;
|
||||
|
||||
@@ -2300,7 +2298,7 @@ static EFI_STATUS initrd_prepare(
|
||||
return err;
|
||||
|
||||
_cleanup_free_ EFI_FILE_INFO *info = NULL;
|
||||
err = get_file_info_harder(handle, &info, NULL);
|
||||
err = get_file_info(handle, &info, NULL);
|
||||
if (err != EFI_SUCCESS)
|
||||
return err;
|
||||
|
||||
@@ -2493,7 +2491,7 @@ static EFI_STATUS secure_boot_discover_keys(Config *config, EFI_FILE *root_dir)
|
||||
size_t dirent_size = 0;
|
||||
ConfigEntry *entry = NULL;
|
||||
|
||||
err = readdir_harder(keys_basedir, &dirent, &dirent_size);
|
||||
err = readdir(keys_basedir, &dirent, &dirent_size);
|
||||
if (err != EFI_SUCCESS || !dirent)
|
||||
return err;
|
||||
|
||||
|
||||
+1
-1
@@ -373,7 +373,7 @@ EFI_STATUS pack_cpio(
|
||||
for (;;) {
|
||||
_cleanup_free_ char16_t *d = NULL;
|
||||
|
||||
err = readdir_harder(extra_dir, &dirent, &dirent_size);
|
||||
err = readdir(extra_dir, &dirent, &dirent_size);
|
||||
if (err != EFI_SUCCESS)
|
||||
return log_error_status(err, "Failed to read extra directory of loaded image: %m");
|
||||
if (!dirent) /* End of directory */
|
||||
|
||||
@@ -79,7 +79,7 @@ EFI_STATUS devicetree_install(struct devicetree_state *state, EFI_FILE *root_dir
|
||||
if (err != EFI_SUCCESS)
|
||||
return err;
|
||||
|
||||
err = get_file_info_harder(handle, &info, NULL);
|
||||
err = get_file_info(handle, &info, NULL);
|
||||
if (err != EFI_SUCCESS)
|
||||
return err;
|
||||
if (info->FileSize < FDT_V1_SIZE || info->FileSize > 32 * 1024 * 1024)
|
||||
|
||||
@@ -87,7 +87,7 @@ EFI_STATUS load_drivers(
|
||||
return log_error_status(err, "Failed to open \\EFI\\systemd\\drivers: %m");
|
||||
|
||||
for (;;) {
|
||||
err = readdir_harder(drivers_dir, &dirent, &dirent_size);
|
||||
err = readdir(drivers_dir, &dirent, &dirent_size);
|
||||
if (err != EFI_SUCCESS)
|
||||
return log_error_status(err, "Failed to read extra directory of loaded image: %m");
|
||||
if (!dirent) /* End of directory */
|
||||
|
||||
@@ -121,6 +121,32 @@ _gnu_printf_(2, 0) _warn_unused_result_ char16_t *xvasprintf_status(EFI_STATUS s
|
||||
# define printf(...) printf_status(EFI_SUCCESS, __VA_ARGS__)
|
||||
# define xasprintf(...) xasprintf_status(EFI_SUCCESS, __VA_ARGS__)
|
||||
|
||||
/* inttypes.h is provided by libc instead of the compiler and is not supposed to be used in freestanding
|
||||
* environments. We could use clang __*_FMT*__ constants for this, bug gcc does not have them. :( */
|
||||
|
||||
# if defined(__ILP32__)
|
||||
# define PRI64_PREFIX "ll"
|
||||
# elif defined(__LP64__)
|
||||
# define PRI64_PREFIX "l"
|
||||
# elif defined(__LLP64__) || (__SIZEOF_LONG__ == 4 && __SIZEOF_POINTER__ == 8)
|
||||
# define PRI64_PREFIX "ll"
|
||||
# else
|
||||
# error Unknown 64-bit data model
|
||||
# endif
|
||||
|
||||
# define PRIi32 "i"
|
||||
# define PRIu32 "u"
|
||||
# define PRIx32 "x"
|
||||
# define PRIX32 "X"
|
||||
# define PRIiPTR "zi"
|
||||
# define PRIuPTR "zu"
|
||||
# define PRIxPTR "zx"
|
||||
# define PRIXPTR "zX"
|
||||
# define PRIi64 PRI64_PREFIX "i"
|
||||
# define PRIu64 PRI64_PREFIX "u"
|
||||
# define PRIx64 PRI64_PREFIX "x"
|
||||
# define PRIX64 PRI64_PREFIX "X"
|
||||
|
||||
/* The compiler normally has knowledge about standard functions such as memcmp, but this is not the case when
|
||||
* compiling with -ffreestanding. By referring to builtins, the compiler can check arguments and do
|
||||
* optimizations again. Note that we still need to provide implementations as the compiler is free to not
|
||||
|
||||
@@ -200,7 +200,7 @@ EFI_STATUS process_random_seed(EFI_FILE *root_dir) {
|
||||
return err;
|
||||
}
|
||||
|
||||
err = get_file_info_harder(handle, &info, NULL);
|
||||
err = get_file_info(handle, &info, NULL);
|
||||
if (err != EFI_SUCCESS)
|
||||
return log_error_status(err, "Failed to get file info for random seed: %m");
|
||||
|
||||
|
||||
+5
-13
@@ -1,7 +1,5 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
#include "proto/device-path.h"
|
||||
#include "proto/simple-text-io.h"
|
||||
#include "ticks.h"
|
||||
@@ -300,7 +298,7 @@ EFI_STATUS file_read(EFI_FILE *dir, const char16_t *name, size_t off, size_t siz
|
||||
if (size == 0) {
|
||||
_cleanup_free_ EFI_FILE_INFO *info = NULL;
|
||||
|
||||
err = get_file_info_harder(handle, &info, NULL);
|
||||
err = get_file_info(handle, &info, NULL);
|
||||
if (err != EFI_SUCCESS)
|
||||
return err;
|
||||
|
||||
@@ -372,11 +370,7 @@ void sort_pointer_array(
|
||||
}
|
||||
}
|
||||
|
||||
EFI_STATUS get_file_info_harder(
|
||||
EFI_FILE *handle,
|
||||
EFI_FILE_INFO **ret,
|
||||
size_t *ret_size) {
|
||||
|
||||
EFI_STATUS get_file_info(EFI_FILE *handle, EFI_FILE_INFO **ret, size_t *ret_size) {
|
||||
size_t size = offsetof(EFI_FILE_INFO, FileName) + 256;
|
||||
_cleanup_free_ EFI_FILE_INFO *fi = NULL;
|
||||
EFI_STATUS err;
|
||||
@@ -384,8 +378,6 @@ EFI_STATUS get_file_info_harder(
|
||||
assert(handle);
|
||||
assert(ret);
|
||||
|
||||
/* A lot like LibFileInfo() but with useful error propagation */
|
||||
|
||||
fi = xmalloc(size);
|
||||
err = handle->GetInfo(handle, MAKE_GUID_PTR(EFI_FILE_INFO), &size, fi);
|
||||
if (err == EFI_BUFFER_TOO_SMALL) {
|
||||
@@ -405,7 +397,7 @@ EFI_STATUS get_file_info_harder(
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
EFI_STATUS readdir_harder(
|
||||
EFI_STATUS readdir(
|
||||
EFI_FILE *handle,
|
||||
EFI_FILE_INFO **buffer,
|
||||
size_t *buffer_size) {
|
||||
@@ -425,7 +417,7 @@ EFI_STATUS readdir_harder(
|
||||
* position when returning EFI_BUFFER_TOO_SMALL, effectively skipping over any files when
|
||||
* the buffer was too small. Therefore, start with a buffer that should handle FAT32 max
|
||||
* file name length.
|
||||
* As a side effect, most readdir_harder() calls will now be slightly faster. */
|
||||
* As a side effect, most readdir() calls will now be slightly faster. */
|
||||
sz = sizeof(EFI_FILE_INFO) + 256 * sizeof(char16_t);
|
||||
*buffer = xmalloc(sz);
|
||||
*buffer_size = sz;
|
||||
@@ -491,7 +483,7 @@ EFI_STATUS open_directory(
|
||||
if (err != EFI_SUCCESS)
|
||||
return err;
|
||||
|
||||
err = get_file_info_harder(dir, &file_info, NULL);
|
||||
err = get_file_info(dir, &file_info, NULL);
|
||||
if (err != EFI_SUCCESS)
|
||||
return err;
|
||||
if (!FLAGS_SET(file_info->Attribute, EFI_FILE_DIRECTORY))
|
||||
|
||||
+2
-3
@@ -125,9 +125,8 @@ void clear_screen(size_t attr);
|
||||
typedef int (*compare_pointer_func_t)(const void *a, const void *b);
|
||||
void sort_pointer_array(void **array, size_t n_members, compare_pointer_func_t compare);
|
||||
|
||||
EFI_STATUS get_file_info_harder(EFI_FILE *handle, EFI_FILE_INFO **ret, size_t *ret_size);
|
||||
|
||||
EFI_STATUS readdir_harder(EFI_FILE *handle, EFI_FILE_INFO **buffer, size_t *buffer_size);
|
||||
EFI_STATUS get_file_info(EFI_FILE *handle, EFI_FILE_INFO **ret, size_t *ret_size);
|
||||
EFI_STATUS readdir(EFI_FILE *handle, EFI_FILE_INFO **buffer, size_t *buffer_size);
|
||||
|
||||
bool is_ascii(const char16_t *f);
|
||||
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
||||
#pragma once
|
||||
|
||||
#include <errno.h>
|
||||
#ifdef SD_BOOT
|
||||
# define EINVAL 22
|
||||
#else
|
||||
# include <errno.h>
|
||||
#endif
|
||||
#include "string-util-fundamental.h"
|
||||
|
||||
/* Features of the loader, i.e. systemd-boot */
|
||||
|
||||
@@ -339,11 +339,8 @@ static inline size_t ALIGN_TO(size_t l, size_t ali) {
|
||||
#define ALIGN2_PTR(p) ((void*) ALIGN2((uintptr_t) p))
|
||||
#define ALIGN4_PTR(p) ((void*) ALIGN4((uintptr_t) p))
|
||||
#define ALIGN8_PTR(p) ((void*) ALIGN8((uintptr_t) p))
|
||||
#if !SD_BOOT
|
||||
/* libefi also provides ALIGN, and we do not use them in sd-boot explicitly. */
|
||||
#define ALIGN(l) ALIGN_TO(l, sizeof(void*))
|
||||
#define ALIGN_PTR(p) ((void*) ALIGN((uintptr_t) (p)))
|
||||
#endif
|
||||
|
||||
/* Checks if the specified pointer is aligned as appropriate for the specific type */
|
||||
#define IS_ALIGNED16(p) (((uintptr_t) p) % __alignof__(uint16_t) == 0)
|
||||
|
||||
@@ -20,7 +20,6 @@ sd_char *startswith(const sd_char *s, const sd_char *prefix) {
|
||||
return (sd_char*) s + l;
|
||||
}
|
||||
|
||||
#if !SD_BOOT
|
||||
sd_char *startswith_no_case(const sd_char *s, const sd_char *prefix) {
|
||||
size_t l;
|
||||
|
||||
@@ -33,7 +32,6 @@ sd_char *startswith_no_case(const sd_char *s, const sd_char *prefix) {
|
||||
|
||||
return (sd_char*) s + l;
|
||||
}
|
||||
#endif
|
||||
|
||||
sd_char* endswith(const sd_char *s, const sd_char *postfix) {
|
||||
size_t sl, pl;
|
||||
|
||||
@@ -58,9 +58,7 @@ static inline size_t strlen_ptr(const sd_char *s) {
|
||||
}
|
||||
|
||||
sd_char *startswith(const sd_char *s, const sd_char *prefix) _pure_;
|
||||
#if !SD_BOOT
|
||||
sd_char *startswith_no_case(const sd_char *s, const sd_char *prefix) _pure_;
|
||||
#endif
|
||||
sd_char *endswith(const sd_char *s, const sd_char *postfix) _pure_;
|
||||
sd_char *endswith_no_case(const sd_char *s, const sd_char *postfix) _pure_;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user