]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ShellPkg/mkdir: support creating nested directories
authorHuajing Li <huajing.li@intel.com>
Tue, 15 Aug 2017 03:45:29 +0000 (11:45 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Mon, 21 Aug 2017 02:42:39 +0000 (10:42 +0800)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Huajing Li <huajing.li@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c

index 4aade13aac6ad4b5a835301aedfc132b505dce12..3a9e037d0e41e6d082bb91c28d314614d3560f82 100644 (file)
@@ -30,14 +30,19 @@ ShellCommandRunMkDir (
 {\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
@@ -99,21 +104,54 @@ ShellCommandRunMkDir (
           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