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 ASSERT(ListHead
!= NULL
);
149 Status
= gRT
->QueryVariableInfo(EFI_VARIABLE_NON_VOLATILE
|EFI_VARIABLE_BOOTSERVICE_ACCESS
, &MaxStorSize
, &RemStorSize
, &MaxVarSize
);
150 ASSERT_EFI_ERROR(Status
);
152 NameSize
= (UINTN
)MaxVarSize
;
153 VariableName
= AllocatePool(NameSize
);
154 StrCpy(VariableName
, L
"");
157 NameSize
= (UINTN
)MaxVarSize
;
158 Status
= gRT
->GetNextVariableName(&NameSize
, VariableName
, &Guid
);
159 if (Status
== EFI_NOT_FOUND
){
160 Status
= EFI_SUCCESS
;
163 ASSERT_EFI_ERROR(Status
);
164 if (EFI_ERROR(Status
)) {
167 if (CompareGuid(&Guid
, &gShellVariableGuid
)){
168 VarList
= AllocateZeroPool(sizeof(ENV_VAR_LIST
));
170 Status
= SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName
, &VarList
->Atts
, &ValSize
, VarList
->Val
);
171 if (Status
== EFI_BUFFER_TOO_SMALL
){
172 VarList
->Val
= AllocatePool(ValSize
);
173 ASSERT(VarList
->Val
!= NULL
);
174 Status
= SHELL_GET_ENVIRONMENT_VARIABLE_AND_ATTRIBUTES(VariableName
, &VarList
->Atts
, &ValSize
, VarList
->Val
);
176 ASSERT_EFI_ERROR(Status
);
177 VarList
->Key
= AllocatePool(StrSize(VariableName
));
178 ASSERT(VarList
->Key
!= NULL
);
179 StrCpy(VarList
->Key
, VariableName
);
181 InsertTailList(ListHead
, &VarList
->Link
);
184 FreePool(VariableName
);
186 if (EFI_ERROR(Status
)) {
187 FreeEnvironmentVariableList(ListHead
);
194 Sets a list of all Shell-Guid-based environment variables. this will
195 also eliminate all existing shell environment variables (even if they
196 are not on the list).
198 This function will also deallocate the memory from List.
200 @param[in] ListHead The pointer to LIST_ENTRY from
201 GetShellEnvVarList().
203 @retval EFI_SUCCESS the list was Set sucessfully.
207 SetEnvironmentVariableList(
208 IN LIST_ENTRY
*ListHead
211 ENV_VAR_LIST VarList
;
216 InitializeListHead(&VarList
.Link
);
219 // Delete all the current environment variables
221 Status
= GetEnvironmentVariableList(&VarList
.Link
);
222 ASSERT_EFI_ERROR(Status
);
224 for ( Node
= (ENV_VAR_LIST
*)GetFirstNode(&VarList
.Link
)
225 ; !IsNull(&VarList
.Link
, &Node
->Link
)
226 ; Node
= (ENV_VAR_LIST
*)GetNextNode(&VarList
.Link
, &Node
->Link
)
228 if (Node
->Key
!= NULL
) {
229 Status
= SHELL_DELETE_ENVIRONMENT_VARIABLE(Node
->Key
);
231 ASSERT_EFI_ERROR(Status
);
234 FreeEnvironmentVariableList(&VarList
.Link
);
237 // set all the variables fron the list
239 for ( Node
= (ENV_VAR_LIST
*)GetFirstNode(ListHead
)
240 ; !IsNull(ListHead
, &Node
->Link
)
241 ; Node
= (ENV_VAR_LIST
*)GetNextNode(ListHead
, &Node
->Link
)
243 Size
= StrSize(Node
->Val
);
244 if (Node
->Atts
& EFI_VARIABLE_NON_VOLATILE
) {
245 Status
= SHELL_SET_ENVIRONMENT_VARIABLE_NV(Node
->Key
, Size
, Node
->Val
);
247 Status
= SHELL_SET_ENVIRONMENT_VARIABLE_V (Node
->Key
, Size
, Node
->Val
);
249 ASSERT_EFI_ERROR(Status
);
251 FreeEnvironmentVariableList(ListHead
);
257 sets a list of all Shell-Guid-based environment variables.
259 @param Environment Points to a NULL-terminated array of environment
260 variables with the format 'x=y', where x is the
261 environment variable name and y is the value.
263 @retval EFI_SUCCESS The command executed successfully.
264 @retval EFI_INVALID_PARAMETER The parameter is invalid.
265 @retval EFI_OUT_OF_RESOURCES Out of resources.
267 @sa SetEnvironmentVariableList
271 SetEnvironmentVariables(
272 IN CONST CHAR16
**Environment
275 CONST CHAR16
*CurrentString
;
277 ENV_VAR_LIST
*VarList
;
283 if (Environment
== NULL
) {
284 return (EFI_INVALID_PARAMETER
);
288 // Build a list identical to the ones used for get/set list functions above
290 for ( CurrentCount
= 0
294 CurrentString
= Environment
[CurrentCount
];
295 if (CurrentString
== NULL
) {
298 ASSERT(StrStr(CurrentString
, L
"=") != NULL
);
299 Node
= AllocatePool(sizeof(ENV_VAR_LIST
));
300 ASSERT(Node
!= NULL
);
301 Node
->Key
= AllocateZeroPool((StrStr(CurrentString
, L
"=") - CurrentString
+ 1) * sizeof(CHAR16
));
302 ASSERT(Node
->Key
!= NULL
);
303 StrnCpy(Node
->Key
, CurrentString
, StrStr(CurrentString
, L
"=") - CurrentString
);
304 NewSize
= StrSize(CurrentString
);
305 NewSize
-= StrLen(Node
->Key
) - 1;
306 Node
->Val
= AllocateZeroPool(NewSize
);
307 ASSERT(Node
->Val
!= NULL
);
308 StrCpy(Node
->Val
, CurrentString
+ StrLen(Node
->Key
) + 1);
309 Node
->Atts
= EFI_VARIABLE_BOOTSERVICE_ACCESS
;
311 if (VarList
== NULL
) {
312 VarList
= AllocateZeroPool(sizeof(ENV_VAR_LIST
));
313 ASSERT(VarList
!= NULL
);
314 InitializeListHead(&VarList
->Link
);
316 InsertTailList(&VarList
->Link
, &Node
->Link
);
321 // set this new list as the set of all environment variables.
322 // this function also frees the memory and deletes all pre-existing
323 // shell-guid based environment variables.
325 return (SetEnvironmentVariableList(&VarList
->Link
));