EFI_STATUS Status;\r
VOID *Buffer;\r
UINTN Size;\r
- LIST_ENTRY List;\r
ENV_VAR_LIST *Node;\r
CHAR16 *CurrentWriteLocation;\r
\r
Buffer = NULL;\r
\r
if (Name == NULL) {\r
- //\r
- // Get all our environment variables\r
- //\r
- InitializeListHead(&List);\r
- Status = GetEnvironmentVariableList(&List);\r
- if (EFI_ERROR(Status)){\r
- return (NULL);\r
- }\r
\r
//\r
// Build the semi-colon delimited list. (2 passes)\r
//\r
- for ( Node = (ENV_VAR_LIST*)GetFirstNode(&List)\r
- ; !IsNull(&List, &Node->Link)\r
- ; Node = (ENV_VAR_LIST*)GetNextNode(&List, &Node->Link)\r
+ for ( Node = (ENV_VAR_LIST*)GetFirstNode(&gShellEnvVarList.Link)\r
+ ; !IsNull(&gShellEnvVarList.Link, &Node->Link)\r
+ ; Node = (ENV_VAR_LIST*)GetNextNode(&gShellEnvVarList.Link, &Node->Link)\r
){\r
ASSERT(Node->Key != NULL);\r
Size += StrSize(Node->Key);\r
\r
Buffer = AllocateZeroPool(Size);\r
if (Buffer == NULL) {\r
- if (!IsListEmpty (&List)) {\r
- FreeEnvironmentVariableList(&List);\r
- }\r
return (NULL);\r
}\r
CurrentWriteLocation = (CHAR16*)Buffer;\r
\r
- for ( Node = (ENV_VAR_LIST*)GetFirstNode(&List)\r
- ; !IsNull(&List, &Node->Link)\r
- ; Node = (ENV_VAR_LIST*)GetNextNode(&List, &Node->Link)\r
+ for ( Node = (ENV_VAR_LIST*)GetFirstNode(&gShellEnvVarList.Link)\r
+ ; !IsNull(&gShellEnvVarList.Link, &Node->Link)\r
+ ; Node = (ENV_VAR_LIST*)GetNextNode(&gShellEnvVarList.Link, &Node->Link)\r
){\r
ASSERT(Node->Key != NULL);\r
StrCpyS( CurrentWriteLocation, \r
CurrentWriteLocation += StrLen(CurrentWriteLocation) + 1;\r
}\r
\r
- //\r
- // Free the list...\r
- //\r
- if (!IsListEmpty (&List)) {\r
- FreeEnvironmentVariableList(&List);\r
- }\r
} else {\r
//\r
// We are doing a specific environment variable\r
//\r
+ Status = ShellFindEnvVarInList(Name, (CHAR16**)&Buffer, &Size, Attributes);\r
\r
- //\r
- // get the size we need for this EnvVariable\r
- //\r
- Status = SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(Name, Attributes, &Size, Buffer);\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ if (EFI_ERROR(Status)){\r
//\r
- // Allocate the space and recall the get function\r
+ // get the size we need for this EnvVariable\r
//\r
- Buffer = AllocateZeroPool(Size);\r
Status = SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(Name, Attributes, &Size, Buffer);\r
- }\r
- //\r
- // we didnt get it (might not exist)\r
- // free the memory if we allocated any and return NULL\r
- //\r
- if (EFI_ERROR(Status)) {\r
- if (Buffer != NULL) {\r
- FreePool(Buffer);\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ //\r
+ // Allocate the space and recall the get function\r
+ //\r
+ Buffer = AllocateZeroPool(Size);\r
+ Status = SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(Name, Attributes, &Size, Buffer);\r
+ }\r
+ //\r
+ // we didnt get it (might not exist)\r
+ // free the memory if we allocated any and return NULL\r
+ //\r
+ if (EFI_ERROR(Status)) {\r
+ if (Buffer != NULL) {\r
+ FreePool(Buffer);\r
+ }\r
+ return (NULL);\r
+ } else {\r
+ //\r
+ // If we did not find the environment variable in the gShellEnvVarList\r
+ // but get it from UEFI variable storage successfully then we need update\r
+ // the gShellEnvVarList.\r
+ //\r
+ ShellFreeEnvVarList ();\r
+ Status = ShellInitEnvVarList ();\r
+ ASSERT (Status == EFI_SUCCESS);\r
}\r
- return (NULL);\r
}\r
}\r
\r
IN BOOLEAN Volatile\r
)\r
{\r
+ EFI_STATUS Status;\r
+ UINT32 Atts;\r
+\r
+ Atts = 0x0;\r
+ \r
if (Value == NULL || StrLen(Value) == 0) {\r
- return (SHELL_DELETE_ENVIRONMENT_VARIABLE(Name));\r
+ Status = SHELL_DELETE_ENVIRONMENT_VARIABLE(Name);\r
+ if (!EFI_ERROR(Status)) {\r
+ ShellRemvoeEnvVarFromList(Name);\r
+ }\r
+ return Status;\r
} else {\r
SHELL_DELETE_ENVIRONMENT_VARIABLE(Name);\r
if (Volatile) {\r
- return (SHELL_SET_ENVIRONMENT_VARIABLE_V(Name, StrSize(Value), Value));\r
+ Status = SHELL_SET_ENVIRONMENT_VARIABLE_V(Name, StrSize(Value), Value);\r
+ if (!EFI_ERROR(Status)) {\r
+ Atts &= ~EFI_VARIABLE_NON_VOLATILE;\r
+ Atts |= EFI_VARIABLE_BOOTSERVICE_ACCESS;\r
+ ShellAddEnvVarToList(Name, Value, StrSize(Value), Atts);\r
+ }\r
+ return Status;\r
} else {\r
- return (SHELL_SET_ENVIRONMENT_VARIABLE_NV(Name, StrSize(Value), Value));\r
+ Status = SHELL_SET_ENVIRONMENT_VARIABLE_NV(Name, StrSize(Value), Value);\r
+ if (!EFI_ERROR(Status)) {\r
+ Atts |= EFI_VARIABLE_NON_VOLATILE;\r
+ Atts |= EFI_VARIABLE_BOOTSERVICE_ACCESS;\r
+ ShellAddEnvVarToList(Name, Value, StrSize(Value), Atts);\r
+ } \r
+ return Status;\r
}\r
}\r
}\r