/*
- * refit/lib.c
+ * refind/lib.c
* General library functions
*
* Copyright (c) 2006-2009 Christoph Pfisterer
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
- * 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
* with this source code or binaries made from it.
- *
+ *
*/
#include "global.h"
#include "screen.h"
#include "../include/refit_call_wrapper.h"
#include "../include/RemovableMedia.h"
+//#include "../include/UsbMass.h"
#ifdef __MAKEWITH_GNUEFI
#define EfiReallocatePool ReallocatePool
#define REISERFS_SUPER_MAGIC_STRING "ReIsErFs"
#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs"
#define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs"
+#define BTRFS_SIGNATURE "_BHRfS_M"
// variables
// and identify its boot loader, and hence probable BIOS-mode OS installation
#define SAMPLE_SIZE 69632 /* 68 KiB -- ReiserFS superblock begins at 64 KiB */
-// Default names for volume badges (mini-icon to define disk type) and icons
-#define VOLUME_BADGE_NAMES L".VolumeBadge.icns,.VolumeBadge.png"
-#define VOLUME_ICON_NAMES L".VolumeIcon.icns,.VolumeIcon.png"
// functions
// isn't present.
VOID CleanUpPathNameSlashes(IN OUT CHAR16 *PathName) {
CHAR16 *NewName;
- UINTN i, FinalChar = 0;
+ UINTN i, Length, FinalChar = 0;
BOOLEAN LastWasSlash = FALSE;
- NewName = AllocateZeroPool(sizeof(CHAR16) * (StrLen(PathName) + 2));
+ Length = StrLen(PathName);
+ NewName = AllocateZeroPool(sizeof(CHAR16) * (Length + 2));
if (NewName != NULL) {
for (i = 0; i < StrLen(PathName); i++) {
if ((PathName[i] == L'/') || (PathName[i] == L'\\')) {
// after that string (after some cleanup) as the return value, and truncating the original
// input value.
// If InString contains no ")" character, this function leaves the original input string
-// unmodified and also returns that string.
+// unmodified and also returns that string. If InString is NULL, this function returns NULL.
static CHAR16* SplitDeviceString(IN OUT CHAR16 *InString) {
INTN i;
CHAR16 *FileName = NULL;
BOOLEAN Found = FALSE;
- i = StrLen(InString) - 1;
- while ((i >= 0) && (!Found)) {
- if (InString[i] == L')') {
- Found = TRUE;
- FileName = StrDuplicate(&InString[i + 1]);
- CleanUpPathNameSlashes(FileName);
- InString[i + 1] = '\0';
- } // if
- i--;
- } // while
- if (FileName == NULL)
- FileName = StrDuplicate(InString);
+ if (InString != NULL) {
+ i = StrLen(InString) - 1;
+ while ((i >= 0) && (!Found)) {
+ if (InString[i] == L')') {
+ Found = TRUE;
+ FileName = StrDuplicate(&InString[i + 1]);
+ CleanUpPathNameSlashes(FileName);
+ InString[i + 1] = '\0';
+ } // if
+ i--;
+ } // while
+ if (FileName == NULL)
+ FileName = StrDuplicate(InString);
+ } // if
return FileName;
} // static CHAR16* SplitDeviceString()
case FS_TYPE_REISERFS:
retval = L" ReiserFS";
break;
+ case FS_TYPE_BTRFS:
+ retval = L" Btrfs";
+ break;
case FS_TYPE_ISO9660:
retval = L" ISO-9660";
break;
} // if
} // search for ReiserFS magic
+ if (BufferSize >= (65536 + 64 + 8)) {
+ MagicString = (char*) (Buffer + 65536 + 64);
+ if (CompareMem(MagicString, BTRFS_SIGNATURE, 8) == 0)
+ return FS_TYPE_BTRFS;
+ } // search for Btrfs magic
+
if (BufferSize >= (1024 + 2)) {
Magic16 = (UINT16*) (Buffer + 1024);
if ((*Magic16 == HFSPLUS_MAGIC1) || (*Magic16 == HFSPLUS_MAGIC2)) {
} // if (Buffer != NULL)
return FoundType;
-}
+} // UINT32 IdentifyFilesystemType()
static VOID ScanVolumeBootcode(REFIT_VOLUME *Volume, BOOLEAN *Bootable)
{
}
} /* VOID ScanVolumeBootcode() */
-// default volume badge icon based on disk kind
-static VOID ScanVolumeDefaultIcon(IN OUT REFIT_VOLUME *Volume)
+// Set default volume badge icon based on /.VolumeBadge.{icns|png} file or disk kind
+VOID SetVolumeBadgeIcon(REFIT_VOLUME *Volume)
{
- switch (Volume->DiskKind) {
- case DISK_KIND_INTERNAL:
- Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_INTERNAL);
- break;
- case DISK_KIND_EXTERNAL:
- Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_EXTERNAL);
- break;
- case DISK_KIND_OPTICAL:
- Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_OPTICAL);
- break;
- } // switch()
-}
+ if (Volume->VolBadgeImage == NULL) {
+ Volume->VolBadgeImage = egLoadIconAnyType(Volume->RootDir, L"", L".VolumeBadge", 128);
+ }
+
+ if (Volume->VolBadgeImage == NULL) {
+ switch (Volume->DiskKind) {
+ case DISK_KIND_INTERNAL:
+ Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_INTERNAL);
+ break;
+ case DISK_KIND_EXTERNAL:
+ Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_EXTERNAL);
+ break;
+ case DISK_KIND_OPTICAL:
+ Volume->VolBadgeImage = BuiltinIcon(BUILTIN_ICON_VOL_OPTICAL);
+ break;
+ } // switch()
+ }
+} // VOID SetVolumeBadgeIcon()
// Return a string representing the input size in IEEE-1541 units.
// The calling function is responsible for freeing the allocated memory.
Volume->HasBootCode = FALSE;
}
- // default volume icon based on disk kind
- ScanVolumeDefaultIcon(Volume);
-
// open the root directory of the volume
Volume->RootDir = LibOpenRoot(Volume->DeviceHandle);
+
+ // Set volume icon based on .VolumeBadge icon or disk kind
+ SetVolumeBadgeIcon(Volume);
+
if (Volume->RootDir == NULL) {
Volume->IsReadable = FALSE;
return;
Volume->VolName = GetVolumeName(Volume);
- // get custom volume icon if present
- if (!Volume->VolBadgeImage)
- Volume->VolBadgeImage = LoadIcns(Volume->RootDir, VOLUME_BADGE_NAMES, 32);
+ // get custom volume icons if present
if (!Volume->VolIconImage)
- Volume->VolIconImage = LoadIcns(Volume->RootDir, VOLUME_ICON_NAMES, 128);
+ Volume->VolIconImage = egLoadIconAnyType(Volume->RootDir, L"", L".VolumeIcon", 128);
} // ScanVolume()
static VOID ScanExtendedPartition(REFIT_VOLUME *WholeDiskVolume, MBR_PARTITION_INFO *MbrEntry)
if (!Bootable)
Volume->HasBootCode = FALSE;
- ScanVolumeDefaultIcon(Volume);
+ SetVolumeBadgeIcon(Volume);
AddListElement((VOID ***) &Volumes, &VolumesCount, Volume);
LastBufferSize = BufferSize;
}
if (EFI_ERROR(Status)) {
- FreePool(Buffer);
+ MyFreePool(Buffer);
+ Buffer = NULL;
break;
}
// check for end of listing
if (BufferSize == 0) { // end of directory listing
- FreePool(Buffer);
+ MyFreePool(Buffer);
+ Buffer = NULL;
break;
}
// else continue loop
} else
break;
- } while (KeepGoing);
+ } while (KeepGoing && FilePattern);
*DirEntry = DirIter->LastFileInfo;
return TRUE;
CHAR16 *FindExtension(IN CHAR16 *Path) {
CHAR16 *Extension;
BOOLEAN Found = FALSE, FoundSlash = FALSE;
- UINTN i;
+ INTN i;
Extension = AllocateZeroPool(sizeof(CHAR16));
if (Path) {
UINTN i, StartOfElement = 0, EndOfElement = 0, PathLength, CopyLength;
CHAR16 *Found = NULL;
+ if (Path == NULL)
+ return NULL;
+
PathLength = StrLen(Path);
// Find start & end of target element
for (i = 0; i < PathLength; i++) {
// freeing the returned string's memory.
CHAR16 *FindPath(IN CHAR16* FullPath) {
UINTN i, LastBackslash = 0;
- CHAR16 *PathOnly;
+ CHAR16 *PathOnly = NULL;
- for (i = 0; i < StrLen(FullPath); i++) {
- if (FullPath[i] == '\\')
- LastBackslash = i;
- } // for
- PathOnly = StrDuplicate(FullPath);
- PathOnly[LastBackslash] = 0;
+ if (FullPath != NULL) {
+ for (i = 0; i < StrLen(FullPath); i++) {
+ if (FullPath[i] == '\\')
+ LastBackslash = i;
+ } // for
+ PathOnly = StrDuplicate(FullPath);
+ PathOnly[LastBackslash] = 0;
+ } // if
return (PathOnly);
}
UINTN i, StartOfElement, EndOfElement = 0, InLength, CopyLength;
CHAR16 *Found = NULL;
+ if (InString == NULL)
+ return NULL;
+
InLength = StartOfElement = StrLen(InString);
// Find start & end of target element
for (i = 0; i < InLength; i++) {