]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - ShellPkg/Library/UefiShellLevel3CommandsLib/Help.c
ShellPkg: Revert 16720 and 16734.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel3CommandsLib / Help.c
... / ...
CommitLineData
1/** @file\r
2 Main file for Help shell level 3 function.\r
3\r
4 Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved. <BR>\r
5 Copyright (c) 2014, ARM Limited. All rights reserved. <BR>\r
6 Copyright (c) 2015, Hewlett-Packard Development Company, L.P.<BR>\r
7\r
8 This program and the accompanying materials\r
9 are licensed and made available under the terms and conditions of the BSD License\r
10 which accompanies this distribution. The full text of the license may be found at\r
11 http://opensource.org/licenses/bsd-license.php\r
12\r
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
15\r
16**/\r
17\r
18#include "UefiShellLevel3CommandsLib.h"\r
19\r
20#include <Library/ShellLib.h>\r
21#include <Library/HandleParsingLib.h>\r
22\r
23#include <Protocol/EfiShellDynamicCommand.h>\r
24\r
25/**\r
26 Attempt to print help from a dynamically added command.\r
27\r
28 @param[in] CommandToGetHelpOn The unicode name of the command that help is\r
29 requested on.\r
30 @param[in] SectionToGetHelpOn Pointer to the section specifier(s).\r
31 @param[in] PrintCommandText Print the command followed by the help content\r
32 or just help.\r
33\r
34 @retval EFI_SUCCESS The help was displayed\r
35 @retval EFI_NOT_FOUND The command name could not be found\r
36 @retval EFI_DEVICE_ERROR The help data format was incorrect.\r
37**/\r
38EFI_STATUS\r
39EFIAPI\r
40PrintDynamicCommandHelp(\r
41 IN CHAR16 *CommandToGetHelpOn,\r
42 IN CHAR16 *SectionToGetHelpOn,\r
43 IN BOOLEAN PrintCommandText\r
44 )\r
45{\r
46 EFI_STATUS Status;\r
47 BOOLEAN Found;\r
48 EFI_HANDLE *CommandHandleList;\r
49 EFI_HANDLE *NextCommand;\r
50 EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL *DynamicCommand;\r
51\r
52 Status = EFI_NOT_FOUND;\r
53 Found = FALSE;\r
54 CommandHandleList = NULL;\r
55\r
56 CommandHandleList = GetHandleListByProtocol(&gEfiShellDynamicCommandProtocolGuid);\r
57\r
58 if (CommandHandleList == NULL) {\r
59 //\r
60 // not found or out of resources\r
61 //\r
62 return Status;\r
63 }\r
64\r
65 for (NextCommand = CommandHandleList; *NextCommand != NULL; NextCommand++) {\r
66 Status = gBS->HandleProtocol(\r
67 *NextCommand,\r
68 &gEfiShellDynamicCommandProtocolGuid,\r
69 (VOID **)&DynamicCommand\r
70 );\r
71\r
72 if (EFI_ERROR(Status)) {\r
73 continue;\r
74 }\r
75\r
76 //\r
77 // Check execution break flag when printing multiple command help information.\r
78 //\r
79 if (ShellGetExecutionBreakFlag ()) {\r
80 break;\r
81 }\r
82\r
83 if ((gUnicodeCollation->MetaiMatch (gUnicodeCollation, (CHAR16 *)DynamicCommand->CommandName, CommandToGetHelpOn)) ||\r
84 (gEfiShellProtocol->GetAlias (CommandToGetHelpOn, NULL) != NULL && (gUnicodeCollation->MetaiMatch (gUnicodeCollation, (CHAR16 *)DynamicCommand->CommandName, (CHAR16*)(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL)))))) {\r
85 // Print as Shell Help if in ManPage format.\r
86 Status = ShellPrintHelp (DynamicCommand->CommandName, SectionToGetHelpOn,\r
87 PrintCommandText);\r
88 if (Status == EFI_DEVICE_ERROR) {\r
89 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_INV),\r
90 gShellLevel3HiiHandle, DynamicCommand->CommandName);\r
91 } else if (EFI_ERROR(Status)) {\r
92 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HELP_NF),\r
93 gShellLevel3HiiHandle, DynamicCommand->CommandName);\r
94 } else {\r
95 Found = TRUE;\r
96 }\r
97 }\r
98 }\r
99\r
100 return (Found ? EFI_SUCCESS : Status);\r
101\r
102}\r
103\r
104STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
105 {L"-usage", TypeFlag},\r
106 {L"-section", TypeMaxValue},\r
107 {L"-verbose", TypeFlag},\r
108 {L"-v", TypeFlag},\r
109 {NULL, TypeMax}\r
110 };\r
111\r
112/**\r
113 Function for 'help' command.\r
114\r
115 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
116 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
117**/\r
118SHELL_STATUS\r
119EFIAPI\r
120ShellCommandRunHelp (\r
121 IN EFI_HANDLE ImageHandle,\r
122 IN EFI_SYSTEM_TABLE *SystemTable\r
123 )\r
124{\r
125 EFI_STATUS Status;\r
126 LIST_ENTRY *Package;\r
127 CHAR16 *ProblemParam;\r
128 SHELL_STATUS ShellStatus;\r
129 CONST COMMAND_LIST *CommandList;\r
130 CONST COMMAND_LIST *Node;\r
131 CHAR16 *CommandToGetHelpOn;\r
132 CHAR16 *SectionToGetHelpOn;\r
133 CHAR16 *HiiString;\r
134 BOOLEAN Found;\r
135 BOOLEAN PrintCommandText;\r
136\r
137 PrintCommandText = TRUE;\r
138 ProblemParam = NULL;\r
139 ShellStatus = SHELL_SUCCESS;\r
140 CommandToGetHelpOn = NULL;\r
141 SectionToGetHelpOn = NULL;\r
142 Found = FALSE;\r
143\r
144 //\r
145 // initialize the shell lib (we must be in non-auto-init...)\r
146 //\r
147 Status = ShellInitialize();\r
148 ASSERT_EFI_ERROR(Status);\r
149\r
150 Status = CommandInit();\r
151 ASSERT_EFI_ERROR(Status);\r
152\r
153 //\r
154 // parse the command line\r
155 //\r
156 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
157 if (EFI_ERROR(Status)) {\r
158 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
159 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel3HiiHandle, L"help", ProblemParam); \r
160 FreePool(ProblemParam);\r
161 ShellStatus = SHELL_INVALID_PARAMETER;\r
162 } else {\r
163 ASSERT(FALSE);\r
164 }\r
165 } else {\r
166 //\r
167 // Check for conflicting parameters.\r
168 //\r
169 if (ShellCommandLineGetFlag(Package, L"-usage")\r
170 &&ShellCommandLineGetFlag(Package, L"-section")\r
171 &&(ShellCommandLineGetFlag(Package, L"-verbose") || ShellCommandLineGetFlag(Package, L"-v"))\r
172 ){\r
173 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel3HiiHandle, L"help"); \r
174 ShellStatus = SHELL_INVALID_PARAMETER;\r
175 } else if (ShellCommandLineGetRawValue(Package, 2) != NULL) {\r
176 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel3HiiHandle, L"help"); \r
177 ShellStatus = SHELL_INVALID_PARAMETER;\r
178 } else {\r
179 //\r
180 // Get the command name we are getting help on\r
181 //\r
182 ASSERT(CommandToGetHelpOn == NULL);\r
183 StrnCatGrow(&CommandToGetHelpOn, NULL, ShellCommandLineGetRawValue(Package, 1), 0);\r
184 if (CommandToGetHelpOn == NULL && ShellCommandLineGetFlag(Package, L"-?")) {\r
185 //\r
186 // If we dont have a command and we got a simple -?\r
187 // we are looking for help on help command.\r
188 //\r
189 StrnCatGrow(&CommandToGetHelpOn, NULL, L"help", 0);\r
190 }\r
191\r
192 if (CommandToGetHelpOn == NULL) {\r
193 StrnCatGrow(&CommandToGetHelpOn, NULL, L"*", 0);\r
194 ASSERT(SectionToGetHelpOn == NULL);\r
195 StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME", 0);\r
196 } else {\r
197 PrintCommandText = FALSE;\r
198 ASSERT(SectionToGetHelpOn == NULL);\r
199 //\r
200 // Get the section name for the given command name\r
201 //\r
202 if (ShellCommandLineGetFlag(Package, L"-section")) {\r
203 StrnCatGrow(&SectionToGetHelpOn, NULL, ShellCommandLineGetValue(Package, L"-section"), 0);\r
204 } else if (ShellCommandLineGetFlag(Package, L"-usage")) {\r
205 StrnCatGrow(&SectionToGetHelpOn, NULL, L"NAME,SYNOPSIS", 0);\r
206 } else if (ShellCommandLineGetFlag(Package, L"-verbose") || ShellCommandLineGetFlag(Package, L"-v")) {\r
207 } else {\r
208 //\r
209 // The output of help <command> will display NAME, SYNOPSIS, OPTIONS, DESCRIPTION, and EXAMPLES sections.\r
210 //\r
211 StrnCatGrow (&SectionToGetHelpOn, NULL, L"NAME,SYNOPSIS,OPTIONS,DESCRIPTION,EXAMPLES", 0);\r
212 }\r
213 }\r
214\r
215 if (gUnicodeCollation->StriColl(gUnicodeCollation, CommandToGetHelpOn, L"special") == 0) {\r
216 //\r
217 // we need info on the special characters\r
218 //\r
219 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_SC_HEADER), gShellLevel3HiiHandle);\r
220 HiiString = HiiGetString(gShellLevel3HiiHandle, STRING_TOKEN(STR_HELP_SC_DATA), NULL);\r
221 ShellPrintEx(-1, -1, L"%s", HiiString);\r
222 FreePool(HiiString);\r
223 Found = TRUE;\r
224 } else {\r
225 CommandList = ShellCommandGetCommandList(TRUE);\r
226 ASSERT(CommandList != NULL);\r
227 for ( Node = (COMMAND_LIST*)GetFirstNode(&CommandList->Link)\r
228 ; CommandList != NULL && !IsListEmpty(&CommandList->Link) && !IsNull(&CommandList->Link, &Node->Link)\r
229 ; Node = (COMMAND_LIST*)GetNextNode(&CommandList->Link, &Node->Link)\r
230 ){\r
231 //\r
232 // Checking execution break flag when print multiple command help information.\r
233 //\r
234 if (ShellGetExecutionBreakFlag ()) {\r
235 break;\r
236 } \r
237 if ((gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, CommandToGetHelpOn)) ||\r
238 (gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL) != NULL && (gUnicodeCollation->MetaiMatch(gUnicodeCollation, Node->CommandString, (CHAR16*)(gEfiShellProtocol->GetAlias(CommandToGetHelpOn, NULL)))))) {\r
239 //\r
240 // We have a command to look for help on.\r
241 //\r
242 Status = ShellPrintHelp(Node->CommandString, SectionToGetHelpOn, PrintCommandText);\r
243 if (Status == EFI_DEVICE_ERROR) {\r
244 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, Node->CommandString);\r
245 } else if (EFI_ERROR(Status)) {\r
246 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, Node->CommandString);\r
247 } else {\r
248 Found = TRUE;\r
249 }\r
250 }\r
251 }\r
252\r
253 //\r
254 // now try to match against the dynamic command list and print help\r
255 //\r
256 Status = PrintDynamicCommandHelp (CommandToGetHelpOn, SectionToGetHelpOn,\r
257 PrintCommandText);\r
258 if (!EFI_ERROR(Status)) {\r
259 Found = TRUE;\r
260 }\r
261\r
262 //\r
263 // Search the .man file for Shell applications (Shell external commands).\r
264 //\r
265 if (!Found) {\r
266 Status = ShellPrintHelp(CommandToGetHelpOn, SectionToGetHelpOn, FALSE);\r
267 if (Status == EFI_DEVICE_ERROR) {\r
268 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_INV), gShellLevel3HiiHandle, CommandToGetHelpOn);\r
269 } else if (EFI_ERROR(Status)) {\r
270 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_NF), gShellLevel3HiiHandle, CommandToGetHelpOn);\r
271 } else {\r
272 Found = TRUE;\r
273 }\r
274 }\r
275 }\r
276\r
277 if (!Found) {\r
278 ShellStatus = SHELL_NOT_FOUND;\r
279 }\r
280\r
281 //\r
282 // free the command line package\r
283 //\r
284 ShellCommandLineFreeVarList (Package);\r
285 }\r
286 }\r
287\r
288 if (CommandToGetHelpOn != NULL && StrCmp(CommandToGetHelpOn, L"*") == 0){\r
289 //\r
290 // If '*' then the command entered was 'Help' without qualifiers, This footer\r
291 // provides additional info on help switches\r
292 //\r
293 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_HELP_FOOTER), gShellLevel3HiiHandle);\r
294 }\r
295 if (CommandToGetHelpOn != NULL) {\r
296 FreePool(CommandToGetHelpOn);\r
297 }\r
298 if (SectionToGetHelpOn != NULL) {\r
299 FreePool(SectionToGetHelpOn);\r
300 }\r
301\r
302 return (ShellStatus);\r
303}\r