]> code.delx.au - refind/blobdiff - refind/lib.c
Added ability to boot the previously-booted loader if
[refind] / refind / lib.c
index 0c4089f5ff3fc49268d7bb4d94ba21f5bf8111b6..057026589c502b104180d336c3a8cb2771b85b81 100644 (file)
@@ -265,6 +265,43 @@ static EFI_STATUS FinishInitRefitLib(VOID)
     return EFI_SUCCESS;
 }
 
+//
+// EFI variable read and write functions
+//
+
+// From gummiboot: Retrieve a raw EFI variable.
+// Returns EFI status
+EFI_STATUS EfivarGetRaw(EFI_GUID *vendor, CHAR16 *name, CHAR8 **buffer, UINTN *size) {
+   CHAR8 *buf;
+   UINTN l;
+   EFI_STATUS err;
+
+   l = sizeof(CHAR16 *) * EFI_MAXIMUM_VARIABLE_SIZE;
+   buf = AllocatePool(l);
+   if (!buf)
+      return EFI_OUT_OF_RESOURCES;
+
+   err = refit_call5_wrapper(RT->GetVariable, name, vendor, NULL, &l, buf);
+   if (EFI_ERROR(err) == EFI_SUCCESS) {
+      *buffer = buf;
+      if (size)
+         *size = l;
+   } else
+      MyFreePool(buf);
+   return err;
+} // EFI_STATUS EfivarGetRaw()
+
+// From gummiboot: Set an EFI variable
+EFI_STATUS EfivarSetRaw(EFI_GUID *vendor, CHAR16 *name, CHAR8 *buf, UINTN size, BOOLEAN persistent) {
+   UINT32 flags;
+
+   flags = EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS;
+   if (persistent)
+      flags |= EFI_VARIABLE_NON_VOLATILE;
+
+   return refit_call5_wrapper(RT->SetVariable, name, vendor, flags, size, buf);
+} // EFI_STATUS EfivarSetRaw()
+
 //
 // list functions
 //
@@ -1061,8 +1098,9 @@ VOID ScanVolumes(VOID)
             Volume->BlockIO != Volume->WholeDiskBlockIO) {
             for (VolumeIndex2 = 0; VolumeIndex2 < VolumesCount; VolumeIndex2++) {
                 if (Volumes[VolumeIndex2]->BlockIO == Volume->WholeDiskBlockIO &&
-                    Volumes[VolumeIndex2]->BlockIOOffset == 0)
+                    Volumes[VolumeIndex2]->BlockIOOffset == 0) {
                     WholeDiskVolume = Volumes[VolumeIndex2];
+                }
             }
         }
 
@@ -1862,9 +1900,26 @@ BOOLEAN IsIn(IN CHAR16 *SmallString, IN CHAR16 *List) {
             Found = TRUE;
       } // while
    } // if
-      return Found;
+   return Found;
 } // BOOLEAN IsIn()
 
+// Returns TRUE if any element of List can be found as a substring of
+// BigString, FALSE otherwise. Performs comparisons case-insensitively.
+BOOLEAN IsInSubstring(IN CHAR16 *BigString, IN CHAR16 *List) {
+   UINTN   i = 0, ElementLength;
+   BOOLEAN Found = FALSE;
+   CHAR16  *OneElement;
+
+   if (BigString && List) {
+      while (!Found && (OneElement = FindCommaDelimited(List, i++))) {
+         ElementLength = StrLen(OneElement);
+         if ((ElementLength <= StrLen(BigString)) && (StriSubCmp(OneElement, BigString)))
+            Found = TRUE;
+      } // while
+   } // if
+   return Found;
+} // BOOLEAN IsSubstringIn()
+
 // Returns TRUE if specified Volume, Directory, and Filename correspond to an
 // element in the comma-delimited List, FALSE otherwise. Note that Directory and
 // Filename must *NOT* include a volume or path specification (that's part of
@@ -2007,11 +2062,12 @@ BOOLEAN IsGuid(CHAR16 *UnknownString) {
 
    for (i = 0; i < Length; i++) {
       a = UnknownString[i];
-      if (((i == 8) || (i == 13) || (i == 18) || (i == 23)) && (a != '-')) {
-         retval = FALSE;
+      if ((i == 8) || (i == 13) || (i == 18) || (i == 23)) {
+         if (a != '-')
+            retval = FALSE;
       } else if (((a < 'a') || (a > 'f')) && ((a < 'A') || (a > 'F')) && ((a < '0') && (a > '9'))) {
          retval = FALSE;
-      } // if/else
+      } // if/else if
    } // for
    return retval;
 } // BOOLEAN IsGuid()