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 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
= AllocateZeroPool(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
));
172 if (VarList
== NULL
) {
173 Status
= EFI_OUT_OF_RESOURCES
;
176 Status
= SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName
, &VarList
->Atts
, &ValSize
, VarList
->Val
);
177 if (Status
== EFI_BUFFER_TOO_SMALL
){
178 VarList
->Val
= AllocateZeroPool(ValSize
);
179 if (VarList
->Val
== NULL
) {
180 SHELL_FREE_NON_NULL(VarList
);
181 Status
= EFI_OUT_OF_RESOURCES
;
183 Status
= SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName
, &VarList
->Atts
, &ValSize
, VarList
->Val
);
186 if (!EFI_ERROR(Status
) && VarList
!= NULL
) {
187 VarList
->Key
= AllocateZeroPool(StrSize(VariableName
));
188 if (VarList
->Key
== NULL
) {
189 SHELL_FREE_NON_NULL(VarList
->Val
);
190 SHELL_FREE_NON_NULL(VarList
);
191 Status
= EFI_OUT_OF_RESOURCES
;
193 StrCpy(VarList
->Key
, VariableName
);
194 InsertTailList(ListHead
, &VarList
->Link
);
200 FreePool(VariableName
);
202 if (EFI_ERROR(Status
)) {
203 FreeEnvironmentVariableList(ListHead
);
210 Sets a list of all Shell-Guid-based environment variables. this will
211 also eliminate all existing shell environment variables (even if they
212 are not on the list).
214 This function will also deallocate the memory from List.
216 @param[in] ListHead The pointer to LIST_ENTRY from
217 GetShellEnvVarList().
219 @retval EFI_SUCCESS the list was Set sucessfully.
223 SetEnvironmentVariableList(
224 IN LIST_ENTRY
*ListHead
227 ENV_VAR_LIST VarList
;
232 InitializeListHead(&VarList
.Link
);
235 // Delete all the current environment variables
237 Status
= GetEnvironmentVariableList(&VarList
.Link
);
238 ASSERT_EFI_ERROR(Status
);
240 for ( Node
= (ENV_VAR_LIST
*)GetFirstNode(&VarList
.Link
)
241 ; !IsNull(&VarList
.Link
, &Node
->Link
)
242 ; Node
= (ENV_VAR_LIST
*)GetNextNode(&VarList
.Link
, &Node
->Link
)
244 if (Node
->Key
!= NULL
) {
245 Status
= SHELL_DELETE_ENVIRONMENT_VARIABLE(Node
->Key
);
247 ASSERT_EFI_ERROR(Status
);
250 FreeEnvironmentVariableList(&VarList
.Link
);
253 // set all the variables fron the list
255 for ( Node
= (ENV_VAR_LIST
*)GetFirstNode(ListHead
)
256 ; !IsNull(ListHead
, &Node
->Link
)
257 ; Node
= (ENV_VAR_LIST
*)GetNextNode(ListHead
, &Node
->Link
)
259 Size
= StrSize(Node
->Val
);
260 if (Node
->Atts
& EFI_VARIABLE_NON_VOLATILE
) {
261 Status
= SHELL_SET_ENVIRONMENT_VARIABLE_NV(Node
->Key
, Size
, Node
->Val
);
263 Status
= SHELL_SET_ENVIRONMENT_VARIABLE_V (Node
->Key
, Size
, Node
->Val
);
265 ASSERT_EFI_ERROR(Status
);
267 FreeEnvironmentVariableList(ListHead
);
273 sets a list of all Shell-Guid-based environment variables.
275 @param Environment Points to a NULL-terminated array of environment
276 variables with the format 'x=y', where x is the
277 environment variable name and y is the value.
279 @retval EFI_SUCCESS The command executed successfully.
280 @retval EFI_INVALID_PARAMETER The parameter is invalid.
281 @retval EFI_OUT_OF_RESOURCES Out of resources.
283 @sa SetEnvironmentVariableList
287 SetEnvironmentVariables(
288 IN CONST CHAR16
**Environment
291 CONST CHAR16
*CurrentString
;
293 ENV_VAR_LIST
*VarList
;
299 if (Environment
== NULL
) {
300 return (EFI_INVALID_PARAMETER
);
304 // Build a list identical to the ones used for get/set list functions above
306 for ( CurrentCount
= 0
310 CurrentString
= Environment
[CurrentCount
];
311 if (CurrentString
== NULL
) {
314 ASSERT(StrStr(CurrentString
, L
"=") != NULL
);
315 Node
= AllocateZeroPool(sizeof(ENV_VAR_LIST
));
316 ASSERT(Node
!= NULL
);
317 Node
->Key
= AllocateZeroPool((StrStr(CurrentString
, L
"=") - CurrentString
+ 1) * sizeof(CHAR16
));
318 ASSERT(Node
->Key
!= NULL
);
319 StrnCpy(Node
->Key
, CurrentString
, StrStr(CurrentString
, L
"=") - CurrentString
);
320 NewSize
= StrSize(CurrentString
);
321 NewSize
-= StrLen(Node
->Key
) - 1;
322 Node
->Val
= AllocateZeroPool(NewSize
);
323 ASSERT(Node
->Val
!= NULL
);
324 StrCpy(Node
->Val
, CurrentString
+ StrLen(Node
->Key
) + 1);
325 Node
->Atts
= EFI_VARIABLE_BOOTSERVICE_ACCESS
;
327 if (VarList
== NULL
) {
328 VarList
= AllocateZeroPool(sizeof(ENV_VAR_LIST
));
329 ASSERT(VarList
!= NULL
);
330 InitializeListHead(&VarList
->Link
);
332 InsertTailList(&VarList
->Link
, &Node
->Link
);
337 // set this new list as the set of all environment variables.
338 // this function also frees the memory and deletes all pre-existing
339 // shell-guid based environment variables.
341 return (SetEnvironmentVariableList(&VarList
->Link
));