]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c
ShellPkg/Dp: Add null pointer check
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel3CommandsLib / Alias.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for Alias shell level 3 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
7bd5a2c8 5 Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved. <BR>\r
a405b86d 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellLevel3CommandsLib.h"\r
17\r
18#include <Library/ShellLib.h>\r
19\r
5ce99ab9
HL
20/**\r
21 Print out single alias registered with the Shell.\r
22\r
23 @param[in] Alias Points to the NULL-terminated shell alias.\r
24 If this parameter is NULL, then all\r
25 aliases will be returned in ReturnedData.\r
26 @retval SHELL_SUCCESS the printout was sucessful\r
27**/\r
28SHELL_STATUS\r
29PrintSingleShellAlias(\r
30 IN CONST CHAR16 *Alias\r
31 )\r
32{\r
33 CONST CHAR16 *ConstAliasVal;\r
34 SHELL_STATUS ShellStatus;\r
35 BOOLEAN Volatile;\r
36\r
37 ShellStatus = SHELL_SUCCESS;\r
38 ConstAliasVal = gEfiShellProtocol->GetAlias (Alias, &Volatile);\r
39 if (ConstAliasVal == NULL) {\r
40 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel3HiiHandle, L"alias", Alias);\r
41 ShellStatus = SHELL_INVALID_PARAMETER;\r
42 } else {\r
43 if (ShellCommandIsOnAliasList (Alias)) {\r
44 Volatile = FALSE;\r
45 }\r
46 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_ALIAS_OUTPUT), gShellLevel3HiiHandle, !Volatile ? L' ' : L'*', Alias, ConstAliasVal);\r
47 }\r
48 return ShellStatus;\r
49}\r
50\r
a405b86d 51/**\r
52 Print out each alias registered with the Shell.\r
53\r
54 @retval STATUS_SUCCESS the printout was sucessful\r
55 @return any return code from GetNextVariableName except EFI_NOT_FOUND\r
56**/\r
57SHELL_STATUS\r
a405b86d 58PrintAllShellAlias(\r
59 VOID\r
60 )\r
61{\r
62 CONST CHAR16 *ConstAllAliasList;\r
63 CHAR16 *Alias;\r
a405b86d 64 CHAR16 *Walker;\r
a405b86d 65\r
66 ConstAllAliasList = gEfiShellProtocol->GetAlias(NULL, NULL);\r
67 if (ConstAllAliasList == NULL) {\r
68 return (SHELL_SUCCESS);\r
69 }\r
70 Alias = AllocateZeroPool(StrSize(ConstAllAliasList));\r
9ea69f8a 71 if (Alias == NULL) {\r
72 return (SHELL_OUT_OF_RESOURCES);\r
73 }\r
a405b86d 74 Walker = (CHAR16*)ConstAllAliasList;\r
75\r
76 do {\r
77 CopyMem(Alias, Walker, StrSize(Walker));\r
78 Walker = StrStr(Alias, L";");\r
79 if (Walker != NULL) {\r
80 Walker[0] = CHAR_NULL;\r
81 Walker = Walker + 1;\r
82 }\r
5ce99ab9 83 PrintSingleShellAlias(Alias);\r
a405b86d 84 } while (Walker != NULL && Walker[0] != CHAR_NULL);\r
85\r
86 FreePool(Alias);\r
87\r
88 return (SHELL_SUCCESS);\r
89}\r
90\r
5ce99ab9
HL
91/**\r
92 Changes a shell command alias.\r
93\r
94 This function creates an alias for a shell command or if Alias is NULL it will delete an existing alias.\r
95\r
96\r
97 @param[in] Command Points to the NULL-terminated shell command or existing alias.\r
98 @param[in] Alias Points to the NULL-terminated alias for the shell command. If this is NULL, and\r
99 Command refers to an alias, that alias will be deleted.\r
100 @param[in] Replace If TRUE and the alias already exists, then the existing alias will be replaced. If\r
101 FALSE and the alias already exists, then the existing alias is unchanged and\r
102 EFI_ACCESS_DENIED is returned.\r
103 @param[in] Volatile if TRUE the Alias being set will be stored in a volatile fashion. if FALSE the\r
104 Alias being set will be stored in a non-volatile fashion.\r
105\r
106 @retval SHELL_SUCCESS Alias created or deleted successfully.\r
107 @retval SHELL_NOT_FOUND the Alias intended to be deleted was not found\r
108 @retval SHELL_ACCESS_DENIED The alias is a built-in alias or already existed and Replace was set to\r
109 FALSE.\r
110 @retval SHELL_DEVICE_ERROR Command is null or the empty string.\r
111**/\r
112SHELL_STATUS\r
113ShellLevel3CommandsLibSetAlias(\r
114 IN CONST CHAR16 *Command,\r
115 IN CONST CHAR16 *Alias,\r
116 IN BOOLEAN Replace,\r
117 IN BOOLEAN Volatile\r
118 )\r
119{\r
120 SHELL_STATUS ShellStatus;\r
121 EFI_STATUS Status;\r
122\r
123 ShellStatus = SHELL_SUCCESS;\r
124 Status = gEfiShellProtocol->SetAlias (Command, Alias, Replace, Volatile);\r
125 if (EFI_ERROR(Status)) {\r
126 if (Status == EFI_ACCESS_DENIED) {\r
127 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel3HiiHandle, L"alias");\r
128 ShellStatus = SHELL_ACCESS_DENIED;\r
129 } else if (Status == EFI_NOT_FOUND) {\r
130 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_NOT_FOUND), gShellLevel3HiiHandle, L"alias", Command);\r
131 ShellStatus = SHELL_NOT_FOUND;\r
132 } else {\r
133 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel3HiiHandle, L"alias", Status);\r
134 ShellStatus = SHELL_DEVICE_ERROR;\r
135 }\r
136 }\r
137 return ShellStatus;\r
138}\r
139\r
a405b86d 140STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
141 {L"-v", TypeFlag},\r
5ce99ab9 142 {L"-d", TypeValue},\r
a405b86d 143 {NULL, TypeMax}\r
144 };\r
145\r
146/**\r
147 Function for 'alias' command.\r
148\r
149 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
150 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
151**/\r
152SHELL_STATUS\r
153EFIAPI\r
154ShellCommandRunAlias (\r
155 IN EFI_HANDLE ImageHandle,\r
156 IN EFI_SYSTEM_TABLE *SystemTable\r
157 )\r
158{\r
159 EFI_STATUS Status;\r
160 LIST_ENTRY *Package;\r
161 CHAR16 *ProblemParam;\r
162 SHELL_STATUS ShellStatus;\r
163 CONST CHAR16 *Param1;\r
164 CONST CHAR16 *Param2;\r
5ce99ab9 165 CONST CHAR16 *ParamStrD;\r
0faec4cf 166 CHAR16 *CleanParam2;\r
5ce99ab9
HL
167 BOOLEAN DeleteFlag;\r
168 BOOLEAN VolatileFlag;\r
a405b86d 169\r
170 ProblemParam = NULL;\r
171 ShellStatus = SHELL_SUCCESS;\r
0faec4cf 172 CleanParam2 = NULL;\r
a405b86d 173\r
174 //\r
175 // initialize the shell lib (we must be in non-auto-init...)\r
176 //\r
177 Status = ShellInitialize();\r
178 ASSERT_EFI_ERROR(Status);\r
179\r
180 Status = CommandInit();\r
181 ASSERT_EFI_ERROR(Status);\r
182\r
183 //\r
184 // parse the command line\r
185 //\r
186 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
187 if (EFI_ERROR(Status)) {\r
188 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
e54a10bb 189 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"alias", ProblemParam); \r
a405b86d 190 FreePool(ProblemParam);\r
191 ShellStatus = SHELL_INVALID_PARAMETER;\r
192 } else {\r
193 ASSERT(FALSE);\r
194 }\r
195 } else {\r
196 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
197 Param2 = ShellCommandLineGetRawValue(Package, 2);\r
0faec4cf 198\r
5ce99ab9
HL
199 DeleteFlag = ShellCommandLineGetFlag (Package, L"-d");\r
200 VolatileFlag = ShellCommandLineGetFlag (Package, L"-v");\r
201\r
0faec4cf
QS
202 if (Param2 != NULL) {\r
203 CleanParam2 = AllocateCopyPool (StrSize(Param2), Param2);\r
204 if (CleanParam2 == NULL) {\r
5ce99ab9 205 ShellCommandLineFreeVarList (Package);\r
0faec4cf
QS
206 return SHELL_OUT_OF_RESOURCES;\r
207 }\r
208\r
209 if (CleanParam2[0] == L'\"' && CleanParam2[StrLen(CleanParam2)-1] == L'\"') {\r
210 CleanParam2[StrLen(CleanParam2)-1] = L'\0';\r
211 CopyMem (CleanParam2, CleanParam2 + 1, StrSize(CleanParam2) - sizeof(CleanParam2[0]));\r
212 }\r
213 }\r
214\r
5ce99ab9
HL
215 if (!DeleteFlag && !VolatileFlag) {\r
216 switch (ShellCommandLineGetCount (Package)) {\r
217 case 1:\r
218 //\r
219 // "alias"\r
220 //\r
221 ShellStatus = PrintAllShellAlias ();\r
222 break;\r
223 case 2:\r
224 //\r
225 // "alias Param1"\r
226 //\r
227 ShellStatus = PrintSingleShellAlias (Param1);\r
228 break;\r
229 case 3:\r
230 //\r
231 // "alias Param1 CleanParam2"\r
232 //\r
233 ShellStatus = ShellLevel3CommandsLibSetAlias (CleanParam2, Param1, FALSE, VolatileFlag);\r
234 break;\r
235 default:\r
236 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");\r
237 ShellStatus = SHELL_INVALID_PARAMETER;\r
7bd5a2c8 238 }\r
5ce99ab9
HL
239 } else if (DeleteFlag) {\r
240 if (VolatileFlag || ShellCommandLineGetCount (Package) > 1) {\r
241 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");\r
242 ShellStatus = SHELL_INVALID_PARAMETER;\r
243 } else {\r
244 ParamStrD = ShellCommandLineGetValue (Package, L"-d");\r
245 if (ParamStrD == NULL) {\r
246 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias");\r
247 ShellStatus = SHELL_INVALID_PARAMETER;\r
a405b86d 248 } else {\r
5ce99ab9
HL
249 //\r
250 // Delete an alias: "alias -d ParamStrD"\r
251 //\r
252 ShellStatus = ShellLevel3CommandsLibSetAlias (ParamStrD, NULL, TRUE, FALSE);\r
a405b86d 253 }\r
254 }\r
5ce99ab9 255 } else {\r
7f9c4a51 256 //\r
5ce99ab9 257 // Set volatile alias.\r
7f9c4a51 258 //\r
5ce99ab9
HL
259 ASSERT (VolatileFlag);\r
260 ASSERT (!DeleteFlag); \r
261 switch (ShellCommandLineGetCount (Package)) {\r
262 case 1:\r
263 case 2:\r
264 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel3HiiHandle, L"alias");\r
265 ShellStatus = SHELL_INVALID_PARAMETER;\r
266 break;\r
267 case 3:\r
268 //\r
269 // "alias -v Param1 CleanParam2"\r
270 //\r
271 ShellStatus = ShellLevel3CommandsLibSetAlias (CleanParam2, Param1, FALSE, VolatileFlag);\r
272 break;\r
273 default:\r
274 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"alias");\r
275 ShellStatus = SHELL_INVALID_PARAMETER;\r
276 }\r
a405b86d 277 }\r
278 //\r
279 // free the command line package\r
280 //\r
281 ShellCommandLineFreeVarList (Package);\r
282 }\r
283\r
0faec4cf 284 SHELL_FREE_NON_NULL (CleanParam2);\r
a405b86d 285 return (ShellStatus);\r
286}\r