ShellLibDestructor (\r
IN EFI_HANDLE ImageHandle,\r
IN EFI_SYSTEM_TABLE *SystemTable\r
- )\r
-{\r
+ ){\r
if (mEfiShellEnvironment2 != NULL) {\r
gBS->CloseProtocol(mEfiShellEnvironment2Handle==NULL?ImageHandle:mEfiShellEnvironment2Handle,\r
&gEfiShellEnvironment2Guid,\r
CONST CHAR16*\r
EFIAPI\r
ShellGetEnvironmentVariable (\r
- IN CHAR16 *EnvKey\r
+ IN CONST CHAR16 *EnvKey\r
)\r
{\r
// \r
//\r
// using EFI Shell\r
//\r
- return (mEfiShellEnvironment2->GetEnv(EnvKey));\r
+ return (mEfiShellEnvironment2->GetEnv((CHAR16*)EnvKey));\r
}\r
/**\r
set the value of an environment variable\r
EFI_SHELL_FILE_INFO based list. it is up to the caller to free the memory via\r
the ShellCloseFileMetaArg function.\r
\r
- @param FileList the EFI shell list type\r
+ @param[in] FileList the EFI shell list type\r
+ @param[in][out] ListHead the list to add to\r
\r
@retval the resultant head of the double linked new format list;\r
**/\r
LIST_ENTRY*\r
EFIAPI\r
InternalShellConvertFileListType (\r
- LIST_ENTRY *FileList\r
- )\r
-{\r
- LIST_ENTRY *ListHead;\r
+ IN LIST_ENTRY *FileList,\r
+ IN OUT LIST_ENTRY *ListHead\r
+ ){\r
SHELL_FILE_ARG *OldInfo;\r
- LIST_ENTRY *Link;\r
+ LIST_ENTRY *Link;\r
EFI_SHELL_FILE_INFO_NO_CONST *NewInfo;\r
\r
//\r
- // ASSERT that FileList is not NULL\r
- //\r
- ASSERT(FileList != NULL);\r
-\r
- //\r
- // Allocate our list head and initialize the list\r
+ // ASSERTs\r
//\r
- ListHead = AllocateZeroPool(sizeof(LIST_ENTRY));\r
- ASSERT (ListHead != NULL);\r
- ListHead = InitializeListHead (ListHead);\r
+ ASSERT(FileList != NULL);\r
+ ASSERT(ListHead != NULL);\r
\r
//\r
// enumerate through each member of the old list and copy\r
//\r
// add that to the list\r
//\r
- InsertTailList(ListHead, (LIST_ENTRY*)NewInfo);\r
+ InsertTailList(ListHead, &NewInfo->Link);\r
}\r
return (ListHead);\r
}\r
and will process '?' and '*' as such. the list must be freed with a call to \r
ShellCloseFileMetaArg().\r
\r
- This function will fail if called sequentially without freeing the list in the middle.\r
+ If you are NOT appending to an existing list *ListHead must be NULL.\r
\r
@param Arg pointer to path string\r
@param OpenMode mode to open files with\r
)\r
{\r
EFI_STATUS Status;\r
- LIST_ENTRY *EmptyNode;\r
- LIST_ENTRY *mOldStyleFileList;\r
+ LIST_ENTRY mOldStyleFileList;\r
\r
//\r
// ASSERT that Arg and ListHead are not NULL\r
//\r
ASSERT(mEfiShellEnvironment2 != NULL);\r
\r
- //\r
- // allocate memory for old list head\r
- //\r
- mOldStyleFileList = (LIST_ENTRY*)AllocatePool(sizeof(LIST_ENTRY));\r
- ASSERT(mOldStyleFileList != NULL);\r
-\r
//\r
// make sure the list head is initialized\r
//\r
- InitializeListHead((LIST_ENTRY*)mOldStyleFileList);\r
+ InitializeListHead(&mOldStyleFileList);\r
\r
//\r
// Get the EFI Shell list of files\r
//\r
- Status = mEfiShellEnvironment2->FileMetaArg(Arg, mOldStyleFileList);\r
+ Status = mEfiShellEnvironment2->FileMetaArg(Arg, &mOldStyleFileList);\r
if (EFI_ERROR(Status)) {\r
*ListHead = NULL;\r
return (Status);\r
}\r
\r
+ if (*ListHead == NULL) {\r
+ *ListHead = (EFI_SHELL_FILE_INFO *)AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO));\r
+ if (*ListHead == NULL) {\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
+ }\r
+\r
//\r
// Convert that to equivalent of UEFI Shell 2.0 structure\r
//\r
- EmptyNode = InternalShellConvertFileListType(mOldStyleFileList);\r
+ InternalShellConvertFileListType(&mOldStyleFileList, &(*ListHead)->Link);\r
\r
//\r
// Free the EFI Shell version that was converted.\r
//\r
- ASSERT_EFI_ERROR(mEfiShellEnvironment2->FreeFileList(mOldStyleFileList));\r
- FreePool(mOldStyleFileList);\r
- mOldStyleFileList = NULL;\r
-\r
- //\r
- // remove the empty head of the list\r
- //\r
- *ListHead = (EFI_SHELL_FILE_INFO*)RemoveEntryList(EmptyNode);\r
- FreePool(EmptyNode); \r
+ mEfiShellEnvironment2->FreeFileList(&mOldStyleFileList);\r
\r
return (Status);\r
}\r
// Since this is EFI Shell version we need to free our internally made copy \r
// of the list\r
//\r
- for (Node = GetFirstNode((LIST_ENTRY*)*ListHead) ; IsListEmpty((LIST_ENTRY*)*ListHead) == FALSE ; Node = GetFirstNode((LIST_ENTRY*)*ListHead)) {\r
+ for ( Node = GetFirstNode(&(*ListHead)->Link) \r
+ ; IsListEmpty(&(*ListHead)->Link) == FALSE \r
+ ; Node = GetFirstNode(&(*ListHead)->Link)) {\r
RemoveEntryList(Node);\r
((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->Handle->Close(((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->Handle);\r
FreePool(((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->FullName);\r
}\r
\r
typedef struct {\r
- LIST_ENTRY List;\r
+ LIST_ENTRY Link;\r
CHAR16 *Name;\r
ParamType Type;\r
CHAR16 *Value;\r
//\r
// this item has no value expected; we are done\r
//\r
- InsertHeadList(*CheckPackage, (LIST_ENTRY*)CurrentItemPackage);\r
+ InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);\r
}\r
} else if (GetItemValue == TRUE && InternalIsFlag(Argv[LoopCounter]) == FALSE) {\r
ASSERT(CurrentItemPackage != NULL);\r
CurrentItemPackage->Value = AllocateZeroPool(StrSize(Argv[LoopCounter]));\r
ASSERT(CurrentItemPackage->Value != NULL);\r
StrCpy(CurrentItemPackage->Value, Argv[LoopCounter]);\r
- InsertHeadList(*CheckPackage, (LIST_ENTRY*)CurrentItemPackage);\r
+ InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);\r
} else if (InternalIsFlag(Argv[LoopCounter]) == FALSE) {\r
//\r
// add this one as a non-flag\r
ASSERT(CurrentItemPackage->Value != NULL);\r
StrCpy(CurrentItemPackage->Value, Argv[LoopCounter]);\r
CurrentItemPackage->OriginalPosition = Count++;\r
- InsertHeadList(*CheckPackage, (LIST_ENTRY*)CurrentItemPackage);\r
+ InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);\r
} else if (ProblemParam) {\r
//\r
// this was a non-recognised flag... error!\r