X-Git-Url: https://code.delx.au/refind/blobdiff_plain/4bb04fb4ee646fbfa209762ea238e531721b6b5e..b72a91c9b51a3c6761db777f3e2818d240adf62e:/refind/config.c diff --git a/refind/config.c b/refind/config.c index 9149b9b..30b3c1f 100644 --- a/refind/config.c +++ b/refind/config.c @@ -35,7 +35,7 @@ */ /* - * Modifications copyright (c) 2012 Roderick W. Smith + * Modifications copyright (c) 2012-2013 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 @@ -220,7 +220,6 @@ static CHAR16 *ReadLine(REFIT_FILE *File) static BOOLEAN KeepReading(IN OUT CHAR16 *p, IN OUT BOOLEAN *IsQuoted) { BOOLEAN MoreToRead = FALSE; CHAR16 *Temp = NULL; -// while (*p && *p != '"' && ((*p != ' ' && *p != '\t' && *p != '=' && *p != '#' && *p != ',') || IsQuoted)) { if ((p == NULL) || (IsQuoted == NULL)) return FALSE; @@ -341,15 +340,31 @@ VOID ReadConfig(CHAR16 *FileName) REFIT_FILE File; CHAR16 **TokenList; CHAR16 *FlagName; + CHAR16 *SelfPath = NULL; UINTN TokenCount, i; // Set a few defaults only if we're loading the default file. if (StriCmp(FileName, CONFIG_FILE_NAME) == 0) { + MyFreePool(GlobalConfig.AlsoScan); + GlobalConfig.AlsoScan = StrDuplicate(ALSO_SCAN_DIRS); MyFreePool(GlobalConfig.DontScanDirs); - GlobalConfig.DontScanDirs = StrDuplicate(SelfDirPath); + if (SelfVolume) { + if (SelfVolume->VolName) { + SelfPath = SelfVolume->VolName ? StrDuplicate(SelfVolume->VolName) : NULL; + } else { + SelfPath = AllocateZeroPool(256 * sizeof(CHAR16)); + if (SelfPath != NULL) + SPrint(SelfPath, 255, L"fs%d", SelfVolume->VolNumber); + } // if/else + } + MergeStrings(&SelfPath, SelfDirPath, L':'); + GlobalConfig.DontScanDirs = SelfPath; MyFreePool(GlobalConfig.DontScanFiles); GlobalConfig.DontScanFiles = StrDuplicate(DONT_SCAN_FILES); - } + MergeStrings(&(GlobalConfig.DontScanFiles), MOK_NAMES, L','); + MyFreePool(GlobalConfig.DontScanVolumes); + GlobalConfig.DontScanVolumes = StrDuplicate(DONT_SCAN_VOLUMES); + } // if if (!FileExists(SelfDir, FileName)) { Print(L"Configuration file '%s' missing!\n", FileName); @@ -376,15 +391,19 @@ VOID ReadConfig(CHAR16 *FileName) } else if (StriCmp(FlagName, L"label") == 0) { GlobalConfig.HideUIFlags |= HIDEUI_FLAG_LABEL; } else if (StriCmp(FlagName, L"singleuser") == 0) { - GlobalConfig.HideUIFlags |= HIDEUI_FLAG_SINGLEUSER; + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_SINGLEUSER; } else if (StriCmp(FlagName, L"hwtest") == 0) { - GlobalConfig.HideUIFlags |= HIDEUI_FLAG_HWTEST; + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_HWTEST; } else if (StriCmp(FlagName, L"arrows") == 0) { GlobalConfig.HideUIFlags |= HIDEUI_FLAG_ARROWS; } else if (StriCmp(FlagName, L"hints") == 0) { GlobalConfig.HideUIFlags |= HIDEUI_FLAG_HINTS; + } else if (StriCmp(FlagName, L"editor") == 0) { + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_EDITOR; + } else if (StriCmp(FlagName, L"safemode") == 0) { + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_SAFEMODE; } else if (StriCmp(FlagName, L"all") == 0) { - GlobalConfig.HideUIFlags = HIDEUI_ALL; + GlobalConfig.HideUIFlags = HIDEUI_FLAG_ALL; } else { Print(L" unknown hideui flag: '%s'\n", FlagName); } @@ -407,6 +426,14 @@ VOID ReadConfig(CHAR16 *FileName) } else if (StriCmp(TokenList[0], L"also_scan_dirs") == 0) { HandleStrings(TokenList, TokenCount, &(GlobalConfig.AlsoScan)); + } else if ((StriCmp(TokenList[0], L"don't_scan_volumes") == 0) || (StriCmp(TokenList[0], L"dont_scan_volumes") == 0)) { + // Note: Don't use HandleStrings() because it modifies slashes, which might be present in volume name + MyFreePool(GlobalConfig.DontScanVolumes); + GlobalConfig.DontScanVolumes = NULL; + for (i = 1; i < TokenCount; i++) { + MergeStrings(&GlobalConfig.DontScanVolumes, TokenList[i], L','); + } + } else if ((StriCmp(TokenList[0], L"don't_scan_dirs") == 0) || (StriCmp(TokenList[0], L"dont_scan_dirs") == 0)) { HandleStrings(TokenList, TokenCount, &(GlobalConfig.DontScanDirs)); @@ -436,6 +463,8 @@ VOID ReadConfig(CHAR16 *FileName) GlobalConfig.ShowTools[i - 1] = TAG_APPLE_RECOVERY; } else if (StriCmp(FlagName, L"mok_tool") == 0) { GlobalConfig.ShowTools[i - 1] = TAG_MOK_TOOL; + } else if (StriCmp(FlagName, L"firmware") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_FIRMWARE; } else { Print(L" unknown showtools flag: '%s'\n", FlagName); } @@ -463,9 +492,15 @@ VOID ReadConfig(CHAR16 *FileName) } else if (StriCmp(TokenList[0], L"textmode") == 0) { HandleInt(TokenList, TokenCount, &(GlobalConfig.RequestedTextMode)); - } else if ((StriCmp(TokenList[0], L"resolution") == 0) && (TokenCount == 3)) { + } else if ((StriCmp(TokenList[0], L"resolution") == 0) && ((TokenCount == 2) || (TokenCount == 3))) { GlobalConfig.RequestedScreenWidth = Atoi(TokenList[1]); - GlobalConfig.RequestedScreenHeight = Atoi(TokenList[2]); + if (TokenCount == 3) + GlobalConfig.RequestedScreenHeight = Atoi(TokenList[2]); + else + GlobalConfig.RequestedScreenHeight = 0; + + } else if (StriCmp(TokenList[0], L"screensaver") == 0) { + HandleInt(TokenList, TokenCount, &(GlobalConfig.ScreensaverTime)); } else if (StriCmp(TokenList[0], L"use_graphics_for") == 0) { GlobalConfig.GraphicsFor = 0; @@ -483,6 +518,9 @@ VOID ReadConfig(CHAR16 *FileName) } } // for (graphics_on tokens) + } else if ((StriCmp(TokenList[0], L"font") == 0) && (TokenCount == 2)) { + 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; @@ -652,7 +690,7 @@ 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 = LoadIcns(CurrentVolume->RootDir, TokenList[1], 128); + Entry->me.Image = egLoadIcon(CurrentVolume->RootDir, TokenList[1], 128); if (Entry->me.Image == NULL) { Entry->me.Image = DummyImage(128); } @@ -695,14 +733,14 @@ static LOADER_ENTRY * AddStanzaEntries(REFIT_FILE *File, REFIT_VOLUME *Volume, C } // if if (!DefaultsSet) - SetLoaderDefaults(Entry, L"\\EFI\\BOOT\\nemo.efi", CurrentVolume); // user included no entry; use bogus one + SetLoaderDefaults(Entry, L"\\EFI\\BOOT\\nemo.efi", CurrentVolume); // user included no "loader" line; use bogus one return(Entry); } // static VOID AddStanzaEntries() // Read the user-configured menu entries from refind.conf and add or delete // entries based on the contents of that file.... -VOID ScanUserConfigured(VOID) +VOID ScanUserConfigured(CHAR16 *FileName) { EFI_STATUS Status; REFIT_FILE File; @@ -711,10 +749,9 @@ VOID ScanUserConfigured(VOID) CHAR16 *Title = NULL; UINTN TokenCount, size; LOADER_ENTRY *Entry; -// REFIT_MENU_SCREEN *SubScreen; - if (FileExists(SelfDir, CONFIG_FILE_NAME)) { - Status = ReadFile(SelfDir, CONFIG_FILE_NAME, &File, &size); + if (FileExists(SelfDir, FileName)) { + Status = ReadFile(SelfDir, FileName, &File, &size); if (EFI_ERROR(Status)) return; @@ -732,7 +769,13 @@ VOID ScanUserConfigured(VOID) MyFreePool(Entry); } // if/else MyFreePool(Title); - } // if + + } else if ((StriCmp(TokenList[0], L"include") == 0) && (TokenCount == 2) && (StriCmp(FileName, CONFIG_FILE_NAME) == 0)) { + if (StriCmp(TokenList[1], FileName) != 0) { + ScanUserConfigured(TokenList[1]); + } + + } // if/else if... FreeTokenLine(&TokenList, &TokenCount); } // while() } // if()