]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/EbcDxe/EbcDebugger/EdbSupportFile.c
ShellPkg: Add error prompt message in Ifconfig6 command.
[mirror_edk2.git] / MdeModulePkg / Universal / EbcDxe / EbcDebugger / EdbSupportFile.c
CommitLineData
748edcd5
PB
1/*++\r
2\r
3Copyright (c) 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 EdbSupportFile.c\r
15\r
16Abstract:\r
17\r
18\r
19--*/\r
20\r
21#include "Edb.h"\r
22\r
23EFI_STATUS\r
24EFIAPI\r
25ReadFileFromVol (\r
26 IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol,\r
27 IN CHAR16 *FileName,\r
28 OUT UINTN *BufferSize,\r
29 OUT VOID **Buffer\r
30 )\r
31/*++\r
32\r
33Routine Description:\r
34\r
35 Read a file.\r
36\r
37Arguments:\r
38\r
39 Vol - File System Volume\r
40 FileName - The file to be read.\r
41 BufferSize - The file buffer size\r
42 Buffer - The file buffer\r
43\r
44Returns:\r
45\r
46 EFI_SUCCESS - read file successfully\r
47 EFI_NOT_FOUND - file not found\r
48\r
49--*/\r
50{\r
51 EFI_STATUS Status;\r
52 EFI_FILE_HANDLE RootDir;\r
53 EFI_FILE_HANDLE Handle;\r
54 UINTN FileInfoSize;\r
55 EFI_FILE_INFO *FileInfo;\r
56 UINTN TempBufferSize;\r
57 VOID *TempBuffer;\r
58\r
59 //\r
60 // Open the root directory\r
61 //\r
62 Status = Vol->OpenVolume (Vol, &RootDir);\r
63 if (EFI_ERROR (Status)) {\r
64 return Status;\r
65 }\r
66\r
67 //\r
68 // Open the file\r
69 //\r
70 Status = RootDir->Open (\r
71 RootDir,\r
72 &Handle,\r
73 FileName,\r
74 EFI_FILE_MODE_READ,\r
75 0\r
76 );\r
77 if (EFI_ERROR (Status)) {\r
78 RootDir->Close (RootDir);\r
79 return Status;\r
80 }\r
81\r
82 RootDir->Close (RootDir);\r
83\r
84 //\r
85 // Get the file information\r
86 //\r
87 FileInfoSize = sizeof(EFI_FILE_INFO) + 1024;\r
88\r
89 FileInfo = AllocateZeroPool (FileInfoSize);\r
90 if (FileInfo == NULL) {\r
91 Handle->Close (Handle);\r
92 return Status;\r
93 }\r
94\r
95 Status = Handle->GetInfo (\r
96 Handle,\r
97 &gEfiFileInfoGuid,\r
98 &FileInfoSize,\r
99 FileInfo\r
100 );\r
101 if (EFI_ERROR (Status)) {\r
102 Handle->Close (Handle);\r
103 gBS->FreePool (FileInfo);\r
104 return Status;\r
105 }\r
106\r
107 //\r
108 // Allocate buffer for the file data. The last CHAR16 is for L'\0'\r
109 //\r
110 TempBufferSize = (UINTN) FileInfo->FileSize + sizeof(CHAR16);\r
111 TempBuffer = AllocateZeroPool (TempBufferSize);\r
112 if (TempBuffer == NULL) {\r
113 Handle->Close (Handle);\r
114 gBS->FreePool (FileInfo);\r
115 return Status;\r
116 }\r
117\r
118 gBS->FreePool (FileInfo);\r
119\r
120 //\r
121 // Read the file data to the buffer\r
122 //\r
123 Status = Handle->Read (\r
124 Handle,\r
125 &TempBufferSize,\r
126 TempBuffer\r
127 );\r
128 if (EFI_ERROR (Status)) {\r
129 Handle->Close (Handle);\r
130 gBS->FreePool (TempBuffer);\r
131 return Status;\r
132 }\r
133\r
134 Handle->Close (Handle);\r
135\r
136 *BufferSize = TempBufferSize;\r
137 *Buffer = TempBuffer;\r
138 return EFI_SUCCESS;\r
139}\r
140\r
141EFI_STATUS\r
142EFIAPI\r
143ReadFileToBuffer (\r
144 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
145 IN CHAR16 *FileName,\r
146 OUT UINTN *BufferSize,\r
147 OUT VOID **Buffer,\r
148 IN BOOLEAN ScanFs\r
149 )\r
150/*++\r
151\r
152Routine Description:\r
153\r
154 Read a file.\r
155 If ScanFs is FLASE, it will use DebuggerPrivate->Vol as default Fs.\r
156 If ScanFs is TRUE, it will scan all FS and check the file.\r
157 If there is only one file match the name, it will be read.\r
158 If there is more than one file match the name, it will return Error.\r
159\r
160Arguments:\r
161\r
162 DebuggerPrivate - EBC Debugger private data structure\r
163 FileName - The file to be read.\r
164 BufferSize - The file buffer size\r
165 Buffer - The file buffer\r
166 ScanFs - Need Scan all FS\r
167\r
168Returns:\r
169\r
170 EFI_SUCCESS - read file successfully\r
171 EFI_NOT_FOUND - file not found\r
172 EFI_NO_MAPPING - there is duplicated files found\r
173\r
174--*/\r
175{\r
176 EFI_STATUS Status;\r
177 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol;\r
178 UINTN TempBufferSize;\r
179 VOID *TempBuffer;\r
180 UINTN NoHandles;\r
181 EFI_HANDLE *HandleBuffer;\r
182 UINTN Index;\r
183\r
184 //\r
185 // Check parameters\r
186 //\r
187 if ((FileName == NULL) || (Buffer == NULL)) {\r
188 return EFI_INVALID_PARAMETER;\r
189 }\r
190\r
191 //\r
192 // not scan fs\r
193 //\r
194 if (!ScanFs) {\r
195 if (DebuggerPrivate->Vol == NULL) {\r
196 return EFI_INVALID_PARAMETER;\r
197 }\r
198 //\r
199 // Read file directly from Vol\r
200 //\r
201 return ReadFileFromVol (DebuggerPrivate->Vol, FileName, BufferSize, Buffer);\r
202 }\r
203\r
204 //\r
205 // need scan fs\r
206 //\r
207\r
208 //\r
209 // Get all Vol handle\r
210 //\r
211 Status = gBS->LocateHandleBuffer (\r
212 ByProtocol,\r
213 &gEfiSimpleFileSystemProtocolGuid,\r
214 NULL,\r
215 &NoHandles,\r
216 &HandleBuffer\r
217 );\r
218 if (EFI_ERROR (Status) && (NoHandles == 0)) {\r
219 return EFI_NOT_FOUND;\r
220 }\r
221\r
222 //\r
223 // Walk through each Vol\r
224 //\r
225 DebuggerPrivate->Vol = NULL;\r
226 *BufferSize = 0;\r
227 *Buffer = NULL;\r
228 for (Index = 0; Index < NoHandles; Index++) {\r
229 Status = gBS->HandleProtocol (\r
230 HandleBuffer[Index],\r
231 &gEfiSimpleFileSystemProtocolGuid,\r
232 (VOID**) &Vol\r
233 );\r
234 if (EFI_ERROR(Status)) {\r
235 continue;\r
236 }\r
237\r
238 Status = ReadFileFromVol (Vol, FileName, &TempBufferSize, &TempBuffer);\r
239 if (!EFI_ERROR (Status)) {\r
240 //\r
241 // Read file OK, check duplication\r
242 //\r
243 if (DebuggerPrivate->Vol != NULL) {\r
244 //\r
245 // Find the duplicated file\r
246 //\r
247 gBS->FreePool (TempBuffer);\r
248 gBS->FreePool (*Buffer);\r
249 EDBPrint (L"Duplicated FileName found!\n");\r
250 return EFI_NO_MAPPING;\r
251 } else {\r
252 //\r
253 // Record value\r
254 //\r
255 DebuggerPrivate->Vol = Vol;\r
256 *BufferSize = TempBufferSize;\r
257 *Buffer = TempBuffer;\r
258 }\r
259 }\r
260 }\r
261\r
262 //\r
263 // Scan Fs done\r
264 //\r
265 if (DebuggerPrivate->Vol == NULL) {\r
266 return EFI_NOT_FOUND;\r
267 }\r
268\r
269 //\r
270 // Done\r
271 //\r
272 return EFI_SUCCESS;\r
273}\r
274\r
275CHAR16 *\r
276EFIAPI\r
277GetFileNameUnderDir (\r
278 IN EFI_DEBUGGER_PRIVATE_DATA *DebuggerPrivate,\r
279 IN CHAR16 *DirName,\r
280 IN CHAR16 *FileName,\r
281 IN OUT UINTN *Index\r
282 )\r
283/*++\r
284\r
285Routine Description:\r
286\r
287 Get file name under this dir with index\r
288\r
289Arguments:\r
290\r
291 DebuggerPrivate - EBC Debugger private data structure\r
292 DirName - The dir to be read.\r
293 FileName - The file name pattern under this dir\r
294 Index - The file index under this dir\r
295\r
296Returns:\r
297\r
298 File Name which match the pattern and index.\r
299\r
300--*/\r
301{\r
302 EFI_STATUS Status;\r
303 EFI_FILE_HANDLE RootDir;\r
304 EFI_FILE_HANDLE Handle;\r
305 UINTN FileInfoSize;\r
306 EFI_FILE_INFO *FileInfo;\r
307 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol;\r
308 VOID *TempName;\r
309 UINTN FileIndex;\r
310\r
311 if (DebuggerPrivate->Vol == NULL) {\r
312 Status = gBS->LocateProtocol (\r
313 &gEfiSimpleFileSystemProtocolGuid,\r
314 NULL,\r
315 (VOID**) &DebuggerPrivate->Vol\r
316 );\r
317 if (EFI_ERROR(Status)) {\r
318 return NULL;\r
319 }\r
320 }\r
321 Vol = DebuggerPrivate->Vol;\r
322\r
323 //\r
324 // Open the root directory\r
325 //\r
326 Status = Vol->OpenVolume (Vol, &RootDir);\r
327 if (EFI_ERROR (Status)) {\r
328 return NULL;\r
329 }\r
330\r
331 //\r
332 // Open the file\r
333 //\r
334 Status = RootDir->Open (\r
335 RootDir,\r
336 &Handle,\r
337 DirName,\r
338 EFI_FILE_MODE_READ,\r
339 EFI_FILE_DIRECTORY\r
340 );\r
341 if (EFI_ERROR (Status)) {\r
342 RootDir->Close (RootDir);\r
343 return NULL;\r
344 }\r
345 RootDir->Close (RootDir);\r
346\r
347 //\r
348 // Set Dir Position\r
349 //\r
350 Status = Handle->SetPosition (Handle, 0);\r
351 if (EFI_ERROR (Status)) {\r
352 Handle->Close (Handle);\r
353 return NULL;\r
354 }\r
355\r
356 //\r
357 // Get the file information\r
358 //\r
359 FileInfoSize = sizeof(EFI_FILE_INFO) + 1024;\r
360\r
361 FileInfo = AllocateZeroPool (FileInfoSize);\r
362 if (FileInfo == NULL) {\r
363 Handle->Close (Handle);\r
364 return NULL;\r
365 }\r
366\r
367 //\r
368 // Walk through each file in the directory\r
369 //\r
370 FileIndex = 0;\r
371 TempName = NULL;\r
372 while (TRUE) {\r
373 //\r
374 // Read a file entry\r
375 //\r
376 FileInfoSize = sizeof(EFI_FILE_INFO) + 1024;\r
377\r
378 Status = Handle->Read (\r
379 Handle,\r
380 &FileInfoSize,\r
381 FileInfo\r
382 );\r
383 if (EFI_ERROR (Status) || (FileInfoSize == 0)) {\r
384 break;\r
385 }\r
386\r
387 if ((FileInfo->Attribute & EFI_FILE_DIRECTORY) == 0) {\r
388 //\r
389 // This is a file\r
390 //\r
391\r
392 //\r
393 // Only deal with the EFI key file\r
394 //\r
395 if (!StrEndWith (FileInfo->FileName, FileName)) {\r
396 continue;\r
397 }\r
398\r
399 if (FileIndex == *Index) {\r
400 TempName = StrDuplicate (FileInfo->FileName);\r
401 *Index = *Index + 1;\r
402 break;\r
403 }\r
404 FileIndex ++;\r
405 }\r
406 }\r
407\r
408 //\r
409 // Free resources\r
410 //\r
411 gBS->FreePool (FileInfo);\r
412 Handle->Close (Handle);\r
413\r
414 return TempName;\r
415}\r