]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/MkDir.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / MkDir.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for attrib shell level 2 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 5 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a405b86d 7\r
8**/\r
9\r
10#include "UefiShellLevel2CommandsLib.h"\r
11\r
12/**\r
13 Function for 'mkdir' command.\r
14\r
15 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
16 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
17**/\r
18SHELL_STATUS\r
19EFIAPI\r
20ShellCommandRunMkDir (\r
21 IN EFI_HANDLE ImageHandle,\r
22 IN EFI_SYSTEM_TABLE *SystemTable\r
23 )\r
24{\r
47d20b54
MK
25 EFI_STATUS Status;\r
26 CONST CHAR16 *NewDirName;\r
27 CHAR16 *NewDirNameCopy;\r
28 CHAR16 *SplitName;\r
29 CHAR16 SaveSplitChar;\r
30 UINTN DirCreateCount;\r
31 LIST_ENTRY *Package;\r
32 CHAR16 *ProblemParam;\r
33 SHELL_FILE_HANDLE FileHandle;\r
34 SHELL_STATUS ShellStatus;\r
35\r
36 ShellStatus = SHELL_SUCCESS;\r
37 NewDirNameCopy = NULL;\r
38 SplitName = NULL;\r
39 SaveSplitChar = CHAR_NULL;\r
a405b86d 40 //\r
41 // initialize the shell lib (we must be in non-auto-init...)\r
42 //\r
47d20b54
MK
43 Status = ShellInitialize ();\r
44 ASSERT_EFI_ERROR (Status);\r
a405b86d 45\r
46 //\r
47 // parse the command line\r
48 //\r
49 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
50 if (EFI_ERROR (Status)) {\r
51 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
52 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"mkdir", ProblemParam);\r
53 FreePool (ProblemParam);\r
a405b86d 54 ShellStatus = SHELL_INVALID_PARAMETER;\r
55 } else {\r
47d20b54 56 ASSERT (FALSE);\r
a405b86d 57 }\r
58 } else {\r
59 //\r
60 // check for "-?"\r
61 //\r
47d20b54
MK
62 if (ShellCommandLineGetFlag (Package, L"-?")) {\r
63 ASSERT (FALSE);\r
a405b86d 64 }\r
65\r
66 //\r
67 // create a set of directories\r
68 //\r
47d20b54 69 if (ShellCommandLineGetRawValue (Package, 1) == NULL) {\r
a405b86d 70 //\r
71 // we didnt get a single parameter\r
72 //\r
47d20b54 73 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"mkdir");\r
a405b86d 74 ShellStatus = SHELL_INVALID_PARAMETER;\r
75 } else {\r
76 for ( DirCreateCount = 1\r
47d20b54
MK
77 ;\r
78 ; DirCreateCount++\r
79 )\r
80 {\r
a405b86d 81 //\r
82 // loop through each directory specified\r
83 //\r
84\r
47d20b54 85 NewDirName = ShellCommandLineGetRawValue (Package, DirCreateCount);\r
a405b86d 86 if (NewDirName == NULL) {\r
87 break;\r
88 }\r
47d20b54 89\r
a405b86d 90 //\r
91 // check if that already exists... if yes fail\r
92 //\r
93 FileHandle = NULL;\r
47d20b54
MK
94 Status = ShellOpenFileByName (\r
95 NewDirName,\r
96 &FileHandle,\r
97 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,\r
98 EFI_FILE_DIRECTORY\r
99 );\r
100 if (!EFI_ERROR (Status)) {\r
101 ShellCloseFile (&FileHandle);\r
102 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MKDIR_ALREADY), gShellLevel2HiiHandle, NewDirName);\r
a405b86d 103 ShellStatus = SHELL_INVALID_PARAMETER;\r
a405b86d 104 } else {\r
47d20b54 105 ASSERT (FileHandle == NULL);\r
a405b86d 106 //\r
bb3d1a61 107 // create the nested directory from parent to child.\r
ba0014b9 108 // if NewDirName = test1\test2\test3, first create "test1\" directory, then "test1\test2\", finally "test1\test2\test3".\r
a405b86d 109 //\r
47d20b54 110 NewDirNameCopy = AllocateCopyPool (StrSize (NewDirName), NewDirName);\r
bb3d1a61 111 NewDirNameCopy = PathCleanUpDirectories (NewDirNameCopy);\r
47d20b54 112 if (NewDirNameCopy == NULL) {\r
bb3d1a61
HL
113 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
114 break;\r
115 }\r
47d20b54 116\r
bb3d1a61
HL
117 SplitName = NewDirNameCopy;\r
118 while (SplitName != NULL) {\r
119 SplitName = StrStr (SplitName + 1, L"\\");\r
120 if (SplitName != NULL) {\r
47d20b54 121 SaveSplitChar = *(SplitName + 1);\r
bb3d1a61
HL
122 *(SplitName + 1) = '\0';\r
123 }\r
47d20b54 124\r
bb3d1a61
HL
125 //\r
126 // check if current nested directory already exists... continue to create the child directory.\r
127 //\r
47d20b54
MK
128 Status = ShellOpenFileByName (\r
129 NewDirNameCopy,\r
130 &FileHandle,\r
131 EFI_FILE_MODE_READ,\r
132 EFI_FILE_DIRECTORY\r
133 );\r
134 if (!EFI_ERROR (Status)) {\r
bb3d1a61
HL
135 ShellCloseFile (&FileHandle);\r
136 } else {\r
137 Status = ShellCreateDirectory (NewDirNameCopy, &FileHandle);\r
47d20b54 138 if (EFI_ERROR (Status)) {\r
bb3d1a61
HL
139 break;\r
140 }\r
47d20b54 141\r
bb3d1a61
HL
142 if (FileHandle != NULL) {\r
143 gEfiShellProtocol->CloseFile (FileHandle);\r
144 }\r
145 }\r
47d20b54 146\r
bb3d1a61
HL
147 if (SplitName != NULL) {\r
148 *(SplitName + 1) = SaveSplitChar;\r
149 }\r
a405b86d 150 }\r
47d20b54
MK
151\r
152 if (EFI_ERROR (Status)) {\r
bb3d1a61 153 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_MKDIR_CREATEFAIL), gShellLevel2HiiHandle, NewDirName);\r
a405b86d 154 ShellStatus = SHELL_ACCESS_DENIED;\r
155 break;\r
156 }\r
47d20b54 157\r
bb3d1a61 158 SHELL_FREE_NON_NULL (NewDirNameCopy);\r
a405b86d 159 }\r
160 }\r
161 }\r
162 }\r
163\r
164 //\r
165 // free the command line package\r
166 //\r
167 ShellCommandLineFreeVarList (Package);\r
168\r
169 return (ShellStatus);\r
170}\r