udk2010.up2.shell initial release.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10874 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
326
ShellPkg/Application/Shell/ShellEnvVar.c
Normal file
326
ShellPkg/Application/Shell/ShellEnvVar.c
Normal file
@ -0,0 +1,326 @@
|
||||
/** @file
|
||||
function declarations for shell environment functions.
|
||||
|
||||
Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <Uefi.h>
|
||||
|
||||
#include <Guid/ShellVariableGuid.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
|
||||
#include "ShellEnvVar.h"
|
||||
|
||||
|
||||
/**
|
||||
Reports whether an environment variable is Volatile or Non-Volatile.
|
||||
|
||||
@param EnvVarName The name of the environment variable in question
|
||||
|
||||
@retval TRUE This environment variable is Volatile
|
||||
@retval FALSE This environment variable is NON-Volatile
|
||||
**/
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
IsVolatileEnv (
|
||||
IN CONST CHAR16 *EnvVarName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN Size;
|
||||
VOID *Buffer;
|
||||
UINT32 Attribs;
|
||||
|
||||
Size = 0;
|
||||
Buffer = NULL;
|
||||
|
||||
//
|
||||
// get the variable
|
||||
//
|
||||
Status = gRT->GetVariable((CHAR16*)EnvVarName,
|
||||
&gShellVariableGuid,
|
||||
&Attribs,
|
||||
&Size,
|
||||
Buffer);
|
||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||
Buffer = AllocatePool(Size);
|
||||
ASSERT(Buffer != NULL);
|
||||
Status = gRT->GetVariable((CHAR16*)EnvVarName,
|
||||
&gShellVariableGuid,
|
||||
&Attribs,
|
||||
&Size,
|
||||
Buffer);
|
||||
FreePool(Buffer);
|
||||
}
|
||||
//
|
||||
// not found means volatile
|
||||
//
|
||||
if (Status == EFI_NOT_FOUND) {
|
||||
return (TRUE);
|
||||
}
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
|
||||
//
|
||||
// check for the Non Volatile bit
|
||||
//
|
||||
if ((Attribs & EFI_VARIABLE_NON_VOLATILE) == EFI_VARIABLE_NON_VOLATILE) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
//
|
||||
// everything else is volatile
|
||||
//
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/**
|
||||
free function for ENV_VAR_LIST objects.
|
||||
|
||||
@param[in] List The pointer to pointer to list.
|
||||
**/
|
||||
VOID
|
||||
EFIAPI
|
||||
FreeEnvironmentVariableList(
|
||||
IN LIST_ENTRY *List
|
||||
)
|
||||
{
|
||||
ENV_VAR_LIST *Node;
|
||||
|
||||
ASSERT (List != NULL);
|
||||
if (List == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
for ( Node = (ENV_VAR_LIST*)GetFirstNode(List)
|
||||
; IsListEmpty(List)
|
||||
; Node = (ENV_VAR_LIST*)GetFirstNode(List)
|
||||
){
|
||||
ASSERT(Node != NULL);
|
||||
RemoveEntryList(&Node->Link);
|
||||
if (Node->Key != NULL) {
|
||||
FreePool(Node->Key);
|
||||
}
|
||||
if (Node->Val != NULL) {
|
||||
FreePool(Node->Val);
|
||||
}
|
||||
FreePool(Node);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
Creates a list of all Shell-Guid-based environment variables.
|
||||
|
||||
@param[in,out] ListHead The pointer to pointer to LIST ENTRY object for
|
||||
storing this list.
|
||||
|
||||
@retval EFI_SUCCESS the list was created sucessfully.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GetEnvironmentVariableList(
|
||||
IN OUT LIST_ENTRY *ListHead
|
||||
)
|
||||
{
|
||||
CHAR16 *VariableName;
|
||||
UINTN NameSize;
|
||||
UINT64 MaxStorSize;
|
||||
UINT64 RemStorSize;
|
||||
UINT64 MaxVarSize;
|
||||
EFI_STATUS Status;
|
||||
EFI_GUID Guid;
|
||||
UINTN ValSize;
|
||||
ENV_VAR_LIST *VarList;
|
||||
|
||||
ASSERT(ListHead != NULL);
|
||||
|
||||
Status = gRT->QueryVariableInfo(EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS, &MaxStorSize, &RemStorSize, &MaxVarSize);
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
|
||||
NameSize = (UINTN)MaxVarSize;
|
||||
VariableName = AllocatePool(NameSize);
|
||||
StrCpy(VariableName, L"");
|
||||
|
||||
while (TRUE) {
|
||||
NameSize = (UINTN)MaxVarSize;
|
||||
Status = gRT->GetNextVariableName(&NameSize, VariableName, &Guid);
|
||||
if (Status == EFI_NOT_FOUND){
|
||||
Status = EFI_SUCCESS;
|
||||
break;
|
||||
}
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
if (EFI_ERROR(Status)) {
|
||||
break;
|
||||
}
|
||||
if (CompareGuid(&Guid, &gShellVariableGuid)){
|
||||
VarList = AllocateZeroPool(sizeof(ENV_VAR_LIST));
|
||||
ValSize = 0;
|
||||
Status = SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName, &VarList->Atts, &ValSize, VarList->Val);
|
||||
if (Status == EFI_BUFFER_TOO_SMALL){
|
||||
VarList->Val = AllocatePool(ValSize);
|
||||
ASSERT(VarList->Val != NULL);
|
||||
Status = SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName, &VarList->Atts, &ValSize, VarList->Val);
|
||||
}
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
VarList->Key = AllocatePool(StrSize(VariableName));
|
||||
ASSERT(VarList->Key != NULL);
|
||||
StrCpy(VarList->Key, VariableName);
|
||||
|
||||
InsertTailList(ListHead, &VarList->Link);
|
||||
} // compare guid
|
||||
} // while
|
||||
FreePool(VariableName);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
FreeEnvironmentVariableList(ListHead);
|
||||
}
|
||||
|
||||
return (Status);
|
||||
}
|
||||
|
||||
/**
|
||||
Sets a list of all Shell-Guid-based environment variables. this will
|
||||
also eliminate all existing shell environment variables (even if they
|
||||
are not on the list).
|
||||
|
||||
This function will also deallocate the memory from List.
|
||||
|
||||
@param[in] ListHead The pointer to LIST_ENTRY from
|
||||
GetShellEnvVarList().
|
||||
|
||||
@retval EFI_SUCCESS the list was Set sucessfully.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetEnvironmentVariableList(
|
||||
IN LIST_ENTRY *ListHead
|
||||
)
|
||||
{
|
||||
ENV_VAR_LIST VarList;
|
||||
ENV_VAR_LIST *Node;
|
||||
EFI_STATUS Status;
|
||||
UINTN Size;
|
||||
|
||||
InitializeListHead(&VarList.Link);
|
||||
|
||||
//
|
||||
// Delete all the current environment variables
|
||||
//
|
||||
Status = GetEnvironmentVariableList(&VarList.Link);
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
|
||||
for ( Node = (ENV_VAR_LIST*)GetFirstNode(&VarList.Link)
|
||||
; !IsNull(&VarList.Link, &Node->Link)
|
||||
; Node = (ENV_VAR_LIST*)GetNextNode(&VarList.Link, &Node->Link)
|
||||
){
|
||||
if (Node->Key != NULL) {
|
||||
Status = SHELL_DELETE_ENVIRONMENT_VARIABLE(Node->Key);
|
||||
}
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
}
|
||||
|
||||
FreeEnvironmentVariableList(&VarList.Link);
|
||||
|
||||
//
|
||||
// set all the variables fron the list
|
||||
//
|
||||
for ( Node = (ENV_VAR_LIST*)GetFirstNode(ListHead)
|
||||
; !IsNull(ListHead, &Node->Link)
|
||||
; Node = (ENV_VAR_LIST*)GetNextNode(ListHead, &Node->Link)
|
||||
){
|
||||
Size = StrSize(Node->Val);
|
||||
if (Node->Atts & EFI_VARIABLE_NON_VOLATILE) {
|
||||
Status = SHELL_SET_ENVIRONMENT_VARIABLE_NV(Node->Key, Size, Node->Val);
|
||||
} else {
|
||||
Status = SHELL_SET_ENVIRONMENT_VARIABLE_V (Node->Key, Size, Node->Val);
|
||||
}
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
}
|
||||
FreeEnvironmentVariableList(ListHead);
|
||||
|
||||
return (Status);
|
||||
}
|
||||
|
||||
/**
|
||||
sets a list of all Shell-Guid-based environment variables.
|
||||
|
||||
@param Environment Points to a NULL-terminated array of environment
|
||||
variables with the format 'x=y', where x is the
|
||||
environment variable name and y is the value.
|
||||
|
||||
@retval EFI_SUCCESS The command executed successfully.
|
||||
@retval EFI_INVALID_PARAMETER The parameter is invalid.
|
||||
@retval EFI_OUT_OF_RESOURCES Out of resources.
|
||||
|
||||
@sa SetEnvironmentVariableList
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SetEnvironmentVariables(
|
||||
IN CONST CHAR16 **Environment
|
||||
)
|
||||
{
|
||||
CONST CHAR16 *CurrentString;
|
||||
UINTN CurrentCount;
|
||||
ENV_VAR_LIST *VarList;
|
||||
ENV_VAR_LIST *Node;
|
||||
UINTN NewSize;
|
||||
|
||||
VarList = NULL;
|
||||
|
||||
if (Environment == NULL) {
|
||||
return (EFI_INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
//
|
||||
// Build a list identical to the ones used for get/set list functions above
|
||||
//
|
||||
for ( CurrentCount = 0
|
||||
;
|
||||
; CurrentCount++
|
||||
){
|
||||
CurrentString = Environment[CurrentCount];
|
||||
if (CurrentString == NULL) {
|
||||
break;
|
||||
}
|
||||
ASSERT(StrStr(CurrentString, L"=") != NULL);
|
||||
Node = AllocatePool(sizeof(ENV_VAR_LIST));
|
||||
ASSERT(Node != NULL);
|
||||
Node->Key = AllocateZeroPool((StrStr(CurrentString, L"=") - CurrentString + 1) * sizeof(CHAR16));
|
||||
ASSERT(Node->Key != NULL);
|
||||
StrnCpy(Node->Key, CurrentString, StrStr(CurrentString, L"=") - CurrentString);
|
||||
NewSize = StrSize(CurrentString);
|
||||
NewSize -= StrLen(Node->Key) - 1;
|
||||
Node->Val = AllocateZeroPool(NewSize);
|
||||
ASSERT(Node->Val != NULL);
|
||||
StrCpy(Node->Val, CurrentString + StrLen(Node->Key) + 1);
|
||||
Node->Atts = EFI_VARIABLE_BOOTSERVICE_ACCESS;
|
||||
|
||||
if (VarList == NULL) {
|
||||
VarList = AllocateZeroPool(sizeof(ENV_VAR_LIST));
|
||||
ASSERT(VarList != NULL);
|
||||
InitializeListHead(&VarList->Link);
|
||||
}
|
||||
InsertTailList(&VarList->Link, &Node->Link);
|
||||
|
||||
} // for loop
|
||||
|
||||
//
|
||||
// set this new list as the set of all environment variables.
|
||||
// this function also frees the memory and deletes all pre-existing
|
||||
// shell-guid based environment variables.
|
||||
//
|
||||
return (SetEnvironmentVariableList(&VarList->Link));
|
||||
}
|
Reference in New Issue
Block a user