]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c
Update Code to pass EBC compiler.
[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
cbcccd2c 4 Copyright (c) 2009 - 2013, 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
cbcccd2c
LG
407 ShellStatus = SHELL_INVALID_PARAMETER;\r
408 if (Status == EFI_SECURITY_VIOLATION) {\r
409 ShellStatus = SHELL_SECURITY_VIOLATION;\r
410 } else if (Status == EFI_WRITE_PROTECTED) {\r
411 ShellStatus = SHELL_WRITE_PROTECTED;\r
412 } else if (Status == EFI_OUT_OF_RESOURCES) {\r
413 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
414 } else if (Status == EFI_DEVICE_ERROR) {\r
415 ShellStatus = SHELL_DEVICE_ERROR;\r
416 } else if (Status == EFI_ACCESS_DENIED) {\r
417 ShellStatus = SHELL_ACCESS_DENIED;\r
418 }\r
9ea69f8a 419 } else {\r
420 ShellPrintEx(-1, -1, L"%s", HiiResultOk);\r
421 }\r
a405b86d 422 }\r
423 } // for loop\r
424\r
425 FreePool(DestPath);\r
426 FreePool(HiiOutput);\r
427 FreePool(HiiResultOk);\r
428 return (ShellStatus);\r
429}\r
430\r
b54fd049 431/**\r
432 Function for 'mv' command.\r
433\r
434 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
435 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
436**/\r
a405b86d 437SHELL_STATUS\r
438EFIAPI\r
439ShellCommandRunMv (\r
440 IN EFI_HANDLE ImageHandle,\r
441 IN EFI_SYSTEM_TABLE *SystemTable\r
442 )\r
443{\r
444 EFI_STATUS Status;\r
445 LIST_ENTRY *Package;\r
446 CHAR16 *ProblemParam;\r
447 SHELL_STATUS ShellStatus;\r
448 UINTN ParamCount;\r
449 UINTN LoopCounter;\r
450 EFI_SHELL_FILE_INFO *FileList;\r
b54fd049 451 VOID *Response;\r
a405b86d 452\r
453 ProblemParam = NULL;\r
454 ShellStatus = SHELL_SUCCESS;\r
455 ParamCount = 0;\r
456 FileList = NULL;\r
b54fd049 457 Response = NULL;\r
a405b86d 458\r
459 //\r
460 // initialize the shell lib (we must be in non-auto-init...)\r
461 //\r
462 Status = ShellInitialize();\r
463 ASSERT_EFI_ERROR(Status);\r
464\r
465 //\r
466 // parse the command line\r
467 //\r
468 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
469 if (EFI_ERROR(Status)) {\r
470 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
471 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
472 FreePool(ProblemParam);\r
473 ShellStatus = SHELL_INVALID_PARAMETER;\r
474 } else {\r
475 ASSERT(FALSE);\r
476 }\r
477 } else {\r
478 //\r
479 // check for "-?"\r
480 //\r
481 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
482 ASSERT(FALSE);\r
483 }\r
484\r
485 switch (ParamCount = ShellCommandLineGetCount(Package)) {\r
486 case 0:\r
487 case 1:\r
488 //\r
489 // we have insufficient parameters\r
490 //\r
491 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
492 ShellStatus = SHELL_INVALID_PARAMETER;\r
493 break;\r
494 case 2:\r
495 //\r
496 // must have valid CWD for single parameter...\r
497 //\r
498 if (ShellGetCurrentDir(NULL) == NULL){\r
499 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle);\r
500 ShellStatus = SHELL_INVALID_PARAMETER;\r
501 } else {\r
502 Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, 1), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);\r
503 if (FileList == NULL || IsListEmpty(&FileList->Link) || EFI_ERROR(Status)) {\r
504 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1));\r
505 ShellStatus = SHELL_NOT_FOUND;\r
506 } else {\r
507 //\r
508 // ValidateAndMoveFiles will report errors to the screen itself\r
509 //\r
b54fd049 510 ShellStatus = ValidateAndMoveFiles(FileList, &Response, ShellGetCurrentDir(NULL));\r
a405b86d 511 }\r
512 }\r
513\r
514 break;\r
515 default:\r
516 ///@todo make sure this works with error half way through and continues...\r
b54fd049 517 for (ParamCount--, LoopCounter = 1 ; LoopCounter < ParamCount ; LoopCounter++) {\r
a405b86d 518 if (ShellGetExecutionBreakFlag()) {\r
519 break;\r
520 }\r
521 Status = ShellOpenFileMetaArg((CHAR16*)ShellCommandLineGetRawValue(Package, LoopCounter), EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ, &FileList);\r
522 if (FileList == NULL || IsListEmpty(&FileList->Link) || EFI_ERROR(Status)) {\r
b54fd049 523 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, LoopCounter));\r
a405b86d 524 ShellStatus = SHELL_NOT_FOUND;\r
525 } else {\r
526 //\r
527 // ValidateAndMoveFiles will report errors to the screen itself\r
528 // Only change ShellStatus if it's sucessful\r
529 //\r
530 if (ShellStatus == SHELL_SUCCESS) {\r
b54fd049 531 ShellStatus = ValidateAndMoveFiles(FileList, &Response, ShellCommandLineGetRawValue(Package, ParamCount));\r
a405b86d 532 } else {\r
b54fd049 533 ValidateAndMoveFiles(FileList, &Response, ShellCommandLineGetRawValue(Package, ParamCount));\r
a405b86d 534 }\r
535 }\r
536 if (FileList != NULL && !IsListEmpty(&FileList->Link)) {\r
537 Status = ShellCloseFileMetaArg(&FileList);\r
538 if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) {\r
539 ShellStatus = SHELL_ACCESS_DENIED;\r
540 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_FILE), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, 1), ShellStatus|MAX_BIT);\r
541 }\r
542 }\r
543 }\r
544 break;\r
545 } // switch on parameter count\r
546\r
547 if (FileList != NULL) {\r
548 ShellCloseFileMetaArg(&FileList);\r
549 }\r
550\r
551 //\r
552 // free the command line package\r
553 //\r
554 ShellCommandLineFreeVarList (Package);\r
555 }\r
556\r
b54fd049 557 SHELL_FREE_NON_NULL(Response);\r
558\r
a405b86d 559 if (ShellGetExecutionBreakFlag()) {\r
560 return (SHELL_ABORTED);\r
561 }\r
562\r
563 return (ShellStatus);\r
564}\r