]>
Commit | Line | Data |
---|---|---|
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 | |
23 | SHELL_STATUS\r | |
b54fd049 | 24 | HandleVol(\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 | |
182 | STATIC 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 | |
194 | SHELL_STATUS\r | |
195 | EFIAPI\r | |
196 | ShellCommandRunVol (\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 |