master ohmu/fastfetch-openbsd / src / detection / bootmgr / bootmgr_linux.c
ohmu  ·  2026-10-15
 1#include "bootmgr.h"
 2#include "common/debug.h"
 3#include "common/io.h"
 4#include "efi_helper.h"
 5
 6#include <stdalign.h>
 7
 8#define FF_EFIVARS_PATH_PREFIX "/sys/firmware/efi/efivars/"
 9#define FF_EFI_GLOBAL_GUID "8be4df61-93ca-11d2-aa0d-00e098032b8c"
10
11const char* ffDetectBootmgr(FFBootmgrResult* result) {
12    alignas(uint16_t) uint8_t buffer[2048];
13
14    if (ffReadFileData(FF_EFIVARS_PATH_PREFIX "BootCurrent-" FF_EFI_GLOBAL_GUID, sizeof(buffer), buffer) != 6) {
15        FF_DEBUG("Failed to read efivar: BootCurrent");
16        return "Failed to read efivar: BootCurrent";
17    }
18
19    result->order = *(uint16_t*) &buffer[4];
20
21    snprintf((char*) buffer, sizeof(buffer), FF_EFIVARS_PATH_PREFIX "Boot%04X-" FF_EFI_GLOBAL_GUID, result->order);
22
23    ssize_t size = ffReadFileData((const char*) buffer, sizeof(buffer), buffer);
24    if (size < 5 + (int) sizeof(FFEfiLoadOption) || size == (ssize_t) sizeof(buffer)) {
25        FF_DEBUG("Failed to read efivar: Boot####");
26        return "Failed to read efivar: Boot####";
27    }
28
29    ffEfiFillLoadOption((FFEfiLoadOption*) &buffer[4], result);
30
31    if (ffReadFileData(FF_EFIVARS_PATH_PREFIX "SecureBoot-" FF_EFI_GLOBAL_GUID, sizeof(buffer), buffer) >= 5) {
32        result->secureBoot = buffer[4] == 1;
33    }
34
35    return nullptr;
36}