/** @file\r
Main file for map shell level 2 command.\r
\r
- Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2013 - 2015, Hewlett-Packard Development Company, L.P.<BR>\r
+ Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
return (FALSE);\r
}\r
\r
-/**\r
- Add mappings for any devices without one. Do not change any existing maps.\r
-\r
- @retval EFI_SUCCESS The operation was successful.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UpdateMapping (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_HANDLE *HandleList;\r
- UINTN Count;\r
- EFI_DEVICE_PATH_PROTOCOL **DevicePathList;\r
- CHAR16 *NewDefaultName;\r
- CHAR16 *NewConsistName;\r
- EFI_DEVICE_PATH_PROTOCOL **ConsistMappingTable;\r
-\r
- HandleList = NULL;\r
- Status = EFI_SUCCESS;\r
-\r
- //\r
- // remove mappings that represent removed devices.\r
- //\r
-\r
- //\r
- // Find each handle with Simple File System\r
- //\r
- HandleList = GetHandleListByProtocol(&gEfiSimpleFileSystemProtocolGuid);\r
- if (HandleList != NULL) {\r
- //\r
- // Do a count of the handles\r
- //\r
- for (Count = 0 ; HandleList[Count] != NULL ; Count++);\r
-\r
- //\r
- // Get all Device Paths\r
- //\r
- DevicePathList = AllocateZeroPool(sizeof(EFI_DEVICE_PATH_PROTOCOL*) * Count);\r
- ASSERT(DevicePathList != NULL);\r
-\r
- for (Count = 0 ; HandleList[Count] != NULL ; Count++) {\r
- DevicePathList[Count] = DevicePathFromHandle(HandleList[Count]);\r
- }\r
-\r
- //\r
- // Sort all DevicePaths\r
- //\r
- PerformQuickSort(DevicePathList, Count, sizeof(EFI_DEVICE_PATH_PROTOCOL*), DevicePathCompare);\r
-\r
- ShellCommandConsistMappingInitialize(&ConsistMappingTable);\r
-\r
- //\r
- // Assign new Mappings to remainders\r
- //\r
- for (Count = 0 ; HandleList[Count] != NULL && !EFI_ERROR(Status); Count++) {\r
- //\r
- // Skip ones that already have\r
- //\r
- if (gEfiShellProtocol->GetMapFromDevicePath(&DevicePathList[Count]) != NULL) {\r
- continue;\r
- }\r
- //\r
- // Get default name\r
- //\r
- NewDefaultName = ShellCommandCreateNewMappingName(MappingTypeFileSystem);\r
- ASSERT(NewDefaultName != NULL);\r
-\r
- //\r
- // Call shell protocol SetMap function now...\r
- //\r
- Status = gEfiShellProtocol->SetMap(DevicePathList[Count], NewDefaultName);\r
-\r
- if (!EFI_ERROR(Status)) {\r
- //\r
- // Now do consistent name\r
- //\r
- NewConsistName = ShellCommandConsistMappingGenMappingName(DevicePathList[Count], ConsistMappingTable);\r
- if (NewConsistName != NULL) {\r
- Status = gEfiShellProtocol->SetMap(DevicePathList[Count], NewConsistName);\r
- FreePool(NewConsistName);\r
- }\r
- }\r
-\r
- FreePool(NewDefaultName);\r
- }\r
- ShellCommandConsistMappingUnInitialize(ConsistMappingTable);\r
- SHELL_FREE_NON_NULL(HandleList);\r
- SHELL_FREE_NON_NULL(DevicePathList);\r
-\r
- HandleList = NULL;\r
- } else {\r
- Count = (UINTN)-1;\r
- }\r
- //\r
- // Do it all over again for gEfiBlockIoProtocolGuid\r
- //\r
-\r
- return (Status);\r
-}\r
-\r
/**\r
Determine what type of device is represented and return it's string. The \r
string is in allocated memory and must be callee freed. The HII is is listed below.\r
// specific has priority\r
//\r
if (Specific != NULL) {\r
- NewSpecific = AllocateZeroPool(StrSize(Specific) + sizeof(CHAR16));\r
+ NewSpecific = AllocateCopyPool(StrSize(Specific) + sizeof(CHAR16), Specific);\r
if (NewSpecific == NULL){\r
return FALSE;\r
}\r
- StrCpy(NewSpecific, Specific);\r
if (NewSpecific[StrLen(NewSpecific)-1] != L':') {\r
- StrCat(NewSpecific, L":");\r
+ StrnCat(NewSpecific, L":", 2);\r
}\r
\r
if (SearchList(MapList, NewSpecific, NULL, TRUE, FALSE, L";")) {\r
FreePool(NewSpecific);\r
}\r
if ( Consist\r
+ && Specific == NULL\r
&& (SearchList(MapList, L"HD*", NULL, TRUE, TRUE, L";")\r
||SearchList(MapList, L"CD*", NULL, TRUE, TRUE, L";")\r
||SearchList(MapList, L"F*", NULL, TRUE, TRUE, L";")\r
}\r
\r
if ( Normal\r
+ && Specific == NULL\r
&& (SearchList(MapList, L"FS", NULL, FALSE, TRUE, L";")\r
||SearchList(MapList, L"BLK", NULL, FALSE, TRUE, L";"))){\r
return (TRUE);\r
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
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 || !Consist) {\r
+ //\r
+ // need the Normal here since people can use both on command line. otherwise unused.\r
+ //\r
+\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 {\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
+ if (Alias == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\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
}\r
DevPathString = ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
+ TempLen = StrLen(CurrentName);\r
if (!SFO) {\r
- TempLen = StrLen(CurrentName);\r
ShellPrintHiiEx (\r
-1,\r
-1,\r
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
TempSpot2\r
);\r
}\r
- FreePool(MediaType);\r
+ SHELL_FREE_NON_NULL(MediaType);\r
}\r
} else {\r
- TempLen = StrLen(CurrentName);\r
ShellPrintHiiEx (\r
-1,\r
-1,\r
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
BOOLEAN Found;\r
\r
if (!Consist && !Normal && Specific == NULL && TypeString == NULL) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); \r
return (SHELL_INVALID_PARAMETER);\r
}\r
\r
if (StrnCmp(TypeString, Test, StrLen(Test)-1) != 0) {\r
Test = (CHAR16*)Fp;\r
if (StrnCmp(TypeString, Test, StrLen(Test)-1) != 0) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, TypeString);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", TypeString); \r
return (SHELL_INVALID_PARAMETER);\r
}\r
} else if (Test == NULL) {\r
}\r
if (!Found) {\r
if (Specific != NULL) {\r
- ShellPrintHiiEx(gST->ConOut->Mode->CursorColumn, gST->ConOut->Mode->CursorRow-1, NULL, STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, Specific);\r
+ ShellPrintHiiEx(gST->ConOut->Mode->CursorColumn, gST->ConOut->Mode->CursorRow-1, NULL, STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, L"map", Specific); \r
} else {\r
- ShellPrintHiiEx(gST->ConOut->Mode->CursorColumn, gST->ConOut->Mode->CursorRow-1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle);\r
+ ShellPrintHiiEx(gST->ConOut->Mode->CursorColumn, gST->ConOut->Mode->CursorRow-1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle, L"map"); \r
}\r
}\r
return (SHELL_SUCCESS);\r
EFI_STATUS Status;\r
CHAR16 *NewSName;\r
\r
- NewSName = AllocateZeroPool(StrSize(SName) + sizeof(CHAR16));\r
+ NewSName = AllocateCopyPool(StrSize(SName) + sizeof(CHAR16), SName);\r
if (NewSName == NULL) {\r
return (SHELL_OUT_OF_RESOURCES);\r
}\r
- StrCpy(NewSName, SName);\r
if (NewSName[StrLen(NewSName)-1] != L':') {\r
- StrCat(NewSName, L":");\r
+ StrnCat(NewSName, L":", 2);\r
}\r
\r
if (!IsNumberLetterOnly(NewSName, StrLen(NewSName)-1)) {\r
EFI_STATUS Status;\r
CHAR16 *NewSName;\r
\r
- NewSName = AllocateZeroPool(StrSize(SName) + sizeof(CHAR16));\r
+ NewSName = AllocateCopyPool(StrSize(SName) + sizeof(CHAR16), SName);\r
if (NewSName == NULL) {\r
return (SHELL_OUT_OF_RESOURCES);\r
}\r
- StrCpy(NewSName, SName);\r
if (NewSName[StrLen(NewSName)-1] != L':') {\r
- StrCat(NewSName, L":");\r
+ StrnCat(NewSName, L":", 2);\r
}\r
\r
if (!IsNumberLetterOnly(NewSName, StrLen(NewSName)-1)) {\r
Status = ShellCommandLineParse (MapParamList, &Package, &ProblemParam, TRUE);\r
if (EFI_ERROR(Status)) {\r
if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"map", ProblemParam); \r
FreePool(ProblemParam);\r
ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
if (ShellCommandLineGetFlag(Package, L"-?")) {\r
ASSERT(FALSE);\r
} else if (ShellCommandLineGetRawValue(Package, 3) != NULL) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"map"); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
//\r
|| ShellCommandLineGetFlag(Package, L"-u")\r
|| ShellCommandLineGetFlag(Package, L"-t")\r
){\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"map"); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
SName = ShellCommandLineGetValue(Package, L"-d");\r
Status = PerformMappingDelete(SName);\r
if (EFI_ERROR(Status)) {\r
if (Status == EFI_ACCESS_DENIED) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map"); \r
ShellStatus = SHELL_ACCESS_DENIED;\r
} else if (Status == EFI_NOT_FOUND) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, SName);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, L"map", SName); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, Status);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); \r
ShellStatus = SHELL_UNSUPPORTED;\r
}\r
}\r
} else {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"map"); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
}\r
}\r
//\r
Status = ShellCommandCreateInitialMappingsAndPaths();\r
if (EFI_ERROR(Status)) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, Status);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); \r
ShellStatus = SHELL_UNSUPPORTED;\r
}\r
}\r
//\r
// Do the Update\r
//\r
- Status = UpdateMapping();\r
+ Status = ShellCommandUpdateMapping ();\r
if (EFI_ERROR(Status)) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, Status);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", Status); \r
ShellStatus = SHELL_UNSUPPORTED;\r
}\r
}\r
MapAsHandle = NULL;\r
}\r
if (MapAsHandle == NULL && Mapping[StrLen(Mapping)-1] != L':') {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, Mapping);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping); \r
ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
if (MapAsHandle != NULL) {\r
TempStringLength = StrLen(SName);\r
if (!IsNumberLetterOnly(SName, TempStringLength-(SName[TempStringLength-1]==L':'?1:0))) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, SName);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", SName);\r
ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
ShellStatus = AddMappingFromHandle(MapAsHandle, SName);\r
} else {\r
TempStringLength = StrLen(SName);\r
if (!IsNumberLetterOnly(SName, TempStringLength-(SName[TempStringLength-1]==L':'?1:0))) {\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, SName);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", SName);\r
ShellStatus = SHELL_INVALID_PARAMETER;\r
} else {\r
ShellStatus = AddMappingFromMapping(Mapping, SName);\r
if (ShellStatus != SHELL_SUCCESS) {\r
switch (ShellStatus) {\r
case SHELL_ACCESS_DENIED:\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle, L"map");\r
break;\r
case SHELL_INVALID_PARAMETER:\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"map", Mapping);\r
break;\r
case SHELL_DEVICE_ERROR:\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MAP_NOF), gShellLevel2HiiHandle, Mapping);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MAP_NOF), gShellLevel2HiiHandle, L"map", Mapping);\r
break;\r
default:\r
- ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, ShellStatus|MAX_BIT);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, L"map", ShellStatus|MAX_BIT);\r
}\r
} else {\r
//\r