no message
[efi/shell/.git] / dmpstore / dmpstore.c
1 /*++
2
3 Copyright 2005, 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   dmpstore.c
15   
16 Abstract:
17
18   Shell app "dmpstore"
19
20
21
22 Revision History
23
24 --*/
25
26 #include "EfiShellLib.h"
27 #include "dmpstore.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 //
38 #define DEBUG_NAME_SIZE 1050
39
40 STATIC CHAR16   *AttrType[] = {
41   L"invalid",   // 000
42   L"invalid",   // 001
43   L"BS",        // 010
44   L"NV+BS",     // 011
45   L"RT+BS",     // 100
46   L"NV+RT+BS",  // 101
47   L"RT+BS",     // 110
48   L"NV+RT+BS",  // 111
49 };
50
51 //
52 //
53 //
54 EFI_STATUS
55 InitializeDumpStore (
56   IN EFI_HANDLE         ImageHandle,
57   IN EFI_SYSTEM_TABLE   *SystemTable
58   );
59
60 EFI_STATUS
61 DumpVariableStore (
62   CHAR16 *VarName
63   );
64
65 //
66 // Global Variables
67 //
68 EFI_HII_HANDLE  HiiHandle;
69 EFI_GUID        EfiDmpstoreGuid = EFI_DMPSTORE_GUID;
70 SHELL_VAR_CHECK_ITEM    DmpstoreCheckList[] = {
71   {
72     L"-b",
73     0x01,
74     0,
75     FlagTypeSingle
76   },
77   {
78     L"-?",
79     0x02,
80     0,
81     FlagTypeSingle
82   },
83   {
84     NULL,
85     0,
86     0,
87     0
88   }
89 };
90
91 EFI_BOOTSHELL_CODE(
92   EFI_APPLICATION_ENTRY_POINT(InitializeDumpStore)
93 )
94
95 EFI_STATUS
96 InitializeDumpStore (
97   IN EFI_HANDLE         ImageHandle,
98   IN EFI_SYSTEM_TABLE   *SystemTable
99   )
100 /*++
101
102 Routine Description:
103
104   Command entry point
105
106 Arguments:
107
108   ImageHandle - The image handle
109   SystemTable - The system table
110
111 Returns:
112
113   EFI_SUCCESS - Success
114
115 --*/
116 {
117   CHAR16                  *VarName;
118   EFI_STATUS              Status;
119
120   SHELL_VAR_CHECK_CODE    RetCode;
121   CHAR16                  *Useful;
122   SHELL_VAR_CHECK_PACKAGE ChkPck;
123
124   ZeroMem (&ChkPck, sizeof (SHELL_VAR_CHECK_PACKAGE));
125   //
126   // We are no being installed as an internal command driver, initialize
127   // as an nshell app and run
128   //
129   EFI_SHELL_APP_INIT (ImageHandle, SystemTable);
130
131   //
132   // Register our string package with HII and return the handle to it.
133   // If previously registered we will simply receive the handle
134   //
135   Status = LibInitializeStrings (&HiiHandle, STRING_ARRAY_NAME, &EfiDmpstoreGuid);
136   if (EFI_ERROR (Status)) {
137     return Status;
138   }
139
140   VarName = NULL;
141   Status  = EFI_SUCCESS;
142
143   LibFilterNullArgs ();
144   //
145   // Check flags
146   //
147   Useful  = NULL;
148   RetCode = LibCheckVariables (SI, DmpstoreCheckList, &ChkPck, &Useful);
149   if (VarCheckOk != RetCode) {
150     switch (RetCode) {
151     case VarCheckDuplicate:
152       PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_DUP_FLAG), HiiHandle, L"dmpstore", Useful);
153       break;
154
155     case VarCheckUnknown:
156       PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_UNKNOWN_FLAG), HiiHandle, L"dmpstore", Useful);
157       break;
158
159     default:
160       break;
161     }
162
163     Status = EFI_INVALID_PARAMETER;
164     goto Done;
165   }
166
167   if (LibCheckVarGetFlag (&ChkPck, L"-b") != NULL) {
168     EnablePageBreak (DEFAULT_INIT_ROW, DEFAULT_AUTO_LF);
169   }
170
171   if (LibCheckVarGetFlag (&ChkPck, L"-?")) {
172     if (ChkPck.ValueCount > 0 ||
173         ChkPck.FlagCount > 2 ||
174         (2 == ChkPck.FlagCount && !LibCheckVarGetFlag (&ChkPck, L"-b"))
175         ) {
176       PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_TOO_MANY), HiiHandle, L"dmpstore");
177       Status = EFI_INVALID_PARAMETER;
178     } else {
179       PrintToken (STRING_TOKEN (STR_DMPSTORE_VERBOSEHELP), HiiHandle);
180       Status = EFI_SUCCESS;
181     }
182
183     goto Done;
184   }
185
186   if (ChkPck.ValueCount > 1) {
187     PrintToken (STRING_TOKEN (STR_SHELLENV_GNC_TOO_MANY), HiiHandle, L"dmpstore");
188     Status = EFI_INVALID_PARAMETER;
189     goto Done;
190   }
191
192   if (NULL != ChkPck.VarList) {
193     VarName = ChkPck.VarList->VarStr;
194   }
195   //
196   // Dump all variables in store
197   //
198   if (VarName == NULL) {
199     Status = DumpVariableStore (NULL);
200     goto Done;
201   }
202   //
203   // Dump one variable in store
204   //
205   if (VarName != NULL) {
206     Status = DumpVariableStore (VarName);
207   }
208   //
209   // Done
210   //
211 Done:
212   LibCheckVarFreeVarList (&ChkPck);
213   LibUnInitializeStrings ();
214   return Status;
215 }
216
217 EFI_STATUS
218 DumpVariableStore (
219   CHAR16 *VarName
220   )
221 {
222   EFI_STATUS  Status;
223   EFI_GUID    Guid;
224   UINT32      Attributes;
225   CHAR16      Name[DEBUG_NAME_SIZE / 2];
226   UINTN       NameSize;
227   CHAR16      Data[DEBUG_NAME_SIZE / 2];
228   UINTN       DataSize;
229   BOOLEAN     Found;
230
231   Found = FALSE;
232
233   if (VarName != NULL) {
234     PrintToken (STRING_TOKEN (STR_DMPSTORE_DUMP_ONE_VAR), HiiHandle, VarName);
235   } else {
236     PrintToken (STRING_TOKEN (STR_DMPSTORE_DUMP), HiiHandle);
237   }
238
239   Name[0] = 0x0000;
240   do {
241     NameSize  = DEBUG_NAME_SIZE;
242     Status    = RT->GetNextVariableName (&NameSize, Name, &Guid);
243     if (VarName != NULL) {
244       if (!MetaiMatch (Name, VarName)) {
245         continue;
246       }
247     }
248
249     if (!EFI_ERROR (Status)) {
250       Found     = TRUE;
251       DataSize  = DEBUG_NAME_SIZE;
252       Status    = RT->GetVariable (Name, &Guid, &Attributes, &DataSize, Data);
253       if (!EFI_ERROR (Status)) {
254         //
255         // dump variables
256         //
257         PrintToken (
258           STRING_TOKEN (STR_DMPSTORE_VAR),
259           HiiHandle,
260           AttrType[Attributes & 7],
261           &Guid,
262           Name,
263           DataSize
264           );
265
266         if (PrivateDumpHex (2, 0, DataSize, Data)) {
267           goto Done;
268         }
269       }
270     }
271   } while (!EFI_ERROR (Status));
272
273   if (Found == FALSE) {
274     if (VarName != NULL) {
275       PrintToken (STRING_TOKEN (STR_DMPSTORE_VAR_NOT_FOUND), HiiHandle, VarName);
276     } else {
277       PrintToken (STRING_TOKEN (STR_DMPSTORE_VAR_EMPTY), HiiHandle);
278     }
279   }
280
281 Done:
282   return EFI_SUCCESS;
283 }
284
285 EFI_STATUS
286 InitializeDumpStoreGetLineHelp (
287   OUT CHAR16                **Str
288   )
289 /*++
290
291 Routine Description:
292
293   Get this command's line help
294
295 Arguments:
296
297   Str - The line help
298
299 Returns:
300
301   EFI_SUCCESS   - Success
302
303 --*/
304 {
305   return LibCmdGetStringByToken (STRING_ARRAY_NAME, &EfiDmpstoreGuid, STRING_TOKEN (STR_DMPSTORE_LINEHELP), Str);
306 }