]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c
ShellPkg: Move UpdateMapping() out of Map command and added to UefiShellCommandLib...
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Map.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for map shell level 2 command.\r
3\r
e71cb452 4 (C) Copyright 2013-2014, Hewlett-Packard Development Company, L.P.\r
f747c71e 5 Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>\r
a405b86d 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellLevel2CommandsLib.h"\r
17#include <Protocol/SimpleFileSystem.h>\r
18#include <Protocol/BlockIo.h>\r
19#include <Library/DevicePathLib.h>\r
20#include <Library/HandleParsingLib.h>\r
21#include <Library/SortLib.h>\r
22\r
b54fd049 23/**\r
24 Determine if a string has only numbers and letters.\r
25\r
26 This is useful for such things as Map names which can only be letters and numbers.\r
27\r
28 @param[in] String pointer to the string to analyze,\r
29 @param[in] Len Number of characters to analyze.\r
30\r
31 @retval TRUE String has only numbers and letters\r
32 @retval FALSE String has at least one other character.\r
33**/\r
34BOOLEAN\r
35EFIAPI\r
36IsNumberLetterOnly(\r
37 IN CONST CHAR16 *String,\r
38 IN CONST UINTN Len\r
39 )\r
40{\r
41 UINTN Count;\r
42 for (Count = 0 ; Count < Len && String != NULL && *String != CHAR_NULL ; String++,Count++) {\r
43 if (! ((*String >= L'a' && *String <= L'z') ||\r
44 (*String >= L'A' && *String <= L'Z') ||\r
45 (*String >= L'0' && *String <= L'9'))\r
46 ){\r
47 return (FALSE);\r
48 }\r
49 }\r
50 return (TRUE);\r
51}\r
52\r
53/**\r
54 Do a search in the Target delimited list.\r
55\r
56 @param[in] List The list to seatch in.\r
57 @param[in] MetaTarget The item to search for. MetaMatching supported.\r
58 @param[out] FullName Optional pointer to an allocated buffer containing \r
59 the match.\r
60 @param[in] Meta TRUE to use MetaMatching.\r
61 @param[in] SkipTrailingNumbers TRUE to allow for numbers after the MetaTarget.\r
62 @param[in] Target The single character that delimits list \r
63 items (";" normally). \r
64**/\r
a405b86d 65BOOLEAN\r
66EFIAPI\r
67SearchList(\r
68 IN CONST CHAR16 *List,\r
69 IN CONST CHAR16 *MetaTarget,\r
70 OUT CHAR16 **FullName OPTIONAL,\r
71 IN CONST BOOLEAN Meta,\r
72 IN CONST BOOLEAN SkipTrailingNumbers,\r
73 IN CONST CHAR16 *Target\r
74\r
75 )\r
76{\r
77 CHAR16 *TempList;\r
78 CONST CHAR16 *ListWalker;\r
79 BOOLEAN Result;\r
80 CHAR16 *TempSpot;\r
81\r
82 for (ListWalker = List , TempList = NULL\r
83 ; ListWalker != NULL && *ListWalker != CHAR_NULL\r
84 ;\r
85 ) {\r
86 TempList = StrnCatGrow(&TempList, NULL, ListWalker, 0);\r
87 ASSERT(TempList != NULL);\r
88 TempSpot = StrStr(TempList, Target);\r
89 if (TempSpot != NULL) {\r
90 *TempSpot = CHAR_NULL;\r
91 }\r
92\r
93 while (SkipTrailingNumbers && (ShellIsDecimalDigitCharacter(TempList[StrLen(TempList)-1]) || TempList[StrLen(TempList)-1] == L':')) {\r
94 TempList[StrLen(TempList)-1] = CHAR_NULL;\r
95 }\r
96\r
97 ListWalker = StrStr(ListWalker, Target);\r
98 while(ListWalker != NULL && *ListWalker == *Target) {\r
99 ListWalker++;\r
100 }\r
101 if (Meta) {\r
102 Result = gUnicodeCollation->MetaiMatch(gUnicodeCollation, (CHAR16*)TempList, (CHAR16*)MetaTarget);\r
103 } else {\r
104 Result = (BOOLEAN)(StrCmp(TempList, MetaTarget)==0);\r
105 }\r
106 if (Result) {\r
107 if (FullName != NULL) {\r
108 *FullName = TempList;\r
109 } else {\r
110 FreePool(TempList);\r
111 }\r
112 return (TRUE);\r
113 }\r
114 FreePool(TempList);\r
115 TempList = NULL;\r
116 }\r
117\r
118 return (FALSE);\r
119}\r
120\r
b54fd049 121/**\r
122 Determine what type of device is represented and return it's string. The \r
123 string is in allocated memory and must be callee freed. The HII is is listed below.\r
124 The actual string cannot be determined.\r
125\r
126 @param[in] DevicePath The device to analyze.\r
127\r
128 @retval STR_MAP_MEDIA_UNKNOWN The media type is unknown.\r
129 @retval STR_MAP_MEDIA_HARDDISK The media is a hard drive.\r
130 @retval STR_MAP_MEDIA_CDROM The media is a CD ROM.\r
131 @retval STR_MAP_MEDIA_FLOPPY The media is a floppy drive.\r
132**/\r
a405b86d 133CHAR16*\r
134EFIAPI\r
135GetDeviceMediaType (\r
136 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
137 )\r
138{\r
139 ACPI_HID_DEVICE_PATH *Acpi;\r
140\r
141 //\r
142 // Parse the device path:\r
143 // Devicepath sub type mediatype\r
144 // MEDIA_HANRDDRIVE_DP -> Hard Disk\r
145 // MEDIA_CDROM_DP -> CD Rom\r
146 // Acpi.HID = 0X0604 -> Floppy\r
147 //\r
148 if (NULL == DevicePath) {\r
149 return HiiGetString(gShellLevel2HiiHandle, STRING_TOKEN(STR_MAP_MEDIA_UNKNOWN), NULL);\r
150 }\r
151\r
152 for (;!IsDevicePathEndType (DevicePath) ;DevicePath = NextDevicePathNode (DevicePath)) {\r
153 if (DevicePathType (DevicePath) == MEDIA_DEVICE_PATH) {\r
154 switch (DevicePathSubType (DevicePath)) {\r
155 case MEDIA_HARDDRIVE_DP:\r
156 return HiiGetString(gShellLevel2HiiHandle, STRING_TOKEN(STR_MAP_MEDIA_HARDDISK), NULL);\r
157 case MEDIA_CDROM_DP:\r
158 return HiiGetString(gShellLevel2HiiHandle, STRING_TOKEN(STR_MAP_MEDIA_CDROM), NULL);\r
159 }\r
160 } else if (DevicePathType (DevicePath) == ACPI_DEVICE_PATH) {\r
161 Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath;\r
162 if (EISA_ID_TO_NUM (Acpi->HID) == 0x0604) {\r
163 return HiiGetString(gShellLevel2HiiHandle, STRING_TOKEN(STR_MAP_MEDIA_FLOPPY), NULL);\r
164 }\r
165 }\r
166 }\r
167\r
168 return HiiGetString(gShellLevel2HiiHandle, STRING_TOKEN(STR_MAP_MEDIA_UNKNOWN), NULL);\r
169}\r
170\r
171/**\r
172 Function to detemine if a handle has removable storage.\r
173\r
174 @param[in] DevicePath DevicePath to test.\r
175\r
176 @retval TRUE The handle has removable storage.\r
177 @retval FALSE The handle does not have removable storage.\r
178**/\r
179BOOLEAN\r
180EFIAPI\r
181IsRemoveableDevice (\r
182 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
183 )\r
184{\r
185 if (NULL == DevicePath) {\r
186 return FALSE;\r
187 }\r
188\r
189 while (!IsDevicePathEndType (DevicePath)) {\r
190 if (DevicePathType (DevicePath) == MESSAGING_DEVICE_PATH) {\r
191 switch (DevicePathSubType (DevicePath)) {\r
192 case MSG_USB_DP:\r
193 case MSG_SCSI_DP:\r
194 return TRUE;\r
195 default:\r
196 return FALSE;\r
197 }\r
198 }\r
199 DevicePath = NextDevicePathNode (DevicePath);\r
200 }\r
201 return FALSE;\r
202}\r
203\r
204/**\r
205 Function to detemine if a something on the map list matches.\r
206\r
207 @param[in] MapList The pointer to the list to test.\r
208 @param[in] Specific The pointer to a specific name to test for.\r
209 @param[in] TypeString The pointer to the list of types.\r
210 @param[in] Normal Always show normal mappings.\r
211 @param[in] Consist Always show consistent mappings.\r
212\r
213 @retval TRUE The map should be displayed.\r
214 @retval FALSE The map should not be displayed.\r
215**/\r
216BOOLEAN\r
217EFIAPI\r
218MappingListHasType(\r
219 IN CONST CHAR16 *MapList,\r
220 IN CONST CHAR16 *Specific,\r
221 IN CONST CHAR16 *TypeString,\r
222 IN CONST BOOLEAN Normal,\r
223 IN CONST BOOLEAN Consist\r
224 )\r
225{\r
b54fd049 226 CHAR16 *NewSpecific;\r
a405b86d 227 //\r
228 // specific has priority\r
229 //\r
b54fd049 230 if (Specific != NULL) {\r
231 NewSpecific = AllocateZeroPool(StrSize(Specific) + sizeof(CHAR16));\r
33c031ee 232 if (NewSpecific == NULL){\r
233 return FALSE;\r
234 }\r
b54fd049 235 StrCpy(NewSpecific, Specific);\r
236 if (NewSpecific[StrLen(NewSpecific)-1] != L':') {\r
237 StrCat(NewSpecific, L":");\r
238 }\r
a405b86d 239\r
b54fd049 240 if (SearchList(MapList, NewSpecific, NULL, TRUE, FALSE, L";")) {\r
241 FreePool(NewSpecific);\r
242 return (TRUE);\r
243 }\r
244 FreePool(NewSpecific);\r
245 }\r
a405b86d 246 if ( Consist\r
022ed0d7 247 && Specific == NULL\r
a405b86d 248 && (SearchList(MapList, L"HD*", NULL, TRUE, TRUE, L";")\r
249 ||SearchList(MapList, L"CD*", NULL, TRUE, TRUE, L";")\r
77dd0c81 250 ||SearchList(MapList, L"F*", NULL, TRUE, TRUE, L";")\r
a405b86d 251 ||SearchList(MapList, L"FP*", NULL, TRUE, TRUE, L";"))){\r
252 return (TRUE);\r
253 }\r
254\r
255 if ( Normal\r
022ed0d7 256 && Specific == NULL\r
a405b86d 257 && (SearchList(MapList, L"FS", NULL, FALSE, TRUE, L";")\r
258 ||SearchList(MapList, L"BLK", NULL, FALSE, TRUE, L";"))){\r
259 return (TRUE);\r
260 }\r
261\r
262 if (TypeString != NULL && SearchList(MapList, TypeString, NULL, TRUE, TRUE, L";")) {\r
263 return (TRUE);\r
264 }\r
265 return (FALSE);\r
266}\r
267\r
268\r
b54fd049 269/**\r
270 Display a single map line for device Handle if conditions are met.\r
271\r
272 @param[in] Verbose TRUE to display (extra) verbose information.\r
273 @param[in] Consist TRUE to display consistent mappings.\r
274 @param[in] Normal TRUE to display normal (not consist) mappings.\r
275 @param[in] TypeString pointer to string of filter types.\r
276 @param[in] SFO TRUE to display output in Standard Output Format.\r
277 @param[in] Specific pointer to string for specific map to display.\r
278 @param[in] Handle The handle to display from.\r
279\r
280 @retval EFI_SUCCESS The mapping was displayed.\r
281**/\r
282EFI_STATUS\r
a405b86d 283EFIAPI\r
284PerformSingleMappingDisplay(\r
285 IN CONST BOOLEAN Verbose,\r
286 IN CONST BOOLEAN Consist,\r
287 IN CONST BOOLEAN Normal,\r
288 IN CONST CHAR16 *TypeString,\r
289 IN CONST BOOLEAN SFO,\r
290 IN CONST CHAR16 *Specific OPTIONAL,\r
291 IN CONST EFI_HANDLE Handle\r
292 )\r
293{\r
294 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
295 EFI_DEVICE_PATH_PROTOCOL *DevPathCopy;\r
296 CONST CHAR16 *MapList;\r
297 CHAR16 *CurrentName;\r
298 CHAR16 *MediaType;\r
299 CHAR16 *DevPathString;\r
300 CHAR16 *TempSpot;\r
64a5bae2 301 CHAR16 *Alias;\r
a405b86d 302 UINTN TempLen;\r
303 BOOLEAN Removable;\r
304 CONST CHAR16 *TempSpot2;\r
305\r
64a5bae2
JC
306 Alias = NULL;\r
307 TempSpot2 = NULL;\r
308 CurrentName = NULL;\r
a405b86d 309 DevPath = DevicePathFromHandle(Handle);\r
310 DevPathCopy = DevPath;\r
311 MapList = gEfiShellProtocol->GetMapFromDevicePath(&DevPathCopy);\r
312 if (MapList == NULL) {\r
b54fd049 313 return EFI_NOT_FOUND;\r
a405b86d 314 }\r
315\r
316 if (!MappingListHasType(MapList, Specific, TypeString, Normal, Consist)){\r
b54fd049 317 return EFI_NOT_FOUND;\r
a405b86d 318 }\r
319\r
f747c71e
JC
320 if (Normal || !Consist) {\r
321 //\r
322 // need the Normal here since people can use both on command line. otherwise unused.\r
323 //\r
324\r
64a5bae2
JC
325 //\r
326 // Allocate a name\r
327 //\r
328 CurrentName = NULL;\r
329 CurrentName = StrnCatGrow(&CurrentName, 0, MapList, 0);\r
330 if (CurrentName == NULL) {\r
331 return (EFI_OUT_OF_RESOURCES);\r
332 }\r
333\r
334 //\r
335 // Chop off the other names that become "Alias(s)"\r
336 // leaving just the normal name\r
337 //\r
338 TempSpot = StrStr(CurrentName, L";");\r
339 if (TempSpot != NULL) {\r
340 *TempSpot = CHAR_NULL;\r
341 }\r
f747c71e 342 } else {\r
64a5bae2
JC
343 CurrentName = NULL;\r
344\r
345 //\r
346 // Skip the first name. This is the standard name.\r
347 //\r
348 TempSpot = StrStr(MapList, L";");\r
349 if (TempSpot != NULL) {\r
350 TempSpot++;\r
351 }\r
352 SearchList(TempSpot, L"HD*", &CurrentName, TRUE, FALSE, L";");\r
353 if (CurrentName == NULL) {\r
354 SearchList(TempSpot, L"CD*", &CurrentName, TRUE, FALSE, L";");\r
355 }\r
356 if (CurrentName == NULL) {\r
357 SearchList(TempSpot, L"FP*", &CurrentName, TRUE, FALSE, L";");\r
358 }\r
359 if (CurrentName == NULL) {\r
360 SearchList(TempSpot, L"F*", &CurrentName, TRUE, FALSE, L";");\r
361 }\r
362 if (CurrentName == NULL) {\r
363 //\r
364 // We didnt find anything, so just the first one in the list...\r
365 //\r
366 CurrentName = StrnCatGrow(&CurrentName, 0, MapList, 0);\r
367 if (CurrentName == NULL) {\r
368 return (EFI_OUT_OF_RESOURCES);\r
369 }\r
370 TempSpot = StrStr(CurrentName, L";");\r
371 if (TempSpot != NULL) {\r
372 *TempSpot = CHAR_NULL;\r
373 }\r
374 } else {\r
375 Alias = StrnCatGrow(&Alias, 0, MapList, 0);\r
c6cef635
SQ
376 if (Alias == NULL) {\r
377 return EFI_OUT_OF_RESOURCES;\r
378 }\r
64a5bae2
JC
379 TempSpot = StrStr(Alias, CurrentName);\r
380 if (TempSpot != NULL) {\r
381 TempSpot2 = StrStr(TempSpot, L";");\r
382 if (TempSpot2 != NULL) {\r
383 TempSpot2++; // Move past ";" from CurrentName\r
384 CopyMem(TempSpot, TempSpot2, StrSize(TempSpot2));\r
385 } else {\r
386 *TempSpot = CHAR_NULL;\r
387 }\r
388 }\r
389 if (Alias[StrLen(Alias)-1] == L';') {\r
390 Alias[StrLen(Alias)-1] = CHAR_NULL;\r
391 }\r
392 }\r
a405b86d 393 }\r
863986b3 394 DevPathString = ConvertDevicePathToText(DevPath, TRUE, FALSE);\r
f747c71e 395 TempLen = StrLen(CurrentName);\r
a405b86d 396 if (!SFO) {\r
a405b86d 397 ShellPrintHiiEx (\r
398 -1,\r
399 -1,\r
400 NULL,\r
401 STRING_TOKEN (STR_MAP_ENTRY),\r
402 gShellLevel2HiiHandle,\r
403 CurrentName,\r
64a5bae2 404 Alias!=NULL?Alias:(TempLen < StrLen(MapList)?MapList + TempLen+1:L""),\r
a405b86d 405 DevPathString\r
406 );\r
407 if (Verbose) {\r
408 //\r
409 // also print handle, media type, removable (y/n), and current directory\r
410 //\r
411 MediaType = GetDeviceMediaType(DevPath);\r
412 if ((TypeString != NULL &&MediaType != NULL && StrStr(TypeString, MediaType) != NULL) || TypeString == NULL) {\r
413 Removable = IsRemoveableDevice(DevPath);\r
414 TempSpot2 = ShellGetCurrentDir(CurrentName);\r
415 ShellPrintHiiEx (\r
416 -1,\r
417 -1,\r
418 NULL,\r
419 STRING_TOKEN (STR_MAP_ENTRY_VERBOSE),\r
420 gShellLevel2HiiHandle,\r
421 ConvertHandleToHandleIndex(Handle),\r
422 MediaType,\r
423 Removable?L"Yes":L"No",\r
424 TempSpot2\r
425 );\r
426 }\r
64a5bae2 427 SHELL_FREE_NON_NULL(MediaType);\r
a405b86d 428 }\r
429 } else {\r
a405b86d 430 ShellPrintHiiEx (\r
431 -1,\r
432 -1,\r
433 NULL,\r
434 STRING_TOKEN (STR_MAP_SFO_MAPPINGS),\r
435 gShellLevel2HiiHandle,\r
436 CurrentName,\r
437 DevPathString,\r
64a5bae2 438 Consist?L"":(TempLen < StrLen(MapList)?MapList + TempLen+1:L"")\r
a405b86d 439 );\r
440 }\r
64a5bae2
JC
441 SHELL_FREE_NON_NULL(DevPathString);\r
442 SHELL_FREE_NON_NULL(CurrentName);\r
443 SHELL_FREE_NON_NULL(Alias);\r
b54fd049 444 return EFI_SUCCESS;\r
a405b86d 445}\r
446\r
b54fd049 447/**\r
448 Delete Specific from the list of maps for device Handle.\r
449\r
450 @param[in] Specific The name to delete.\r
451 @param[in] Handle The device to look on.\r
452\r
453 @retval EFI_SUCCESS The delete was successful.\r
454 @retval EFI_NOT_FOUND Name was not a map on Handle.\r
455**/\r
a405b86d 456EFI_STATUS\r
457EFIAPI\r
458PerformSingleMappingDelete(\r
459 IN CONST CHAR16 *Specific,\r
460 IN CONST EFI_HANDLE Handle\r
461 )\r
462{\r
463 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
464 EFI_DEVICE_PATH_PROTOCOL *DevPathCopy;\r
465 CONST CHAR16 *MapList;\r
466 CHAR16 *CurrentName;\r
467\r
468 DevPath = DevicePathFromHandle(Handle);\r
469 DevPathCopy = DevPath;\r
470 MapList = gEfiShellProtocol->GetMapFromDevicePath(&DevPathCopy);\r
471 CurrentName = NULL;\r
472\r
473 if (MapList == NULL) {\r
474 return (EFI_NOT_FOUND);\r
475 }\r
476 //\r
477 // if there is a specific and its not on the list...\r
478 //\r
479 if (!SearchList(MapList, Specific, &CurrentName, TRUE, FALSE, L";")) {\r
480 return (EFI_NOT_FOUND);\r
481 }\r
482 return (gEfiShellProtocol->SetMap(NULL, CurrentName));\r
483}\r
484\r
b54fd049 485CONST CHAR16 Cd[] = L"cd*";\r
486CONST CHAR16 Hd[] = L"hd*";\r
487CONST CHAR16 Fp[] = L"fp*";\r
488CONST CHAR16 AnyF[] = L"F*";\r
a405b86d 489/**\r
490 Function to display mapping information to the user.\r
491\r
a1d4bfcc 492 If Specific is specified then Consist and Normal will be ignored since information will\r
a405b86d 493 be printed for the specific item only.\r
494\r
a1d4bfcc 495 @param[in] Verbose TRUE to display (extra) verbose information.\r
496 @param[in] Consist TRUE to display consistent mappings.\r
497 @param[in] Normal TRUE to display normal (not consist) mappings.\r
498 @param[in] TypeString Pointer to string of filter types.\r
499 @param[in] SFO TRUE to display output in Standard Output Format.\r
500 @param[in] Specific Pointer to string for specific map to display.\r
501 @param[in] Header TRUE to print the header block.\r
a405b86d 502\r
a1d4bfcc 503 @retval SHELL_SUCCESS The display was printed.\r
504 @retval SHELL_INVALID_PARAMETER One of Consist or Normal must be TRUE if no Specific.\r
a405b86d 505\r
506**/\r
a405b86d 507SHELL_STATUS\r
508EFIAPI\r
509PerformMappingDisplay(\r
510 IN CONST BOOLEAN Verbose,\r
511 IN CONST BOOLEAN Consist,\r
512 IN CONST BOOLEAN Normal,\r
513 IN CONST CHAR16 *TypeString,\r
514 IN CONST BOOLEAN SFO,\r
515 IN CONST CHAR16 *Specific OPTIONAL,\r
516 IN CONST BOOLEAN Header\r
517 )\r
518{\r
519 EFI_STATUS Status;\r
520 EFI_HANDLE *HandleBuffer;\r
521 UINTN BufferSize;\r
522 UINTN LoopVar;\r
523 CHAR16 *Test;\r
b54fd049 524 BOOLEAN Found;\r
a405b86d 525\r
526 if (!Consist && !Normal && Specific == NULL && TypeString == NULL) {\r
527 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
528 return (SHELL_INVALID_PARAMETER);\r
529 }\r
530\r
531 if (TypeString != NULL) {\r
532 Test = (CHAR16*)Cd;\r
533 if (StrnCmp(TypeString, Test, StrLen(Test)-1) != 0) {\r
534 Test = (CHAR16*)Hd;\r
535 if (StrnCmp(TypeString, Test, StrLen(Test)-1) != 0) {\r
536 Test = (CHAR16*)Fp;\r
537 if (StrnCmp(TypeString, Test, StrLen(Test)-1) != 0) {\r
538 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, TypeString);\r
539 return (SHELL_INVALID_PARAMETER);\r
540 }\r
541 } else if (Test == NULL) {\r
b54fd049 542 Test = (CHAR16*)AnyF;\r
a405b86d 543 }\r
544 }\r
545 } else {\r
546 Test = NULL;\r
547 }\r
548\r
549 if (Header) {\r
550 //\r
551 // Print the header\r
552 //\r
553 if (!SFO) {\r
554 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MAP_HEADER), gShellLevel2HiiHandle);\r
555 } else {\r
556 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellLevel2HiiHandle, L"map");\r
557 }\r
558 }\r
559\r
560 BufferSize = 0;\r
561 HandleBuffer = NULL;\r
562\r
563 //\r
564 // Look up all SimpleFileSystems in the platform\r
565 //\r
566 Status = gBS->LocateHandle(\r
567 ByProtocol,\r
b54fd049 568 &gEfiSimpleFileSystemProtocolGuid,\r
a405b86d 569 NULL,\r
570 &BufferSize,\r
571 HandleBuffer);\r
572 if (Status == EFI_BUFFER_TOO_SMALL) {\r
b54fd049 573 HandleBuffer = AllocateZeroPool(BufferSize);\r
9ea69f8a 574 if (HandleBuffer == NULL) {\r
575 return (SHELL_OUT_OF_RESOURCES);\r
576 }\r
a405b86d 577 Status = gBS->LocateHandle(\r
578 ByProtocol,\r
b54fd049 579 &gEfiSimpleFileSystemProtocolGuid,\r
a405b86d 580 NULL,\r
581 &BufferSize,\r
582 HandleBuffer);\r
583 }\r
a405b86d 584\r
585 //\r
586 // Get the map name(s) for each one.\r
587 //\r
b54fd049 588 for ( LoopVar = 0, Found = FALSE\r
33c031ee 589 ; LoopVar < (BufferSize / sizeof(EFI_HANDLE)) && HandleBuffer != NULL\r
a405b86d 590 ; LoopVar ++\r
591 ){\r
b54fd049 592 Status = PerformSingleMappingDisplay(\r
a405b86d 593 Verbose,\r
594 Consist,\r
595 Normal,\r
596 Test,\r
597 SFO,\r
598 Specific,\r
599 HandleBuffer[LoopVar]);\r
b54fd049 600 if (!EFI_ERROR(Status)) {\r
601 Found = TRUE;\r
602 }\r
a405b86d 603 }\r
604\r
605 //\r
606 // Look up all BlockIo in the platform\r
607 //\r
608 Status = gBS->LocateHandle(\r
609 ByProtocol,\r
610 &gEfiBlockIoProtocolGuid,\r
611 NULL,\r
612 &BufferSize,\r
613 HandleBuffer);\r
614 if (Status == EFI_BUFFER_TOO_SMALL) {\r
33c031ee 615 SHELL_FREE_NON_NULL(HandleBuffer);\r
b54fd049 616 HandleBuffer = AllocateZeroPool(BufferSize);\r
9ea69f8a 617 if (HandleBuffer == NULL) {\r
618 return (SHELL_OUT_OF_RESOURCES);\r
619 }\r
a405b86d 620 Status = gBS->LocateHandle(\r
621 ByProtocol,\r
622 &gEfiBlockIoProtocolGuid,\r
623 NULL,\r
624 &BufferSize,\r
625 HandleBuffer);\r
626 }\r
ae724571 627 if (!EFI_ERROR(Status) && HandleBuffer != NULL) {\r
a405b86d 628 //\r
9ea69f8a 629 // Get the map name(s) for each one.\r
a405b86d 630 //\r
9ea69f8a 631 for ( LoopVar = 0\r
632 ; LoopVar < BufferSize / sizeof(EFI_HANDLE)\r
633 ; LoopVar ++\r
634 ){\r
635 //\r
636 // Skip any that were already done...\r
637 //\r
638 if (gBS->OpenProtocol(\r
639 HandleBuffer[LoopVar],\r
b54fd049 640 &gEfiSimpleFileSystemProtocolGuid,\r
9ea69f8a 641 NULL,\r
642 gImageHandle,\r
643 NULL,\r
644 EFI_OPEN_PROTOCOL_TEST_PROTOCOL) == EFI_SUCCESS) {\r
645 continue;\r
646 }\r
b54fd049 647 Status = PerformSingleMappingDisplay(\r
9ea69f8a 648 Verbose,\r
649 Consist,\r
650 Normal,\r
651 Test,\r
652 SFO,\r
653 Specific,\r
654 HandleBuffer[LoopVar]);\r
b54fd049 655 if (!EFI_ERROR(Status)) {\r
656 Found = TRUE;\r
657 }\r
a405b86d 658 }\r
9ea69f8a 659 FreePool(HandleBuffer);\r
a405b86d 660 }\r
b54fd049 661 if (!Found) {\r
77dd0c81 662 if (Specific != NULL) {\r
663 ShellPrintHiiEx(gST->ConOut->Mode->CursorColumn, gST->ConOut->Mode->CursorRow-1, NULL, STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, Specific);\r
664 } else {\r
665 ShellPrintHiiEx(gST->ConOut->Mode->CursorColumn, gST->ConOut->Mode->CursorRow-1, NULL, STRING_TOKEN (STR_CD_NF), gShellLevel2HiiHandle);\r
666 }\r
b54fd049 667 }\r
a405b86d 668 return (SHELL_SUCCESS);\r
669}\r
670\r
b54fd049 671/**\r
672 Perform a mapping display and parse for multiple types in the TypeString.\r
673\r
674 @param[in] Verbose TRUE to use verbose output.\r
675 @param[in] Consist TRUE to display consistent names.\r
676 @param[in] Normal TRUE to display normal names.\r
677 @param[in] TypeString An optional comma-delimited list of types.\r
678 @param[in] SFO TRUE to display in SFO format. See Spec.\r
679 @param[in] Specific An optional specific map name to display alone.\r
680\r
681 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
682 @retval SHELL_SUCCESS The display was successful.\r
683 @sa PerformMappingDisplay\r
684**/\r
a405b86d 685SHELL_STATUS\r
686EFIAPI\r
687PerformMappingDisplay2(\r
688 IN CONST BOOLEAN Verbose,\r
689 IN CONST BOOLEAN Consist,\r
690 IN CONST BOOLEAN Normal,\r
691 IN CONST CHAR16 *TypeString,\r
692 IN CONST BOOLEAN SFO,\r
693 IN CONST CHAR16 *Specific OPTIONAL\r
694 )\r
695{\r
696 CONST CHAR16 *TypeWalker;\r
697 SHELL_STATUS ShellStatus;\r
698 CHAR16 *Comma;\r
699\r
700\r
701 if (TypeString == NULL) {\r
702 return (PerformMappingDisplay(Verbose, Consist, Normal, NULL, SFO, Specific, TRUE));\r
703 }\r
704 ShellStatus = SHELL_SUCCESS;\r
705 for (TypeWalker = TypeString ; TypeWalker != NULL && *TypeWalker != CHAR_NULL ;) {\r
706 Comma = StrStr(TypeWalker, L",");\r
707 if (Comma == NULL) {\r
708 if (ShellStatus == SHELL_SUCCESS) {\r
709 ShellStatus = PerformMappingDisplay(Verbose, Consist, Normal, TypeWalker, SFO, Specific, (BOOLEAN)(TypeWalker == TypeString));\r
710 } else {\r
711 PerformMappingDisplay(Verbose, Consist, Normal, TypeWalker, SFO, Specific, (BOOLEAN)(TypeWalker == TypeString));\r
712 }\r
713 break;\r
714 } else {\r
715 *Comma = CHAR_NULL;\r
716 if (ShellStatus == SHELL_SUCCESS) {\r
717 ShellStatus = PerformMappingDisplay(Verbose, Consist, Normal, TypeWalker, SFO, Specific, (BOOLEAN)(TypeWalker == TypeString));\r
718 } else {\r
719 PerformMappingDisplay(Verbose, Consist, Normal, TypeWalker, SFO, Specific, (BOOLEAN)(TypeWalker == TypeString));\r
720 }\r
721 *Comma = L',';\r
722 TypeWalker = Comma + 1;\r
723 }\r
724 }\r
725\r
726 return (ShellStatus);\r
727}\r
728\r
b54fd049 729/**\r
730 Delete a specific map.\r
731\r
732 @param[in] Specific The pointer to the name of the map to delete.\r
733\r
734 @retval EFI_INVALID_PARAMETER Specific was NULL.\r
735 @retval EFI_SUCCESS The operation was successful.\r
736 @retval EFI_NOT_FOUND Specific could not be found.\r
737**/\r
a405b86d 738EFI_STATUS\r
739EFIAPI\r
740PerformMappingDelete(\r
741 IN CONST CHAR16 *Specific\r
742 )\r
743{\r
744 EFI_STATUS Status;\r
745 EFI_HANDLE *HandleBuffer;\r
746 UINTN BufferSize;\r
747 UINTN LoopVar;\r
748 BOOLEAN Deleted;\r
749\r
750 if (Specific == NULL) {\r
751 return (EFI_INVALID_PARAMETER);\r
752 }\r
753\r
754 BufferSize = 0;\r
755 HandleBuffer = NULL;\r
756 Deleted = FALSE;\r
757\r
758 //\r
759 // Look up all SimpleFileSystems in the platform\r
760 //\r
761 Status = gBS->LocateHandle(\r
762 ByProtocol,\r
763 &gEfiDevicePathProtocolGuid,\r
764 NULL,\r
765 &BufferSize,\r
766 HandleBuffer);\r
767 if (Status == EFI_BUFFER_TOO_SMALL) {\r
b54fd049 768 HandleBuffer = AllocateZeroPool(BufferSize);\r
3e082d58 769 if (HandleBuffer == NULL) {\r
770 return (EFI_OUT_OF_RESOURCES);\r
771 }\r
a405b86d 772 Status = gBS->LocateHandle(\r
773 ByProtocol,\r
774 &gEfiDevicePathProtocolGuid,\r
775 NULL,\r
776 &BufferSize,\r
777 HandleBuffer);\r
778 }\r
3e082d58 779 if (EFI_ERROR(Status)) {\r
780 SHELL_FREE_NON_NULL(HandleBuffer);\r
781 return (Status);\r
782 }\r
a405b86d 783\r
c154b997 784 if (HandleBuffer != NULL) {\r
785 //\r
786 // Get the map name(s) for each one.\r
787 //\r
788 for ( LoopVar = 0\r
789 ; LoopVar < BufferSize / sizeof(EFI_HANDLE)\r
790 ; LoopVar ++\r
791 ){\r
792 if (PerformSingleMappingDelete(Specific,HandleBuffer[LoopVar]) == SHELL_SUCCESS) {\r
793 Deleted = TRUE;\r
794 }\r
a405b86d 795 }\r
796 }\r
a405b86d 797 //\r
798 // Look up all BlockIo in the platform\r
799 //\r
800 Status = gBS->LocateHandle(\r
801 ByProtocol,\r
802 &gEfiBlockIoProtocolGuid,\r
803 NULL,\r
804 &BufferSize,\r
805 HandleBuffer);\r
806 if (Status == EFI_BUFFER_TOO_SMALL) {\r
807 FreePool(HandleBuffer);\r
b54fd049 808 HandleBuffer = AllocateZeroPool(BufferSize);\r
3e082d58 809 if (HandleBuffer == NULL) {\r
810 return (EFI_OUT_OF_RESOURCES);\r
811 }\r
a405b86d 812 Status = gBS->LocateHandle(\r
813 ByProtocol,\r
814 &gEfiBlockIoProtocolGuid,\r
815 NULL,\r
816 &BufferSize,\r
817 HandleBuffer);\r
818 }\r
3e082d58 819 if (EFI_ERROR(Status)) {\r
820 SHELL_FREE_NON_NULL(HandleBuffer);\r
821 return (Status);\r
822 }\r
a405b86d 823\r
c154b997 824 if (HandleBuffer != NULL) {\r
a405b86d 825 //\r
c154b997 826 // Get the map name(s) for each one.\r
a405b86d 827 //\r
c154b997 828 for ( LoopVar = 0\r
829 ; LoopVar < BufferSize / sizeof(EFI_HANDLE)\r
830 ; LoopVar ++\r
831 ){\r
832 //\r
833 // Skip any that were already done...\r
834 //\r
835 if (gBS->OpenProtocol(\r
836 HandleBuffer[LoopVar],\r
837 &gEfiDevicePathProtocolGuid,\r
838 NULL,\r
839 gImageHandle,\r
840 NULL,\r
841 EFI_OPEN_PROTOCOL_TEST_PROTOCOL) == EFI_SUCCESS) {\r
842 continue;\r
843 }\r
844 if (PerformSingleMappingDelete(Specific,HandleBuffer[LoopVar]) == SHELL_SUCCESS) {\r
845 Deleted = TRUE;\r
846 }\r
a405b86d 847 }\r
848 }\r
c154b997 849 SHELL_FREE_NON_NULL(HandleBuffer);\r
a405b86d 850 if (!Deleted) {\r
851 return (EFI_NOT_FOUND);\r
852 }\r
853 return (EFI_SUCCESS);\r
854}\r
855\r
856/**\r
857 function to add a mapping from mapping.\r
858\r
859 This function will get the device path associated with the mapping and call SetMap.\r
860\r
861 @param[in] Map The Map to add a mapping for\r
862 @param[in] SName The name of the new mapping\r
863\r
864 @retval SHELL_SUCCESS the mapping was added\r
865 @retval SHELL_INVALID_PARAMETER the device path for Map could not be retrieved.\r
866 @return Shell version of a return value from EfiShellProtocol->SetMap\r
867\r
868**/\r
869SHELL_STATUS\r
870EFIAPI\r
871AddMappingFromMapping(\r
872 IN CONST CHAR16 *Map,\r
873 IN CONST CHAR16 *SName\r
874 )\r
875{\r
876 CONST EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
877 EFI_STATUS Status;\r
b54fd049 878 CHAR16 *NewSName;\r
879 \r
880 NewSName = AllocateZeroPool(StrSize(SName) + sizeof(CHAR16));\r
33c031ee 881 if (NewSName == NULL) {\r
882 return (SHELL_OUT_OF_RESOURCES);\r
883 }\r
b54fd049 884 StrCpy(NewSName, SName);\r
885 if (NewSName[StrLen(NewSName)-1] != L':') {\r
886 StrCat(NewSName, L":");\r
887 }\r
a405b86d 888\r
b54fd049 889 if (!IsNumberLetterOnly(NewSName, StrLen(NewSName)-1)) {\r
890 FreePool(NewSName);\r
a405b86d 891 return (SHELL_INVALID_PARAMETER);\r
892 }\r
893\r
894 DevPath = gEfiShellProtocol->GetDevicePathFromMap(Map);\r
895 if (DevPath == NULL) {\r
b54fd049 896 FreePool(NewSName);\r
a405b86d 897 return (SHELL_INVALID_PARAMETER);\r
898 }\r
899\r
b54fd049 900 Status = gEfiShellProtocol->SetMap(DevPath, NewSName);\r
901 FreePool(NewSName);\r
a405b86d 902 if (EFI_ERROR(Status)) {\r
903 return (SHELL_DEVICE_ERROR);\r
904 }\r
905 return (SHELL_SUCCESS);\r
906}\r
907\r
a405b86d 908/**\r
909 function to add a mapping from an EFI_HANDLE.\r
910\r
911 This function will get the device path associated with the Handle and call SetMap.\r
912\r
913 @param[in] Handle The handle to add a mapping for\r
914 @param[in] SName The name of the new mapping\r
915\r
916 @retval SHELL_SUCCESS the mapping was added\r
917 @retval SHELL_INVALID_PARAMETER SName was not valid for a map name.\r
918 @return Shell version of a return value from either\r
919 gBS->OpenProtocol or EfiShellProtocol->SetMap\r
920\r
921**/\r
922SHELL_STATUS\r
923EFIAPI\r
924AddMappingFromHandle(\r
925 IN CONST EFI_HANDLE Handle,\r
926 IN CONST CHAR16 *SName\r
927 )\r
928{\r
929 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
930 EFI_STATUS Status;\r
b54fd049 931 CHAR16 *NewSName;\r
932 \r
933 NewSName = AllocateZeroPool(StrSize(SName) + sizeof(CHAR16));\r
33c031ee 934 if (NewSName == NULL) {\r
935 return (SHELL_OUT_OF_RESOURCES);\r
936 }\r
b54fd049 937 StrCpy(NewSName, SName);\r
938 if (NewSName[StrLen(NewSName)-1] != L':') {\r
939 StrCat(NewSName, L":");\r
940 }\r
a405b86d 941\r
b54fd049 942 if (!IsNumberLetterOnly(NewSName, StrLen(NewSName)-1)) {\r
943 FreePool(NewSName);\r
a405b86d 944 return (SHELL_INVALID_PARAMETER);\r
945 }\r
946\r
947 Status = gBS->OpenProtocol(\r
948 Handle,\r
949 &gEfiDevicePathProtocolGuid,\r
950 (VOID**)&DevPath,\r
951 gImageHandle,\r
952 NULL,\r
953 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
954 );\r
955 if (EFI_ERROR(Status)) {\r
b54fd049 956 FreePool(NewSName);\r
a405b86d 957 return (SHELL_DEVICE_ERROR);\r
958 }\r
b54fd049 959 Status = gEfiShellProtocol->SetMap(DevPath, NewSName);\r
960 FreePool(NewSName);\r
a405b86d 961 if (EFI_ERROR(Status)) {\r
962 return (SHELL_DEVICE_ERROR);\r
963 }\r
964 return (SHELL_SUCCESS);\r
965}\r
966\r
967STATIC CONST SHELL_PARAM_ITEM MapParamList[] = {\r
968 {L"-d", TypeValue},\r
969 {L"-r", TypeFlag},\r
970 {L"-v", TypeFlag},\r
971 {L"-c", TypeFlag},\r
972 {L"-f", TypeFlag},\r
973 {L"-u", TypeFlag},\r
974 {L"-t", TypeValue},\r
975 {L"-sfo", TypeValue},\r
976 {NULL, TypeMax}\r
977 };\r
978\r
979/**\r
980 Function for 'map' command.\r
981\r
982 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
983 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
984**/\r
985SHELL_STATUS\r
986EFIAPI\r
987ShellCommandRunMap (\r
988 IN EFI_HANDLE ImageHandle,\r
989 IN EFI_SYSTEM_TABLE *SystemTable\r
990 )\r
991{\r
992 EFI_STATUS Status;\r
993 LIST_ENTRY *Package;\r
994 CHAR16 *ProblemParam;\r
995 CONST CHAR16 *SName;\r
996 CONST CHAR16 *Mapping;\r
b54fd049 997 EFI_HANDLE MapAsHandle;\r
a405b86d 998 SHELL_STATUS ShellStatus;\r
999 BOOLEAN SfoMode;\r
1000 BOOLEAN ConstMode;\r
1001 BOOLEAN NormlMode;\r
1002 CONST CHAR16 *Param1;\r
1003 CONST CHAR16 *TypeString;\r
b54fd049 1004 UINTN TempStringLength;\r
a405b86d 1005\r
1006 ProblemParam = NULL;\r
1007 Mapping = NULL;\r
1008 SName = NULL;\r
a405b86d 1009 ShellStatus = SHELL_SUCCESS;\r
b54fd049 1010 MapAsHandle = NULL;\r
a405b86d 1011\r
1012 //\r
1013 // initialize the shell lib (we must be in non-auto-init...)\r
1014 //\r
1015 Status = ShellInitialize();\r
1016 ASSERT_EFI_ERROR(Status);\r
1017\r
1018 Status = CommandInit();\r
1019 ASSERT_EFI_ERROR(Status);\r
1020\r
1021 //\r
1022 // parse the command line\r
1023 //\r
1024 Status = ShellCommandLineParse (MapParamList, &Package, &ProblemParam, TRUE);\r
1025 if (EFI_ERROR(Status)) {\r
1026 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
1027 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
1028 FreePool(ProblemParam);\r
1029 ShellStatus = SHELL_INVALID_PARAMETER;\r
1030 } else {\r
1031 ASSERT(FALSE);\r
1032 }\r
1033 } else {\r
1034 //\r
1035 // check for "-?"\r
1036 //\r
1037 SfoMode = ShellCommandLineGetFlag(Package, L"-sfo");\r
1038 ConstMode = ShellCommandLineGetFlag(Package, L"-c");\r
1039 NormlMode = ShellCommandLineGetFlag(Package, L"-f");\r
1040 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
1041 ASSERT(FALSE);\r
1042 } else if (ShellCommandLineGetRawValue(Package, 3) != NULL) {\r
1043 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle);\r
1044 ShellStatus = SHELL_INVALID_PARAMETER;\r
1045 } else {\r
1046 //\r
1047 // Deleting a map name...\r
1048 //\r
1049 if (ShellCommandLineGetFlag(Package, L"-d")) {\r
1050 if ( ShellCommandLineGetFlag(Package, L"-r")\r
1051 || ShellCommandLineGetFlag(Package, L"-v")\r
1052 || ConstMode\r
1053 || NormlMode\r
1054 || ShellCommandLineGetFlag(Package, L"-u")\r
1055 || ShellCommandLineGetFlag(Package, L"-t")\r
1056 ){\r
1057 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle);\r
1058 ShellStatus = SHELL_INVALID_PARAMETER;\r
1059 } else {\r
1060 SName = ShellCommandLineGetValue(Package, L"-d");\r
1061 if (SName != NULL) {\r
1062 Status = PerformMappingDelete(SName);\r
1063 if (EFI_ERROR(Status)) {\r
cbcccd2c
LG
1064 if (Status == EFI_ACCESS_DENIED) {\r
1065 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle);\r
1066 ShellStatus = SHELL_ACCESS_DENIED;\r
1067 } else if (Status == EFI_NOT_FOUND) {\r
1068 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MAP_NF), gShellLevel2HiiHandle, SName);\r
1069 ShellStatus = SHELL_INVALID_PARAMETER;\r
1070 } else {\r
1071 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, Status);\r
1072 ShellStatus = SHELL_UNSUPPORTED;\r
a405b86d 1073 }\r
1074 }\r
1075 } else {\r
1076 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
1077 ShellStatus = SHELL_INVALID_PARAMETER;\r
1078 }\r
1079 }\r
1080 } else if ( ShellCommandLineGetFlag(Package, L"-r")\r
1081// || ShellCommandLineGetFlag(Package, L"-v")\r
1082 || ConstMode\r
1083 || NormlMode\r
1084 || ShellCommandLineGetFlag(Package, L"-u")\r
1085 || ShellCommandLineGetFlag(Package, L"-t")\r
1086 ){\r
1087 if ( ShellCommandLineGetFlag(Package, L"-r")) {\r
1088 //\r
1089 // Do the reset\r
1090 //\r
1091 Status = ShellCommandCreateInitialMappingsAndPaths();\r
1092 if (EFI_ERROR(Status)) {\r
1093 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, Status);\r
1094 ShellStatus = SHELL_UNSUPPORTED;\r
1095 }\r
1096 }\r
1097 if ( ShellStatus == SHELL_SUCCESS && ShellCommandLineGetFlag(Package, L"-u")) {\r
1098 //\r
1099 // Do the Update\r
1100 //\r
e71cb452 1101 Status = ShellCommandUpdateMapping ();\r
a405b86d 1102 if (EFI_ERROR(Status)) {\r
1103 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, Status);\r
1104 ShellStatus = SHELL_UNSUPPORTED;\r
1105 }\r
1106 }\r
1107 if (ShellStatus == SHELL_SUCCESS) {\r
1108 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
1109 TypeString = ShellCommandLineGetValue(Package, L"-t");\r
1110 if (!ConstMode\r
1111 &&!NormlMode\r
1112 &&TypeString == NULL\r
1113 ) {\r
1114 //\r
1115 // now do the display...\r
1116 //\r
1117 ShellStatus = PerformMappingDisplay(\r
1118 ShellCommandLineGetFlag(Package, L"-v"),\r
1119 TRUE,\r
1120 TRUE,\r
1121 NULL,\r
1122 SfoMode,\r
1123 Param1,\r
1124 TRUE\r
1125 );\r
1126 } else {\r
1127 //\r
1128 // now do the display...\r
1129 //\r
1130 ShellStatus = PerformMappingDisplay2(\r
1131 ShellCommandLineGetFlag(Package, L"-v"),\r
1132 ConstMode,\r
1133 NormlMode,\r
1134 TypeString,\r
1135 SfoMode,\r
1136 Param1\r
1137 );\r
1138 }\r
1139 }\r
1140 } else {\r
1141 //\r
1142 // adding or displaying (there were no flags)\r
1143 //\r
1144 SName = ShellCommandLineGetRawValue(Package, 1);\r
1145 Mapping = ShellCommandLineGetRawValue(Package, 2);\r
1146 if ( SName == NULL\r
1147 && Mapping == NULL\r
1148 ){\r
1149 //\r
1150 // display only since no flags\r
1151 //\r
1152 ShellStatus = PerformMappingDisplay(\r
1153 ShellCommandLineGetFlag(Package, L"-v"),\r
1154 TRUE,\r
1155 TRUE,\r
1156 NULL,\r
1157 SfoMode,\r
1158 NULL,\r
1159 TRUE\r
1160 );\r
1161 } else if ( SName == NULL\r
1162 || Mapping == NULL\r
1163 ){\r
1164 //\r
1165 // Display only the one specified\r
1166 //\r
1167 ShellStatus = PerformMappingDisplay(\r
1168 FALSE,\r
1169 FALSE,\r
1170 FALSE,\r
1171 NULL,\r
1172 SfoMode,\r
1173 SName, // note the variable here...\r
1174 TRUE\r
1175 );\r
1176 } else {\r
1177 if (ShellIsHexOrDecimalNumber(Mapping, TRUE, FALSE)) {\r
b54fd049 1178 MapAsHandle = ConvertHandleIndexToHandle(ShellStrToUintn(Mapping));\r
a405b86d 1179 } else {\r
b54fd049 1180 MapAsHandle = NULL;\r
a405b86d 1181 }\r
b54fd049 1182 if (MapAsHandle == NULL && Mapping[StrLen(Mapping)-1] != L':') {\r
a405b86d 1183 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, Mapping);\r
1184 ShellStatus = SHELL_INVALID_PARAMETER;\r
1185 } else {\r
b54fd049 1186 if (MapAsHandle != NULL) {\r
1187 TempStringLength = StrLen(SName);\r
1188 if (!IsNumberLetterOnly(SName, TempStringLength-(SName[TempStringLength-1]==L':'?1:0))) {\r
1189 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, SName);\r
1190 ShellStatus = SHELL_INVALID_PARAMETER;\r
1191 } else {\r
1192 ShellStatus = AddMappingFromHandle(MapAsHandle, SName);\r
1193 }\r
a405b86d 1194 } else {\r
b54fd049 1195 TempStringLength = StrLen(SName);\r
1196 if (!IsNumberLetterOnly(SName, TempStringLength-(SName[TempStringLength-1]==L':'?1:0))) {\r
1197 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, SName);\r
1198 ShellStatus = SHELL_INVALID_PARAMETER;\r
1199 } else {\r
1200 ShellStatus = AddMappingFromMapping(Mapping, SName);\r
1201 }\r
a405b86d 1202 }\r
1203 if (ShellStatus != SHELL_SUCCESS) {\r
1204 switch (ShellStatus) {\r
1205 case SHELL_ACCESS_DENIED:\r
1206 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellLevel2HiiHandle);\r
1207 break;\r
1208 case SHELL_INVALID_PARAMETER:\r
1209 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle);\r
1210 break;\r
b54fd049 1211 case SHELL_DEVICE_ERROR:\r
1212 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MAP_NOF), gShellLevel2HiiHandle, Mapping);\r
1213 break;\r
a405b86d 1214 default:\r
1215 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, ShellStatus|MAX_BIT);\r
1216 }\r
1217 } else {\r
1218 //\r
1219 // now do the display...\r
1220 //\r
1221 ShellStatus = PerformMappingDisplay(\r
1222 FALSE,\r
1223 FALSE,\r
1224 FALSE,\r
1225 NULL,\r
1226 SfoMode,\r
1227 SName,\r
1228 TRUE\r
1229 );\r
1230 } // we were sucessful so do an output\r
1231 } // got a valid map target\r
1232 } // got 2 variables\r
1233 } // we are adding a mapping\r
1234 } // got valid parameters\r
1235 }\r
1236\r
1237 //\r
1238 // free the command line package\r
1239 //\r
1240 ShellCommandLineFreeVarList (Package);\r
1241\r
1242 return (ShellStatus);\r
1243}\r
1244\r