]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Attrib.c
CommitLineData
a405b86d 1/** @file\r
2 Main file for attrib shell level 2 function.\r
3\r
c011b6c9 4 (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 5 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a405b86d 7\r
8**/\r
9\r
10#include "UefiShellLevel2CommandsLib.h"\r
11\r
47d20b54
MK
12STATIC CONST CHAR16 AllFiles[] = L"*";\r
13\r
14STATIC CONST SHELL_PARAM_ITEM AttribParamList[] = {\r
15 { L"-a", TypeFlag },\r
16 { L"+a", TypeFlag },\r
17 { L"-s", TypeFlag },\r
18 { L"+s", TypeFlag },\r
19 { L"-h", TypeFlag },\r
20 { L"+h", TypeFlag },\r
21 { L"-r", TypeFlag },\r
22 { L"+r", TypeFlag },\r
23 { NULL, TypeMax }\r
24};\r
a405b86d 25\r
26/**\r
27 Function for 'attrib' command.\r
28\r
29 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
30 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
31**/\r
32SHELL_STATUS\r
33EFIAPI\r
34ShellCommandRunAttrib (\r
35 IN EFI_HANDLE ImageHandle,\r
36 IN EFI_SYSTEM_TABLE *SystemTable\r
37 )\r
38{\r
47d20b54
MK
39 UINT64 FileAttributesToAdd;\r
40 UINT64 FileAttributesToRemove;\r
41 EFI_STATUS Status;\r
42 LIST_ENTRY *Package;\r
43 CHAR16 *ProblemParam;\r
44 SHELL_STATUS ShellStatus;\r
45 UINTN ParamNumberCount;\r
46 CONST CHAR16 *FileName;\r
47 EFI_SHELL_FILE_INFO *ListOfFiles;\r
48 EFI_SHELL_FILE_INFO *FileNode;\r
49 EFI_FILE_INFO *FileInfo;\r
50\r
51 ListOfFiles = NULL;\r
52 ShellStatus = SHELL_SUCCESS;\r
53 ProblemParam = NULL;\r
a405b86d 54\r
55 //\r
56 // initialize the shell lib (we must be in non-auto-init...)\r
57 //\r
47d20b54
MK
58 Status = ShellInitialize ();\r
59 ASSERT_EFI_ERROR (Status);\r
a405b86d 60\r
61 //\r
62 // parse the command line\r
63 //\r
64 Status = ShellCommandLineParse (AttribParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
65 if (EFI_ERROR (Status)) {\r
66 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
67 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"attrib", ProblemParam);\r
68 FreePool (ProblemParam);\r
a405b86d 69 ShellStatus = SHELL_INVALID_PARAMETER;\r
70 } else {\r
47d20b54 71 ASSERT (FALSE);\r
a405b86d 72 }\r
73 } else {\r
a405b86d 74 //\r
75 // check for "-?"\r
76 //\r
47d20b54
MK
77 if (ShellCommandLineGetFlag (Package, L"-?")) {\r
78 ASSERT (FALSE);\r
a405b86d 79 } else {\r
47d20b54 80 FileAttributesToAdd = 0;\r
a405b86d 81 FileAttributesToRemove = 0;\r
82\r
83 //\r
84 // apply or remove each flag\r
85 //\r
47d20b54 86 if (ShellCommandLineGetFlag (Package, L"+a")) {\r
a405b86d 87 FileAttributesToAdd |= EFI_FILE_ARCHIVE;\r
88 }\r
47d20b54
MK
89\r
90 if (ShellCommandLineGetFlag (Package, L"-a")) {\r
a405b86d 91 FileAttributesToRemove |= EFI_FILE_ARCHIVE;\r
92 }\r
47d20b54
MK
93\r
94 if (ShellCommandLineGetFlag (Package, L"+s")) {\r
a405b86d 95 FileAttributesToAdd |= EFI_FILE_SYSTEM;\r
96 }\r
47d20b54
MK
97\r
98 if (ShellCommandLineGetFlag (Package, L"-s")) {\r
a405b86d 99 FileAttributesToRemove |= EFI_FILE_SYSTEM;\r
100 }\r
47d20b54
MK
101\r
102 if (ShellCommandLineGetFlag (Package, L"+h")) {\r
a405b86d 103 FileAttributesToAdd |= EFI_FILE_HIDDEN;\r
104 }\r
47d20b54
MK
105\r
106 if (ShellCommandLineGetFlag (Package, L"-h")) {\r
a405b86d 107 FileAttributesToRemove |= EFI_FILE_HIDDEN;\r
108 }\r
47d20b54
MK
109\r
110 if (ShellCommandLineGetFlag (Package, L"+r")) {\r
a405b86d 111 FileAttributesToAdd |= EFI_FILE_READ_ONLY;\r
112 }\r
47d20b54
MK
113\r
114 if (ShellCommandLineGetFlag (Package, L"-r")) {\r
a405b86d 115 FileAttributesToRemove |= EFI_FILE_READ_ONLY;\r
116 }\r
117\r
47d20b54 118 if ((FileAttributesToRemove == 0) && (FileAttributesToAdd == 0)) {\r
a405b86d 119 //\r
120 // Do display as we have no attributes to change\r
121 //\r
122 for ( ParamNumberCount = 1\r
47d20b54
MK
123 ;\r
124 ; ParamNumberCount++\r
125 )\r
126 {\r
127 FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount);\r
a405b86d 128 // if we dont have anything left, move on...\r
47d20b54
MK
129 if ((FileName == NULL) && (ParamNumberCount == 1)) {\r
130 FileName = (CHAR16 *)AllFiles;\r
a405b86d 131 } else if (FileName == NULL) {\r
132 break;\r
133 }\r
47d20b54
MK
134\r
135 ASSERT (ListOfFiles == NULL);\r
136 Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles);\r
137 if (EFI_ERROR (Status)) {\r
138 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));\r
a405b86d 139 ShellStatus = SHELL_NOT_FOUND;\r
140 } else {\r
47d20b54
MK
141 for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link)\r
142 ; !IsNull (&ListOfFiles->Link, &FileNode->Link)\r
143 ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link)\r
144 )\r
145 {\r
146 ShellPrintHiiEx (\r
a405b86d 147 -1,\r
148 -1,\r
149 NULL,\r
150 STRING_TOKEN (STR_ATTRIB_OUTPUT_LINE),\r
151 gShellLevel2HiiHandle,\r
47d20b54
MK
152 FileNode->Info->Attribute&EFI_FILE_DIRECTORY ? L'D' : L' ',\r
153 FileNode->Info->Attribute&EFI_FILE_ARCHIVE ? L'A' : L' ',\r
154 FileNode->Info->Attribute&EFI_FILE_SYSTEM ? L'S' : L' ',\r
155 FileNode->Info->Attribute&EFI_FILE_HIDDEN ? L'H' : L' ',\r
156 FileNode->Info->Attribute&EFI_FILE_READ_ONLY ? L'R' : L' ',\r
a405b86d 157 FileNode->FileName\r
47d20b54 158 );\r
ba0014b9 159\r
47d20b54
MK
160 if (ShellGetExecutionBreakFlag ()) {\r
161 ShellStatus = SHELL_ABORTED;\r
162 break;\r
288638f0 163 }\r
a405b86d 164 }\r
47d20b54
MK
165\r
166 Status = ShellCloseFileMetaArg (&ListOfFiles);\r
a405b86d 167 ListOfFiles = NULL;\r
47d20b54
MK
168 if (EFI_ERROR (Status)) {\r
169 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));\r
a405b86d 170 ShellStatus = SHELL_NOT_FOUND;\r
171 }\r
172 } // for loop for handling wildcard filenames\r
173 } // for loop for printing out the info\r
174 } else if ((FileAttributesToRemove & FileAttributesToAdd) != 0) {\r
175 //\r
176 // fail as we have conflcting params.\r
177 //\r
47d20b54 178 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"attrib");\r
a405b86d 179 ShellStatus = SHELL_INVALID_PARAMETER;\r
180 } else {\r
181 //\r
182 // enumerate through all the files/directories and apply the attributes\r
183 //\r
184 for ( ParamNumberCount = 1\r
47d20b54
MK
185 ;\r
186 ; ParamNumberCount++\r
187 )\r
188 {\r
189 FileName = ShellCommandLineGetRawValue (Package, ParamNumberCount);\r
a405b86d 190 // if we dont have anything left, move on...\r
191 if (FileName == NULL) {\r
192 //\r
193 // make sure we are not failing on the first one we do... if yes that's an error...\r
194 //\r
195 if (ParamNumberCount == 1) {\r
47d20b54 196 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"attrib");\r
a405b86d 197 ShellStatus = SHELL_INVALID_PARAMETER;\r
198 }\r
47d20b54 199\r
a405b86d 200 break;\r
201 }\r
202\r
203 //\r
204 // OpenFileByName / GetFileInfo / Change attributes / SetFileInfo / CloseFile / free memory\r
205 // for each file or directory on the line.\r
206 //\r
207\r
208 //\r
209 // Open the file(s)\r
210 //\r
47d20b54
MK
211 ASSERT (ListOfFiles == NULL);\r
212 Status = ShellOpenFileMetaArg ((CHAR16 *)FileName, EFI_FILE_MODE_READ, &ListOfFiles);\r
213 if (EFI_ERROR (Status)) {\r
214 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));\r
a405b86d 215 ShellStatus = SHELL_NOT_FOUND;\r
216 } else {\r
47d20b54
MK
217 for (FileNode = (EFI_SHELL_FILE_INFO *)GetFirstNode (&ListOfFiles->Link)\r
218 ; !IsNull (&ListOfFiles->Link, &FileNode->Link)\r
219 ; FileNode = (EFI_SHELL_FILE_INFO *)GetNextNode (&ListOfFiles->Link, &FileNode->Link)\r
220 )\r
221 {\r
a405b86d 222 //\r
223 // skip the directory traversing stuff...\r
224 //\r
47d20b54 225 if ((StrCmp (FileNode->FileName, L".") == 0) || (StrCmp (FileNode->FileName, L"..") == 0)) {\r
a405b86d 226 continue;\r
227 }\r
228\r
47d20b54 229 FileInfo = gEfiShellProtocol->GetFileInfo (FileNode->Handle);\r
a405b86d 230\r
231 //\r
232 // if we are removing Read-Only we need to do that alone\r
233 //\r
234 if ((FileAttributesToRemove & EFI_FILE_READ_ONLY) == EFI_FILE_READ_ONLY) {\r
235 FileInfo->Attribute &= ~EFI_FILE_READ_ONLY;\r
236 //\r
237 // SetFileInfo\r
238 //\r
47d20b54
MK
239 Status = ShellSetFileInfo (FileNode->Handle, FileInfo);\r
240 if (EFI_ERROR (Status)) {\r
241 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));\r
a405b86d 242 ShellStatus = SHELL_ACCESS_DENIED;\r
243 }\r
244 }\r
245\r
246 //\r
247 // change the attribute\r
248 //\r
249 FileInfo->Attribute &= ~FileAttributesToRemove;\r
250 FileInfo->Attribute |= FileAttributesToAdd;\r
251\r
252 //\r
253 // SetFileInfo\r
254 //\r
47d20b54
MK
255 Status = ShellSetFileInfo (FileNode->Handle, FileInfo);\r
256 if (EFI_ERROR (Status)) {\r
257 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));\r
a405b86d 258 ShellStatus = SHELL_ACCESS_DENIED;\r
259 }\r
260\r
47d20b54 261 SHELL_FREE_NON_NULL (FileInfo);\r
a405b86d 262 }\r
47d20b54
MK
263\r
264 Status = ShellCloseFileMetaArg (&ListOfFiles);\r
a405b86d 265 ListOfFiles = NULL;\r
47d20b54
MK
266 if (EFI_ERROR (Status)) {\r
267 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue (Package, ParamNumberCount));\r
a405b86d 268 ShellStatus = SHELL_NOT_FOUND;\r
269 }\r
270 } // for loop for handling wildcard filenames\r
271 }\r
272 }\r
273 }\r
274 }\r
275\r
276 //\r
277 // free the command line package\r
278 //\r
279 ShellCommandLineFreeVarList (Package);\r
280\r
281 //\r
282 // return the status\r
283 //\r
284 return (ShellStatus);\r
285}\r