]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Vol.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[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
47d20b54
MK
24HandleVol (\r
25 IN CONST CHAR16 *Path,\r
26 IN CONST BOOLEAN Delete,\r
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
47d20b54 39 ShellStatus = SHELL_SUCCESS;\r
b54fd049 40\r
6b825919 41 if (\r
47d20b54
MK
42 (Name != NULL) && (\r
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
58 (StrStr (Name, L" ") != NULL))\r
59 )\r
60 {\r
61 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellLevel2HiiHandle, L"vol", Name);\r
6b825919 62 return (SHELL_INVALID_PARAMETER);\r
63 }\r
64\r
47d20b54
MK
65 Status = gEfiShellProtocol->OpenFileByName (\r
66 Path,\r
67 &ShellFileHandle,\r
68 Name != NULL ? EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE : EFI_FILE_MODE_READ\r
69 );\r
b54fd049 70\r
47d20b54
MK
71 if (EFI_ERROR (Status) || (ShellFileHandle == NULL)) {\r
72 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"vol", Path);\r
6b825919 73 return (SHELL_ACCESS_DENIED);\r
b54fd049 74 }\r
75\r
76 //\r
77 // Get the Volume Info from ShellFileHandle\r
78 //\r
79 SysInfo = NULL;\r
80 SysInfoSize = 0;\r
47d20b54
MK
81 EfiFpHandle = ConvertShellHandleToEfiFileProtocol (ShellFileHandle);\r
82 Status = EfiFpHandle->GetInfo (\r
83 EfiFpHandle,\r
84 &gEfiFileSystemInfoGuid,\r
85 &SysInfoSize,\r
86 SysInfo\r
87 );\r
b54fd049 88\r
89 if (Status == EFI_BUFFER_TOO_SMALL) {\r
47d20b54
MK
90 SysInfo = AllocateZeroPool (SysInfoSize);\r
91 Status = EfiFpHandle->GetInfo (\r
92 EfiFpHandle,\r
93 &gEfiFileSystemInfoGuid,\r
94 &SysInfoSize,\r
95 SysInfo\r
96 );\r
b54fd049 97 }\r
98\r
47d20b54 99 ASSERT (SysInfo != NULL);\r
33c031ee 100\r
b54fd049 101 if (Delete) {\r
47d20b54
MK
102 *((CHAR16 *)SysInfo->VolumeLabel) = CHAR_NULL;\r
103 SysInfo->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (SysInfo->VolumeLabel);\r
104 Status = EfiFpHandle->SetInfo (\r
105 EfiFpHandle,\r
106 &gEfiFileSystemInfoGuid,\r
107 (UINTN)SysInfo->Size,\r
108 SysInfo\r
109 );\r
b54fd049 110 } else if (Name != NULL) {\r
47d20b54
MK
111 Size1 = StrSize (Name);\r
112 Size2 = StrSize (SysInfo->VolumeLabel);\r
b54fd049 113 if (Size1 > Size2) {\r
47d20b54 114 SysInfo = ReallocatePool ((UINTN)SysInfo->Size, (UINTN)SysInfo->Size + Size1 - Size2, SysInfo);\r
cbdd109b 115 if (SysInfo == NULL) {\r
47d20b54 116 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellLevel2HiiHandle, L"vol");\r
cbdd109b 117 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
ba0014b9 118 }\r
cbdd109b 119 }\r
47d20b54 120\r
cbdd109b 121 if (SysInfo != NULL) {\r
47d20b54
MK
122 StrCpyS (\r
123 (CHAR16 *)SysInfo->VolumeLabel,\r
124 (Size1 > Size2 ? Size1/sizeof (CHAR16) : Size2/sizeof (CHAR16)),\r
125 Name\r
126 );\r
cbdd109b 127 SysInfo->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + Size1;\r
47d20b54
MK
128 Status = EfiFpHandle->SetInfo (\r
129 EfiFpHandle,\r
130 &gEfiFileSystemInfoGuid,\r
131 (UINTN)SysInfo->Size,\r
132 SysInfo\r
133 );\r
b54fd049 134 }\r
ba0014b9 135 }\r
b54fd049 136\r
47d20b54 137 FreePool (SysInfo);\r
b54fd049 138\r
47d20b54
MK
139 if (Delete || (Name != NULL)) {\r
140 if (EFI_ERROR (Status)) {\r
141 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"vol", Path);\r
b54fd049 142 ShellStatus = SHELL_ACCESS_DENIED;\r
143 }\r
144 }\r
145\r
e35b5317 146 SysInfoSize = 0;\r
47d20b54 147 SysInfo = NULL;\r
e35b5317 148\r
47d20b54
MK
149 Status = EfiFpHandle->GetInfo (\r
150 EfiFpHandle,\r
151 &gEfiFileSystemInfoGuid,\r
152 &SysInfoSize,\r
153 SysInfo\r
154 );\r
b54fd049 155\r
e35b5317 156 if (Status == EFI_BUFFER_TOO_SMALL) {\r
47d20b54
MK
157 SysInfo = AllocateZeroPool (SysInfoSize);\r
158 Status = EfiFpHandle->GetInfo (\r
159 EfiFpHandle,\r
160 &gEfiFileSystemInfoGuid,\r
161 &SysInfoSize,\r
162 SysInfo\r
163 );\r
e35b5317 164 }\r
165\r
47d20b54 166 gEfiShellProtocol->CloseFile (ShellFileHandle);\r
ba0014b9 167\r
47d20b54 168 ASSERT (SysInfo != NULL);\r
b54fd049 169\r
cbdd109b 170 if (SysInfo != NULL) {\r
171 //\r
172 // print VolumeInfo table\r
173 //\r
174 ShellPrintHiiEx (\r
175 0,\r
176 gST->ConOut->Mode->CursorRow,\r
177 NULL,\r
178 STRING_TOKEN (STR_VOL_VOLINFO),\r
179 gShellLevel2HiiHandle,\r
180 SysInfo->VolumeLabel,\r
47d20b54 181 SysInfo->ReadOnly ? L"r" : L"rw",\r
cbdd109b 182 SysInfo->VolumeSize,\r
183 SysInfo->FreeSpace,\r
184 SysInfo->BlockSize\r
47d20b54
MK
185 );\r
186 SHELL_FREE_NON_NULL (SysInfo);\r
cbdd109b 187 }\r
b54fd049 188\r
189 return (ShellStatus);\r
190}\r
191\r
47d20b54
MK
192STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
193 { L"-d", TypeFlag },\r
194 { L"-n", TypeValue },\r
195 { NULL, TypeMax }\r
196};\r
b54fd049 197\r
198/**\r
199 Function for 'Vol' command.\r
200\r
201 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
202 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
203**/\r
204SHELL_STATUS\r
205EFIAPI\r
206ShellCommandRunVol (\r
207 IN EFI_HANDLE ImageHandle,\r
208 IN EFI_SYSTEM_TABLE *SystemTable\r
209 )\r
210{\r
211 EFI_STATUS Status;\r
212 LIST_ENTRY *Package;\r
213 CHAR16 *ProblemParam;\r
214 SHELL_STATUS ShellStatus;\r
215 CONST CHAR16 *PathName;\r
216 CONST CHAR16 *CurDir;\r
217 BOOLEAN DeleteMode;\r
218 CHAR16 *FullPath;\r
e35b5317 219 CHAR16 *TempSpot;\r
b54fd049 220 UINTN Length;\r
ae724571 221 CONST CHAR16 *NewName;\r
b54fd049 222\r
47d20b54
MK
223 Length = 0;\r
224 ProblemParam = NULL;\r
225 ShellStatus = SHELL_SUCCESS;\r
226 PathName = NULL;\r
227 CurDir = NULL;\r
228 FullPath = NULL;\r
b54fd049 229\r
230 //\r
231 // initialize the shell lib (we must be in non-auto-init...)\r
232 //\r
47d20b54
MK
233 Status = ShellInitialize ();\r
234 ASSERT_EFI_ERROR (Status);\r
b54fd049 235\r
236 //\r
237 // Fix local copies of the protocol pointers\r
238 //\r
47d20b54
MK
239 Status = CommandInit ();\r
240 ASSERT_EFI_ERROR (Status);\r
b54fd049 241\r
242 //\r
243 // parse the command line\r
244 //\r
245 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
246 if (EFI_ERROR (Status)) {\r
247 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
248 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"vol", ProblemParam);\r
249 FreePool (ProblemParam);\r
b54fd049 250 ShellStatus = SHELL_INVALID_PARAMETER;\r
251 } else {\r
47d20b54 252 ASSERT (FALSE);\r
b54fd049 253 }\r
254 } else {\r
255 //\r
256 // check for "-?"\r
257 //\r
47d20b54
MK
258 if (ShellCommandLineGetFlag (Package, L"-?")) {\r
259 ASSERT (FALSE);\r
b54fd049 260 }\r
261\r
47d20b54
MK
262 if (ShellCommandLineGetCount (Package) > 2) {\r
263 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"vol");\r
b54fd049 264 ShellStatus = SHELL_INVALID_PARAMETER;\r
265 } else {\r
47d20b54 266 PathName = ShellCommandLineGetRawValue (Package, 1);\r
b54fd049 267 if (PathName == NULL) {\r
47d20b54 268 CurDir = gEfiShellProtocol->GetCurDir (NULL);\r
b54fd049 269 if (CurDir == NULL) {\r
270 ShellStatus = SHELL_NOT_FOUND;\r
47d20b54 271 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_CWD), gShellLevel2HiiHandle, L"vol");\r
b54fd049 272 } else {\r
273 PathName = CurDir;\r
274 }\r
275 }\r
47d20b54 276\r
b54fd049 277 if (PathName != NULL) {\r
47d20b54 278 TempSpot = StrStr (PathName, L":");\r
e35b5317 279 if (TempSpot != NULL) {\r
280 *TempSpot = CHAR_NULL;\r
281 }\r
47d20b54
MK
282\r
283 TempSpot = StrStr (PathName, L"\\");\r
e35b5317 284 if (TempSpot != NULL) {\r
285 *TempSpot = CHAR_NULL;\r
b54fd049 286 }\r
47d20b54
MK
287\r
288 StrnCatGrow (&FullPath, &Length, PathName, 0);\r
289 StrnCatGrow (&FullPath, &Length, L":\\", 0);\r
290 DeleteMode = ShellCommandLineGetFlag (Package, L"-d");\r
291 NewName = ShellCommandLineGetValue (Package, L"-n");\r
292 if (DeleteMode && ShellCommandLineGetFlag (Package, L"-n")) {\r
293 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellLevel2HiiHandle, L"vol", L"-d", L"-n");\r
b54fd049 294 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
295 } else if (ShellCommandLineGetFlag (Package, L"-n") && (NewName == NULL)) {\r
296 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellLevel2HiiHandle, L"vol", L"-n");\r
b54fd049 297 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
298 } else if ((NewName != NULL) && (StrLen (NewName) > 11)) {\r
299 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellLevel2HiiHandle, L"vol", NewName, L"-n");\r
b54fd049 300 ShellStatus = SHELL_INVALID_PARAMETER;\r
301 } else if (ShellStatus == SHELL_SUCCESS) {\r
47d20b54
MK
302 ShellStatus = HandleVol (\r
303 FullPath,\r
304 DeleteMode,\r
305 NewName\r
306 );\r
b54fd049 307 }\r
308 }\r
309 }\r
310 }\r
311\r
47d20b54 312 SHELL_FREE_NON_NULL (FullPath);\r
b54fd049 313\r
314 //\r
315 // free the command line package\r
316 //\r
317 ShellCommandLineFreeVarList (Package);\r
318\r
319 return (ShellStatus);\r
320}\r