X-Git-Url: https://code.delx.au/refind/blobdiff_plain/0189958c722bdd4e7f323d59f81e25579bb0aad2..9a669ad3b5fb341500d76d487c38a7102eb01b3d:/refind/config.c diff --git a/refind/config.c b/refind/config.c index c56c54f..bb5a53d 100644 --- a/refind/config.c +++ b/refind/config.c @@ -35,7 +35,7 @@ */ /* - * Modifications copyright (c) 2012-2013 Roderick W. Smith + * Modifications copyright (c) 2012-2014 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 @@ -372,6 +372,18 @@ static UINTN HandleTime(IN CHAR16 *TimeString) { return (Hour * 60 + Minute); } // BOOLEAN HandleTime() +static BOOLEAN HandleBoolean(IN CHAR16 **TokenList, IN UINTN TokenCount) { + BOOLEAN TruthValue = TRUE; + + if ((TokenCount >= 2) && ((StriCmp(TokenList[1], L"0") == 0) || + (StriCmp(TokenList[1], L"false") == 0) || + (StriCmp(TokenList[1], L"off") == 0))) { + TruthValue = FALSE; + } // if + + return TruthValue; +} // BOOLEAN HandleBoolean + // Sets the default boot loader IF the current time is within the bounds // defined by the third and fourth tokens in the TokenList. static VOID SetDefaultByTime(IN CHAR16 **TokenList, OUT CHAR16 **Default) { @@ -498,6 +510,9 @@ VOID ReadConfig(CHAR16 *FileName) GlobalConfig.ScanFor[i] = ' '; } + } else if (StriCmp(TokenList[0], L"deep_uefi_legacy_scan") == 0) { + GlobalConfig.DeepLegacyScan = HandleBoolean(TokenList, TokenCount); + } else if ((StriCmp(TokenList[0], L"scan_delay") == 0) && (TokenCount == 2)) { HandleInt(TokenList, TokenCount, &(GlobalConfig.ScanDelay)); @@ -532,6 +547,8 @@ VOID ReadConfig(CHAR16 *FileName) GlobalConfig.ShowTools[i - 1] = TAG_SHELL; } else if (StriCmp(FlagName, L"gptsync") == 0) { GlobalConfig.ShowTools[i - 1] = TAG_GPTSYNC; + } else if (StriCmp(FlagName, L"gdisk") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_GDISK; } else if (StriCmp(FlagName, L"about") == 0) { GlobalConfig.ShowTools[i - 1] = TAG_ABOUT; } else if (StriCmp(FlagName, L"exit") == 0) { @@ -558,6 +575,27 @@ VOID ReadConfig(CHAR16 *FileName) } else if (StriCmp(TokenList[0], L"banner") == 0) { HandleString(TokenList, TokenCount, &(GlobalConfig.BannerFileName)); + } else if ((StriCmp(TokenList[0], L"banner_scale") == 0) && (TokenCount == 2)) { + if (StriCmp(TokenList[1], L"noscale") == 0) { + GlobalConfig.BannerScale = BANNER_NOSCALE; + } else if ((StriCmp(TokenList[1], L"fillscreen") == 0) || (StriCmp(TokenList[1], L"fullscreen") == 0)) { + GlobalConfig.BannerScale = BANNER_FILLSCREEN; + } else { + Print(L" unknown banner_type flag: '%s'\n", TokenList[1]); + } // if/else + + } else if ((StriCmp(TokenList[0], L"small_icon_size") == 0) && (TokenCount == 2)) { + HandleInt(TokenList, TokenCount, &i); + if (i >= 32) + GlobalConfig.IconSizes[ICON_SIZE_SMALL] = i; + + } else if ((StriCmp(TokenList[0], L"big_icon_size") == 0) && (TokenCount == 2)) { + HandleInt(TokenList, TokenCount, &i); + if (i >= 32) { + GlobalConfig.IconSizes[ICON_SIZE_BIG] = i; + GlobalConfig.IconSizes[ICON_SIZE_BADGE] = i / 4; + } + } else if (StriCmp(TokenList[0], L"selection_small") == 0) { HandleString(TokenList, TokenCount, &(GlobalConfig.SelectionSmallFileName)); @@ -572,11 +610,12 @@ VOID ReadConfig(CHAR16 *FileName) } } else if (StriCmp(TokenList[0], L"textonly") == 0) { - if ((TokenCount >= 2) && (StriCmp(TokenList[1], L"0") == 0)) { - GlobalConfig.TextOnly = FALSE; - } else { - GlobalConfig.TextOnly = TRUE; - } + 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)); @@ -612,11 +651,12 @@ VOID ReadConfig(CHAR16 *FileName) egLoadFont(TokenList[1]); } else if (StriCmp(TokenList[0], L"scan_all_linux_kernels") == 0) { - if ((TokenCount >= 2) && (StriCmp(TokenList[1], L"0") == 0)) { - GlobalConfig.ScanAllLinux = FALSE; - } else { - GlobalConfig.ScanAllLinux = TRUE; - } + 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)); @@ -636,18 +676,23 @@ VOID ReadConfig(CHAR16 *FileName) MyFreePool(File.Buffer); } /* VOID ReadConfig() */ -// Finds a volume with the specified Identifier (a volume label or a number -// followed by a colon, for the moment). If found, sets *Volume to point to -// that volume. If not, leaves it unchanged. +// Finds a volume with the specified Identifier (a filesystem label, a +// partition name, a partition GUID, or a number followed by a colon). If +// found, sets *Volume to point to that volume. If not, leaves it unchanged. // Returns TRUE if a match was found, FALSE if not. static BOOLEAN FindVolume(REFIT_VOLUME **Volume, CHAR16 *Identifier) { - UINTN i = 0, CountedVolumes = 0; + UINTN i = 0, CountedVolumes = 0, Length; INTN Number = -1; - BOOLEAN Found = FALSE; + BOOLEAN Found = FALSE, IdIsGuid = FALSE; + EFI_GUID VolGuid, NullGuid = NULL_GUID_VALUE; - if ((StrLen(Identifier) >= 2) && (Identifier[StrLen(Identifier) - 1] == L':') && + VolGuid = StringAsGuid(Identifier); + Length = StrLen(Identifier); + if ((Length >= 2) && (Identifier[Length - 1] == L':') && (Identifier[0] >= L'0') && (Identifier[0] <= L'9')) { Number = (INTN) Atoi(Identifier); + } else if (IsGuid(Identifier)) { + IdIsGuid = TRUE; } while ((i < VolumesCount) && (!Found)) { if (Number >= 0) { // User specified a volume by number @@ -658,11 +703,18 @@ static BOOLEAN FindVolume(REFIT_VOLUME **Volume, CHAR16 *Identifier) { } CountedVolumes++; } // if - } else { // User specified a volume by label - if (StriCmp(Identifier, Volumes[i]->VolName) == 0) { + } else { // User specified a volume by label or GUID + if ((StriCmp(Identifier, Volumes[i]->VolName) == 0) || + (StriCmp(Identifier, Volumes[i]->PartName) == 0)) { *Volume = Volumes[i]; Found = TRUE; } // if + if (IdIsGuid && !Found) { + if (GuidsAreEqual(&VolGuid, &(Volumes[i]->PartGuid)) && !GuidsAreEqual(&NullGuid, &(Volumes[i]->PartGuid))) { + *Volume = Volumes[i]; + Found = TRUE; + } // if + } // if } // if/else i++; } // while() @@ -783,9 +835,9 @@ static LOADER_ENTRY * AddStanzaEntries(REFIT_FILE *File, REFIT_VOLUME *Volume, C } else if ((StriCmp(TokenList[0], L"icon") == 0) && (TokenCount > 1)) { MyFreePool(Entry->me.Image); - Entry->me.Image = egLoadIcon(CurrentVolume->RootDir, TokenList[1], 128); + Entry->me.Image = egLoadIcon(CurrentVolume->RootDir, TokenList[1], GlobalConfig.IconSizes[ICON_SIZE_BIG]); if (Entry->me.Image == NULL) { - Entry->me.Image = DummyImage(128); + Entry->me.Image = DummyImage(GlobalConfig.IconSizes[ICON_SIZE_BIG]); } } else if ((StriCmp(TokenList[0], L"initrd") == 0) && (TokenCount > 1)) {