]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c
EmulatorPkg: Remove framework pkgs dependency from EmulatorPkg
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Vol.c
CommitLineData
b54fd049 1/** @file\r
2 Main file for vol shell level 2 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 5 Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
b54fd049 7\r
8**/\r
9\r
10#include "UefiShellLevel2CommandsLib.h"\r
11#include <Guid/FileSystemInfo.h>\r
12#include <Guid/FileSystemVolumeLabelInfo.h>\r
13\r
14/**\r
15 Print the info or change the volume info.\r
16\r
17 @param[in] Path String with starting path.\r
18 @param[in] Delete TRUE to delete the volume label. FALSE otherwise.\r
19 @param[in] Name New name to set to the volume label.\r
20\r
21 @retval SHELL_SUCCESS The operation was sucessful.\r
22**/\r
23SHELL_STATUS\r
b54fd049 24HandleVol(\r
25 IN CONST CHAR16 *Path,\r
26 IN CONST BOOLEAN Delete,\r
ae724571 27 IN CONST CHAR16 *Name OPTIONAL\r
b54fd049 28 )\r
29{\r
30 EFI_STATUS Status;\r
31 SHELL_STATUS ShellStatus;\r
32 EFI_FILE_SYSTEM_INFO *SysInfo;\r
33 UINTN SysInfoSize;\r
34 SHELL_FILE_HANDLE ShellFileHandle;\r
35 EFI_FILE_PROTOCOL *EfiFpHandle;\r
36 UINTN Size1;\r
37 UINTN Size2;\r
38\r
39 ShellStatus = SHELL_SUCCESS;\r
40\r
6b825919 41 if (\r
ae724571 42 Name != NULL && (\r
6b825919 43 StrStr(Name, L"%") != NULL ||\r
44 StrStr(Name, L"^") != NULL ||\r
45 StrStr(Name, L"*") != NULL ||\r
46 StrStr(Name, L"+") != NULL ||\r
47 StrStr(Name, L"=") != NULL ||\r
48 StrStr(Name, L"[") != NULL ||\r
49 StrStr(Name, L"]") != NULL ||\r
50 StrStr(Name, L"|") != NULL ||\r
51 StrStr(Name, L":") != NULL ||\r
52 StrStr(Name, L";") != NULL ||\r
53 StrStr(Name, L"\"") != NULL ||\r
54 StrStr(Name, L"<") != NULL ||\r
55 StrStr(Name, L">") != NULL ||\r
56 StrStr(Name, L"?") != NULL ||\r
57 StrStr(Name, L"/") != NULL ||\r
ae724571 58 StrStr(Name, L" ") != NULL )\r
6b825919 59 ){\r
ba0014b9 60 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"vol", Name);\r
6b825919 61 return (SHELL_INVALID_PARAMETER);\r
62 }\r
63\r
b54fd049 64 Status = gEfiShellProtocol->OpenFileByName(\r
65 Path,\r
66 &ShellFileHandle,\r
67 Name != NULL?EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE:EFI_FILE_MODE_READ);\r
68\r
69 if (EFI_ERROR(Status) || ShellFileHandle == NULL) {\r
ba0014b9 70 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"vol", Path);\r
6b825919 71 return (SHELL_ACCESS_DENIED);\r
b54fd049 72 }\r
73\r
74 //\r
75 // Get the Volume Info from ShellFileHandle\r
76 //\r
77 SysInfo = NULL;\r
78 SysInfoSize = 0;\r
79 EfiFpHandle = ConvertShellHandleToEfiFileProtocol(ShellFileHandle);\r
80 Status = EfiFpHandle->GetInfo(\r
81 EfiFpHandle,\r
82 &gEfiFileSystemInfoGuid,\r
83 &SysInfoSize,\r
84 SysInfo);\r
85\r
86 if (Status == EFI_BUFFER_TOO_SMALL) {\r
87 SysInfo = AllocateZeroPool(SysInfoSize);\r
88 Status = EfiFpHandle->GetInfo(\r
89 EfiFpHandle,\r
90 &gEfiFileSystemInfoGuid,\r
91 &SysInfoSize,\r
92 SysInfo);\r
93 }\r
94\r
33c031ee 95 ASSERT(SysInfo != NULL);\r
96\r
b54fd049 97 if (Delete) {\r
cea5e3b9 98 *((CHAR16 *) SysInfo->VolumeLabel) = CHAR_NULL;\r
b54fd049 99 SysInfo->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize(SysInfo->VolumeLabel);\r
100 Status = EfiFpHandle->SetInfo(\r
101 EfiFpHandle,\r
102 &gEfiFileSystemInfoGuid,\r
103 (UINTN)SysInfo->Size,\r
104 SysInfo);\r
105 } else if (Name != NULL) {\r
106 Size1 = StrSize(Name);\r
107 Size2 = StrSize(SysInfo->VolumeLabel);\r
108 if (Size1 > Size2) {\r
109 SysInfo = ReallocatePool((UINTN)SysInfo->Size, (UINTN)SysInfo->Size + Size1 - Size2, SysInfo);\r
cbdd109b 110 if (SysInfo == NULL) {\r
ba0014b9 111 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol");\r
cbdd109b 112 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
ba0014b9 113 }\r
cbdd109b 114 }\r
115 if (SysInfo != NULL) {\r
ba0014b9
LG
116 StrCpyS ( (CHAR16 *) SysInfo->VolumeLabel,\r
117 (Size1>Size2? Size1/sizeof(CHAR16) : Size2/sizeof(CHAR16)),\r
e75390f0
QS
118 Name\r
119 );\r
cbdd109b 120 SysInfo->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + Size1;\r
121 Status = EfiFpHandle->SetInfo(\r
122 EfiFpHandle,\r
123 &gEfiFileSystemInfoGuid,\r
124 (UINTN)SysInfo->Size,\r
125 SysInfo);\r
b54fd049 126 }\r
ba0014b9 127 }\r
b54fd049 128\r
129 FreePool(SysInfo);\r
130\r
131 if (Delete || Name != NULL) {\r
132 if (EFI_ERROR(Status)) {\r
ba0014b9 133 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"vol", Path);\r
b54fd049 134 ShellStatus = SHELL_ACCESS_DENIED;\r
135 }\r
136 }\r
137\r
e35b5317 138 SysInfoSize = 0;\r
139 SysInfo = NULL;\r
140\r
b54fd049 141 Status = EfiFpHandle->GetInfo(\r
142 EfiFpHandle,\r
143 &gEfiFileSystemInfoGuid,\r
144 &SysInfoSize,\r
145 SysInfo);\r
146\r
e35b5317 147 if (Status == EFI_BUFFER_TOO_SMALL) {\r
148 SysInfo = AllocateZeroPool(SysInfoSize);\r
149 Status = EfiFpHandle->GetInfo(\r
150 EfiFpHandle,\r
151 &gEfiFileSystemInfoGuid,\r
152 &SysInfoSize,\r
153 SysInfo);\r
154 }\r
155\r
b54fd049 156 gEfiShellProtocol->CloseFile(ShellFileHandle);\r
ba0014b9 157\r
ae724571 158 ASSERT(SysInfo != NULL);\r
b54fd049 159\r
cbdd109b 160 if (SysInfo != NULL) {\r
161 //\r
162 // print VolumeInfo table\r
163 //\r
164 ShellPrintHiiEx (\r
165 0,\r
166 gST->ConOut->Mode->CursorRow,\r
167 NULL,\r
168 STRING_TOKEN (STR_VOL_VOLINFO),\r
169 gShellLevel2HiiHandle,\r
170 SysInfo->VolumeLabel,\r
171 SysInfo->ReadOnly?L"r":L"rw",\r
172 SysInfo->VolumeSize,\r
173 SysInfo->FreeSpace,\r
174 SysInfo->BlockSize\r
175 );\r
176 SHELL_FREE_NON_NULL(SysInfo);\r
177 }\r
b54fd049 178\r
179 return (ShellStatus);\r
180}\r
181\r
182STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
183 {L"-d", TypeFlag},\r
184 {L"-n", TypeValue},\r
185 {NULL, TypeMax}\r
186 };\r
187\r
188/**\r
189 Function for 'Vol' command.\r
190\r
191 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
192 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
193**/\r
194SHELL_STATUS\r
195EFIAPI\r
196ShellCommandRunVol (\r
197 IN EFI_HANDLE ImageHandle,\r
198 IN EFI_SYSTEM_TABLE *SystemTable\r
199 )\r
200{\r
201 EFI_STATUS Status;\r
202 LIST_ENTRY *Package;\r
203 CHAR16 *ProblemParam;\r
204 SHELL_STATUS ShellStatus;\r
205 CONST CHAR16 *PathName;\r
206 CONST CHAR16 *CurDir;\r
207 BOOLEAN DeleteMode;\r
208 CHAR16 *FullPath;\r
e35b5317 209 CHAR16 *TempSpot;\r
b54fd049 210 UINTN Length;\r
ae724571 211 CONST CHAR16 *NewName;\r
b54fd049 212\r
213 Length = 0;\r
214 ProblemParam = NULL;\r
215 ShellStatus = SHELL_SUCCESS;\r
216 PathName = NULL;\r
217 CurDir = NULL;\r
218 FullPath = NULL;\r
219\r
220 //\r
221 // initialize the shell lib (we must be in non-auto-init...)\r
222 //\r
223 Status = ShellInitialize();\r
224 ASSERT_EFI_ERROR(Status);\r
225\r
226 //\r
227 // Fix local copies of the protocol pointers\r
228 //\r
229 Status = CommandInit();\r
230 ASSERT_EFI_ERROR(Status);\r
231\r
232 //\r
233 // parse the command line\r
234 //\r
235 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
236 if (EFI_ERROR(Status)) {\r
237 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
ba0014b9 238 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"vol", ProblemParam);\r
b54fd049 239 FreePool(ProblemParam);\r
240 ShellStatus = SHELL_INVALID_PARAMETER;\r
241 } else {\r
242 ASSERT(FALSE);\r
243 }\r
244 } else {\r
245 //\r
246 // check for "-?"\r
247 //\r
248 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
249 ASSERT(FALSE);\r
250 }\r
251\r
252 if (ShellCommandLineGetCount(Package) > 2) {\r
ba0014b9 253 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"vol");\r
b54fd049 254 ShellStatus = SHELL_INVALID_PARAMETER;\r
255 } else {\r
256 PathName = ShellCommandLineGetRawValue(Package, 1);\r
257 if (PathName == NULL) {\r
258 CurDir = gEfiShellProtocol->GetCurDir(NULL);\r
259 if (CurDir == NULL) {\r
260 ShellStatus = SHELL_NOT_FOUND;\r
ba0014b9 261 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"vol");\r
b54fd049 262 } else {\r
263 PathName = CurDir;\r
264 }\r
265 }\r
266 if (PathName != NULL) {\r
e35b5317 267 TempSpot = StrStr(PathName, L":");\r
268 if (TempSpot != NULL) {\r
269 *TempSpot = CHAR_NULL;\r
270 }\r
271 TempSpot = StrStr(PathName, L"\\");\r
272 if (TempSpot != NULL) {\r
273 *TempSpot = CHAR_NULL;\r
b54fd049 274 }\r
e35b5317 275 StrnCatGrow(&FullPath, &Length, PathName, 0);\r
276 StrnCatGrow(&FullPath, &Length, L":\\", 0);\r
b54fd049 277 DeleteMode = ShellCommandLineGetFlag(Package, L"-d");\r
ae724571 278 NewName = ShellCommandLineGetValue(Package, L"-n");\r
b54fd049 279 if (DeleteMode && ShellCommandLineGetFlag(Package, L"-n")) {\r
ba0014b9 280 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel2HiiHandle, L"vol", L"-d", L"-n");\r
b54fd049 281 ShellStatus = SHELL_INVALID_PARAMETER;\r
ae724571 282 } else if (ShellCommandLineGetFlag(Package, L"-n") && NewName == NULL) {\r
ba0014b9 283 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"vol", L"-n");\r
b54fd049 284 ShellStatus = SHELL_INVALID_PARAMETER;\r
ae724571 285 } else if (NewName != NULL && StrLen(NewName) > 11) {\r
ba0014b9 286 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"vol", NewName, L"-n");\r
b54fd049 287 ShellStatus = SHELL_INVALID_PARAMETER;\r
288 } else if (ShellStatus == SHELL_SUCCESS) {\r
289 ShellStatus = HandleVol(\r
290 FullPath,\r
291 DeleteMode,\r
ae724571 292 NewName\r
b54fd049 293 );\r
294 }\r
295 }\r
296 }\r
297 }\r
298\r
299 SHELL_FREE_NON_NULL(FullPath);\r
300\r
301 //\r
302 // free the command line package\r
303 //\r
304 ShellCommandLineFreeVarList (Package);\r
305\r
306 return (ShellStatus);\r
307}\r