X-Git-Url: https://code.delx.au/refind/blobdiff_plain/6ddfd09a30d788c784840b1f6dfc3d9281b33726..860fb6e13e399f326ff20e25f9f36070ee67b1a9:/refind/config.c diff --git a/refind/config.c b/refind/config.c index b89e365..803ce61 100644 --- a/refind/config.c +++ b/refind/config.c @@ -53,9 +53,9 @@ // constants -#define CONFIG_FILE_NAME L"refind.conf" -#define LINUX_OPTIONS_FILENAME L"linux.conf" -#define MAXCONFIGFILESIZE (128*1024) +#define CONFIG_FILE_NAME L"refind.conf" +#define LINUX_OPTIONS_FILENAMES L"refind_linux.conf,refind-linux.conf,linux.conf" +#define MAXCONFIGFILESIZE (128*1024) #define ENCODING_ISO8859_1 (0) #define ENCODING_UTF8 (1) @@ -325,20 +325,26 @@ VOID ReadConfig(VOID) if (StriCmp(TokenList[0], L"timeout") == 0) { HandleInt(TokenList, TokenCount, &(GlobalConfig.Timeout)); - - } else if (StriCmp(TokenList[0], L"disable") == 0) { + + // Note: I'm using "disable" as equivalent to "hideui" for the moment (as of rEFInd 0.2.4) + // because I've folded two options into one and removed some values, so I want to catch + // existing configurations as much as possible. The "disable" equivalency to "hideui" will + // be removed sooner or later, leaving only "hideui". + } else if ((StriCmp(TokenList[0], L"hideui") == 0) || (StriCmp(TokenList[0], L"disable") == 0)) { for (i = 1; i < TokenCount; i++) { FlagName = TokenList[i]; - if (StriCmp(FlagName, L"shell") == 0) { - GlobalConfig.DisableFlags |= DISABLE_FLAG_SHELL; - } else if (StriCmp(FlagName, L"tools") == 0) { - GlobalConfig.DisableFlags |= DISABLE_FLAG_TOOLS; + if (StriCmp(FlagName, L"banner") == 0) { + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_BANNER; + } else if (StriCmp(FlagName, L"label") == 0) { + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_LABEL; } else if (StriCmp(FlagName, L"singleuser") == 0) { - GlobalConfig.DisableFlags |= DISABLE_FLAG_SINGLEUSER; + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_SINGLEUSER; } else if (StriCmp(FlagName, L"hwtest") == 0) { - GlobalConfig.DisableFlags |= DISABLE_FLAG_HWTEST; + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_HWTEST; + } else if (StriCmp(FlagName, L"arrows") == 0) { + GlobalConfig.HideUIFlags |= HIDEUI_FLAG_ARROWS; } else if (StriCmp(FlagName, L"all") == 0) { - GlobalConfig.DisableFlags = DISABLE_ALL; + GlobalConfig.HideUIFlags = HIDEUI_ALL; } else { Print(L" unknown disable flag: '%s'\n", FlagName); } @@ -351,27 +357,27 @@ VOID ReadConfig(VOID) else GlobalConfig.ScanFor[i] = ' '; } - } else if (StriCmp(TokenList[0], L"hideui") == 0) { - for (i = 1; i < TokenCount; i++) { + } else if (StriCmp(TokenList[0], L"showtools") == 0) { + SetMem(GlobalConfig.ShowTools, NUM_TOOLS * sizeof(UINTN), 0); + for (i = 1; (i < TokenCount) && (i < NUM_TOOLS); i++) { FlagName = TokenList[i]; - if (StriCmp(FlagName, L"banner") == 0) { - GlobalConfig.HideUIFlags |= HIDEUI_FLAG_BANNER; - } else if (StriCmp(FlagName, L"shell") == 0) { - GlobalConfig.DisableFlags |= DISABLE_FLAG_SHELL; - } else if (StriCmp(FlagName, L"tools") == 0) { - GlobalConfig.DisableFlags |= DISABLE_FLAG_TOOLS; - } else if (StriCmp(FlagName, L"funcs") == 0) { - GlobalConfig.HideUIFlags |= HIDEUI_FLAG_FUNCS; - } else if (StriCmp(FlagName, L"label") == 0) { - GlobalConfig.HideUIFlags |= HIDEUI_FLAG_LABEL; - } else if (StriCmp(FlagName, L"all") == 0) { - GlobalConfig.HideUIFlags = HIDEUI_ALL; - GlobalConfig.DisableFlags |= DISABLE_FLAG_SHELL | DISABLE_FLAG_TOOLS; + if (StriCmp(FlagName, L"shell") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_SHELL; + } else if (StriCmp(FlagName, L"gptsync") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_GPTSYNC; + } else if (StriCmp(FlagName, L"about") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_ABOUT; + } else if (StriCmp(FlagName, L"exit") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_EXIT; + } else if (StriCmp(FlagName, L"reboot") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_REBOOT; + } else if (StriCmp(FlagName, L"shutdown") == 0) { + GlobalConfig.ShowTools[i - 1] = TAG_SHUTDOWN; } else { - Print(L" unknown hideui flag: '%s'\n", FlagName); + Print(L" unknown showtools flag: '%s'\n", FlagName); } - } - + } // showtools options + } else if (StriCmp(TokenList[0], L"banner") == 0) { HandleString(TokenList, TokenCount, &(GlobalConfig.BannerFileName)); @@ -390,11 +396,12 @@ VOID ReadConfig(VOID) } else if ((StriCmp(TokenList[0], L"}") == 0) || (StriCmp(TokenList[0], L"loader") == 0) || (StriCmp(TokenList[0], L"icon") == 0) || (StriCmp(TokenList[0], L"options") == 0)) { // Do nothing; handled by ScanUserConfigured() + } else if ((StriCmp(TokenList[0], L"max_tags") == 0) && (TokenCount > 1)) { + GlobalConfig.MaxTags = Atoi(TokenList[1]); } FreeTokenLine(&TokenList, &TokenCount); } - FreePool(File.Buffer); } /* VOID ReadConfig() */ @@ -570,27 +577,50 @@ VOID ScanUserConfigured(VOID) // Read a Linux kernel options file for a Linux boot loader into memory. The LoaderPath // and Volume variables identify the location of the options file, but not its name -- // you pass this function the filename of the Linux kernel, initial RAM disk, or other -// file in the target directory, and this function finds the file with the name -// LINUX_OPTIONS_FILENAME within that directory and loads it. +// file in the target directory, and this function finds the file with a name in the +// comma-delimited list of names specified by LINUX_OPTIONS_FILENAMES within that +// directory and loads it. This function tries multiple files because I originally +// used the filename linux.conf, but close on the heels of that decision, the Linux +// kernel developers decided to use that name for a similar purpose, but with a +// different file format. Thus, I'm migrating rEFInd to use the name refind_linux.conf, +// but I want a migration period in which both names are used. +// // The return value is a pointer to the REFIT_FILE handle for the file, or NULL if // it wasn't found. REFIT_FILE * ReadLinuxOptionsFile(IN CHAR16 *LoaderPath, IN REFIT_VOLUME *Volume) { - CHAR16 *OptionsFilename = NULL; + CHAR16 *OptionsFilename, *FullFilename; + BOOLEAN GoOn = TRUE; + UINTN i = 0; REFIT_FILE *File = NULL; EFI_STATUS Status; - - OptionsFilename = FindPath(LoaderPath); - MergeStrings(&OptionsFilename, LINUX_OPTIONS_FILENAME, L'\\'); - if (FileExists(Volume->RootDir, OptionsFilename)) { - File = AllocateZeroPool(sizeof(REFIT_FILE)); - Status = ReadFile(Volume->RootDir, OptionsFilename, File); - if (CheckError(Status, L"while loading the Linux options file")) - File = NULL; - } - if (OptionsFilename != NULL) - FreePool(OptionsFilename); + + do { + OptionsFilename = FindCommaDelimited(LINUX_OPTIONS_FILENAMES, i++); + FullFilename = FindPath(LoaderPath); + if ((OptionsFilename != NULL) && (FullFilename != NULL)) { + MergeStrings(&FullFilename, OptionsFilename, '\\'); + if (FileExists(Volume->RootDir, FullFilename)) { + File = AllocateZeroPool(sizeof(REFIT_FILE)); + Status = ReadFile(Volume->RootDir, FullFilename, File); + GoOn = FALSE; + if (CheckError(Status, L"while loading the Linux options file")) { + if (File != NULL) + FreePool(File); + File = NULL; + GoOn = TRUE; + } // if error + } // if file exists + } else { // a filename string is NULL + GoOn = FALSE; + } // if/else + if (OptionsFilename != NULL) + FreePool(OptionsFilename); + if (FullFilename != NULL) + FreePool(FullFilename); + OptionsFilename = FullFilename = NULL; + } while (GoOn); return (File); -} // static REFIT_FILE * FindLinuxOptionsFile() +} // static REFIT_FILE * ReadLinuxOptionsFile() // Retrieve a single line of options from a Linux kernel options file CHAR16 * GetFirstOptionsFromFile(IN CHAR16 *LoaderPath, IN REFIT_VOLUME *Volume) {