2 Main file for NULL named library for level 2 shell command functions.
22 * functions are non-interactive only
25 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
26 This program and the accompanying materials
27 are licensed and made available under the terms and conditions of the BSD License
28 which accompanies this distribution. The full text of the license may be found at
29 http://opensource.org/licenses/bsd-license.php
31 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
32 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
35 #include "UefiShellLevel2CommandsLib.h"
37 CONST CHAR16 mFileName
[] = L
"ShellCommands";
38 EFI_HANDLE gShellLevel2HiiHandle
= NULL
;
41 Get the filename to get help text from if not using HII.
47 ShellCommandGetManFileNameLevel2 (
55 Constructor for the Shell Level 2 Commands library.
57 Install the handlers for level 2 UEFI Shell 2.0 commands.
59 @param ImageHandle the image handle of the process
60 @param SystemTable the EFI System Table pointer
62 @retval EFI_SUCCESS the shell command handlers were installed sucessfully
63 @retval EFI_UNSUPPORTED the shell level required was not found.
67 ShellLevel2CommandsLibConstructor (
68 IN EFI_HANDLE ImageHandle
,
69 IN EFI_SYSTEM_TABLE
*SystemTable
73 // if shell level is less than 2 do nothing
75 if (PcdGet8(PcdShellSupportLevel
) < 2) {
79 gShellLevel2HiiHandle
= HiiAddPackages (&gShellLevel2HiiGuid
, gImageHandle
, UefiShellLevel2CommandsLibStrings
, NULL
);
80 if (gShellLevel2HiiHandle
== NULL
) {
81 return (EFI_DEVICE_ERROR
);
85 // install our shell command handlers that are always installed
87 ShellCommandRegisterCommandName(L
"attrib", ShellCommandRunAttrib
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_ATTRIB
) );
88 ShellCommandRegisterCommandName(L
"cd", ShellCommandRunCd
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_CD
) );
89 ShellCommandRegisterCommandName(L
"cp", ShellCommandRunCp
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_CP
) );
90 ShellCommandRegisterCommandName(L
"load", ShellCommandRunLoad
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_LOAD
) );
91 ShellCommandRegisterCommandName(L
"map", ShellCommandRunMap
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_MAP
) );
92 ShellCommandRegisterCommandName(L
"mkdir", ShellCommandRunMkDir
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_MKDIR
) );
93 ShellCommandRegisterCommandName(L
"mv", ShellCommandRunMv
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_MV
) );
94 ShellCommandRegisterCommandName(L
"parse", ShellCommandRunParse
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_PARSE
) );
95 ShellCommandRegisterCommandName(L
"reset", ShellCommandRunReset
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_RESET
) );
96 ShellCommandRegisterCommandName(L
"set", ShellCommandRunSet
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_SET
) );
97 ShellCommandRegisterCommandName(L
"ls", ShellCommandRunLs
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_LS
) );
98 ShellCommandRegisterCommandName(L
"rm", ShellCommandRunRm
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_RM
) );
99 ShellCommandRegisterCommandName(L
"vol", ShellCommandRunVol
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_VOL
) );
102 // support for permenant (built in) aliases
104 ShellCommandRegisterAlias(L
"rm", L
"del");
105 ShellCommandRegisterAlias(L
"ls", L
"dir");
106 ShellCommandRegisterAlias(L
"cp", L
"copy");
107 ShellCommandRegisterAlias(L
"mkdir", L
"md");
108 ShellCommandRegisterAlias(L
"cd ..", L
"cd..");
109 ShellCommandRegisterAlias(L
"cd \\", L
"cd\\");
110 ShellCommandRegisterAlias(L
"ren", L
"mv");
112 // These are installed in level 2 or 3...
114 if (PcdGet8(PcdShellSupportLevel
) == 2 || PcdGet8(PcdShellSupportLevel
) == 3) {
115 ShellCommandRegisterCommandName(L
"date", ShellCommandRunDate
, ShellCommandGetManFileNameLevel2
, PcdGet8(PcdShellSupportLevel
), L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_DATE
) );
116 ShellCommandRegisterCommandName(L
"time", ShellCommandRunTime
, ShellCommandGetManFileNameLevel2
, PcdGet8(PcdShellSupportLevel
), L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_TIME
) );
117 ShellCommandRegisterCommandName(L
"timezone", ShellCommandRunTimeZone
, ShellCommandGetManFileNameLevel2
, PcdGet8(PcdShellSupportLevel
), L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_TIMEZONE
));
121 // we want to be able to test these so install them under a different name in debug mode...
123 ShellCommandRegisterCommandName(L
"l2date", ShellCommandRunDate
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_DATE
) );
124 ShellCommandRegisterCommandName(L
"l2time", ShellCommandRunTime
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_TIME
) );
125 ShellCommandRegisterCommandName(L
"l2timezone", ShellCommandRunTimeZone
, ShellCommandGetManFileNameLevel2
, 2, L
"", TRUE
, gShellLevel2HiiHandle
, STRING_TOKEN(STR_GET_HELP_TIMEZONE
));
129 return (EFI_SUCCESS
);
133 Destructor for the library. free any resources.
135 @param ImageHandle The image handle of the process.
136 @param SystemTable The EFI System Table pointer.
138 @retval EFI_SUCCESS Always returned.
142 ShellLevel2CommandsLibDestructor (
143 IN EFI_HANDLE ImageHandle
,
144 IN EFI_SYSTEM_TABLE
*SystemTable
147 if (gShellLevel2HiiHandle
!= NULL
) {
148 HiiRemovePackages(gShellLevel2HiiHandle
);
150 return (EFI_SUCCESS
);
154 returns a fully qualified directory (contains a map drive at the begining)
155 path from a unknown directory path.
157 If Path is already fully qualified this will return a duplicat otherwise this
158 will use get the current directory and use that to build the fully qualified
161 if the return value is not NULL it must be caller freed.
163 @param[in] Path The unknown Path Value
165 @retval NULL A memory allocation failed
166 @retval NULL a fully qualified path could not be discovered.
167 @retval other pointer to a fuly qualified path.
171 GetFullyQualifiedPath(
172 IN CONST CHAR16
* Path
175 CHAR16
*PathToReturn
;
177 CONST CHAR16
*CurDir
;
182 ASSERT((PathToReturn
== NULL
&& Size
== 0) || (PathToReturn
!= NULL
));
184 // convert a local path to an absolute path
186 if (StrStr(Path
, L
":") == NULL
) {
187 CurDir
= gEfiShellProtocol
->GetCurDir(NULL
);
188 StrnCatGrow(&PathToReturn
, &Size
, CurDir
, 0);
189 if (*Path
== L
'\\') {
193 StrnCatGrow(&PathToReturn
, &Size
, Path
, 0);
195 PathCleanUpDirectories(PathToReturn
);
197 while (PathToReturn
[StrLen(PathToReturn
)-1] == L
'*') {
198 PathToReturn
[StrLen(PathToReturn
)-1] = CHAR_NULL
;
201 return (PathToReturn
);
205 Function to verify all intermediate directories in the path.
207 @param[in] Path The pointer to the path to fix.
209 @retval EFI_SUCCESS The operation was successful.
213 VerifyIntermediateDirectories (
214 IN CONST CHAR16
*Path
220 SHELL_FILE_HANDLE FileHandle
;
222 ASSERT(Path
!= NULL
);
224 Status
= EFI_SUCCESS
;
226 PathCopy
= StrnCatGrow(&PathCopy
, NULL
, Path
, 0);
229 for (TempSpot
= &PathCopy
[StrLen(PathCopy
)-1] ; *TempSpot
!= CHAR_NULL
&& *TempSpot
!= L
'\\' ; TempSpot
= &PathCopy
[StrLen(PathCopy
)-1]){
230 *TempSpot
= CHAR_NULL
;
232 if (*TempSpot
== L
'\\') {
233 *TempSpot
= CHAR_NULL
;
236 if (PathCopy
!= NULL
&& *PathCopy
!= CHAR_NULL
) {
237 Status
= VerifyIntermediateDirectories(PathCopy
);
239 if (PathCopy
[StrLen(PathCopy
)-1] != L
':') {
240 if (!EFI_ERROR(Status
)) {
241 Status
= ShellOpenFileByName(PathCopy
, &FileHandle
, EFI_FILE_MODE_READ
, 0);
242 if (FileHandle
!= NULL
) {
243 ShellCloseFile(&FileHandle
);
249 SHELL_FREE_NON_NULL(PathCopy
);
255 Be lazy and borrow from baselib.
257 @param[in] Char The character to convert to upper case.
259 @return Char as an upper case character.
263 InternalCharToUpper (
268 String comparison without regard to case for a limited number of characters.
270 @param[in] Source The first item to compare.
271 @param[in] Target The second item to compare.
272 @param[in] Count How many characters to compare.
274 @retval NULL Source and Target are identical strings without regard to case.
275 @return The location in Source where there is a difference.
280 IN CONST CHAR16
*Source
,
281 IN CONST CHAR16
*Target
,
289 ASSERT(Source
!= NULL
);
290 ASSERT(Target
!= NULL
);
292 for (LoopCount
= 0 ; LoopCount
< Count
; LoopCount
++) {
293 Char1
= InternalCharToUpper(Source
[LoopCount
]);
294 Char2
= InternalCharToUpper(Target
[LoopCount
]);
295 if (Char1
!= Char2
) {
296 return (&Source
[LoopCount
]);