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