X-Git-Url: https://code.delx.au/refind/blobdiff_plain/9a669ad3b5fb341500d76d487c38a7102eb01b3d..0a030a201e52e18ed4df68ff0dff84096eb98bce:/refind/config.c diff --git a/refind/config.c b/refind/config.c index bb5a53d..fa1d9a6 100644 --- a/refind/config.c +++ b/refind/config.c @@ -35,7 +35,7 @@ */ /* - * Modifications copyright (c) 2012-2014 Roderick W. Smith + * Modifications copyright (c) 2012-2015 Roderick W. Smith * * Modifications distributed under the terms of the GNU General Public * License (GPL) version 3 (GPLv3), a copy of which must be distributed @@ -50,6 +50,7 @@ #include "config.h" #include "screen.h" #include "../include/refit_call_wrapper.h" +#include "../mok/mok.h" // constants @@ -63,7 +64,8 @@ #define GetTime ST->RuntimeServices->GetTime #define LAST_MINUTE 1439 /* Last minute of a day */ -static REFIT_MENU_ENTRY MenuEntryReturn = { L"Return to Main Menu", TAG_RETURN, 0, 0, 0, NULL, NULL, NULL }; +extern REFIT_MENU_ENTRY MenuEntryReturn; +//static REFIT_MENU_ENTRY MenuEntryReturn = { L"Return to Main Menu", TAG_RETURN, 0, 0, 0, NULL, NULL, NULL }; // // read a file into a buffer @@ -265,6 +267,10 @@ UINTN ReadTokenLine(IN REFIT_FILE *File, OUT CHAR16 ***TokenList) Line = ReadLine(File); if (Line == NULL) return(0); + if (Line[0] == L'\0') { + MyFreePool(Line); + return(0); + } // if p = Line; LineFinished = FALSE; @@ -318,9 +324,18 @@ static VOID HandleInt(IN CHAR16 **TokenList, IN UINTN TokenCount, OUT UINTN *Val // handle a parameter with a single string argument static VOID HandleString(IN CHAR16 **TokenList, IN UINTN TokenCount, OUT CHAR16 **Target) { - if (TokenCount == 2) { - MyFreePool(*Target); - *Target = StrDuplicate(TokenList[1]); + if ((TokenCount == 2) && Target) { + if ((StrLen(TokenList[1]) > 1) && (TokenList[1][0] == L'+') && + ((TokenList[1][1] == L',') || (TokenList[1][1] == L' '))) { + if (*Target) { + MergeStrings(Target, TokenList[1] + 2, L','); + } else { + *Target = StrDuplicate(TokenList[1] + 2); + } // if/else + } else { + MyFreePool(*Target); + *Target = StrDuplicate(TokenList[1]); + } // if/else } // if } // static VOID HandleString() @@ -389,7 +404,7 @@ static BOOLEAN HandleBoolean(IN CHAR16 **TokenList, IN UINTN TokenCount) { static VOID SetDefaultByTime(IN CHAR16 **TokenList, OUT CHAR16 **Default) { EFI_STATUS Status; EFI_TIME CurrentTime; - UINTN StartTime = LAST_MINUTE + 1, EndTime = LAST_MINUTE + 1, Now; + UINTN StartTime, EndTime, Now; BOOLEAN SetIt = FALSE; StartTime = HandleTime(TokenList[2]); @@ -430,6 +445,7 @@ VOID ReadConfig(CHAR16 *FileName) CHAR16 *FlagName; CHAR16 *TempStr = NULL; UINTN TokenCount, i; + EFI_GUID RefindGuid = REFIND_GUID_VALUE; // Set a few defaults only if we're loading the default file. if (StriCmp(FileName, GlobalConfig.ConfigFilename) == 0) { @@ -454,11 +470,22 @@ VOID ReadConfig(CHAR16 *FileName) MyFreePool(GlobalConfig.DontScanVolumes); GlobalConfig.DontScanVolumes = StrDuplicate(DONT_SCAN_VOLUMES); GlobalConfig.WindowsRecoveryFiles = StrDuplicate(WINDOWS_RECOVERY_FILES); + if (GlobalConfig.DefaultSelection != NULL) { + MyFreePool(GlobalConfig.DefaultSelection); + GlobalConfig.DefaultSelection = NULL; + } + Status = EfivarGetRaw(&RefindGuid, L"PreviousBoot", (CHAR8**) &(GlobalConfig.DefaultSelection), &i); + if (Status != EFI_SUCCESS) + GlobalConfig.DefaultSelection = NULL; } // if if (!FileExists(SelfDir, FileName)) { - Print(L"Configuration file '%s' missing!\n", FileName); - return; + Print(L"Configuration file '%s' missing!\n", FileName); + if (!FileExists(SelfDir, L"icons")) { + Print(L"Icons directory doesn't exist; setting textonly = TRUE!\n"); + GlobalConfig.TextOnly = TRUE; + } + return; } Status = ReadFile(SelfDir, FileName, &File, &i); @@ -492,6 +519,8 @@ VOID ReadConfig(CHAR16 *FileName) GlobalConfig.HideUIFlags |= HIDEUI_FLAG_EDITOR; } else if (StriCmp(FlagName, L"safemode") == 0) { GlobalConfig.HideUIFlags |= HIDEUI_FLAG_SAFEMODE; + } else if (StriCmp(FlagName, L"badges") == 0) { + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_BADGES; } else if (StriCmp(FlagName, L"all") == 0) { GlobalConfig.HideUIFlags = HIDEUI_FLAG_ALL; } else { @@ -510,7 +539,7 @@ VOID ReadConfig(CHAR16 *FileName) GlobalConfig.ScanFor[i] = ' '; } - } else if (StriCmp(TokenList[0], L"deep_uefi_legacy_scan") == 0) { + } else if (StriCmp(TokenList[0], L"uefi_deep_legacy_scan") == 0) { GlobalConfig.DeepLegacyScan = HandleBoolean(TokenList, TokenCount); } else if ((StriCmp(TokenList[0], L"scan_delay") == 0) && (TokenCount == 2)) { @@ -567,6 +596,8 @@ VOID ReadConfig(CHAR16 *FileName) GlobalConfig.ShowTools[i - 1] = TAG_FIRMWARE; } else if ((StriCmp(FlagName, L"memtest86") == 0) || (StriCmp(FlagName, L"memtest") == 0)) { GlobalConfig.ShowTools[i - 1] = TAG_MEMTEST; + } else if (StriCmp(FlagName, L"netboot") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_NETBOOT; } else { Print(L" unknown showtools flag: '%s'\n", FlagName); } @@ -611,11 +642,6 @@ VOID ReadConfig(CHAR16 *FileName) } else if (StriCmp(TokenList[0], L"textonly") == 0) { GlobalConfig.TextOnly = HandleBoolean(TokenList, TokenCount); -// if ((TokenCount >= 2) && (StriCmp(TokenList[1], L"0") == 0)) { -// GlobalConfig.TextOnly = FALSE; -// } else { -// GlobalConfig.TextOnly = TRUE; -// } } else if (StriCmp(TokenList[0], L"textmode") == 0) { HandleInt(TokenList, TokenCount, &(GlobalConfig.RequestedTextMode)); @@ -652,15 +678,13 @@ VOID ReadConfig(CHAR16 *FileName) } else if (StriCmp(TokenList[0], L"scan_all_linux_kernels") == 0) { GlobalConfig.ScanAllLinux = HandleBoolean(TokenList, TokenCount); -// if ((TokenCount >= 2) && (StriCmp(TokenList[1], L"0") == 0)) { -// GlobalConfig.ScanAllLinux = FALSE; -// } else { -// GlobalConfig.ScanAllLinux = TRUE; -// } } else if (StriCmp(TokenList[0], L"max_tags") == 0) { HandleInt(TokenList, TokenCount, &(GlobalConfig.MaxTags)); + } else if (StriCmp(TokenList[0], L"enable_and_lock_vmx") == 0) { + GlobalConfig.EnableAndLockVMX = HandleBoolean(TokenList, TokenCount); + } else if ((StriCmp(TokenList[0], L"include") == 0) && (TokenCount == 2) && (StriCmp(FileName, GlobalConfig.ConfigFilename) == 0)) { if (StriCmp(TokenList[1], FileName) != 0) { @@ -674,6 +698,11 @@ VOID ReadConfig(CHAR16 *FileName) if ((GlobalConfig.DontScanFiles) && (GlobalConfig.WindowsRecoveryFiles)) MergeStrings(&(GlobalConfig.DontScanFiles), GlobalConfig.WindowsRecoveryFiles, L','); MyFreePool(File.Buffer); + + if (!FileExists(SelfDir, L"icons") && !FileExists(SelfDir, GlobalConfig.IconsDir)) { + Print(L"Icons directory doesn't exist; setting textonly = TRUE!\n"); + GlobalConfig.TextOnly = TRUE; + } } /* VOID ReadConfig() */ // Finds a volume with the specified Identifier (a filesystem label, a @@ -745,11 +774,13 @@ static VOID AddSubmenu(LOADER_ENTRY *Entry, REFIT_FILE *File, REFIT_VOLUME *Volu } else if ((StriCmp(TokenList[0], L"volume") == 0) && (TokenCount > 1)) { if (FindVolume(&Volume, TokenList[1])) { - MyFreePool(SubEntry->me.Title); - SubEntry->me.Title = AllocateZeroPool(256 * sizeof(CHAR16)); - SPrint(SubEntry->me.Title, 255, L"Boot %s from %s", (Title != NULL) ? Title : L"Unknown", Volume->VolName); - SubEntry->me.BadgeImage = Volume->VolBadgeImage; - SubEntry->VolName = Volume->VolName; + if ((Volume != NULL) && (Volume->IsReadable) && (Volume->RootDir)) { + MyFreePool(SubEntry->me.Title); + SubEntry->me.Title = AllocateZeroPool(256 * sizeof(CHAR16)); + SPrint(SubEntry->me.Title, 255, L"Boot %s from %s", (Title != NULL) ? Title : L"Unknown", Volume->VolName); + SubEntry->me.BadgeImage = Volume->VolBadgeImage; + SubEntry->VolName = Volume->VolName; + } // if volume is readable } // if match found } else if (StriCmp(TokenList[0], L"initrd") == 0) { @@ -826,11 +857,13 @@ static LOADER_ENTRY * AddStanzaEntries(REFIT_FILE *File, REFIT_VOLUME *Volume, C } else if ((StriCmp(TokenList[0], L"volume") == 0) && (TokenCount > 1)) { if (FindVolume(&CurrentVolume, TokenList[1])) { - MyFreePool(Entry->me.Title); - Entry->me.Title = AllocateZeroPool(256 * sizeof(CHAR16)); - SPrint(Entry->me.Title, 255, L"Boot %s from %s", (Title != NULL) ? Title : L"Unknown", CurrentVolume->VolName); - Entry->me.BadgeImage = CurrentVolume->VolBadgeImage; - Entry->VolName = CurrentVolume->VolName; + if ((CurrentVolume != NULL) && (CurrentVolume->IsReadable) && (CurrentVolume->RootDir)) { + MyFreePool(Entry->me.Title); + Entry->me.Title = AllocateZeroPool(256 * sizeof(CHAR16)); + SPrint(Entry->me.Title, 255, L"Boot %s from %s", (Title != NULL) ? Title : L"Unknown", CurrentVolume->VolName); + Entry->me.BadgeImage = CurrentVolume->VolBadgeImage; + Entry->VolName = CurrentVolume->VolName; + } // if volume is readable } // if match found } else if ((StriCmp(TokenList[0], L"icon") == 0) && (TokenCount > 1)) {