Reports whether an environment variable is Volatile or Non-Volatile.\r
\r
@param EnvVarName The name of the environment variable in question\r
+ @param Volatile Return TRUE if the environment variable is volatile\r
\r
- @retval TRUE This environment variable is Volatile\r
- @retval FALSE This environment variable is NON-Volatile\r
+ @retval EFI_SUCCESS The volatile attribute is returned successfully\r
+ @retval others Some errors happened.\r
**/\r
-BOOLEAN\r
-EFIAPI\r
+EFI_STATUS\r
IsVolatileEnv (\r
- IN CONST CHAR16 *EnvVarName\r
+ IN CONST CHAR16 *EnvVarName,\r
+ OUT BOOLEAN *Volatile\r
)\r
{\r
EFI_STATUS Status;\r
VOID *Buffer;\r
UINT32 Attribs;\r
\r
+ ASSERT (Volatile != NULL);\r
+\r
Size = 0;\r
Buffer = NULL;\r
\r
Buffer);\r
if (Status == EFI_BUFFER_TOO_SMALL) {\r
Buffer = AllocateZeroPool(Size);\r
- ASSERT(Buffer != NULL);\r
+ if (Buffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
Status = gRT->GetVariable((CHAR16*)EnvVarName,\r
&gShellVariableGuid,\r
&Attribs,\r
// not found means volatile\r
//\r
if (Status == EFI_NOT_FOUND) {\r
- return (TRUE);\r
+ *Volatile = TRUE;\r
+ return EFI_SUCCESS;\r
}\r
- ASSERT_EFI_ERROR(Status);\r
-\r
- //\r
- // check for the Non Volatile bit\r
- //\r
- if ((Attribs & EFI_VARIABLE_NON_VOLATILE) == EFI_VARIABLE_NON_VOLATILE) {\r
- return (FALSE);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
}\r
\r
//\r
- // everything else is volatile\r
+ // check for the Non Volatile bit\r
//\r
- return (TRUE);\r
+ *Volatile = !(BOOLEAN) ((Attribs & EFI_VARIABLE_NON_VOLATILE) == EFI_VARIABLE_NON_VOLATILE);\r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r
including the tailing CHAR_NULL\r
@param Atts The attributes of the variable.\r
\r
+ @retval EFI_SUCCESS The environment variable was added to list successfully.\r
+ @retval others Some errors happened.\r
+\r
**/\r
-VOID\r
+EFI_STATUS\r
ShellAddEnvVarToList (\r
IN CONST CHAR16 *Key,\r
IN CONST CHAR16 *Value,\r
)\r
{\r
ENV_VAR_LIST *Node;\r
+ CHAR16 *LocalKey;\r
+ CHAR16 *LocalValue;\r
\r
if (Key == NULL || Value == NULL || ValueSize == 0) {\r
- return;\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ LocalValue = AllocateCopyPool (ValueSize, Value);\r
+ if (LocalValue == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
\r
//\r
if (Node->Key != NULL && StrCmp(Key, Node->Key) == 0) {\r
Node->Atts = Atts;\r
SHELL_FREE_NON_NULL(Node->Val);\r
- Node->Val = AllocateZeroPool (ValueSize);\r
- ASSERT (Node->Val != NULL);\r
- CopyMem(Node->Val, Value, ValueSize);\r
- return;\r
+ Node->Val = LocalValue;\r
+ return EFI_SUCCESS;\r
}\r
}\r
\r
// If the environment varialbe key doesn't exist in list just insert\r
// a new node.\r
//\r
+ LocalKey = AllocateCopyPool (StrSize(Key), Key);\r
+ if (LocalKey == NULL) {\r
+ FreePool (LocalValue);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
Node = (ENV_VAR_LIST*)AllocateZeroPool (sizeof(ENV_VAR_LIST));\r
- ASSERT (Node != NULL);\r
- Node->Key = AllocateCopyPool(StrSize(Key), Key);\r
- ASSERT (Node->Key != NULL);\r
- Node->Val = AllocateCopyPool(ValueSize, Value);\r
- ASSERT (Node->Val != NULL);\r
+ if (Node == NULL) {\r
+ FreePool (LocalKey);\r
+ FreePool (LocalValue);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ Node->Key = LocalKey;\r
+ Node->Val = LocalValue;\r
Node->Atts = Atts;\r
InsertTailList(&gShellEnvVarList.Link, &Node->Link);\r
\r
- return;\r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r