SHEL23
[mirror/efi/shell/.git] / guid / guid.c
1 /*++
2  
3 Copyright (c) 2005 - 2006, Intel Corporation                                                         
4 All rights reserved. This program and the accompanying materials                          
5 are licensed and made available under the terms and conditions of the BSD License         
6 which accompanies this distribution. The full text of the license may be found at         
7 http://opensource.org/licenses/bsd-license.php                                            
8                                                                                           
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
11
12 Module Name:
13
14   guid.c
15   
16 Abstract:
17
18   Shell command "guid"
19
20
21
22 Revision History
23
24 --*/
25
26 #include "EfiShellLib.h"
27 #include "guid.h"
28
29 extern UINT8  STRING_ARRAY_NAME[];
30
31 //
32 // This is the generated header file which includes whatever needs to be exported (strings + IFR)
33 //
34 #include STRING_DEFINES_FILE
35
36 //
37 // Global Variables
38 //
39 EFI_HII_HANDLE  HiiHandle;
40 EFI_GUID        EfiGuidGuid = EFI_GUID_GUID;
41 SHELL_VAR_CHECK_ITEM    GuidCheckList[] = {
42   {
43     L"-b",
44     0x01,
45     0,
46     FlagTypeSingle
47   },
48   {
49     L"-?",
50     0x02,
51     0,
52     FlagTypeSingle
53   },
54   {
55     NULL,
56     0,
57     0,
58     0
59   }
60 };
61
62 EFI_BOOTSHELL_CODE (
63   EFI_APPLICATION_ENTRY_POINT(GuidMain)
64 )
65 //
66 //
67 //
68 EFI_STATUS
69 GuidMain (
70   IN EFI_HANDLE         ImageHandle,
71   IN EFI_SYSTEM_TABLE   *SystemTable
72   );
73
74 //
75 //
76 //
77 EFI_STATUS
78 GuidMain (
79   IN EFI_HANDLE               ImageHandle,
80   IN EFI_SYSTEM_TABLE         *SystemTable
81   )
82 /*++
83
84 Routine Description:
85
86   Code for external shell "guid" command.
87
88 Arguments:
89
90   ImageHandle - The image handle
91   SystemTable - The system table
92
93 Returns:
94
95 --*/
96 {
97   PROTOCOL_INFO           *Prot;
98   UINTN                   Len;
99   UINTN                   SLen;
100   EFI_STATUS              Status;
101
102   SHELL_VAR_CHECK_CODE    RetCode;
103   CHAR16                  *Useful;
104   SHELL_VAR_CHECK_PACKAGE ChkPck;
105
106   ZeroMem (&ChkPck, sizeof (SHELL_VAR_CHECK_PACKAGE));
107   EFI_SHELL_APP_INIT (ImageHandle, SystemTable);
108   
109   //
110   // Enable tab key which can pause the output
111   //
112   EnableOutputTabPause();
113
114   Status = LibInitializeStrings (&HiiHandle, STRING_ARRAY_NAME, &EfiGuidGuid);
115   if (EFI_ERROR (Status)) {
116     return Status;
117   }
118
119   if (!EFI_PROPER_VERSION (0, 99)) {
120     PrintToken (
121       STRING_TOKEN (STR_SHELLENV_GNC_COMMAND_NOT_SUPPORT),
122       HiiHandle,
123       L"guid",
124       EFI_VERSION_0_99 
125       );
126     Status = EFI_UNSUPPORTED;
127     goto Done;
128   }
129   //
130   // Initializing variable to aVOID level 4 warning
131   //
132   RetCode = LibCheckVariables (SI, GuidCheckList, &ChkPck, &Useful);
133
134   if (VarCheckOk != RetCode) {
135     switch (RetCode) {
136     case VarCheckUnknown:
137       PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_UNKNOWN_FLAG), HiiHandle, L"guid", Useful);
138       break;
139
140     case VarCheckDuplicate:
141       PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_DUP_FLAG), HiiHandle, L"guid", Useful);
142       break;
143
144     default:
145       break;
146     }
147
148     Status = EFI_INVALID_PARAMETER;
149     goto Done;
150   }
151
152   if (LibCheckVarGetFlag (&ChkPck, L"-b") != NULL) {
153     EnablePageBreak (DEFAULT_INIT_ROW, DEFAULT_AUTO_LF);
154   }
155
156   if (LibCheckVarGetFlag (&ChkPck, L"-?")) {
157     if (ChkPck.ValueCount > 0 ||
158         ChkPck.FlagCount > 2 ||
159         (2 == ChkPck.FlagCount && !LibCheckVarGetFlag (&ChkPck, L"-b"))
160         ) {
161       PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_TOO_MANY), HiiHandle, L"guid");
162       Status = EFI_INVALID_PARAMETER;
163     } else {
164       PrintToken (STRING_TOKEN (STR_GUID_VERBOSEHELP), HiiHandle);
165       Status = EFI_SUCCESS;
166     }
167
168     goto Done;
169   }
170
171   if (ChkPck.ValueCount > 0) {
172     PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_TOO_MANY), HiiHandle, L"guid");
173     Status = EFI_INVALID_PARAMETER;
174     goto Done;
175   }
176   //
177   // Find the protocol entry for this id
178   //
179   Status  = EFI_SUCCESS;
180   SLen    = 0;
181   Prot    = NULL;
182   ShellInitProtocolInfoEnumerator ();
183   do {
184     Status = ShellNextProtocolInfo (&Prot);
185     if (Prot == NULL && Status == EFI_SUCCESS) {
186       break;
187     }
188
189     Len = StrLen (Prot->IdString);
190     if (StrLen (Prot->IdString) > SLen) {
191       SLen = Len;
192     }
193   } while (Prot != NULL);
194
195   ShellResetProtocolInfoEnumerator ();
196   do {
197     Status = ShellNextProtocolInfo (&Prot);
198     if (Prot == NULL && Status == EFI_SUCCESS) {
199       break;
200     }
201     //
202     // Can't use Lib function to dump the guid as it may lookup the
203     // "short name" for it
204     //
205     if (GetExecutionBreak ()) {
206       Status = EFI_ABORTED;
207       break;
208     }
209
210     PrintToken (
211       STRING_TOKEN (STR_SHELLENV_PROTID_FOURTEEN_VARS),
212       HiiHandle,
213       SLen,
214       Prot->IdString,
215       Prot->ProtocolId.Data1,
216       Prot->ProtocolId.Data2,
217       Prot->ProtocolId.Data3,
218       Prot->ProtocolId.Data4[0],
219       Prot->ProtocolId.Data4[1],
220       Prot->ProtocolId.Data4[2],
221       Prot->ProtocolId.Data4[3],
222       Prot->ProtocolId.Data4[4],
223       Prot->ProtocolId.Data4[5],
224       Prot->ProtocolId.Data4[6],
225       Prot->ProtocolId.Data4[7],
226       (Prot->DumpToken || Prot->DumpInfo) ? L'*' : L' '
227       );
228   } while (Prot != NULL);
229
230   ShellCloseProtocolInfoEnumerator ();
231
232 Done:
233   LibCheckVarFreeVarList (&ChkPck);
234   LibUnInitializeStrings ();
235   return Status;
236 }
237
238 EFI_STATUS
239 GuidMainGetLineHelp (
240   OUT CHAR16          **Str
241   )
242 /*++
243
244 Routine Description:
245
246   Get this command's line help
247
248 Arguments:
249
250   Str - The line help
251
252 Returns:
253
254   EFI_SUCCESS   - Success
255
256 --*/
257 {
258   return LibCmdGetStringByToken (STRING_ARRAY_NAME, &EfiGuidGuid, STRING_TOKEN (STR_GUID_LINEHELP), Str);
259 }