summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaan De Meyer <daan.j.demeyer@gmail.com>2021-02-02 22:27:09 +0000
committerDaan De Meyer <daan.j.demeyer@gmail.com>2021-02-02 22:53:31 +0000
commitcb347d263d38ee3d9fb9be588a6efd77bca218ea (patch)
treed1f248cd0fc4b89c1f7c4a46bacf770233012952
parentfffd5e8ee312c7ef55058b61b2b619c7e3c48925 (diff)
downloadsystemd-cb347d263d38ee3d9fb9be588a6efd77bca218ea.tar.gz
boot: Add startswith() and endswith() functions with no_case variants
Adapted from string-util
-rw-r--r--src/boot/efi/boot.c16
-rw-r--r--src/boot/efi/util.c56
-rw-r--r--src/boot/efi/util.h6
3 files changed, 66 insertions, 12 deletions
diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c
index 8b5bcd3683..c88a6db9de 100644
--- a/src/boot/efi/boot.c
+++ b/src/boot/efi/boot.c
@@ -1493,7 +1493,6 @@ static VOID config_load_entries(
UINTN bufsize;
EFI_FILE_INFO *f;
_cleanup_freepool_ CHAR8 *content = NULL;
- UINTN len;
bufsize = sizeof(buf);
err = uefi_call_wrapper(entries_dir->Read, 3, entries_dir, &bufsize, buf);
@@ -1506,12 +1505,9 @@ static VOID config_load_entries(
if (f->Attribute & EFI_FILE_DIRECTORY)
continue;
- len = StrLen(f->FileName);
- if (len < 6)
- continue;
- if (StriCmp(f->FileName + len - 5, L".conf") != 0)
+ if (!endswith_no_case(f->FileName, L".conf"))
continue;
- if (StrnCmp(f->FileName, L"auto-", 5) == 0)
+ if (startswith(f->FileName, L"auto-"))
continue;
err = file_read(entries_dir, f->FileName, 0, 0, &content, NULL);
@@ -1894,7 +1890,6 @@ static VOID config_entry_add_linux(
UINTN szs[ELEMENTSOF(sections)-1] = {};
UINTN addrs[ELEMENTSOF(sections)-1] = {};
CHAR8 *content = NULL;
- UINTN len;
CHAR8 *line;
UINTN pos = 0;
CHAR8 *key, *value;
@@ -1914,12 +1909,9 @@ static VOID config_entry_add_linux(
continue;
if (f->Attribute & EFI_FILE_DIRECTORY)
continue;
- len = StrLen(f->FileName);
- if (len < 5)
- continue;
- if (StriCmp(f->FileName + len - 4, L".efi") != 0)
+ if (!endswith_no_case(f->FileName, L".efi"))
continue;
- if (StrnCmp(f->FileName, L"auto-", 5) == 0)
+ if (startswith(f->FileName, L"auto-"))
continue;
/* look for .osrel and .cmdline sections in the .efi binary */
diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c
index 50ad757565..8adf3f5fe4 100644
--- a/src/boot/efi/util.c
+++ b/src/boot/efi/util.c
@@ -375,6 +375,62 @@ CHAR8 *strchra(CHAR8 *s, CHAR8 c) {
return NULL;
}
+const CHAR16 *startswith(const CHAR16 *s, const CHAR16 *prefix) {
+ UINTN l;
+
+ l = StrLen(prefix);
+ if (StrnCmp(s, prefix, l) == 0)
+ return s + l;
+
+ return NULL;
+}
+
+const CHAR16 *endswith(const CHAR16 *s, const CHAR16 *postfix) {
+ UINTN sl, pl;
+
+ sl = StrLen(s);
+ pl = StrLen(postfix);
+
+ if (pl == 0)
+ return s + sl;
+
+ if (sl < pl)
+ return NULL;
+
+ if (StrnCmp(s + sl - pl, postfix, pl) != 0)
+ return NULL;
+
+ return s + sl - pl;
+}
+
+const CHAR16 *startswith_no_case(const CHAR16 *s, const CHAR16 *prefix) {
+ UINTN l;
+
+ l = StrLen(prefix);
+ if (StriCmp(s, prefix) == 0)
+ return s + l;
+
+ return NULL;
+}
+
+const CHAR16 *endswith_no_case(const CHAR16 *s, const CHAR16 *postfix) {
+ UINTN sl, pl;
+
+ sl = StrLen(s);
+ pl = StrLen(postfix);
+
+ if (pl == 0)
+ return s + sl;
+
+ if (sl < pl)
+ return NULL;
+
+ if (StriCmp(s + sl - pl, postfix) != 0)
+ return NULL;
+
+ return s + sl - pl;
+}
+
EFI_STATUS file_read(EFI_FILE_HANDLE dir, const CHAR16 *name, UINTN off, UINTN size, CHAR8 **ret, UINTN *ret_size) {
_cleanup_(FileHandleClosep) EFI_FILE_HANDLE handle = NULL;
_cleanup_freepool_ CHAR8 *buf = NULL;
diff --git a/src/boot/efi/util.h b/src/boot/efi/util.h
index 313d6697d2..f2be857d42 100644
--- a/src/boot/efi/util.h
+++ b/src/boot/efi/util.h
@@ -39,6 +39,12 @@ CHAR8 *strchra(CHAR8 *s, CHAR8 c);
CHAR16 *stra_to_path(CHAR8 *stra);
CHAR16 *stra_to_str(CHAR8 *stra);
+const CHAR16 *startswith(const CHAR16 *s, const CHAR16 *prefix);
+const CHAR16 *endswith(const CHAR16 *s, const CHAR16 *postfix);
+
+const CHAR16 *startswith_no_case(const CHAR16 *s, const CHAR16 *prefix);
+const CHAR16 *endswith_no_case(const CHAR16 *s, const CHAR16 *postfix);
+
EFI_STATUS file_read(EFI_FILE_HANDLE dir, const CHAR16 *name, UINTN off, UINTN size, CHAR8 **content, UINTN *content_size);
static inline void FreePoolp(void *p) {