]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c
ShellPkg/UefiShellLevel2CommansLib: Pointer Resonse should be checked
[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
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
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
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
54\r
55 //\r
56 // initialize the shell lib (we must be in non-auto-init...)\r
57 //\r
58 Status = ShellInitialize();\r
59 ASSERT_EFI_ERROR(Status);\r
60\r
61 //\r
62 // parse the command line\r
63 //\r
64 Status = ShellCommandLineParse (AttribParamList, &Package, &ProblemParam, TRUE);\r
65 if (EFI_ERROR(Status)) {\r
66 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
ba0014b9 67 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"attrib", ProblemParam);\r
a405b86d 68 FreePool(ProblemParam);\r
69 ShellStatus = SHELL_INVALID_PARAMETER;\r
70 } else {\r
71 ASSERT(FALSE);\r
72 }\r
73 } else {\r
74\r
75 //\r
76 // check for "-?"\r
77 //\r
78 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
79 ASSERT(FALSE);\r
80 } else {\r
81 FileAttributesToAdd = 0;\r
82 FileAttributesToRemove = 0;\r
83\r
84 //\r
85 // apply or remove each flag\r
86 //\r
87 if (ShellCommandLineGetFlag(Package, L"+a")) {\r
88 FileAttributesToAdd |= EFI_FILE_ARCHIVE;\r
89 }\r
90 if (ShellCommandLineGetFlag(Package, L"-a")) {\r
91 FileAttributesToRemove |= EFI_FILE_ARCHIVE;\r
92 }\r
93 if (ShellCommandLineGetFlag(Package, L"+s")) {\r
94 FileAttributesToAdd |= EFI_FILE_SYSTEM;\r
95 }\r
96 if (ShellCommandLineGetFlag(Package, L"-s")) {\r
97 FileAttributesToRemove |= EFI_FILE_SYSTEM;\r
98 }\r
99 if (ShellCommandLineGetFlag(Package, L"+h")) {\r
100 FileAttributesToAdd |= EFI_FILE_HIDDEN;\r
101 }\r
102 if (ShellCommandLineGetFlag(Package, L"-h")) {\r
103 FileAttributesToRemove |= EFI_FILE_HIDDEN;\r
104 }\r
105 if (ShellCommandLineGetFlag(Package, L"+r")) {\r
106 FileAttributesToAdd |= EFI_FILE_READ_ONLY;\r
107 }\r
108 if (ShellCommandLineGetFlag(Package, L"-r")) {\r
109 FileAttributesToRemove |= EFI_FILE_READ_ONLY;\r
110 }\r
111\r
112 if (FileAttributesToRemove == 0 && FileAttributesToAdd == 0) {\r
113 //\r
114 // Do display as we have no attributes to change\r
115 //\r
116 for ( ParamNumberCount = 1\r
117 ;\r
118 ; ParamNumberCount++\r
119 ){\r
120 FileName = ShellCommandLineGetRawValue(Package, ParamNumberCount);\r
121 // if we dont have anything left, move on...\r
122 if (FileName == NULL && ParamNumberCount == 1) {\r
123 FileName = (CHAR16*)AllFiles;\r
124 } else if (FileName == NULL) {\r
125 break;\r
126 }\r
127 ASSERT(ListOfFiles == NULL);\r
128 Status = ShellOpenFileMetaArg((CHAR16*)FileName, EFI_FILE_MODE_READ, &ListOfFiles);\r
129 if (EFI_ERROR(Status)) {\r
ba0014b9 130 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
a405b86d 131 ShellStatus = SHELL_NOT_FOUND;\r
132 } else {\r
133 for (FileNode = (EFI_SHELL_FILE_INFO*)GetFirstNode(&ListOfFiles->Link)\r
134 ; !IsNull(&ListOfFiles->Link, &FileNode->Link)\r
135 ; FileNode = (EFI_SHELL_FILE_INFO*)GetNextNode(&ListOfFiles->Link, &FileNode->Link)\r
136 ){\r
137 ShellPrintHiiEx(\r
138 -1,\r
139 -1,\r
140 NULL,\r
141 STRING_TOKEN (STR_ATTRIB_OUTPUT_LINE),\r
142 gShellLevel2HiiHandle,\r
143 FileNode->Info->Attribute&EFI_FILE_DIRECTORY? L'D':L' ',\r
144 FileNode->Info->Attribute&EFI_FILE_ARCHIVE? L'A':L' ',\r
145 FileNode->Info->Attribute&EFI_FILE_SYSTEM? L'S':L' ',\r
146 FileNode->Info->Attribute&EFI_FILE_HIDDEN? L'H':L' ',\r
147 FileNode->Info->Attribute&EFI_FILE_READ_ONLY? L'R':L' ',\r
148 FileNode->FileName\r
149 );\r
ba0014b9 150\r
288638f0
TS
151 if (ShellGetExecutionBreakFlag()) {\r
152 ShellStatus = SHELL_ABORTED;\r
153 break;\r
154 }\r
a405b86d 155 }\r
156 Status = ShellCloseFileMetaArg(&ListOfFiles);\r
157 ListOfFiles = NULL;\r
158 if (EFI_ERROR(Status)) {\r
ba0014b9 159 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
a405b86d 160 ShellStatus = SHELL_NOT_FOUND;\r
161 }\r
162 } // for loop for handling wildcard filenames\r
163 } // for loop for printing out the info\r
164 } else if ((FileAttributesToRemove & FileAttributesToAdd) != 0) {\r
165 //\r
166 // fail as we have conflcting params.\r
167 //\r
ba0014b9 168 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle, L"attrib");\r
a405b86d 169 ShellStatus = SHELL_INVALID_PARAMETER;\r
170 } else {\r
171 //\r
172 // enumerate through all the files/directories and apply the attributes\r
173 //\r
174 for ( ParamNumberCount = 1\r
175 ;\r
176 ; ParamNumberCount++\r
177 ){\r
178 FileName = ShellCommandLineGetRawValue(Package, ParamNumberCount);\r
179 // if we dont have anything left, move on...\r
180 if (FileName == NULL) {\r
181 //\r
182 // make sure we are not failing on the first one we do... if yes that's an error...\r
183 //\r
184 if (ParamNumberCount == 1) {\r
ba0014b9 185 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle, L"attrib");\r
a405b86d 186 ShellStatus = SHELL_INVALID_PARAMETER;\r
187 }\r
188 break;\r
189 }\r
190\r
191 //\r
192 // OpenFileByName / GetFileInfo / Change attributes / SetFileInfo / CloseFile / free memory\r
193 // for each file or directory on the line.\r
194 //\r
195\r
196 //\r
197 // Open the file(s)\r
198 //\r
199 ASSERT(ListOfFiles == NULL);\r
200 Status = ShellOpenFileMetaArg((CHAR16*)FileName, EFI_FILE_MODE_READ, &ListOfFiles);\r
201 if (EFI_ERROR(Status)) {\r
ba0014b9 202 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
a405b86d 203 ShellStatus = SHELL_NOT_FOUND;\r
204 } else {\r
205 for (FileNode = (EFI_SHELL_FILE_INFO*)GetFirstNode(&ListOfFiles->Link)\r
206 ; !IsNull(&ListOfFiles->Link, &FileNode->Link)\r
207 ; FileNode = (EFI_SHELL_FILE_INFO*)GetNextNode(&ListOfFiles->Link, &FileNode->Link)\r
208 ){\r
209 //\r
210 // skip the directory traversing stuff...\r
211 //\r
212 if (StrCmp(FileNode->FileName, L".") == 0 || StrCmp(FileNode->FileName, L"..") == 0) {\r
213 continue;\r
214 }\r
215\r
216 FileInfo = gEfiShellProtocol->GetFileInfo(FileNode->Handle);\r
217\r
218 //\r
219 // if we are removing Read-Only we need to do that alone\r
220 //\r
221 if ((FileAttributesToRemove & EFI_FILE_READ_ONLY) == EFI_FILE_READ_ONLY) {\r
222 FileInfo->Attribute &= ~EFI_FILE_READ_ONLY;\r
223 //\r
224 // SetFileInfo\r
225 //\r
226 Status = ShellSetFileInfo(FileNode->Handle, FileInfo);\r
099e8ff5 227 if (EFI_ERROR(Status)) {\r
ba0014b9 228 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
a405b86d 229 ShellStatus = SHELL_ACCESS_DENIED;\r
230 }\r
231 }\r
232\r
233 //\r
234 // change the attribute\r
235 //\r
236 FileInfo->Attribute &= ~FileAttributesToRemove;\r
237 FileInfo->Attribute |= FileAttributesToAdd;\r
238\r
239 //\r
240 // SetFileInfo\r
241 //\r
242 Status = ShellSetFileInfo(FileNode->Handle, FileInfo);\r
243 if (EFI_ERROR(Status)) {;\r
ba0014b9 244 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
a405b86d 245 ShellStatus = SHELL_ACCESS_DENIED;\r
246 }\r
247\r
248 SHELL_FREE_NON_NULL(FileInfo);\r
249 }\r
250 Status = ShellCloseFileMetaArg(&ListOfFiles);\r
251 ListOfFiles = NULL;\r
252 if (EFI_ERROR(Status)) {\r
ba0014b9 253 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, L"attrib", ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
a405b86d 254 ShellStatus = SHELL_NOT_FOUND;\r
255 }\r
256 } // for loop for handling wildcard filenames\r
257 }\r
258 }\r
259 }\r
260 }\r
261\r
262 //\r
263 // free the command line package\r
264 //\r
265 ShellCommandLineFreeVarList (Package);\r
266\r
267 //\r
268 // return the status\r
269 //\r
270 return (ShellStatus);\r
271}\r