// 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)
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);
}
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));
} 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() */
// 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) {