public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH 0/2] ShellPkg/mkdir Support creating nested directories
@ 2017-08-16  5:42 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 ` [PATCH 2/2] ShellPkg/mkdir: support creating nested directories Ruiyu Ni
  0 siblings, 2 replies; 3+ messages in thread
From: Ruiyu Ni @ 2017-08-16  5:42 UTC (permalink / raw)
  To: edk2-devel

Huajing Li (2):
  Shell/mkdir: Modify the help content to align to spec.
  ShellPkg/mkdir: support creating nested directories

 .../Library/UefiShellLevel2CommandsLib/MkDir.c     | 54 ++++++++++++++++++----
 .../UefiShellLevel2CommandsLib.uni                 | 15 +++---
 2 files changed, 52 insertions(+), 17 deletions(-)

-- 
2.12.2.windows.2



^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] Shell/mkdir: Modify the help content to align to spec.
  2017-08-16  5:42 [PATCH 0/2] ShellPkg/mkdir Support creating nested directories Ruiyu Ni
@ 2017-08-16  5:42 ` Ruiyu Ni
  2017-08-16  5:42 ` [PATCH 2/2] ShellPkg/mkdir: support creating nested directories Ruiyu Ni
  1 sibling, 0 replies; 3+ messages in thread
From: Ruiyu Ni @ 2017-08-16  5:42 UTC (permalink / raw)
  To: edk2-devel; +Cc: Huajing Li

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>
---
 .../UefiShellLevel2CommandsLib.uni                        | 15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.uni b/ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.uni
index 60f48f4633..f9c647a035 100644
--- a/ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.uni
+++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.uni
@@ -464,18 +464,15 @@
 "MKDIR dir [dir...]\r\n"
 ".SH OPTIONS\r\n"
 " \r\n"
-"  dir - Specifies the name of a directory or directories to create. (Wildcards are not\r\n"
-"        allowed) \r\n"
+"  dir - Specifies the name of a directory or directories to create.\r\n"
+"        (Wildcards are not allowed)\r\n"
 ".SH DESCRIPTION\r\n"
 " \r\n"
 "NOTES:\r\n"
-"  1. The parent directory must already exist.\r\n"
-"  2. If the directory already exists, mkdir will abort.\r\n"
-"  3. Specifying additional directory parameters dependent on previous\r\n"
-"     directory parameters is not allowed:\r\n"
-"     For example, mkdir new new\Test is not allowed.\r\n"
-"  4. Redirecting output to a file that exists under the directory specified\r\n"
-"     by this command is not allowed.\r\n"
+"  1. Mkdir can create one or more new directories.\r\n"
+"  2. If dir includes nested directories, then parent directories will be\r\n"
+"     created before child directories.\r\n"
+"  3. If the directory already exists, mkdir will exit with an error.\r\n"
 ".SH EXAMPLES\r\n"
 " \r\n"
 "EXAMPLES:\r\n"
-- 
2.12.2.windows.2



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] ShellPkg/mkdir: support creating nested directories
  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
  1 sibling, 0 replies; 3+ messages in thread
From: Ruiyu Ni @ 2017-08-16  5:42 UTC (permalink / raw)
  To: edk2-devel; +Cc: Huajing Li

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



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2017-08-16  5:40 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [PATCH 2/2] ShellPkg/mkdir: support creating nested directories Ruiyu Ni

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox