]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.c
ShellPkg: Apply uncrustify changes
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / UefiShellLevel2CommandsLib.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for NULL named library for level 2 shell command functions.\r
3\r
4 these functions are:\r
5 attrib,\r
6 cd,\r
7 cp,\r
8 date*,\r
9 time*,\r
10 load,\r
11 ls,\r
12 map,\r
13 mkdir,\r
14 mv,\r
15 parse,\r
16 rm,\r
17 reset,\r
18 set,\r
b54fd049 19 timezone*,\r
20 vol\r
a405b86d 21\r
22 * functions are non-interactive only\r
23\r
41921ad5 24 Copyright (c) 2014 Hewlett-Packard Development Company, L.P.\r
630cb850 25 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 26 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a405b86d 27\r
28**/\r
29#include "UefiShellLevel2CommandsLib.h"\r
30\r
47d20b54
MK
31CONST CHAR16 mFileName[] = L"ShellCommands";\r
32EFI_HII_HANDLE gShellLevel2HiiHandle = NULL;\r
a405b86d 33\r
b54fd049 34/**\r
35 Get the filename to get help text from if not using HII.\r
36\r
37 @retval The filename.\r
38**/\r
47d20b54 39CONST CHAR16 *\r
a405b86d 40EFIAPI\r
41ShellCommandGetManFileNameLevel2 (\r
42 VOID\r
43 )\r
44{\r
45 return (mFileName);\r
46}\r
47\r
48/**\r
49 Constructor for the Shell Level 2 Commands library.\r
50\r
51 Install the handlers for level 2 UEFI Shell 2.0 commands.\r
52\r
53 @param ImageHandle the image handle of the process\r
54 @param SystemTable the EFI System Table pointer\r
55\r
56 @retval EFI_SUCCESS the shell command handlers were installed sucessfully\r
57 @retval EFI_UNSUPPORTED the shell level required was not found.\r
58**/\r
59EFI_STATUS\r
60EFIAPI\r
61ShellLevel2CommandsLibConstructor (\r
62 IN EFI_HANDLE ImageHandle,\r
63 IN EFI_SYSTEM_TABLE *SystemTable\r
64 )\r
65{\r
66 //\r
67 // if shell level is less than 2 do nothing\r
68 //\r
47d20b54 69 if (PcdGet8 (PcdShellSupportLevel) < 2) {\r
82571fb5 70 return (EFI_SUCCESS);\r
a405b86d 71 }\r
72\r
73 gShellLevel2HiiHandle = HiiAddPackages (&gShellLevel2HiiGuid, gImageHandle, UefiShellLevel2CommandsLibStrings, NULL);\r
74 if (gShellLevel2HiiHandle == NULL) {\r
75 return (EFI_DEVICE_ERROR);\r
76 }\r
77\r
78 //\r
79 // install our shell command handlers that are always installed\r
80 //\r
47d20b54
MK
81 ShellCommandRegisterCommandName (L"attrib", ShellCommandRunAttrib, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_ATTRIB));\r
82 ShellCommandRegisterCommandName (L"cd", ShellCommandRunCd, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_CD));\r
83 ShellCommandRegisterCommandName (L"cp", ShellCommandRunCp, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_CP));\r
84 ShellCommandRegisterCommandName (L"load", ShellCommandRunLoad, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_LOAD));\r
85 ShellCommandRegisterCommandName (L"map", ShellCommandRunMap, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_MAP));\r
86 ShellCommandRegisterCommandName (L"mkdir", ShellCommandRunMkDir, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_MKDIR));\r
87 ShellCommandRegisterCommandName (L"mv", ShellCommandRunMv, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_MV));\r
88 ShellCommandRegisterCommandName (L"parse", ShellCommandRunParse, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_PARSE));\r
89 ShellCommandRegisterCommandName (L"reset", ShellCommandRunReset, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_RESET));\r
90 ShellCommandRegisterCommandName (L"set", ShellCommandRunSet, ShellCommandGetManFileNameLevel2, 2, L"", FALSE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_SET));\r
91 ShellCommandRegisterCommandName (L"ls", ShellCommandRunLs, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_LS));\r
92 ShellCommandRegisterCommandName (L"rm", ShellCommandRunRm, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_RM));\r
93 ShellCommandRegisterCommandName (L"vol", ShellCommandRunVol, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_VOL));\r
a405b86d 94\r
95 //\r
268d3445 96 // support for permanent (built in) aliases\r
a405b86d 97 //\r
47d20b54
MK
98 ShellCommandRegisterAlias (L"rm", L"del");\r
99 ShellCommandRegisterAlias (L"ls", L"dir");\r
100 ShellCommandRegisterAlias (L"cp", L"copy");\r
101 ShellCommandRegisterAlias (L"mkdir", L"md");\r
102 ShellCommandRegisterAlias (L"cd ..", L"cd..");\r
103 ShellCommandRegisterAlias (L"cd \\", L"cd\\");\r
104 ShellCommandRegisterAlias (L"mv", L"ren");\r
105 ShellCommandRegisterAlias (L"mv", L"move");\r
106 ShellCommandRegisterAlias (L"map", L"mount");\r
a405b86d 107 //\r
108 // These are installed in level 2 or 3...\r
109 //\r
47d20b54
MK
110 if ((PcdGet8 (PcdShellSupportLevel) == 2) || (PcdGet8 (PcdShellSupportLevel) == 3)) {\r
111 ShellCommandRegisterCommandName (L"date", ShellCommandRunDate, ShellCommandGetManFileNameLevel2, PcdGet8 (PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_DATE));\r
112 ShellCommandRegisterCommandName (L"time", ShellCommandRunTime, ShellCommandGetManFileNameLevel2, PcdGet8 (PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_TIME));\r
113 ShellCommandRegisterCommandName (L"timezone", ShellCommandRunTimeZone, ShellCommandGetManFileNameLevel2, PcdGet8 (PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_TIMEZONE));\r
a405b86d 114 } else {\r
47d20b54 115 DEBUG_CODE_BEGIN ();\r
a405b86d 116 //\r
117 // we want to be able to test these so install them under a different name in debug mode...\r
118 //\r
47d20b54
MK
119 ShellCommandRegisterCommandName (L"l2date", ShellCommandRunDate, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_DATE));\r
120 ShellCommandRegisterCommandName (L"l2time", ShellCommandRunTime, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_TIME));\r
121 ShellCommandRegisterCommandName (L"l2timezone", ShellCommandRunTimeZone, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN (STR_GET_HELP_TIMEZONE));\r
122 DEBUG_CODE_END ();\r
a405b86d 123 }\r
124\r
125 return (EFI_SUCCESS);\r
126}\r
127\r
128/**\r
129 Destructor for the library. free any resources.\r
130\r
131 @param ImageHandle The image handle of the process.\r
132 @param SystemTable The EFI System Table pointer.\r
133\r
134 @retval EFI_SUCCESS Always returned.\r
135**/\r
136EFI_STATUS\r
137EFIAPI\r
138ShellLevel2CommandsLibDestructor (\r
139 IN EFI_HANDLE ImageHandle,\r
140 IN EFI_SYSTEM_TABLE *SystemTable\r
141 )\r
142{\r
143 if (gShellLevel2HiiHandle != NULL) {\r
47d20b54 144 HiiRemovePackages (gShellLevel2HiiHandle);\r
a405b86d 145 }\r
47d20b54 146\r
a405b86d 147 return (EFI_SUCCESS);\r
148}\r
149\r
a405b86d 150/**\r
151 returns a fully qualified directory (contains a map drive at the begining)\r
152 path from a unknown directory path.\r
153\r
154 If Path is already fully qualified this will return a duplicat otherwise this\r
155 will use get the current directory and use that to build the fully qualified\r
156 version.\r
157\r
158 if the return value is not NULL it must be caller freed.\r
159\r
160 @param[in] Path The unknown Path Value\r
161\r
162 @retval NULL A memory allocation failed\r
c8c22591 163 @retval NULL A fully qualified path could not be discovered.\r
164 @retval other An allocated pointer to a fuly qualified path.\r
a405b86d 165**/\r
47d20b54
MK
166CHAR16 *\r
167GetFullyQualifiedPath (\r
168 IN CONST CHAR16 *Path\r
a405b86d 169 )\r
170{\r
171 CHAR16 *PathToReturn;\r
172 UINTN Size;\r
173 CONST CHAR16 *CurDir;\r
174\r
47d20b54
MK
175 PathToReturn = NULL;\r
176 Size = 0;\r
a405b86d 177\r
47d20b54 178 ASSERT ((PathToReturn == NULL && Size == 0) || (PathToReturn != NULL));\r
a405b86d 179 //\r
180 // convert a local path to an absolute path\r
181 //\r
47d20b54
MK
182 if (StrStr (Path, L":") == NULL) {\r
183 CurDir = gEfiShellProtocol->GetCurDir (NULL);\r
184 StrnCatGrow (&PathToReturn, &Size, CurDir, 0);\r
185 StrnCatGrow (&PathToReturn, &Size, L"\\", 0);\r
a405b86d 186 if (*Path == L'\\') {\r
187 Path++;\r
188 }\r
189 }\r
a405b86d 190\r
47d20b54
MK
191 StrnCatGrow (&PathToReturn, &Size, Path, 0);\r
192\r
193 PathCleanUpDirectories (PathToReturn);\r
a405b86d 194\r
d6c06dd7 195 if (PathToReturn == NULL) {\r
c8c22591 196 return NULL;\r
197 }\r
198\r
47d20b54
MK
199 while (PathToReturn[StrLen (PathToReturn)-1] == L'*') {\r
200 PathToReturn[StrLen (PathToReturn)-1] = CHAR_NULL;\r
a405b86d 201 }\r
202\r
203 return (PathToReturn);\r
204}\r
205\r
206/**\r
207 Function to verify all intermediate directories in the path.\r
208\r
209 @param[in] Path The pointer to the path to fix.\r
210\r
211 @retval EFI_SUCCESS The operation was successful.\r
212**/\r
213EFI_STATUS\r
a405b86d 214VerifyIntermediateDirectories (\r
47d20b54 215 IN CONST CHAR16 *Path\r
a405b86d 216 )\r
217{\r
47d20b54
MK
218 EFI_STATUS Status;\r
219 CHAR16 *PathCopy;\r
220 CHAR16 *TempSpot;\r
221 SHELL_FILE_HANDLE FileHandle;\r
a405b86d 222\r
47d20b54 223 ASSERT (Path != NULL);\r
a405b86d 224\r
47d20b54
MK
225 Status = EFI_SUCCESS;\r
226 PathCopy = NULL;\r
227 PathCopy = StrnCatGrow (&PathCopy, NULL, Path, 0);\r
228 FileHandle = NULL;\r
a405b86d 229\r
532691c8 230 if (PathCopy == NULL) {\r
231 return (EFI_OUT_OF_RESOURCES);\r
232 }\r
233\r
47d20b54 234 for (TempSpot = &PathCopy[StrLen (PathCopy)-1]; *TempSpot != CHAR_NULL && *TempSpot != L'\\'; TempSpot = &PathCopy[StrLen (PathCopy)-1]) {\r
a405b86d 235 *TempSpot = CHAR_NULL;\r
236 }\r
47d20b54 237\r
a405b86d 238 if (*TempSpot == L'\\') {\r
239 *TempSpot = CHAR_NULL;\r
240 }\r
241\r
47d20b54
MK
242 if ((PathCopy != NULL) && (*PathCopy != CHAR_NULL)) {\r
243 Status = VerifyIntermediateDirectories (PathCopy);\r
a405b86d 244\r
47d20b54
MK
245 if (PathCopy[StrLen (PathCopy)-1] != L':') {\r
246 if (!EFI_ERROR (Status)) {\r
247 Status = ShellOpenFileByName (PathCopy, &FileHandle, EFI_FILE_MODE_READ, 0);\r
a405b86d 248 if (FileHandle != NULL) {\r
47d20b54 249 ShellCloseFile (&FileHandle);\r
a405b86d 250 }\r
251 }\r
252 }\r
253 }\r
254\r
47d20b54 255 SHELL_FREE_NON_NULL (PathCopy);\r
a405b86d 256\r
257 return (Status);\r
258}\r
259\r
b54fd049 260/**\r
261 String comparison without regard to case for a limited number of characters.\r
262\r
263 @param[in] Source The first item to compare.\r
264 @param[in] Target The second item to compare.\r
265 @param[in] Count How many characters to compare.\r
266\r
630cb850
RN
267 @retval 0 Source and Target are identical strings without regard to case.\r
268 @retval !=0 Source is not identical to Target.\r
ba0014b9 269\r
b54fd049 270**/\r
630cb850 271INTN\r
47d20b54
MK
272StrniCmp (\r
273 IN CONST CHAR16 *Source,\r
274 IN CONST CHAR16 *Target,\r
275 IN CONST UINTN Count\r
a405b86d 276 )\r
277{\r
47d20b54
MK
278 CHAR16 *SourceCopy;\r
279 CHAR16 *TargetCopy;\r
280 UINTN SourceLength;\r
281 UINTN TargetLength;\r
282 INTN Result;\r
630cb850
RN
283\r
284 if (Count == 0) {\r
285 return 0;\r
286 }\r
287\r
288 SourceLength = StrLen (Source);\r
289 TargetLength = StrLen (Target);\r
290 SourceLength = MIN (SourceLength, Count);\r
291 TargetLength = MIN (TargetLength, Count);\r
47d20b54 292 SourceCopy = AllocateCopyPool ((SourceLength + 1) * sizeof (CHAR16), Source);\r
630cb850
RN
293 if (SourceCopy == NULL) {\r
294 return -1;\r
295 }\r
47d20b54 296\r
630cb850
RN
297 TargetCopy = AllocateCopyPool ((TargetLength + 1) * sizeof (CHAR16), Target);\r
298 if (TargetCopy == NULL) {\r
299 FreePool (SourceCopy);\r
300 return -1;\r
a405b86d 301 }\r
ba0014b9 302\r
630cb850
RN
303 SourceCopy[SourceLength] = L'\0';\r
304 TargetCopy[TargetLength] = L'\0';\r
47d20b54 305 Result = gUnicodeCollation->StriColl (gUnicodeCollation, SourceCopy, TargetCopy);\r
630cb850
RN
306 FreePool (SourceCopy);\r
307 FreePool (TargetCopy);\r
308 return Result;\r
a405b86d 309}\r
310\r
0960ba17
QS
311/**\r
312 Cleans off all the quotes in the string.\r
313\r
314 @param[in] OriginalString pointer to the string to be cleaned.\r
ba0014b9
LG
315 @param[out] CleanString The new string with all quotes removed.\r
316 Memory allocated in the function and free\r
0960ba17
QS
317 by caller.\r
318\r
319 @retval EFI_SUCCESS The operation was successful.\r
320**/\r
321EFI_STATUS\r
0960ba17 322ShellLevel2StripQuotes (\r
47d20b54
MK
323 IN CONST CHAR16 *OriginalString,\r
324 OUT CHAR16 **CleanString\r
0960ba17
QS
325 )\r
326{\r
47d20b54 327 CHAR16 *Walker;\r
ba0014b9 328\r
47d20b54 329 if ((OriginalString == NULL) || (CleanString == NULL)) {\r
0960ba17
QS
330 return EFI_INVALID_PARAMETER;\r
331 }\r
332\r
333 *CleanString = AllocateCopyPool (StrSize (OriginalString), OriginalString);\r
334 if (*CleanString == NULL) {\r
335 return EFI_OUT_OF_RESOURCES;\r
336 }\r
337\r
47d20b54 338 for (Walker = *CleanString; Walker != NULL && *Walker != CHAR_NULL; Walker++) {\r
0960ba17 339 if (*Walker == L'\"') {\r
47d20b54 340 CopyMem (Walker, Walker+1, StrSize (Walker) - sizeof (Walker[0]));\r
0960ba17
QS
341 }\r
342 }\r
343\r
344 return EFI_SUCCESS;\r
345}\r