// read a file into a buffer
//
-static EFI_STATUS ReadFile(IN EFI_FILE_HANDLE BaseDir, CHAR16 *FileName, REFIT_FILE *File)
+EFI_STATUS ReadFile(IN EFI_FILE_HANDLE BaseDir, IN CHAR16 *FileName, IN OUT REFIT_FILE *File, OUT UINTN *size)
{
EFI_STATUS Status;
EFI_FILE_HANDLE FileHandle;
EFI_FILE_INFO *FileInfo;
UINT64 ReadSize;
+ CHAR16 Message[256];
File->Buffer = NULL;
File->BufferSize = 0;
// read the file, allocating a buffer on the way
Status = refit_call5_wrapper(BaseDir->Open, BaseDir, &FileHandle, FileName, EFI_FILE_MODE_READ, 0);
- if (CheckError(Status, L"while loading the configuration file"))
+ SPrint(Message, 255, L"while loading the file '%s'", FileName);
+ if (CheckError(Status, Message))
return Status;
FileInfo = LibFileInfo(FileHandle);
return EFI_LOAD_ERROR;
}
ReadSize = FileInfo->FileSize;
- if (ReadSize > MAXCONFIGFILESIZE)
- ReadSize = MAXCONFIGFILESIZE;
FreePool(FileInfo);
- File->BufferSize = (UINTN)ReadSize; // was limited to a few K before, so this is safe
+ File->BufferSize = (UINTN)ReadSize;
File->Buffer = AllocatePool(File->BufferSize);
+ if (File->Buffer == NULL) {
+ size = 0;
+ return EFI_OUT_OF_RESOURCES;
+ } else {
+ *size = File->BufferSize;
+ } // if/else
Status = refit_call3_wrapper(FileHandle->Read, FileHandle, &File->BufferSize, File->Buffer);
- if (CheckError(Status, L"while loading the configuration file")) {
+ if (CheckError(Status, Message)) {
MyFreePool(File->Buffer);
File->Buffer = NULL;
refit_call1_wrapper(FileHandle->Close, FileHandle);
}
// TODO: detect other encodings as they are implemented
}
-
+
return EFI_SUCCESS;
}
return;
}
- Status = ReadFile(SelfDir, CONFIG_FILE_NAME, &File);
+ Status = ReadFile(SelfDir, CONFIG_FILE_NAME, &File, &i);
if (EFI_ERROR(Status))
return;
+ GlobalConfig.DontScan = StrDuplicate(SelfDirPath);
+
for (;;) {
TokenCount = ReadTokenLine(&File, &TokenList);
if (TokenCount == 0)
GlobalConfig.ShowTools[i - 1] = TAG_REBOOT;
} else if (StriCmp(FlagName, L"shutdown") == 0) {
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"mok_tool") == 0) {
+ GlobalConfig.ShowTools[i - 1] = TAG_MOK_TOOL;
} else {
Print(L" unknown showtools flag: '%s'\n", FlagName);
}
MyFreePool(Entry->LoadOptions);
Entry->LoadOptions = NULL; // Discard default options, if any
DefaultsSet = TRUE;
+
} else if ((StriCmp(TokenList[0], L"volume") == 0) && (TokenCount > 1)) {
if (FindVolume(&CurrentVolume, TokenList[1])) {
MyFreePool(Entry->me.Title);
Entry->me.BadgeImage = CurrentVolume->VolBadgeImage;
Entry->VolName = CurrentVolume->VolName;
} // if match found
+
} else if ((StriCmp(TokenList[0], L"icon") == 0) && (TokenCount > 1)) {
MyFreePool(Entry->me.Image);
Entry->me.Image = LoadIcns(CurrentVolume->RootDir, TokenList[1], 128);
if (Entry->me.Image == NULL) {
Entry->me.Image = DummyImage(128);
}
+
} else if ((StriCmp(TokenList[0], L"initrd") == 0) && (TokenCount > 1)) {
MyFreePool(Entry->InitrdPath);
Entry->InitrdPath = StrDuplicate(TokenList[1]);
+
} else if ((StriCmp(TokenList[0], L"options") == 0) && (TokenCount > 1)) {
MyFreePool(Entry->LoadOptions);
Entry->LoadOptions = StrDuplicate(TokenList[1]);
+
} else if ((StriCmp(TokenList[0], L"ostype") == 0) && (TokenCount > 1)) {
if (TokenCount > 1) {
Entry->OSType = TokenList[1][0];
}
+
} else if ((StriCmp(TokenList[0], L"graphics") == 0) && (TokenCount > 1)) {
Entry->UseGraphicsMode = (StriCmp(TokenList[1], L"on") == 0);
+
} else if (StriCmp(TokenList[0], L"disabled") == 0) {
Entry->Enabled = FALSE;
+
} else if ((StriCmp(TokenList[0], L"submenuentry") == 0) && (TokenCount > 1)) {
AddSubmenu(Entry, File, CurrentVolume, TokenList[1]);
AddedSubmenu = TRUE;
+
} // set options to pass to the loader program
FreeTokenLine(&TokenList, &TokenCount);
} // while()
REFIT_VOLUME *Volume;
CHAR16 **TokenList;
CHAR16 *Title = NULL;
- UINTN TokenCount;
+ UINTN TokenCount, size;
LOADER_ENTRY *Entry;
if (FileExists(SelfDir, CONFIG_FILE_NAME)) {
- Status = ReadFile(SelfDir, CONFIG_FILE_NAME, &File);
+ Status = ReadFile(SelfDir, CONFIG_FILE_NAME, &File, &size);
if (EFI_ERROR(Status))
return;
REFIT_FILE * ReadLinuxOptionsFile(IN CHAR16 *LoaderPath, IN REFIT_VOLUME *Volume) {
CHAR16 *OptionsFilename, *FullFilename;
BOOLEAN GoOn = TRUE;
- UINTN i = 0;
+ UINTN i = 0, size;
REFIT_FILE *File = NULL;
EFI_STATUS Status;
MergeStrings(&FullFilename, OptionsFilename, '\\');
if (FileExists(Volume->RootDir, FullFilename)) {
File = AllocateZeroPool(sizeof(REFIT_FILE));
- Status = ReadFile(Volume->RootDir, FullFilename, File);
+ Status = ReadFile(Volume->RootDir, FullFilename, File, &size);
GoOn = FALSE;
if (CheckError(Status, L"while loading the Linux options file")) {
if (File != NULL)