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