2 function declarations for shell environment functions.
4 Copyright (c) 2009 - 2011, 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.
16 #include <ShellBase.h>
18 #include <Guid/ShellVariableGuid.h>
20 #include <Library/BaseLib.h>
21 #include <Library/UefiRuntimeServicesTableLib.h>
22 #include <Library/MemoryAllocationLib.h>
23 #include <Library/DebugLib.h>
24 #include <Library/BaseMemoryLib.h>
26 #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
= AllocateZeroPool(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 if (gRT
->Hdr
.Revision
>= EFI_2_00_SYSTEM_TABLE_REVISION
) {
152 Status
= gRT
->QueryVariableInfo(EFI_VARIABLE_NON_VOLATILE
|EFI_VARIABLE_BOOTSERVICE_ACCESS
, &MaxStorSize
, &RemStorSize
, &MaxVarSize
);
153 if (EFI_ERROR(Status
)) {
160 NameSize
= (UINTN
)MaxVarSize
;
161 VariableName
= AllocateZeroPool(NameSize
);
162 if (VariableName
== NULL
) {
163 return (EFI_OUT_OF_RESOURCES
);
165 StrCpy(VariableName
, L
"");
167 while (!EFI_ERROR(Status
)) {
168 NameSize
= (UINTN
)MaxVarSize
;
169 Status
= gRT
->GetNextVariableName(&NameSize
, VariableName
, &Guid
);
170 if (Status
== EFI_NOT_FOUND
){
171 Status
= EFI_SUCCESS
;
174 if (!EFI_ERROR(Status
) && CompareGuid(&Guid
, &gShellVariableGuid
)){
175 VarList
= AllocateZeroPool(sizeof(ENV_VAR_LIST
));
176 if (VarList
== NULL
) {
177 Status
= EFI_OUT_OF_RESOURCES
;
180 Status
= SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName
, &VarList
->Atts
, &ValSize
, VarList
->Val
);
181 if (Status
== EFI_BUFFER_TOO_SMALL
){
182 VarList
->Val
= AllocateZeroPool(ValSize
);
183 if (VarList
->Val
== NULL
) {
184 SHELL_FREE_NON_NULL(VarList
);
185 Status
= EFI_OUT_OF_RESOURCES
;
187 Status
= SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName
, &VarList
->Atts
, &ValSize
, VarList
->Val
);
190 if (!EFI_ERROR(Status
) && VarList
!= NULL
) {
191 VarList
->Key
= AllocateZeroPool(StrSize(VariableName
));
192 if (VarList
->Key
== NULL
) {
193 SHELL_FREE_NON_NULL(VarList
->Val
);
194 SHELL_FREE_NON_NULL(VarList
);
195 Status
= EFI_OUT_OF_RESOURCES
;
197 StrCpy(VarList
->Key
, VariableName
);
198 InsertTailList(ListHead
, &VarList
->Link
);
204 FreePool(VariableName
);
206 if (EFI_ERROR(Status
)) {
207 FreeEnvironmentVariableList(ListHead
);
214 Sets a list of all Shell-Guid-based environment variables. this will
215 also eliminate all existing shell environment variables (even if they
216 are not on the list).
218 This function will also deallocate the memory from List.
220 @param[in] ListHead The pointer to LIST_ENTRY from
221 GetShellEnvVarList().
223 @retval EFI_SUCCESS the list was Set sucessfully.
227 SetEnvironmentVariableList(
228 IN LIST_ENTRY
*ListHead
231 ENV_VAR_LIST VarList
;
236 InitializeListHead(&VarList
.Link
);
239 // Delete all the current environment variables
241 Status
= GetEnvironmentVariableList(&VarList
.Link
);
242 ASSERT_EFI_ERROR(Status
);
244 for ( Node
= (ENV_VAR_LIST
*)GetFirstNode(&VarList
.Link
)
245 ; !IsNull(&VarList
.Link
, &Node
->Link
)
246 ; Node
= (ENV_VAR_LIST
*)GetNextNode(&VarList
.Link
, &Node
->Link
)
248 if (Node
->Key
!= NULL
) {
249 Status
= SHELL_DELETE_ENVIRONMENT_VARIABLE(Node
->Key
);
251 ASSERT_EFI_ERROR(Status
);
254 FreeEnvironmentVariableList(&VarList
.Link
);
257 // set all the variables fron the list
259 for ( Node
= (ENV_VAR_LIST
*)GetFirstNode(ListHead
)
260 ; !IsNull(ListHead
, &Node
->Link
)
261 ; Node
= (ENV_VAR_LIST
*)GetNextNode(ListHead
, &Node
->Link
)
263 Size
= StrSize(Node
->Val
);
264 if (Node
->Atts
& EFI_VARIABLE_NON_VOLATILE
) {
265 Status
= SHELL_SET_ENVIRONMENT_VARIABLE_NV(Node
->Key
, Size
, Node
->Val
);
267 Status
= SHELL_SET_ENVIRONMENT_VARIABLE_V (Node
->Key
, Size
, Node
->Val
);
269 ASSERT_EFI_ERROR(Status
);
271 FreeEnvironmentVariableList(ListHead
);
277 sets a list of all Shell-Guid-based environment variables.
279 @param Environment Points to a NULL-terminated array of environment
280 variables with the format 'x=y', where x is the
281 environment variable name and y is the value.
283 @retval EFI_SUCCESS The command executed successfully.
284 @retval EFI_INVALID_PARAMETER The parameter is invalid.
285 @retval EFI_OUT_OF_RESOURCES Out of resources.
287 @sa SetEnvironmentVariableList
291 SetEnvironmentVariables(
292 IN CONST CHAR16
**Environment
295 CONST CHAR16
*CurrentString
;
297 ENV_VAR_LIST
*VarList
;
303 if (Environment
== NULL
) {
304 return (EFI_INVALID_PARAMETER
);
308 // Build a list identical to the ones used for get/set list functions above
310 for ( CurrentCount
= 0
314 CurrentString
= Environment
[CurrentCount
];
315 if (CurrentString
== NULL
) {
318 ASSERT(StrStr(CurrentString
, L
"=") != NULL
);
319 Node
= AllocateZeroPool(sizeof(ENV_VAR_LIST
));
320 ASSERT(Node
!= NULL
);
321 Node
->Key
= AllocateZeroPool((StrStr(CurrentString
, L
"=") - CurrentString
+ 1) * sizeof(CHAR16
));
322 ASSERT(Node
->Key
!= NULL
);
323 StrnCpy(Node
->Key
, CurrentString
, StrStr(CurrentString
, L
"=") - CurrentString
);
324 NewSize
= StrSize(CurrentString
);
325 NewSize
-= StrLen(Node
->Key
) - 1;
326 Node
->Val
= AllocateZeroPool(NewSize
);
327 ASSERT(Node
->Val
!= NULL
);
328 StrCpy(Node
->Val
, CurrentString
+ StrLen(Node
->Key
) + 1);
329 Node
->Atts
= EFI_VARIABLE_BOOTSERVICE_ACCESS
;
331 if (VarList
== NULL
) {
332 VarList
= AllocateZeroPool(sizeof(ENV_VAR_LIST
));
333 ASSERT(VarList
!= NULL
);
334 InitializeListHead(&VarList
->Link
);
336 InsertTailList(&VarList
->Link
, &Node
->Link
);
341 // set this new list as the set of all environment variables.
342 // this function also frees the memory and deletes all pre-existing
343 // shell-guid based environment variables.
345 return (SetEnvironmentVariableList(&VarList
->Link
));