public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Ruiyu Ni <ruiyu.ni@intel.com>
To: edk2-devel@lists.01.org
Cc: Huajing Li <huajing.li@intel.com>
Subject: [PATCH 2/2] ShellPkg/mkdir: support creating nested directories
Date: Wed, 16 Aug 2017 13:42:54 +0800	[thread overview]
Message-ID: <20170816054254.16184-3-ruiyu.ni@intel.com> (raw)
In-Reply-To: <20170816054254.16184-1-ruiyu.ni@intel.com>

From: Huajing Li <huajing.li@intel.com>

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Huajing Li <huajing.li@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
---
 .../Library/UefiShellLevel2CommandsLib/MkDir.c     | 54 ++++++++++++++++++----
 1 file changed, 46 insertions(+), 8 deletions(-)

diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c
index 4aade13aac..3a9e037d0e 100644
--- a/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c
+++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c
@@ -30,14 +30,19 @@ ShellCommandRunMkDir (
 {
   EFI_STATUS      Status;
   CONST CHAR16    *NewDirName;
+  CHAR16          *NewDirNameCopy;
+  CHAR16          *SplitName;
+  CHAR16          SaveSplitChar;
   UINTN           DirCreateCount;
   LIST_ENTRY      *Package;
   CHAR16          *ProblemParam;
   SHELL_FILE_HANDLE          FileHandle;
   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...)
   //
@@ -99,21 +104,54 @@ ShellCommandRunMkDir (
           ShellCloseFile(&FileHandle);
           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName);
           ShellStatus = SHELL_INVALID_PARAMETER;
-          break;
         } else {
           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);
-          if (FileHandle != NULL) {
-            gEfiShellProtocol->CloseFile(FileHandle);
+          NewDirNameCopy = AllocateCopyPool (StrSize(NewDirName), NewDirName);
+          NewDirNameCopy = PathCleanUpDirectories (NewDirNameCopy);
+          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)) {
-            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;
             break;
           }
+          SHELL_FREE_NON_NULL (NewDirNameCopy);
         }
       }
     }
-- 
2.12.2.windows.2



      parent reply	other threads:[~2017-08-16  5:40 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-08-16  5:42 [PATCH 0/2] ShellPkg/mkdir Support creating nested directories Ruiyu Ni
2017-08-16  5:42 ` [PATCH 1/2] Shell/mkdir: Modify the help content to align to spec Ruiyu Ni
2017-08-16  5:42 ` Ruiyu Ni [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170816054254.16184-3-ruiyu.ni@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox