2 function declarations for shell environment functions.
4 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include <Guid/ShellVariableGuid.h>
19 #include <Library/BaseLib.h>
20 #include <Library/UefiRuntimeServicesTableLib.h>
21 #include <Library/MemoryAllocationLib.h>
22 #include <Library/DebugLib.h>
23 #include <Library/BaseMemoryLib.h>
25 #include "ShellEnvVar.h"
29 Reports whether an environment variable is Volatile or Non-Volatile.
31 @param EnvVarName The name of the environment variable in question
33 @retval TRUE This environment variable is Volatile
34 @retval FALSE This environment variable is NON-Volatile
39 IN CONST CHAR16
*EnvVarName
53 Status
= gRT
->GetVariable((CHAR16
*)EnvVarName
,
58 if (Status
== EFI_BUFFER_TOO_SMALL
) {
59 Buffer
= AllocatePool(Size
);
60 ASSERT(Buffer
!= NULL
);
61 Status
= gRT
->GetVariable((CHAR16
*)EnvVarName
,
69 // not found means volatile
71 if (Status
== EFI_NOT_FOUND
) {
74 ASSERT_EFI_ERROR(Status
);
77 // check for the Non Volatile bit
79 if ((Attribs
& EFI_VARIABLE_NON_VOLATILE
) == EFI_VARIABLE_NON_VOLATILE
) {
84 // everything else is volatile
90 free function for ENV_VAR_LIST objects.
92 @param[in] List The pointer to pointer to list.
96 FreeEnvironmentVariableList(
102 ASSERT (List
!= NULL
);
107 for ( Node
= (ENV_VAR_LIST
*)GetFirstNode(List
)
109 ; Node
= (ENV_VAR_LIST
*)GetFirstNode(List
)
111 ASSERT(Node
!= NULL
);
112 RemoveEntryList(&Node
->Link
);
113 if (Node
->Key
!= NULL
) {
116 if (Node
->Val
!= NULL
) {
124 Creates a list of all Shell-Guid-based environment variables.
126 @param[in,out] ListHead The pointer to pointer to LIST ENTRY object for
129 @retval EFI_SUCCESS the list was created sucessfully.
133 GetEnvironmentVariableList(
134 IN OUT LIST_ENTRY
*ListHead
137 CHAR16
*VariableName
;
145 ENV_VAR_LIST
*VarList
;
147 if (ListHead
== NULL
) {
148 return (EFI_INVALID_PARAMETER
);
151 Status
= gRT
->QueryVariableInfo(EFI_VARIABLE_NON_VOLATILE
|EFI_VARIABLE_BOOTSERVICE_ACCESS
, &MaxStorSize
, &RemStorSize
, &MaxVarSize
);
152 if (EFI_ERROR(Status
)) {
156 NameSize
= (UINTN
)MaxVarSize
;
157 VariableName
= AllocatePool(NameSize
);
158 if (VariableName
== NULL
) {
159 return (EFI_OUT_OF_RESOURCES
);
161 StrCpy(VariableName
, L
"");
163 while (!EFI_ERROR(Status
)) {
164 NameSize
= (UINTN
)MaxVarSize
;
165 Status
= gRT
->GetNextVariableName(&NameSize
, VariableName
, &Guid
);
166 if (Status
== EFI_NOT_FOUND
){
167 Status
= EFI_SUCCESS
;
170 if (!EFI_ERROR(Status
) && CompareGuid(&Guid
, &gShellVariableGuid
)){
171 VarList
= AllocateZeroPool(sizeof(ENV_VAR_LIST
));
173 Status
= SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName
, &VarList
->Atts
, &ValSize
, VarList
->Val
);
174 if (Status
== EFI_BUFFER_TOO_SMALL
){
175 VarList
->Val
= AllocatePool(ValSize
);
176 ASSERT(VarList
->Val
!= NULL
);
177 Status
= SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName
, &VarList
->Atts
, &ValSize
, VarList
->Val
);
179 if (!EFI_ERROR(Status
)) {
180 VarList
->Key
= AllocatePool(StrSize(VariableName
));
181 ASSERT(VarList
->Key
!= NULL
);
182 StrCpy(VarList
->Key
, VariableName
);
183 InsertTailList(ListHead
, &VarList
->Link
);
187 FreePool(VariableName
);
189 if (EFI_ERROR(Status
)) {
190 FreeEnvironmentVariableList(ListHead
);
197 Sets a list of all Shell-Guid-based environment variables. this will
198 also eliminate all existing shell environment variables (even if they
199 are not on the list).
201 This function will also deallocate the memory from List.
203 @param[in] ListHead The pointer to LIST_ENTRY from
204 GetShellEnvVarList().
206 @retval EFI_SUCCESS the list was Set sucessfully.
210 SetEnvironmentVariableList(
211 IN LIST_ENTRY
*ListHead
214 ENV_VAR_LIST VarList
;
219 InitializeListHead(&VarList
.Link
);
222 // Delete all the current environment variables
224 Status
= GetEnvironmentVariableList(&VarList
.Link
);
225 ASSERT_EFI_ERROR(Status
);
227 for ( Node
= (ENV_VAR_LIST
*)GetFirstNode(&VarList
.Link
)
228 ; !IsNull(&VarList
.Link
, &Node
->Link
)
229 ; Node
= (ENV_VAR_LIST
*)GetNextNode(&VarList
.Link
, &Node
->Link
)
231 if (Node
->Key
!= NULL
) {
232 Status
= SHELL_DELETE_ENVIRONMENT_VARIABLE(Node
->Key
);
234 ASSERT_EFI_ERROR(Status
);
237 FreeEnvironmentVariableList(&VarList
.Link
);
240 // set all the variables fron the list
242 for ( Node
= (ENV_VAR_LIST
*)GetFirstNode(ListHead
)
243 ; !IsNull(ListHead
, &Node
->Link
)
244 ; Node
= (ENV_VAR_LIST
*)GetNextNode(ListHead
, &Node
->Link
)
246 Size
= StrSize(Node
->Val
);
247 if (Node
->Atts
& EFI_VARIABLE_NON_VOLATILE
) {
248 Status
= SHELL_SET_ENVIRONMENT_VARIABLE_NV(Node
->Key
, Size
, Node
->Val
);
250 Status
= SHELL_SET_ENVIRONMENT_VARIABLE_V (Node
->Key
, Size
, Node
->Val
);
252 ASSERT_EFI_ERROR(Status
);
254 FreeEnvironmentVariableList(ListHead
);
260 sets a list of all Shell-Guid-based environment variables.
262 @param Environment Points to a NULL-terminated array of environment
263 variables with the format 'x=y', where x is the
264 environment variable name and y is the value.
266 @retval EFI_SUCCESS The command executed successfully.
267 @retval EFI_INVALID_PARAMETER The parameter is invalid.
268 @retval EFI_OUT_OF_RESOURCES Out of resources.
270 @sa SetEnvironmentVariableList
274 SetEnvironmentVariables(
275 IN CONST CHAR16
**Environment
278 CONST CHAR16
*CurrentString
;
280 ENV_VAR_LIST
*VarList
;
286 if (Environment
== NULL
) {
287 return (EFI_INVALID_PARAMETER
);
291 // Build a list identical to the ones used for get/set list functions above
293 for ( CurrentCount
= 0
297 CurrentString
= Environment
[CurrentCount
];
298 if (CurrentString
== NULL
) {
301 ASSERT(StrStr(CurrentString
, L
"=") != NULL
);
302 Node
= AllocatePool(sizeof(ENV_VAR_LIST
));
303 ASSERT(Node
!= NULL
);
304 Node
->Key
= AllocateZeroPool((StrStr(CurrentString
, L
"=") - CurrentString
+ 1) * sizeof(CHAR16
));
305 ASSERT(Node
->Key
!= NULL
);
306 StrnCpy(Node
->Key
, CurrentString
, StrStr(CurrentString
, L
"=") - CurrentString
);
307 NewSize
= StrSize(CurrentString
);
308 NewSize
-= StrLen(Node
->Key
) - 1;
309 Node
->Val
= AllocateZeroPool(NewSize
);
310 ASSERT(Node
->Val
!= NULL
);
311 StrCpy(Node
->Val
, CurrentString
+ StrLen(Node
->Key
) + 1);
312 Node
->Atts
= EFI_VARIABLE_BOOTSERVICE_ACCESS
;
314 if (VarList
== NULL
) {
315 VarList
= AllocateZeroPool(sizeof(ENV_VAR_LIST
));
316 ASSERT(VarList
!= NULL
);
317 InitializeListHead(&VarList
->Link
);
319 InsertTailList(&VarList
->Link
, &Node
->Link
);
324 // set this new list as the set of all environment variables.
325 // this function also frees the memory and deletes all pre-existing
326 // shell-guid based environment variables.
328 return (SetEnvironmentVariableList(&VarList
->Link
));