]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c
ShellPkg: Correctly support "map -c"
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Map.c
index bd004beaaf9fa291bcdf66bf7c8d4471e6343bc9..590dbf79e34f2bb3451a3a659178e752268c740a 100644 (file)
@@ -397,10 +397,14 @@ PerformSingleMappingDisplay(
   CHAR16                    *MediaType;\r
   CHAR16                    *DevPathString;\r
   CHAR16                    *TempSpot;\r
+  CHAR16                    *Alias;\r
   UINTN                     TempLen;\r
   BOOLEAN                   Removable;\r
   CONST CHAR16              *TempSpot2;\r
 \r
+  Alias       = NULL;\r
+  TempSpot2   = NULL;\r
+  CurrentName = NULL;\r
   DevPath = DevicePathFromHandle(Handle);\r
   DevPathCopy = DevPath;\r
   MapList = gEfiShellProtocol->GetMapFromDevicePath(&DevPathCopy);\r
@@ -412,14 +416,74 @@ PerformSingleMappingDisplay(
     return EFI_NOT_FOUND;\r
   }\r
 \r
-  CurrentName = NULL;\r
-  CurrentName = StrnCatGrow(&CurrentName, 0, MapList, 0);\r
-  if (CurrentName == NULL) {\r
-    return (EFI_OUT_OF_RESOURCES);\r
-  }\r
-  TempSpot = StrStr(CurrentName, L";");\r
-  if (TempSpot != NULL) {\r
-    *TempSpot = CHAR_NULL;\r
+  if (Normal) {\r
+    //\r
+    // Allocate a name\r
+    //\r
+    CurrentName = NULL;\r
+    CurrentName = StrnCatGrow(&CurrentName, 0, MapList, 0);\r
+    if (CurrentName == NULL) {\r
+      return (EFI_OUT_OF_RESOURCES);\r
+    }\r
+\r
+    //\r
+    // Chop off the other names that become "Alias(s)"\r
+    // leaving just the normal name\r
+    //\r
+    TempSpot = StrStr(CurrentName, L";");\r
+    if (TempSpot != NULL) {\r
+      *TempSpot = CHAR_NULL;\r
+    }\r
+  } else if (Consist) {\r
+    CurrentName = NULL;\r
+\r
+    //\r
+    // Skip the first name.  This is the standard name.\r
+    //\r
+    TempSpot = StrStr(MapList, L";");\r
+    if (TempSpot != NULL) {\r
+      TempSpot++;\r
+    }\r
+    SearchList(TempSpot, L"HD*", &CurrentName, TRUE, FALSE, L";");\r
+    if (CurrentName == NULL) {\r
+      SearchList(TempSpot, L"CD*", &CurrentName, TRUE, FALSE, L";");\r
+    }\r
+    if (CurrentName == NULL) {\r
+      SearchList(TempSpot, L"FP*", &CurrentName, TRUE, FALSE, L";");\r
+    }\r
+    if (CurrentName == NULL) {\r
+      SearchList(TempSpot, L"F*",  &CurrentName, TRUE, FALSE, L";");\r
+    }\r
+    if (CurrentName == NULL) {\r
+      //\r
+      // We didnt find anything, so just the first one in the list...\r
+      //\r
+      CurrentName = StrnCatGrow(&CurrentName, 0, MapList, 0);\r
+      if (CurrentName == NULL) {\r
+        return (EFI_OUT_OF_RESOURCES);\r
+      }\r
+      TempSpot = StrStr(CurrentName, L";");\r
+      if (TempSpot != NULL) {\r
+        *TempSpot = CHAR_NULL;\r
+      }\r
+    } else {\r
+      Alias = StrnCatGrow(&Alias, 0, MapList, 0);\r
+      TempSpot = StrStr(Alias, CurrentName);\r
+      if (TempSpot != NULL) {\r
+        TempSpot2 = StrStr(TempSpot, L";");\r
+        if (TempSpot2 != NULL) {\r
+          TempSpot2++; // Move past ";" from CurrentName\r
+          CopyMem(TempSpot, TempSpot2, StrSize(TempSpot2));\r
+        } else {\r
+          *TempSpot = CHAR_NULL;\r
+        }\r
+      }\r
+      if (Alias[StrLen(Alias)-1] == L';') {\r
+        Alias[StrLen(Alias)-1] = CHAR_NULL;\r
+      }\r
+    }\r
+  } else {\r
+    CurrentName = NULL;\r
   }\r
   DevPathString = ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
   if (!SFO) {\r
@@ -431,7 +495,7 @@ PerformSingleMappingDisplay(
       STRING_TOKEN (STR_MAP_ENTRY),\r
       gShellLevel2HiiHandle,\r
       CurrentName,\r
-      TempLen < StrLen(MapList)?MapList + TempLen+1:L"",\r
+      Alias!=NULL?Alias:(TempLen < StrLen(MapList)?MapList + TempLen+1:L""),\r
       DevPathString\r
      );\r
     if (Verbose) {\r
@@ -454,7 +518,7 @@ PerformSingleMappingDisplay(
           TempSpot2\r
          );\r
       }\r
-      FreePool(MediaType);\r
+      SHELL_FREE_NON_NULL(MediaType);\r
     }\r
   } else {\r
     TempLen = StrLen(CurrentName);\r
@@ -466,11 +530,12 @@ PerformSingleMappingDisplay(
       gShellLevel2HiiHandle,\r
       CurrentName,\r
       DevPathString,\r
-      TempLen < StrLen(MapList)?MapList + TempLen+1:L""\r
+      Consist?L"":(TempLen < StrLen(MapList)?MapList + TempLen+1:L"")\r
      );\r
   }\r
-  FreePool(DevPathString);\r
-  FreePool(CurrentName);\r
+  SHELL_FREE_NON_NULL(DevPathString);\r
+  SHELL_FREE_NON_NULL(CurrentName);\r
+  SHELL_FREE_NON_NULL(Alias);\r
   return EFI_SUCCESS;\r
 }\r
 \r