]> code.delx.au - refind/blobdiff - refind/config.c
0.2.4 release version
[refind] / refind / config.c
index b89e365caef956c19336e4a470dcbdc447f9e902..803ce61bde5bf852bbc1e5fdc070ce2204163a5d 100644 (file)
@@ -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) {