]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c
Comment's added and fixed.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Mv.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for mv shell level 2 function.\r
3\r
b54fd049 4 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
a405b86d 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellLevel2CommandsLib.h"\r
16\r
17/**\r
18 Function to validate that moving a specific file (FileName) to a specific\r
19 location (DestPath) is valid.\r
20\r
21 This function will verify that the destination is not a subdirectory of\r
22 FullName, that the Current working Directory is not being moved, and that\r
23 the directory is not read only.\r
24\r
25 if the move is invalid this function will report the error to StdOut.\r
26\r
27 @param FullName [in] The name of the file to move.\r
28 @param Cwd [in] The current working directory\r
29 @param DestPath [in] The target location to move to\r
30 @param Attribute[in] The Attribute of the file\r
31\r
32 @retval TRUE The move is valid\r
33 @retval FALSE The move is not\r
34**/\r
35BOOLEAN\r
36EFIAPI\r
37IsValidMove(\r
38 IN CONST CHAR16 *FullName,\r
39 IN CONST CHAR16 *Cwd,\r
40 IN CONST CHAR16 *DestPath,\r
41 IN CONST UINT64 Attribute\r
42 )\r
43{\r
44 CHAR16 *Test;\r
45 CHAR16 *Test1;\r
46 CHAR16 *TestWalker;\r
3e082d58 47 INTN Result;\r
a405b86d 48 UINTN TempLen;\r
49 if (Cwd != NULL && StrCmp(FullName, Cwd) == 0) {\r
50 //\r
51 // Invalid move\r
52 //\r
53 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MV_INV_CWD), gShellLevel2HiiHandle);\r
54 return (FALSE);\r
55 }\r
56 Test = NULL;\r
57 Test = StrnCatGrow(&Test, NULL, DestPath, 0);\r
58 TestWalker = Test;\r
59 ASSERT(TestWalker != NULL);\r
60 while(*TestWalker == L'\\') {\r
61 TestWalker++;\r
62 }\r
63 while(TestWalker != NULL && TestWalker[StrLen(TestWalker)-1] == L'\\') {\r
64 TestWalker[StrLen(TestWalker)-1] = CHAR_NULL;\r
65 }\r
66 ASSERT(TestWalker != NULL);\r
67 ASSERT(FullName != NULL);\r
68 if (StrStr(FullName, TestWalker) != 0) {\r
69 TempLen = StrLen(FullName);\r
70 if (StrStr(FullName, TestWalker) != FullName // not the first items... (could below it)\r
71 && TempLen <= (StrLen(TestWalker) + 1)\r
72 && StrStr(FullName+StrLen(TestWalker) + 1, L"\\") == NULL) {\r
73 //\r
74 // Invalid move\r
75 //\r
76 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MV_INV_SUB), gShellLevel2HiiHandle);\r
77 FreePool(Test);\r
78 return (FALSE);\r
79 }\r
80 }\r
81 FreePool(Test);\r
82 if (StrStr(DestPath, FullName) != 0 && StrStr(DestPath, FullName) != DestPath) {\r
83 //\r
84 // Invalid move\r
85 //\r
86 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MV_INV_SUB), gShellLevel2HiiHandle);\r
87 return (FALSE);\r
88 }\r
89 if ((Attribute & EFI_FILE_READ_ONLY) != 0) {\r
90 //\r
91 // invalid to move read only\r
92 //\r
93 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MV_INV_RO), gShellLevel2HiiHandle);\r
94 return (FALSE);\r
95 }\r
96 Test = StrStr(FullName, L":");\r
97 Test1 = StrStr(DestPath, L":");\r
98 if (Test1 != NULL && Test != NULL) {\r
99 *Test = CHAR_NULL;\r
100 *Test1 = CHAR_NULL;\r
101 Result = StringNoCaseCompare(&FullName, &DestPath);\r
102 *Test = L':';\r
103 *Test1 = L':';\r
104 if (Result != 0) {\r
105 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MV_INV_FS), gShellLevel2HiiHandle);\r
106 return (FALSE);\r
107 }\r
108 }\r
109 return (TRUE);\r
110}\r
111\r
112/**\r
113 Function to take a destination path that might contain wildcards and verify\r
114 that there is only a single possible target (IE we cant have wildcards that\r
115 have 2 possible destination).\r
116\r
117 if the result is sucessful the caller must free *DestPathPointer.\r
118\r
b54fd049 119 @param[in] DestDir The original path to the destination.\r
120 @param[in,out] DestPathPointer A pointer to the callee allocated final path.\r
121 @param[in] Cwd A pointer to the current working directory.\r
a405b86d 122\r
b54fd049 123 @retval EFI_INVALID_PARAMETR The DestDir could not be resolved to a location.\r
124 @retval EFI_INVALID_PARAMETR The DestDir could be resolved to more than 1 location.\r
125 @retval EFI_SUCCESS The operation was sucessful.\r
a405b86d 126**/\r
127SHELL_STATUS\r
128EFIAPI\r
129GetDestinationLocation(\r
130 IN CONST CHAR16 *DestDir,\r
131 IN OUT CHAR16 **DestPathPointer,\r
132 IN CONST CHAR16 *Cwd\r
133 )\r
134{\r
135 EFI_SHELL_FILE_INFO *DestList;\r
136 EFI_SHELL_FILE_INFO *Node;\r
137 EFI_STATUS Status;\r
138 CHAR16 *DestPath;\r
139 CHAR16 *TempLocation;\r
140 UINTN NewSize;\r
141\r
142 DestList = NULL;\r
143 DestPath = NULL;\r
b54fd049 144\r
145 if (StrStr(DestDir, L"\\") == DestDir) {\r
146 DestPath = AllocateZeroPool(StrSize(Cwd));\r
147 if (DestPath == NULL) {\r
148 return (SHELL_OUT_OF_RESOURCES);\r
149 }\r
150 StrCpy(DestPath, Cwd);\r
151 while (ChopLastSlash(DestPath)) ;\r
152 *DestPathPointer = DestPath;\r
153 return (SHELL_SUCCESS);\r
154 }\r
a405b86d 155 //\r
156 // get the destination path\r
157 //\r
158 Status = ShellOpenFileMetaArg((CHAR16*)DestDir, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ|EFI_FILE_MODE_CREATE, &DestList);\r
159 if (DestList == NULL || IsListEmpty(&DestList->Link)) {\r
160 //\r
161 // Not existing... must be renaming\r
162 //\r
163 if ((TempLocation = StrStr(DestDir, L":")) == NULL) {\r
164 NewSize = StrSize(Cwd);\r
165 NewSize += StrSize(DestDir);\r
166 DestPath = AllocateZeroPool(NewSize);\r
9ea69f8a 167 if (DestPath == NULL) {\r
168 ShellCloseFileMetaArg(&DestList);\r
169 return (SHELL_OUT_OF_RESOURCES);\r
170 }\r
a405b86d 171 StrCpy(DestPath, Cwd);\r
172 if (DestPath[StrLen(DestPath)-1] != L'\\' && DestDir[0] != L'\\') {\r
173 StrCat(DestPath, L"\\");\r
174 } else if (DestPath[StrLen(DestPath)-1] == L'\\' && DestDir[0] == L'\\') {\r
175 ((CHAR16*)DestPath)[StrLen(DestPath)-1] = CHAR_NULL;\r
176 }\r
177 StrCat(DestPath, DestDir);\r
178 } else {\r
179 ASSERT(DestPath == NULL);\r
180 DestPath = StrnCatGrow(&DestPath, NULL, DestDir, 0);\r
9ea69f8a 181 if (DestPath == NULL) {\r
182 ShellCloseFileMetaArg(&DestList);\r
183 return (SHELL_OUT_OF_RESOURCES);\r
184 }\r
a405b86d 185 }\r
186 } else {\r
187 Node = (EFI_SHELL_FILE_INFO*)GetFirstNode(&DestList->Link);\r
188 //\r
189 // Make sure there is only 1 node in the list.\r
190 //\r
191 if (!IsNodeAtEnd(&DestList->Link, &Node->Link)) {\r
192 ShellCloseFileMetaArg(&DestList);\r
193 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_MARG_ERROR), gShellLevel2HiiHandle, DestDir);\r
194 return (SHELL_INVALID_PARAMETER);\r
195 }\r
196 if (ShellIsDirectory(Node->FullName)==EFI_SUCCESS) {\r
197 DestPath = AllocateZeroPool(StrSize(Node->FullName)+sizeof(CHAR16));\r
9ea69f8a 198 if (DestPath == NULL) {\r
199 ShellCloseFileMetaArg(&DestList);\r
200 return (SHELL_OUT_OF_RESOURCES);\r
201 }\r
a405b86d 202 StrCpy(DestPath, Node->FullName);\r
203 StrCat(DestPath, L"\\");\r
204 } else {\r
205 //\r
206 // cant move onto another file.\r
207 //\r
208 ShellCloseFileMetaArg(&DestList);\r
209 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_ERROR), gShellLevel2HiiHandle, DestDir);\r
210 return (SHELL_INVALID_PARAMETER);\r
211 }\r
212 }\r
213\r
214 *DestPathPointer = DestPath;\r
215 ShellCloseFileMetaArg(&DestList);\r
216\r
217 return (SHELL_SUCCESS);\r
218}\r
219\r
220/**\r
221 function to take a list of files to move and a destination location and do\r
222 the verification and moving of those files to that location. This function\r
223 will report any errors to the user and continue to move the rest of the files.\r
224\r
225 @param[in] FileList A LIST_ENTRY* based list of files to move\r
b54fd049 226 @param[out] Resp pointer to response from question. Pass back on looped calling\r
a405b86d 227 @param[in] DestDir the destination location\r
228\r
229 @retval SHELL_SUCCESS the files were all moved.\r
230 @retval SHELL_INVALID_PARAMETER a parameter was invalid\r
231 @retval SHELL_SECURITY_VIOLATION a security violation ocurred\r
232 @retval SHELL_WRITE_PROTECTED the destination was write protected\r
233 @retval SHELL_OUT_OF_RESOURCES a memory allocation failed\r
234**/\r
235SHELL_STATUS\r
236EFIAPI\r
237ValidateAndMoveFiles(\r
238 IN CONST EFI_SHELL_FILE_INFO *FileList,\r
b54fd049 239 OUT VOID **Resp,\r
a405b86d 240 IN CONST CHAR16 *DestDir\r
241 )\r
242{\r
243 EFI_STATUS Status;\r
244 CHAR16 *HiiOutput;\r
245 CHAR16 *HiiResultOk;\r
246 CHAR16 *DestPath;\r
247 CONST CHAR16 *Cwd;\r
248 SHELL_STATUS ShellStatus;\r
249 CONST EFI_SHELL_FILE_INFO *Node;\r
250 EFI_FILE_INFO *NewFileInfo;\r
251 CHAR16 *TempLocation;\r
252 UINTN NewSize;\r
3e082d58 253 UINTN Length;\r
b54fd049 254 VOID *Response;\r
255 SHELL_FILE_HANDLE DestHandle;\r
a405b86d 256\r
257 ASSERT(FileList != NULL);\r
258 ASSERT(DestDir != NULL);\r
259\r
260 DestPath = NULL;\r
261 Cwd = ShellGetCurrentDir(NULL);\r
b54fd049 262 Response = *Resp;\r
a405b86d 263\r
264 //\r
265 // Get and validate the destination location\r
266 //\r
267 ShellStatus = GetDestinationLocation(DestDir, &DestPath, Cwd);\r
268 if (ShellStatus != SHELL_SUCCESS) {\r
269 return (ShellStatus);\r
270 }\r
b54fd049 271 DestPath = CleanPath(DestPath);\r
a405b86d 272\r
273 HiiOutput = HiiGetString (gShellLevel2HiiHandle, STRING_TOKEN (STR_MV_OUTPUT), NULL);\r
274 HiiResultOk = HiiGetString (gShellLevel2HiiHandle, STRING_TOKEN (STR_GEN_RES_OK), NULL);\r
275 ASSERT (DestPath != NULL);\r
276 ASSERT (HiiResultOk != NULL);\r
277 ASSERT (HiiOutput != NULL);\r
278// ASSERT (Cwd != NULL);\r
279\r
280 //\r
281 // Go through the list of files and directories to move...\r
282 //\r
283 for (Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&FileList->Link)\r
284 ; !IsNull(&FileList->Link, &Node->Link)\r
285 ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&FileList->Link, &Node->Link)\r
286 ){\r
287 if (ShellGetExecutionBreakFlag()) {\r
288 break;\r
289 }\r
290 ASSERT(Node->FileName != NULL);\r
291 ASSERT(Node->FullName != NULL);\r
292\r
293 //\r
294 // skip the directory traversing stuff...\r
295 //\r
296 if (StrCmp(Node->FileName, L".") == 0 || StrCmp(Node->FileName, L"..") == 0) {\r
297 continue;\r
298 }\r
299\r
300 //\r
301 // Validate that the move is valid\r
302 //\r
303 if (!IsValidMove(Node->FullName, Cwd, DestPath, Node->Info->Attribute)) {\r
304 ShellStatus = SHELL_INVALID_PARAMETER;\r
305 continue;\r
306 }\r
307\r
308 //\r
309 // Chop off map info from "DestPath"\r
310 //\r
311 if ((TempLocation = StrStr(DestPath, L":")) != NULL) {\r
312 CopyMem(DestPath, TempLocation+1, StrSize(TempLocation+1));\r
313 }\r
314\r
315 //\r
316 // construct the new file info block\r
317 //\r
318 NewSize = StrSize(DestPath);\r
319 NewSize += StrSize(Node->FileName) + sizeof(EFI_FILE_INFO) + sizeof(CHAR16);\r
320 NewFileInfo = AllocateZeroPool(NewSize);\r
9ea69f8a 321 if (NewFileInfo == NULL) {\r
322 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellLevel2HiiHandle);\r
323 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
a405b86d 324 } else {\r
9ea69f8a 325 CopyMem(NewFileInfo, Node->Info, sizeof(EFI_FILE_INFO));\r
326 if (DestPath[0] != L'\\') {\r
327 StrCpy(NewFileInfo->FileName, L"\\");\r
328 StrCat(NewFileInfo->FileName, DestPath);\r
329 } else {\r
330 StrCpy(NewFileInfo->FileName, DestPath);\r
a405b86d 331 }\r
3e082d58 332 Length = StrLen(NewFileInfo->FileName);\r
333 if (Length > 0) {\r
334 Length--;\r
335 }\r
336 if (NewFileInfo->FileName[Length] == L'\\') {\r
9ea69f8a 337 if (Node->FileName[0] == L'\\') {\r
338 //\r
339 // Don't allow for double slashes. Eliminate one of them.\r
340 //\r
3e082d58 341 NewFileInfo->FileName[Length] = CHAR_NULL;\r
9ea69f8a 342 }\r
343 StrCat(NewFileInfo->FileName, Node->FileName);\r
344 }\r
345 NewFileInfo->Size = sizeof(EFI_FILE_INFO) + StrSize(NewFileInfo->FileName);\r
9ea69f8a 346 ShellPrintEx(-1, -1, HiiOutput, Node->FullName, NewFileInfo->FileName);\r
a405b86d 347\r
b54fd049 348 if (!EFI_ERROR(ShellFileExists(NewFileInfo->FileName))) {\r
349 if (Response == NULL) {\r
350 ShellPromptForResponseHii(ShellPromptResponseTypeYesNoAllCancel, STRING_TOKEN (STR_GEN_DEST_EXIST_OVR), gShellLevel2HiiHandle, &Response);\r
351 }\r
352 switch (*(SHELL_PROMPT_RESPONSE*)Response) {\r
353 case ShellPromptResponseNo:\r
354 FreePool(NewFileInfo);\r
355 continue;\r
356 case ShellPromptResponseCancel:\r
357 *Resp = Response;\r
358 //\r
359 // indicate to stop everything\r
360 //\r
361 FreePool(NewFileInfo);\r
362 FreePool(DestPath);\r
363 FreePool(HiiOutput);\r
364 FreePool(HiiResultOk);\r
365 return (SHELL_ABORTED);\r
366 case ShellPromptResponseAll:\r
367 *Resp = Response;\r
368 break;\r
369 case ShellPromptResponseYes:\r
370 FreePool(Response);\r
371 break;\r
372 default:\r
373 FreePool(Response);\r
374 FreePool(NewFileInfo);\r
375 FreePool(DestPath);\r
376 FreePool(HiiOutput);\r
377 FreePool(HiiResultOk);\r
378 return SHELL_ABORTED;\r
379 }\r
380 Status = ShellOpenFileByName(NewFileInfo->FileName, &DestHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 0);\r
381 ShellDeleteFile(&DestHandle);\r
382 }\r
383\r
384\r
9ea69f8a 385 //\r
386 // Perform the move operation\r
387 //\r
388 Status = ShellSetFileInfo(Node->Handle, NewFileInfo);\r
a405b86d 389\r
9ea69f8a 390 //\r
391 // Free the info object we used...\r
392 //\r
9ea69f8a 393 FreePool(NewFileInfo);\r
a405b86d 394\r
a405b86d 395 //\r
9ea69f8a 396 // Check our result\r
a405b86d 397 //\r
9ea69f8a 398 if (EFI_ERROR(Status)) {\r
399 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, Status);\r
400 //\r
401 // move failed\r
402 //\r
403 switch(Status){\r
404 default:\r
405 ShellStatus = SHELL_INVALID_PARAMETER;\r
406 case EFI_SECURITY_VIOLATION:\r
407 ShellStatus = SHELL_SECURITY_VIOLATION;\r
408 case EFI_WRITE_PROTECTED:\r
409 ShellStatus = SHELL_WRITE_PROTECTED;\r
410 case EFI_OUT_OF_RESOURCES:\r
411 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
412 case EFI_DEVICE_ERROR:\r
413 ShellStatus = SHELL_DEVICE_ERROR;\r
414 case EFI_ACCESS_DENIED:\r
415 ShellStatus = SHELL_ACCESS_DENIED;\r
416 } // switch\r
417 } else {\r
418 ShellPrintEx(-1, -1, L"%s", HiiResultOk);\r
419 }\r
a405b86d 420 }\r
421 } // for loop\r
422\r
423 FreePool(DestPath);\r
424 FreePool(HiiOutput);\r
425 FreePool(HiiResultOk);\r
426 return (ShellStatus);\r
427}\r
428\r
b54fd049 429/**\r
430 Function for 'mv' command.\r
431\r
432 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
433 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
434**/\r
a405b86d 435SHELL_STATUS\r
436EFIAPI\r
437ShellCommandRunMv (\r
438 IN EFI_HANDLE ImageHandle,\r
439 IN EFI_SYSTEM_TABLE *SystemTable\r
440 )\r
441{\r
442 EFI_STATUS Status;\r
443 LIST_ENTRY *Package;\r
444 CHAR16 *ProblemParam;\r
445 SHELL_STATUS ShellStatus;\r
446 UINTN ParamCount;\r
447 UINTN LoopCounter;\r
448 EFI_SHELL_FILE_INFO *FileList;\r
b54fd049 449 VOID *Response;\r
a405b86d 450\r
451 ProblemParam = NULL;\r
452 ShellStatus = SHELL_SUCCESS;\r
453 ParamCount = 0;\r
454 FileList = NULL;\r
b54fd049 455 Response = NULL;\r
a405b86d 456\r
457 //\r
458 // initialize the shell lib (we must be in non-auto-init...)\r
459 //\r
460 Status = ShellInitialize();\r
461 ASSERT_EFI_ERROR(Status);\r
462\r
463 //\r
464 // parse the command line\r
465 //\r
466 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
467 if (EFI_ERROR(Status)) {\r
468 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
469 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
470 FreePool(ProblemParam);\r
471 ShellStatus = SHELL_INVALID_PARAMETER;\r
472 } else {\r
473 ASSERT(FALSE);\r
474 }\r
475 } else {\r
476 //\r
477 // check for "-?"\r
478 //\r
479 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
480 ASSERT(FALSE);\r
481 }\r
482\r
483 switch (ParamCount = ShellCommandLineGetCount(Package)) {\r
484 case 0:\r
485 case 1:\r
486 //\r
487 // we have insufficient parameters\r
488 //\r
489 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
490 ShellStatus = SHELL_INVALID_PARAMETER;\r
491 break;\r
492 case 2:\r
493 //\r
494 // must have valid CWD for single parameter...\r
495 //\r
496 if (ShellGetCurrentDir(NULL) == NULL){\r
497 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle);\r
498 ShellStatus = SHELL_INVALID_PARAMETER;\r
499 } else {\r
500 Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);\r
501 if (FileList == NULL || IsListEmpty(&FileList->Link) || EFI_ERROR(Status)) {\r
502 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
503 ShellStatus = SHELL_NOT_FOUND;\r
504 } else {\r
505 //\r
506 // ValidateAndMoveFiles will report errors to the screen itself\r
507 //\r
b54fd049 508 ShellStatus = ValidateAndMoveFiles(FileList, &Response, ShellGetCurrentDir(NULL));\r
a405b86d 509 }\r
510 }\r
511\r
512 break;\r
513 default:\r
514 ///@todo make sure this works with error half way through and continues...\r
b54fd049 515 for (ParamCount--, LoopCounter = 1 ; LoopCounter < ParamCount ; LoopCounter++) {\r
a405b86d 516 if (ShellGetExecutionBreakFlag()) {\r
517 break;\r
518 }\r
519 Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);\r
520 if (FileList == NULL || IsListEmpty(&FileList->Link) || EFI_ERROR(Status)) {\r
b54fd049 521 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, LoopCounter));\r
a405b86d 522 ShellStatus = SHELL_NOT_FOUND;\r
523 } else {\r
524 //\r
525 // ValidateAndMoveFiles will report errors to the screen itself\r
526 // Only change ShellStatus if it's sucessful\r
527 //\r
528 if (ShellStatus == SHELL_SUCCESS) {\r
b54fd049 529 ShellStatus = ValidateAndMoveFiles(FileList, &Response, ShellCommandLineGetRawValue(Package, ParamCount));\r
a405b86d 530 } else {\r
b54fd049 531 ValidateAndMoveFiles(FileList, &Response, ShellCommandLineGetRawValue(Package, ParamCount));\r
a405b86d 532 }\r
533 }\r
534 if (FileList != NULL && !IsListEmpty(&FileList->Link)) {\r
535 Status = ShellCloseFileMetaArg(&FileList);\r
536 if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) {\r
537 ShellStatus = SHELL_ACCESS_DENIED;\r
538 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1), ShellStatus|MAX_BIT);\r
539 }\r
540 }\r
541 }\r
542 break;\r
543 } // switch on parameter count\r
544\r
545 if (FileList != NULL) {\r
546 ShellCloseFileMetaArg(&FileList);\r
547 }\r
548\r
549 //\r
550 // free the command line package\r
551 //\r
552 ShellCommandLineFreeVarList (Package);\r
553 }\r
554\r
b54fd049 555 SHELL_FREE_NON_NULL(Response);\r
556\r
a405b86d 557 if (ShellGetExecutionBreakFlag()) {\r
558 return (SHELL_ABORTED);\r
559 }\r
560\r
561 return (ShellStatus);\r
562}\r