]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c
ShellPkg: Fixed build error 'variable set but not used'
[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
4ff7e37b
ED
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
beab0fc5 123 @retval SHELL_INVALID_PARAMETER The DestDir could not be resolved to a location.\r
124 @retval SHELL_INVALID_PARAMETER The DestDir could be resolved to more than 1 location.\r
125 @retval SHELL_INVALID_PARAMETER Cwd is required and is NULL.\r
126 @retval SHELL_SUCCESS The operation was sucessful.\r
a405b86d 127**/\r
128SHELL_STATUS\r
129EFIAPI\r
130GetDestinationLocation(\r
131 IN CONST CHAR16 *DestDir,\r
132 IN OUT CHAR16 **DestPathPointer,\r
133 IN CONST CHAR16 *Cwd\r
134 )\r
135{\r
136 EFI_SHELL_FILE_INFO *DestList;\r
137 EFI_SHELL_FILE_INFO *Node;\r
a405b86d 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
beab0fc5 146 if (Cwd == NULL) {\r
147 return SHELL_INVALID_PARAMETER;\r
148 }\r
b54fd049 149 DestPath = AllocateZeroPool(StrSize(Cwd));\r
150 if (DestPath == NULL) {\r
151 return (SHELL_OUT_OF_RESOURCES);\r
152 }\r
153 StrCpy(DestPath, Cwd);\r
ab94587a 154 while (PathRemoveLastItem(DestPath)) ;\r
b54fd049 155 *DestPathPointer = DestPath;\r
156 return (SHELL_SUCCESS);\r
157 }\r
a405b86d 158 //\r
159 // get the destination path\r
160 //\r
e755a4ca 161 ShellOpenFileMetaArg((CHAR16*)DestDir, EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ|EFI_FILE_MODE_CREATE, &DestList);\r
a405b86d 162 if (DestList == NULL || IsListEmpty(&DestList->Link)) {\r
163 //\r
164 // Not existing... must be renaming\r
165 //\r
166 if ((TempLocation = StrStr(DestDir, L":")) == NULL) {\r
beab0fc5 167 if (Cwd == NULL) {\r
168 ShellCloseFileMetaArg(&DestList);\r
169 return (SHELL_INVALID_PARAMETER);\r
170 }\r
a405b86d 171 NewSize = StrSize(Cwd);\r
172 NewSize += StrSize(DestDir);\r
173 DestPath = AllocateZeroPool(NewSize);\r
9ea69f8a 174 if (DestPath == NULL) {\r
175 ShellCloseFileMetaArg(&DestList);\r
176 return (SHELL_OUT_OF_RESOURCES);\r
177 }\r
a405b86d 178 StrCpy(DestPath, Cwd);\r
179 if (DestPath[StrLen(DestPath)-1] != L'\\' && DestDir[0] != L'\\') {\r
180 StrCat(DestPath, L"\\");\r
181 } else if (DestPath[StrLen(DestPath)-1] == L'\\' && DestDir[0] == L'\\') {\r
182 ((CHAR16*)DestPath)[StrLen(DestPath)-1] = CHAR_NULL;\r
183 }\r
184 StrCat(DestPath, DestDir);\r
185 } else {\r
186 ASSERT(DestPath == NULL);\r
187 DestPath = StrnCatGrow(&DestPath, NULL, DestDir, 0);\r
9ea69f8a 188 if (DestPath == NULL) {\r
189 ShellCloseFileMetaArg(&DestList);\r
190 return (SHELL_OUT_OF_RESOURCES);\r
191 }\r
a405b86d 192 }\r
193 } else {\r
194 Node = (EFI_SHELL_FILE_INFO*)GetFirstNode(&DestList->Link);\r
195 //\r
196 // Make sure there is only 1 node in the list.\r
197 //\r
198 if (!IsNodeAtEnd(&DestList->Link, &Node->Link)) {\r
199 ShellCloseFileMetaArg(&DestList);\r
200 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_MARG_ERROR), gShellLevel2HiiHandle, DestDir);\r
201 return (SHELL_INVALID_PARAMETER);\r
202 }\r
203 if (ShellIsDirectory(Node->FullName)==EFI_SUCCESS) {\r
204 DestPath = AllocateZeroPool(StrSize(Node->FullName)+sizeof(CHAR16));\r
9ea69f8a 205 if (DestPath == NULL) {\r
206 ShellCloseFileMetaArg(&DestList);\r
207 return (SHELL_OUT_OF_RESOURCES);\r
208 }\r
a405b86d 209 StrCpy(DestPath, Node->FullName);\r
210 StrCat(DestPath, L"\\");\r
211 } else {\r
212 //\r
213 // cant move onto another file.\r
214 //\r
215 ShellCloseFileMetaArg(&DestList);\r
216 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_ERROR), gShellLevel2HiiHandle, DestDir);\r
217 return (SHELL_INVALID_PARAMETER);\r
218 }\r
219 }\r
220\r
221 *DestPathPointer = DestPath;\r
222 ShellCloseFileMetaArg(&DestList);\r
223\r
224 return (SHELL_SUCCESS);\r
225}\r
226\r
227/**\r
228 function to take a list of files to move and a destination location and do\r
229 the verification and moving of those files to that location. This function\r
230 will report any errors to the user and continue to move the rest of the files.\r
231\r
232 @param[in] FileList A LIST_ENTRY* based list of files to move\r
b54fd049 233 @param[out] Resp pointer to response from question. Pass back on looped calling\r
a405b86d 234 @param[in] DestDir the destination location\r
235\r
236 @retval SHELL_SUCCESS the files were all moved.\r
237 @retval SHELL_INVALID_PARAMETER a parameter was invalid\r
238 @retval SHELL_SECURITY_VIOLATION a security violation ocurred\r
239 @retval SHELL_WRITE_PROTECTED the destination was write protected\r
240 @retval SHELL_OUT_OF_RESOURCES a memory allocation failed\r
241**/\r
242SHELL_STATUS\r
243EFIAPI\r
244ValidateAndMoveFiles(\r
245 IN CONST EFI_SHELL_FILE_INFO *FileList,\r
b54fd049 246 OUT VOID **Resp,\r
a405b86d 247 IN CONST CHAR16 *DestDir\r
248 )\r
249{\r
250 EFI_STATUS Status;\r
251 CHAR16 *HiiOutput;\r
252 CHAR16 *HiiResultOk;\r
253 CHAR16 *DestPath;\r
254 CONST CHAR16 *Cwd;\r
255 SHELL_STATUS ShellStatus;\r
256 CONST EFI_SHELL_FILE_INFO *Node;\r
257 EFI_FILE_INFO *NewFileInfo;\r
258 CHAR16 *TempLocation;\r
259 UINTN NewSize;\r
3e082d58 260 UINTN Length;\r
b54fd049 261 VOID *Response;\r
262 SHELL_FILE_HANDLE DestHandle;\r
a405b86d 263\r
264 ASSERT(FileList != NULL);\r
265 ASSERT(DestDir != NULL);\r
266\r
267 DestPath = NULL;\r
268 Cwd = ShellGetCurrentDir(NULL);\r
b54fd049 269 Response = *Resp;\r
a405b86d 270\r
271 //\r
272 // Get and validate the destination location\r
273 //\r
274 ShellStatus = GetDestinationLocation(DestDir, &DestPath, Cwd);\r
275 if (ShellStatus != SHELL_SUCCESS) {\r
276 return (ShellStatus);\r
277 }\r
ab94587a 278 DestPath = PathCleanUpDirectories(DestPath);\r
a405b86d 279\r
280 HiiOutput = HiiGetString (gShellLevel2HiiHandle, STRING_TOKEN (STR_MV_OUTPUT), NULL);\r
281 HiiResultOk = HiiGetString (gShellLevel2HiiHandle, STRING_TOKEN (STR_GEN_RES_OK), NULL);\r
282 ASSERT (DestPath != NULL);\r
283 ASSERT (HiiResultOk != NULL);\r
284 ASSERT (HiiOutput != NULL);\r
285// ASSERT (Cwd != NULL);\r
286\r
287 //\r
288 // Go through the list of files and directories to move...\r
289 //\r
290 for (Node = (EFI_SHELL_FILE_INFO *)GetFirstNode(&FileList->Link)\r
291 ; !IsNull(&FileList->Link, &Node->Link)\r
292 ; Node = (EFI_SHELL_FILE_INFO *)GetNextNode(&FileList->Link, &Node->Link)\r
293 ){\r
294 if (ShellGetExecutionBreakFlag()) {\r
295 break;\r
296 }\r
297 ASSERT(Node->FileName != NULL);\r
298 ASSERT(Node->FullName != NULL);\r
299\r
300 //\r
301 // skip the directory traversing stuff...\r
302 //\r
303 if (StrCmp(Node->FileName, L".") == 0 || StrCmp(Node->FileName, L"..") == 0) {\r
304 continue;\r
305 }\r
306\r
307 //\r
308 // Validate that the move is valid\r
309 //\r
310 if (!IsValidMove(Node->FullName, Cwd, DestPath, Node->Info->Attribute)) {\r
311 ShellStatus = SHELL_INVALID_PARAMETER;\r
312 continue;\r
313 }\r
314\r
315 //\r
316 // Chop off map info from "DestPath"\r
317 //\r
318 if ((TempLocation = StrStr(DestPath, L":")) != NULL) {\r
319 CopyMem(DestPath, TempLocation+1, StrSize(TempLocation+1));\r
320 }\r
321\r
322 //\r
323 // construct the new file info block\r
324 //\r
325 NewSize = StrSize(DestPath);\r
73c83c69 326 NewSize += StrSize(Node->FileName) + SIZE_OF_EFI_FILE_INFO + sizeof(CHAR16);\r
a405b86d 327 NewFileInfo = AllocateZeroPool(NewSize);\r
9ea69f8a 328 if (NewFileInfo == NULL) {\r
329 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellLevel2HiiHandle);\r
330 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
a405b86d 331 } else {\r
73c83c69 332 CopyMem(NewFileInfo, Node->Info, SIZE_OF_EFI_FILE_INFO);\r
9ea69f8a 333 if (DestPath[0] != L'\\') {\r
334 StrCpy(NewFileInfo->FileName, L"\\");\r
335 StrCat(NewFileInfo->FileName, DestPath);\r
336 } else {\r
337 StrCpy(NewFileInfo->FileName, DestPath);\r
a405b86d 338 }\r
3e082d58 339 Length = StrLen(NewFileInfo->FileName);\r
340 if (Length > 0) {\r
341 Length--;\r
342 }\r
343 if (NewFileInfo->FileName[Length] == L'\\') {\r
9ea69f8a 344 if (Node->FileName[0] == L'\\') {\r
345 //\r
346 // Don't allow for double slashes. Eliminate one of them.\r
347 //\r
3e082d58 348 NewFileInfo->FileName[Length] = CHAR_NULL;\r
9ea69f8a 349 }\r
350 StrCat(NewFileInfo->FileName, Node->FileName);\r
351 }\r
73c83c69 352 NewFileInfo->Size = SIZE_OF_EFI_FILE_INFO + StrSize(NewFileInfo->FileName);\r
9ea69f8a 353 ShellPrintEx(-1, -1, HiiOutput, Node->FullName, NewFileInfo->FileName);\r
a405b86d 354\r
b54fd049 355 if (!EFI_ERROR(ShellFileExists(NewFileInfo->FileName))) {\r
356 if (Response == NULL) {\r
357 ShellPromptForResponseHii(ShellPromptResponseTypeYesNoAllCancel, STRING_TOKEN (STR_GEN_DEST_EXIST_OVR), gShellLevel2HiiHandle, &Response);\r
358 }\r
359 switch (*(SHELL_PROMPT_RESPONSE*)Response) {\r
360 case ShellPromptResponseNo:\r
361 FreePool(NewFileInfo);\r
362 continue;\r
363 case ShellPromptResponseCancel:\r
364 *Resp = Response;\r
365 //\r
366 // indicate to stop everything\r
367 //\r
368 FreePool(NewFileInfo);\r
369 FreePool(DestPath);\r
370 FreePool(HiiOutput);\r
371 FreePool(HiiResultOk);\r
372 return (SHELL_ABORTED);\r
373 case ShellPromptResponseAll:\r
374 *Resp = Response;\r
375 break;\r
376 case ShellPromptResponseYes:\r
377 FreePool(Response);\r
378 break;\r
379 default:\r
380 FreePool(Response);\r
381 FreePool(NewFileInfo);\r
382 FreePool(DestPath);\r
383 FreePool(HiiOutput);\r
384 FreePool(HiiResultOk);\r
385 return SHELL_ABORTED;\r
386 }\r
387 Status = ShellOpenFileByName(NewFileInfo->FileName, &DestHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 0);\r
388 ShellDeleteFile(&DestHandle);\r
389 }\r
390\r
391\r
9ea69f8a 392 //\r
393 // Perform the move operation\r
394 //\r
395 Status = ShellSetFileInfo(Node->Handle, NewFileInfo);\r
a405b86d 396\r
9ea69f8a 397 //\r
398 // Free the info object we used...\r
399 //\r
9ea69f8a 400 FreePool(NewFileInfo);\r
a405b86d 401\r
a405b86d 402 //\r
9ea69f8a 403 // Check our result\r
a405b86d 404 //\r
9ea69f8a 405 if (EFI_ERROR(Status)) {\r
406 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_UK), gShellLevel2HiiHandle, Status);\r
407 //\r
408 // move failed\r
409 //\r
410 switch(Status){\r
411 default:\r
412 ShellStatus = SHELL_INVALID_PARAMETER;\r
413 case EFI_SECURITY_VIOLATION:\r
414 ShellStatus = SHELL_SECURITY_VIOLATION;\r
415 case EFI_WRITE_PROTECTED:\r
416 ShellStatus = SHELL_WRITE_PROTECTED;\r
417 case EFI_OUT_OF_RESOURCES:\r
418 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
419 case EFI_DEVICE_ERROR:\r
420 ShellStatus = SHELL_DEVICE_ERROR;\r
421 case EFI_ACCESS_DENIED:\r
422 ShellStatus = SHELL_ACCESS_DENIED;\r
423 } // switch\r
424 } else {\r
425 ShellPrintEx(-1, -1, L"%s", HiiResultOk);\r
426 }\r
a405b86d 427 }\r
428 } // for loop\r
429\r
430 FreePool(DestPath);\r
431 FreePool(HiiOutput);\r
432 FreePool(HiiResultOk);\r
433 return (ShellStatus);\r
434}\r
435\r
b54fd049 436/**\r
437 Function for 'mv' command.\r
438\r
439 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
440 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
441**/\r
a405b86d 442SHELL_STATUS\r
443EFIAPI\r
444ShellCommandRunMv (\r
445 IN EFI_HANDLE ImageHandle,\r
446 IN EFI_SYSTEM_TABLE *SystemTable\r
447 )\r
448{\r
449 EFI_STATUS Status;\r
450 LIST_ENTRY *Package;\r
451 CHAR16 *ProblemParam;\r
452 SHELL_STATUS ShellStatus;\r
453 UINTN ParamCount;\r
454 UINTN LoopCounter;\r
455 EFI_SHELL_FILE_INFO *FileList;\r
b54fd049 456 VOID *Response;\r
a405b86d 457\r
458 ProblemParam = NULL;\r
459 ShellStatus = SHELL_SUCCESS;\r
460 ParamCount = 0;\r
461 FileList = NULL;\r
b54fd049 462 Response = NULL;\r
a405b86d 463\r
464 //\r
465 // initialize the shell lib (we must be in non-auto-init...)\r
466 //\r
467 Status = ShellInitialize();\r
468 ASSERT_EFI_ERROR(Status);\r
469\r
470 //\r
471 // parse the command line\r
472 //\r
473 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
474 if (EFI_ERROR(Status)) {\r
475 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
476 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
477 FreePool(ProblemParam);\r
478 ShellStatus = SHELL_INVALID_PARAMETER;\r
479 } else {\r
480 ASSERT(FALSE);\r
481 }\r
482 } else {\r
483 //\r
484 // check for "-?"\r
485 //\r
486 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
487 ASSERT(FALSE);\r
488 }\r
489\r
490 switch (ParamCount = ShellCommandLineGetCount(Package)) {\r
491 case 0:\r
492 case 1:\r
493 //\r
494 // we have insufficient parameters\r
495 //\r
496 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
497 ShellStatus = SHELL_INVALID_PARAMETER;\r
498 break;\r
499 case 2:\r
500 //\r
501 // must have valid CWD for single parameter...\r
502 //\r
503 if (ShellGetCurrentDir(NULL) == NULL){\r
504 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle);\r
505 ShellStatus = SHELL_INVALID_PARAMETER;\r
506 } else {\r
507 Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);\r
508 if (FileList == NULL || IsListEmpty(&FileList->Link) || EFI_ERROR(Status)) {\r
509 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
510 ShellStatus = SHELL_NOT_FOUND;\r
511 } else {\r
512 //\r
513 // ValidateAndMoveFiles will report errors to the screen itself\r
514 //\r
b54fd049 515 ShellStatus = ValidateAndMoveFiles(FileList, &Response, ShellGetCurrentDir(NULL));\r
a405b86d 516 }\r
517 }\r
518\r
519 break;\r
520 default:\r
521 ///@todo make sure this works with error half way through and continues...\r
b54fd049 522 for (ParamCount--, LoopCounter = 1 ; LoopCounter < ParamCount ; LoopCounter++) {\r
a405b86d 523 if (ShellGetExecutionBreakFlag()) {\r
524 break;\r
525 }\r
526 Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);\r
527 if (FileList == NULL || IsListEmpty(&FileList->Link) || EFI_ERROR(Status)) {\r
b54fd049 528 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, LoopCounter));\r
a405b86d 529 ShellStatus = SHELL_NOT_FOUND;\r
530 } else {\r
531 //\r
532 // ValidateAndMoveFiles will report errors to the screen itself\r
533 // Only change ShellStatus if it's sucessful\r
534 //\r
535 if (ShellStatus == SHELL_SUCCESS) {\r
b54fd049 536 ShellStatus = ValidateAndMoveFiles(FileList, &Response, ShellCommandLineGetRawValue(Package, ParamCount));\r
a405b86d 537 } else {\r
b54fd049 538 ValidateAndMoveFiles(FileList, &Response, ShellCommandLineGetRawValue(Package, ParamCount));\r
a405b86d 539 }\r
540 }\r
541 if (FileList != NULL && !IsListEmpty(&FileList->Link)) {\r
542 Status = ShellCloseFileMetaArg(&FileList);\r
543 if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) {\r
544 ShellStatus = SHELL_ACCESS_DENIED;\r
545 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1), ShellStatus|MAX_BIT);\r
546 }\r
547 }\r
548 }\r
549 break;\r
550 } // switch on parameter count\r
551\r
552 if (FileList != NULL) {\r
553 ShellCloseFileMetaArg(&FileList);\r
554 }\r
555\r
556 //\r
557 // free the command line package\r
558 //\r
559 ShellCommandLineFreeVarList (Package);\r
560 }\r
561\r
b54fd049 562 SHELL_FREE_NON_NULL(Response);\r
563\r
a405b86d 564 if (ShellGetExecutionBreakFlag()) {\r
565 return (SHELL_ABORTED);\r
566 }\r
567\r
568 return (ShellStatus);\r
569}\r