]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c
Comment's added and fixed.
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Mv.c
... / ...
CommitLineData
1/** @file\r
2 Main file for mv shell level 2 function.\r
3\r
4 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
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
47 INTN Result;\r
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
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
122\r
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
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
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
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
167 if (DestPath == NULL) {\r
168 ShellCloseFileMetaArg(&DestList);\r
169 return (SHELL_OUT_OF_RESOURCES);\r
170 }\r
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
181 if (DestPath == NULL) {\r
182 ShellCloseFileMetaArg(&DestList);\r
183 return (SHELL_OUT_OF_RESOURCES);\r
184 }\r
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
198 if (DestPath == NULL) {\r
199 ShellCloseFileMetaArg(&DestList);\r
200 return (SHELL_OUT_OF_RESOURCES);\r
201 }\r
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
226 @param[out] Resp pointer to response from question. Pass back on looped calling\r
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
239 OUT VOID **Resp,\r
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
253 UINTN Length;\r
254 VOID *Response;\r
255 SHELL_FILE_HANDLE DestHandle;\r
256\r
257 ASSERT(FileList != NULL);\r
258 ASSERT(DestDir != NULL);\r
259\r
260 DestPath = NULL;\r
261 Cwd = ShellGetCurrentDir(NULL);\r
262 Response = *Resp;\r
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
271 DestPath = CleanPath(DestPath);\r
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
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
324 } else {\r
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
331 }\r
332 Length = StrLen(NewFileInfo->FileName);\r
333 if (Length > 0) {\r
334 Length--;\r
335 }\r
336 if (NewFileInfo->FileName[Length] == L'\\') {\r
337 if (Node->FileName[0] == L'\\') {\r
338 //\r
339 // Don't allow for double slashes. Eliminate one of them.\r
340 //\r
341 NewFileInfo->FileName[Length] = CHAR_NULL;\r
342 }\r
343 StrCat(NewFileInfo->FileName, Node->FileName);\r
344 }\r
345 NewFileInfo->Size = sizeof(EFI_FILE_INFO) + StrSize(NewFileInfo->FileName);\r
346 ShellPrintEx(-1, -1, HiiOutput, Node->FullName, NewFileInfo->FileName);\r
347\r
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
385 //\r
386 // Perform the move operation\r
387 //\r
388 Status = ShellSetFileInfo(Node->Handle, NewFileInfo);\r
389\r
390 //\r
391 // Free the info object we used...\r
392 //\r
393 FreePool(NewFileInfo);\r
394\r
395 //\r
396 // Check our result\r
397 //\r
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
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
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
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
449 VOID *Response;\r
450\r
451 ProblemParam = NULL;\r
452 ShellStatus = SHELL_SUCCESS;\r
453 ParamCount = 0;\r
454 FileList = NULL;\r
455 Response = NULL;\r
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
508 ShellStatus = ValidateAndMoveFiles(FileList, &Response, ShellGetCurrentDir(NULL));\r
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
515 for (ParamCount--, LoopCounter = 1 ; LoopCounter < ParamCount ; LoopCounter++) {\r
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
521 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_NF), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, LoopCounter));\r
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
529 ShellStatus = ValidateAndMoveFiles(FileList, &Response, ShellCommandLineGetRawValue(Package, ParamCount));\r
530 } else {\r
531 ValidateAndMoveFiles(FileList, &Response, ShellCommandLineGetRawValue(Package, ParamCount));\r
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
555 SHELL_FREE_NON_NULL(Response);\r
556\r
557 if (ShellGetExecutionBreakFlag()) {\r
558 return (SHELL_ABORTED);\r
559 }\r
560\r
561 return (ShellStatus);\r
562}\r