This commit is contained in:
jcarsey
2009-06-23 21:15:07 +00:00
parent 8bb37919e3
commit 9b3bf083f7
5 changed files with 39 additions and 52 deletions

View File

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