X-Git-Url: https://code.delx.au/refind/blobdiff_plain/9f59e764bc973af9845d222cad85713395c51cf0..0189958c722bdd4e7f323d59f81e25579bb0aad2:/refind/config.c diff --git a/refind/config.c b/refind/config.c index e9d2e55..c56c54f 100644 --- a/refind/config.c +++ b/refind/config.c @@ -324,54 +324,42 @@ static VOID HandleString(IN CHAR16 **TokenList, IN UINTN TokenCount, OUT CHAR16 } // if } // static VOID HandleString() -// Handle a parameter with a series of string arguments, to be added to a comma-delimited -// list. Passes each token through the CleanUpPathNameSlashes() function to ensure -// consistency in subsequent comparisons of filenames. +// Handle a parameter with a series of string arguments, to replace or be added to a +// comma-delimited list. Passes each token through the CleanUpPathNameSlashes() function +// to ensure consistency in subsequent comparisons of filenames. If the first +// non-keyword token is "+", the list is added to the existing target string; otherwise, +// the tokens replace the current string. static VOID HandleStrings(IN CHAR16 **TokenList, IN UINTN TokenCount, OUT CHAR16 **Target) { UINTN i; + BOOLEAN AddMode = FALSE; - if (*Target != NULL) { + if ((TokenCount > 2) && (StriCmp(TokenList[1], L"+") == 0)) { + AddMode = TRUE; + } + + if ((*Target != NULL) && !AddMode) { FreePool(*Target); *Target = NULL; } // if for (i = 1; i < TokenCount; i++) { - CleanUpPathNameSlashes(TokenList[i]); - MergeStrings(Target, TokenList[i], L','); - } + if ((i != 1) || !AddMode) { + CleanUpPathNameSlashes(TokenList[i]); + MergeStrings(Target, TokenList[i], L','); + } // if + } // for } // static VOID HandleStrings() // Convert TimeString (in "HH:MM" format) to a pure-minute format. Values should be // in the range from 0 (for 00:00, or midnight) to 1439 (for 23:59; aka LAST_MINUTE). -// Any value outside that range denotes an error in the specification. -// static UINTN HandleTime(IN CHAR16 *TimeString) { -// BOOLEAN Found = FALSE; -// UINTN ColonPosition = 0, Hour = 0, Minute = 0, TimeLength; -// -// Print(L"Entering HandleTime('%s')\n", TimeString); -// TimeLength = StrLen(TimeString); -// for (ColonPosition = 0; (ColonPosition < TimeLength) && !Found; ColonPosition++) { -// Print(L"ColonPosition = %d\n", ColonPosition); -// if (TimeString[ColonPosition] == ':') -// Found = TRUE; -// } // for -// -// if ((ColonPosition == 0) || (ColonPosition > StrLen(TimeString))) -// return (LAST_MINUTE + 1); -// -// Hour = Atoi(TimeString); -// Minute = Atoi(&TimeString[ColonPosition + 1]); -// Print(L"Hour = %d, Minute = %d\n", Hour, Minute); -// return (Hour * 60 + Minute); -// } // BOOLEAN HandleTime() - +// Any value outside that range denotes an error in the specification. Note that if +// the input is a number that includes no colon, this function will return the original +// number in UINTN form. static UINTN HandleTime(IN CHAR16 *TimeString) { UINTN Hour = 0, Minute = 0, TimeLength, i = 0; - BOOLEAN FoundColon = FALSE; TimeLength = StrLen(TimeString); while (i < TimeLength) { if (TimeString[i] == L':') { - FoundColon = TRUE; Hour = Minute; Minute = 0; } // if @@ -381,7 +369,7 @@ static UINTN HandleTime(IN CHAR16 *TimeString) { } // if i++; } // while - return (FoundColon ? Hour * 60 + Minute : LAST_MINUTE + 1); + return (Hour * 60 + Minute); } // BOOLEAN HandleTime() // Sets the default boot loader IF the current time is within the bounds @@ -432,7 +420,7 @@ VOID ReadConfig(CHAR16 *FileName) UINTN TokenCount, i; // Set a few defaults only if we're loading the default file. - if (StriCmp(FileName, CONFIG_FILE_NAME) == 0) { + if (StriCmp(FileName, GlobalConfig.ConfigFilename) == 0) { MyFreePool(GlobalConfig.AlsoScan); GlobalConfig.AlsoScan = StrDuplicate(ALSO_SCAN_DIRS); MyFreePool(GlobalConfig.DontScanDirs); @@ -453,6 +441,7 @@ VOID ReadConfig(CHAR16 *FileName) MergeStrings(&(GlobalConfig.DontScanFiles), MOK_NAMES, L','); MyFreePool(GlobalConfig.DontScanVolumes); GlobalConfig.DontScanVolumes = StrDuplicate(DONT_SCAN_VOLUMES); + GlobalConfig.WindowsRecoveryFiles = StrDuplicate(WINDOWS_RECOVERY_FILES); } // if if (!FileExists(SelfDir, FileName)) { @@ -529,6 +518,9 @@ VOID ReadConfig(CHAR16 *FileName) } else if ((StriCmp(TokenList[0], L"don't_scan_files") == 0) || (StriCmp(TokenList[0], L"dont_scan_files") == 0)) { HandleStrings(TokenList, TokenCount, &(GlobalConfig.DontScanFiles)); + } else if (StriCmp(TokenList[0], L"windows_recovery_files") == 0) { + HandleStrings(TokenList, TokenCount, &(GlobalConfig.WindowsRecoveryFiles)); + } else if (StriCmp(TokenList[0], L"scan_driver_dirs") == 0) { HandleStrings(TokenList, TokenCount, &(GlobalConfig.DriverDirs)); @@ -550,6 +542,8 @@ VOID ReadConfig(CHAR16 *FileName) GlobalConfig.ShowTools[i - 1] = TAG_SHUTDOWN; } else if (StriCmp(FlagName, L"apple_recovery") == 0) { GlobalConfig.ShowTools[i - 1] = TAG_APPLE_RECOVERY; + } else if (StriCmp(FlagName, L"windows_recovery") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_WINDOWS_RECOVERY; } else if (StriCmp(FlagName, L"mok_tool") == 0) { GlobalConfig.ShowTools[i - 1] = TAG_MOK_TOOL; } else if (StriCmp(FlagName, L"firmware") == 0) { @@ -598,7 +592,8 @@ VOID ReadConfig(CHAR16 *FileName) HandleInt(TokenList, TokenCount, &(GlobalConfig.ScreensaverTime)); } else if (StriCmp(TokenList[0], L"use_graphics_for") == 0) { - GlobalConfig.GraphicsFor = 0; + if ((TokenCount == 2) || ((TokenCount > 2) && (StriCmp(TokenList[1], L"+") != 0))) + GlobalConfig.GraphicsFor = 0; for (i = 1; i < TokenCount; i++) { if (StriCmp(TokenList[i], L"osx") == 0) { GlobalConfig.GraphicsFor |= GRAPHICS_FOR_OSX; @@ -626,7 +621,8 @@ VOID ReadConfig(CHAR16 *FileName) } else if (StriCmp(TokenList[0], L"max_tags") == 0) { HandleInt(TokenList, TokenCount, &(GlobalConfig.MaxTags)); - } else if ((StriCmp(TokenList[0], L"include") == 0) && (TokenCount == 2) && (StriCmp(FileName, CONFIG_FILE_NAME) == 0)) { + } else if ((StriCmp(TokenList[0], L"include") == 0) && (TokenCount == 2) && + (StriCmp(FileName, GlobalConfig.ConfigFilename) == 0)) { if (StriCmp(TokenList[1], FileName) != 0) { ReadConfig(TokenList[1]); } @@ -635,6 +631,8 @@ VOID ReadConfig(CHAR16 *FileName) FreeTokenLine(&TokenList, &TokenCount); } + if ((GlobalConfig.DontScanFiles) && (GlobalConfig.WindowsRecoveryFiles)) + MergeStrings(&(GlobalConfig.DontScanFiles), GlobalConfig.WindowsRecoveryFiles, L','); MyFreePool(File.Buffer); } /* VOID ReadConfig() */ @@ -865,7 +863,8 @@ VOID ScanUserConfigured(CHAR16 *FileName) } // if/else MyFreePool(Title); - } else if ((StriCmp(TokenList[0], L"include") == 0) && (TokenCount == 2) && (StriCmp(FileName, CONFIG_FILE_NAME) == 0)) { + } else if ((StriCmp(TokenList[0], L"include") == 0) && (TokenCount == 2) && + (StriCmp(FileName, GlobalConfig.ConfigFilename) == 0)) { if (StriCmp(TokenList[1], FileName) != 0) { ScanUserConfigured(TokenList[1]); }