]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.c
This refactors 3 functions out of ShellCommandLib and puts them into a new library...
[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
24\r
b54fd049 25 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
a405b86d 26 This program and the accompanying materials\r
27 are licensed and made available under the terms and conditions of the BSD License\r
28 which accompanies this distribution. The full text of the license may be found at\r
29 http://opensource.org/licenses/bsd-license.php\r
30\r
31 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
32 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
33\r
34**/\r
35#include "UefiShellLevel2CommandsLib.h"\r
36\r
37CONST CHAR16 mFileName[] = L"ShellCommands";\r
38EFI_HANDLE gShellLevel2HiiHandle = NULL;\r
39CONST EFI_GUID gShellLevel2HiiGuid = \\r
40 { \\r
41 0xf95a7ccc, 0x4c55, 0x4426, { 0xa7, 0xb4, 0xdc, 0x89, 0x61, 0x95, 0xb, 0xae } \\r
42 };\r
43\r
b54fd049 44/**\r
45 Get the filename to get help text from if not using HII.\r
46\r
47 @retval The filename.\r
48**/\r
a405b86d 49CONST CHAR16*\r
50EFIAPI\r
51ShellCommandGetManFileNameLevel2 (\r
52 VOID\r
53 )\r
54{\r
55 return (mFileName);\r
56}\r
57\r
58/**\r
59 Constructor for the Shell Level 2 Commands library.\r
60\r
61 Install the handlers for level 2 UEFI Shell 2.0 commands.\r
62\r
63 @param ImageHandle the image handle of the process\r
64 @param SystemTable the EFI System Table pointer\r
65\r
66 @retval EFI_SUCCESS the shell command handlers were installed sucessfully\r
67 @retval EFI_UNSUPPORTED the shell level required was not found.\r
68**/\r
69EFI_STATUS\r
70EFIAPI\r
71ShellLevel2CommandsLibConstructor (\r
72 IN EFI_HANDLE ImageHandle,\r
73 IN EFI_SYSTEM_TABLE *SystemTable\r
74 )\r
75{\r
76 //\r
77 // if shell level is less than 2 do nothing\r
78 //\r
79 if (PcdGet8(PcdShellSupportLevel) < 2) {\r
82571fb5 80 return (EFI_SUCCESS);\r
a405b86d 81 }\r
82\r
83 gShellLevel2HiiHandle = HiiAddPackages (&gShellLevel2HiiGuid, gImageHandle, UefiShellLevel2CommandsLibStrings, NULL);\r
84 if (gShellLevel2HiiHandle == NULL) {\r
85 return (EFI_DEVICE_ERROR);\r
86 }\r
87\r
88 //\r
89 // install our shell command handlers that are always installed\r
90 //\r
91 ShellCommandRegisterCommandName(L"attrib", ShellCommandRunAttrib , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_ATTRIB) );\r
92 ShellCommandRegisterCommandName(L"cd", ShellCommandRunCd , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_CD) );\r
93 ShellCommandRegisterCommandName(L"cp", ShellCommandRunCp , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_CP) );\r
94 ShellCommandRegisterCommandName(L"load", ShellCommandRunLoad , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_LOAD) );\r
95 ShellCommandRegisterCommandName(L"map", ShellCommandRunMap , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_MAP) );\r
96 ShellCommandRegisterCommandName(L"mkdir", ShellCommandRunMkDir , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_MKDIR) );\r
97 ShellCommandRegisterCommandName(L"mv", ShellCommandRunMv , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_MV) );\r
98 ShellCommandRegisterCommandName(L"parse", ShellCommandRunParse , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_PARSE) );\r
99 ShellCommandRegisterCommandName(L"reset", ShellCommandRunReset , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_RESET) );\r
100 ShellCommandRegisterCommandName(L"set", ShellCommandRunSet , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_SET) );\r
101 ShellCommandRegisterCommandName(L"ls", ShellCommandRunLs , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_LS) );\r
102 ShellCommandRegisterCommandName(L"rm", ShellCommandRunRm , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_RM) );\r
b54fd049 103 ShellCommandRegisterCommandName(L"vol", ShellCommandRunVol , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_VOL) );\r
a405b86d 104\r
105 //\r
106 // support for permenant (built in) aliases\r
107 //\r
108 ShellCommandRegisterAlias(L"rm", L"del");\r
109 ShellCommandRegisterAlias(L"ls", L"dir");\r
110 ShellCommandRegisterAlias(L"cp", L"copy");\r
111 ShellCommandRegisterAlias(L"mkdir", L"md");\r
112 ShellCommandRegisterAlias(L"cd ..", L"cd..");\r
113 ShellCommandRegisterAlias(L"cd \\", L"cd\\");\r
a49016b1 114 ShellCommandRegisterAlias(L"ren", L"mv");\r
a405b86d 115 //\r
116 // These are installed in level 2 or 3...\r
117 //\r
118 if (PcdGet8(PcdShellSupportLevel) == 2 || PcdGet8(PcdShellSupportLevel) == 3) {\r
119 ShellCommandRegisterCommandName(L"date", ShellCommandRunDate , ShellCommandGetManFileNameLevel2, PcdGet8(PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_DATE) );\r
120 ShellCommandRegisterCommandName(L"time", ShellCommandRunTime , ShellCommandGetManFileNameLevel2, PcdGet8(PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIME) );\r
121 ShellCommandRegisterCommandName(L"timezone", ShellCommandRunTimeZone, ShellCommandGetManFileNameLevel2, PcdGet8(PcdShellSupportLevel), L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIMEZONE));\r
122 } else {\r
123 DEBUG_CODE_BEGIN();\r
124 //\r
125 // we want to be able to test these so install them under a different name in debug mode...\r
126 //\r
127 ShellCommandRegisterCommandName(L"l2date", ShellCommandRunDate , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_DATE) );\r
128 ShellCommandRegisterCommandName(L"l2time", ShellCommandRunTime , ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIME) );\r
129 ShellCommandRegisterCommandName(L"l2timezone", ShellCommandRunTimeZone, ShellCommandGetManFileNameLevel2, 2, L"", TRUE, gShellLevel2HiiHandle, STRING_TOKEN(STR_GET_HELP_TIMEZONE));\r
130 DEBUG_CODE_END();\r
131 }\r
132\r
133 return (EFI_SUCCESS);\r
134}\r
135\r
136/**\r
137 Destructor for the library. free any resources.\r
138\r
139 @param ImageHandle The image handle of the process.\r
140 @param SystemTable The EFI System Table pointer.\r
141\r
142 @retval EFI_SUCCESS Always returned.\r
143**/\r
144EFI_STATUS\r
145EFIAPI\r
146ShellLevel2CommandsLibDestructor (\r
147 IN EFI_HANDLE ImageHandle,\r
148 IN EFI_SYSTEM_TABLE *SystemTable\r
149 )\r
150{\r
151 if (gShellLevel2HiiHandle != NULL) {\r
152 HiiRemovePackages(gShellLevel2HiiHandle);\r
153 }\r
154 return (EFI_SUCCESS);\r
155}\r
156\r
a405b86d 157/**\r
158 returns a fully qualified directory (contains a map drive at the begining)\r
159 path from a unknown directory path.\r
160\r
161 If Path is already fully qualified this will return a duplicat otherwise this\r
162 will use get the current directory and use that to build the fully qualified\r
163 version.\r
164\r
165 if the return value is not NULL it must be caller freed.\r
166\r
167 @param[in] Path The unknown Path Value\r
168\r
169 @retval NULL A memory allocation failed\r
170 @retval NULL a fully qualified path could not be discovered.\r
171 @retval other pointer to a fuly qualified path.\r
172**/\r
173CHAR16*\r
174EFIAPI\r
175GetFullyQualifiedPath(\r
176 IN CONST CHAR16* Path\r
177 )\r
178{\r
179 CHAR16 *PathToReturn;\r
180 UINTN Size;\r
181 CONST CHAR16 *CurDir;\r
182\r
183 PathToReturn = NULL;\r
184 Size = 0;\r
185\r
186 ASSERT((PathToReturn == NULL && Size == 0) || (PathToReturn != NULL));\r
187 //\r
188 // convert a local path to an absolute path\r
189 //\r
190 if (StrStr(Path, L":") == NULL) {\r
191 CurDir = gEfiShellProtocol->GetCurDir(NULL);\r
192 StrnCatGrow(&PathToReturn, &Size, CurDir, 0);\r
193 if (*Path == L'\\') {\r
194 Path++;\r
195 }\r
196 }\r
197 StrnCatGrow(&PathToReturn, &Size, Path, 0);\r
198\r
ab94587a 199 PathCleanUpDirectories(PathToReturn);\r
a405b86d 200\r
201 while (PathToReturn[StrLen(PathToReturn)-1] == L'*') {\r
202 PathToReturn[StrLen(PathToReturn)-1] = CHAR_NULL;\r
203 }\r
204\r
205 return (PathToReturn);\r
206}\r
207\r
208/**\r
209 Function to verify all intermediate directories in the path.\r
210\r
211 @param[in] Path The pointer to the path to fix.\r
212\r
213 @retval EFI_SUCCESS The operation was successful.\r
214**/\r
215EFI_STATUS\r
216EFIAPI\r
217VerifyIntermediateDirectories (\r
218 IN CONST CHAR16 *Path\r
219 )\r
220{\r
221 EFI_STATUS Status;\r
222 CHAR16 *PathCopy;\r
223 CHAR16 *TempSpot;\r
224 SHELL_FILE_HANDLE FileHandle;\r
225\r
226 ASSERT(Path != NULL);\r
227\r
228 Status = EFI_SUCCESS;\r
229 PathCopy = NULL;\r
230 PathCopy = StrnCatGrow(&PathCopy, NULL, Path, 0);\r
231 FileHandle = NULL;\r
232\r
233 for (TempSpot = &PathCopy[StrLen(PathCopy)-1] ; *TempSpot != CHAR_NULL && *TempSpot != L'\\' ; TempSpot = &PathCopy[StrLen(PathCopy)-1]){\r
234 *TempSpot = CHAR_NULL;\r
235 }\r
236 if (*TempSpot == L'\\') {\r
237 *TempSpot = CHAR_NULL;\r
238 }\r
239\r
240 if (PathCopy != NULL && *PathCopy != CHAR_NULL) {\r
241 Status = VerifyIntermediateDirectories(PathCopy);\r
242\r
243 if (PathCopy[StrLen(PathCopy)-1] != L':') {\r
244 if (!EFI_ERROR(Status)) {\r
245 Status = ShellOpenFileByName(PathCopy, &FileHandle, EFI_FILE_MODE_READ, 0);\r
246 if (FileHandle != NULL) {\r
247 ShellCloseFile(&FileHandle);\r
248 }\r
249 }\r
250 }\r
251 }\r
252\r
253 SHELL_FREE_NON_NULL(PathCopy);\r
254\r
255 return (Status);\r
256}\r
257\r
b54fd049 258/**\r
259 Be lazy and borrow from baselib.\r
260\r
261 @param[in] Char The character to convert to upper case.\r
262\r
263 @return Char as an upper case character.\r
264**/\r
a405b86d 265CHAR16\r
266EFIAPI\r
267InternalCharToUpper (\r
268 IN CONST CHAR16 Char\r
269 );\r
270\r
b54fd049 271/**\r
272 String comparison without regard to case for a limited number of characters.\r
273\r
274 @param[in] Source The first item to compare.\r
275 @param[in] Target The second item to compare.\r
276 @param[in] Count How many characters to compare.\r
277\r
278 @retval NULL Source and Target are identical strings without regard to case.\r
279 @return The location in Source where there is a difference.\r
280**/\r
a405b86d 281CONST CHAR16*\r
282EFIAPI\r
283StrniCmp(\r
284 IN CONST CHAR16 *Source,\r
285 IN CONST CHAR16 *Target,\r
286 IN CONST UINTN Count\r
287 )\r
288{\r
289 UINTN LoopCount;\r
290 CHAR16 Char1;\r
291 CHAR16 Char2;\r
292\r
293 ASSERT(Source != NULL);\r
294 ASSERT(Target != NULL);\r
295\r
296 for (LoopCount = 0 ; LoopCount < Count ; LoopCount++) {\r
297 Char1 = InternalCharToUpper(Source[LoopCount]);\r
298 Char2 = InternalCharToUpper(Target[LoopCount]);\r
299 if (Char1 != Char2) {\r
300 return (&Source[LoopCount]);\r
301 }\r
302 }\r
303 return (NULL);\r
304}\r
305\r