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