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