]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - ShellPkg/Library/UefiShellLevel3CommandsLib/Alias.c
ShellPkg: remove superfluous TimerLib resolution
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel3CommandsLib / Alias.c
... / ...
CommitLineData
1/** @file\r
2 Main file for Alias shell level 3 function.\r
3\r
4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
5 Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved. <BR>\r
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
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
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
58PrintAllShellAlias(\r
59 VOID\r
60 )\r
61{\r
62 CONST CHAR16 *ConstAllAliasList;\r
63 CHAR16 *Alias;\r
64 CHAR16 *Walker;\r
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
71 if (Alias == NULL) {\r
72 return (SHELL_OUT_OF_RESOURCES);\r
73 }\r
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
83 PrintSingleShellAlias(Alias);\r
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
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
140STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
141 {L"-v", TypeFlag},\r
142 {L"-d", TypeValue},\r
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
165 CONST CHAR16 *ParamStrD;\r
166 CHAR16 *CleanParam2;\r
167 BOOLEAN DeleteFlag;\r
168 BOOLEAN VolatileFlag;\r
169\r
170 ProblemParam = NULL;\r
171 ShellStatus = SHELL_SUCCESS;\r
172 CleanParam2 = NULL;\r
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
189 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"alias", ProblemParam); \r
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
198\r
199 DeleteFlag = ShellCommandLineGetFlag (Package, L"-d");\r
200 VolatileFlag = ShellCommandLineGetFlag (Package, L"-v");\r
201\r
202 if (Param2 != NULL) {\r
203 CleanParam2 = AllocateCopyPool (StrSize(Param2), Param2);\r
204 if (CleanParam2 == NULL) {\r
205 ShellCommandLineFreeVarList (Package);\r
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
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
238 }\r
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
248 } else {\r
249 //\r
250 // Delete an alias: "alias -d ParamStrD"\r
251 //\r
252 ShellStatus = ShellLevel3CommandsLibSetAlias (ParamStrD, NULL, TRUE, FALSE);\r
253 }\r
254 }\r
255 } else {\r
256 //\r
257 // Set volatile alias.\r
258 //\r
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
277 }\r
278 //\r
279 // free the command line package\r
280 //\r
281 ShellCommandLineFreeVarList (Package);\r
282 }\r
283\r
284 SHELL_FREE_NON_NULL (CleanParam2);\r
285 return (ShellStatus);\r
286}\r