ShellPkg/mkdir: support creating nested directories

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Huajing Li <huajing.li@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
Huajing Li 2017-08-15 11:45:29 +08:00 committed by Ruiyu Ni
parent 88f9acd6cc
commit bb3d1a6198
1 changed files with 46 additions and 8 deletions

View File

@ -30,14 +30,19 @@ ShellCommandRunMkDir (
{ {
EFI_STATUS Status; EFI_STATUS Status;
CONST CHAR16 *NewDirName; CONST CHAR16 *NewDirName;
CHAR16 *NewDirNameCopy;
CHAR16 *SplitName;
CHAR16 SaveSplitChar;
UINTN DirCreateCount; UINTN DirCreateCount;
LIST_ENTRY *Package; LIST_ENTRY *Package;
CHAR16 *ProblemParam; CHAR16 *ProblemParam;
SHELL_FILE_HANDLE FileHandle; SHELL_FILE_HANDLE FileHandle;
SHELL_STATUS ShellStatus; SHELL_STATUS ShellStatus;
ShellStatus = SHELL_SUCCESS; ShellStatus = SHELL_SUCCESS;
NewDirNameCopy = NULL;
SplitName = NULL;
SaveSplitChar = CHAR_NULL;
// //
// initialize the shell lib (we must be in non-auto-init...) // initialize the shell lib (we must be in non-auto-init...)
// //
@ -99,21 +104,54 @@ ShellCommandRunMkDir (
ShellCloseFile(&FileHandle); ShellCloseFile(&FileHandle);
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName);
ShellStatus = SHELL_INVALID_PARAMETER; ShellStatus = SHELL_INVALID_PARAMETER;
break;
} else { } else {
ASSERT(FileHandle == NULL); ASSERT(FileHandle == NULL);
// //
// create the directory named NewDirName // create the nested directory from parent to child.
// if NewDirName = test1\test2\test3, first create "test1\" directory, then "test1\test2\", finally "test1\test2\test3".
// //
Status = ShellCreateDirectory(NewDirName, &FileHandle); NewDirNameCopy = AllocateCopyPool (StrSize(NewDirName), NewDirName);
if (FileHandle != NULL) { NewDirNameCopy = PathCleanUpDirectories (NewDirNameCopy);
gEfiShellProtocol->CloseFile(FileHandle); if(NewDirNameCopy == NULL) {
ShellStatus = SHELL_OUT_OF_RESOURCES;
break;
}
SplitName = NewDirNameCopy;
while (SplitName != NULL) {
SplitName = StrStr (SplitName + 1, L"\\");
if (SplitName != NULL) {
SaveSplitChar = *(SplitName + 1);
*(SplitName + 1) = '\0';
}
//
// check if current nested directory already exists... continue to create the child directory.
//
Status = ShellOpenFileByName (NewDirNameCopy,
&FileHandle,
EFI_FILE_MODE_READ,
EFI_FILE_DIRECTORY
);
if (!EFI_ERROR(Status)) {
ShellCloseFile (&FileHandle);
} else {
Status = ShellCreateDirectory (NewDirNameCopy, &FileHandle);
if (EFI_ERROR(Status)) {
break;
}
if (FileHandle != NULL) {
gEfiShellProtocol->CloseFile (FileHandle);
}
}
if (SplitName != NULL) {
*(SplitName + 1) = SaveSplitChar;
}
} }
if (EFI_ERROR(Status)) { if (EFI_ERROR(Status)) {
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MKDIR_CREATEFAIL), gShellLevel2HiiHandle, NewDirName); ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MKDIR_CREATEFAIL), gShellLevel2HiiHandle, NewDirName);
ShellStatus = SHELL_ACCESS_DENIED; ShellStatus = SHELL_ACCESS_DENIED;
break; break;
} }
SHELL_FREE_NON_NULL (NewDirNameCopy);
} }
} }
} }