]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
efi: add efivar_get_raw_full() flavour that returns the variable attributes too
authorLennart Poettering <lennart@amutable.com>
Fri, 6 Mar 2026 16:53:09 +0000 (17:53 +0100)
committerLennart Poettering <lennart@amutable.com>
Wed, 25 Mar 2026 13:50:19 +0000 (14:50 +0100)
src/boot/efi-efivars.c
src/boot/efi-efivars.h

index 0358a071e07d704442e354807a0d0e449c73da16..5581d98ec35022622f70c700a3b5efe60d775d3b 100644 (file)
@@ -177,7 +177,13 @@ EFI_STATUS efivar_get_uint64_le(const EFI_GUID *vendor, const char16_t *name, ui
         return EFI_SUCCESS;
 }
 
-EFI_STATUS efivar_get_raw(const EFI_GUID *vendor, const char16_t *name, void **ret_data, size_t *ret_size) {
+EFI_STATUS efivar_get_raw_full(
+                const EFI_GUID *vendor,
+                const char16_t *name,
+                uint32_t *ret_attributes,
+                void **ret_data,
+                size_t *ret_size) {
+
         EFI_STATUS err;
 
         assert(vendor);
@@ -188,11 +194,14 @@ EFI_STATUS efivar_get_raw(const EFI_GUID *vendor, const char16_t *name, void **r
         if (err != EFI_BUFFER_TOO_SMALL)
                 return err;
 
+        uint32_t attributes = 0;
         _cleanup_free_ void *buf = xmalloc(size);
-        err = RT->GetVariable((char16_t *) name, (EFI_GUID *) vendor, NULL, &size, buf);
+        err = RT->GetVariable((char16_t *) name, (EFI_GUID *) vendor, ret_attributes ? &attributes : NULL, &size, buf);
         if (err != EFI_SUCCESS)
                 return err;
 
+        if (ret_attributes)
+                *ret_attributes = attributes;
         if (ret_data)
                 *ret_data = TAKE_PTR(buf);
         if (ret_size)
index 1e74d6483cf4c22ed7b412d1ba9bb3048ea07a55..6d88f56e71296a987c772d016a64ea459d2baf93 100644 (file)
@@ -22,7 +22,10 @@ void efivar_set_time_usec(const EFI_GUID *vendor, const char16_t *name, uint64_t
 EFI_STATUS efivar_unset(const EFI_GUID *vendor, const char16_t *name, uint32_t flags);
 
 EFI_STATUS efivar_get_str16(const EFI_GUID *vendor, const char16_t *name, char16_t **ret);
-EFI_STATUS efivar_get_raw(const EFI_GUID *vendor, const char16_t *name, void **ret_data, size_t *ret_size);
+EFI_STATUS efivar_get_raw_full(const EFI_GUID *vendor, const char16_t *name, uint32_t *ret_attributes, void **ret_data, size_t *ret_size);
+static inline EFI_STATUS efivar_get_raw(const EFI_GUID *vendor, const char16_t *name, void **ret_data, size_t *ret_size) {
+        return efivar_get_raw_full(vendor, name, NULL, ret_data, ret_size);
+}
 EFI_STATUS efivar_get_uint64_str16(const EFI_GUID *vendor, const char16_t *name, uint64_t *ret);
 EFI_STATUS efivar_get_uint32_le(const EFI_GUID *vendor, const char16_t *name, uint32_t *ret);
 EFI_STATUS efivar_get_uint64_le(const EFI_GUID *vendor, const char16_t *name, uint64_t *ret);