]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellLevel2CommandsLib/Attrib.c
Add code to check whether the pointer 'CorrectedPath' and 'FullPath' are NULL before...
[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
4 Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellLevel2CommandsLib.h"\r
16\r
17STATIC CONST CHAR16 AllFiles[] = L"*";\r
18\r
19STATIC CONST SHELL_PARAM_ITEM AttribParamList[] = {\r
20 {L"-a", TypeFlag},\r
21 {L"+a", TypeFlag},\r
22 {L"-s", TypeFlag},\r
23 {L"+s", TypeFlag},\r
24 {L"-h", TypeFlag},\r
25 {L"+h", TypeFlag},\r
26 {L"-r", TypeFlag},\r
27 {L"+r", TypeFlag},\r
28 {NULL, TypeMax}\r
29 };\r
30\r
31/**\r
32 Function for 'attrib' command.\r
33\r
34 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
35 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
36**/\r
37SHELL_STATUS\r
38EFIAPI\r
39ShellCommandRunAttrib (\r
40 IN EFI_HANDLE ImageHandle,\r
41 IN EFI_SYSTEM_TABLE *SystemTable\r
42 )\r
43{\r
44 UINT64 FileAttributesToAdd;\r
45 UINT64 FileAttributesToRemove;\r
46 EFI_STATUS Status;\r
47 LIST_ENTRY *Package;\r
48 CHAR16 *ProblemParam;\r
49 SHELL_STATUS ShellStatus;\r
50 UINTN ParamNumberCount;\r
51 CONST CHAR16 *FileName;\r
52 EFI_SHELL_FILE_INFO *ListOfFiles;\r
53 EFI_SHELL_FILE_INFO *FileNode;\r
54 EFI_FILE_INFO *FileInfo;\r
55\r
56 ListOfFiles = NULL;\r
57 ShellStatus = SHELL_SUCCESS;\r
58 ProblemParam = NULL;\r
59\r
60 //\r
61 // initialize the shell lib (we must be in non-auto-init...)\r
62 //\r
63 Status = ShellInitialize();\r
64 ASSERT_EFI_ERROR(Status);\r
65\r
66 //\r
67 // parse the command line\r
68 //\r
69 Status = ShellCommandLineParse (AttribParamList, &Package, &ProblemParam, TRUE);\r
70 if (EFI_ERROR(Status)) {\r
71 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
72 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, ProblemParam);\r
73 FreePool(ProblemParam);\r
74 ShellStatus = SHELL_INVALID_PARAMETER;\r
75 } else {\r
76 ASSERT(FALSE);\r
77 }\r
78 } else {\r
79\r
80 //\r
81 // check for "-?"\r
82 //\r
83 if (ShellCommandLineGetFlag(Package, L"-?")) {\r
84 ASSERT(FALSE);\r
85 } else {\r
86 FileAttributesToAdd = 0;\r
87 FileAttributesToRemove = 0;\r
88\r
89 //\r
90 // apply or remove each flag\r
91 //\r
92 if (ShellCommandLineGetFlag(Package, L"+a")) {\r
93 FileAttributesToAdd |= EFI_FILE_ARCHIVE;\r
94 }\r
95 if (ShellCommandLineGetFlag(Package, L"-a")) {\r
96 FileAttributesToRemove |= EFI_FILE_ARCHIVE;\r
97 }\r
98 if (ShellCommandLineGetFlag(Package, L"+s")) {\r
99 FileAttributesToAdd |= EFI_FILE_SYSTEM;\r
100 }\r
101 if (ShellCommandLineGetFlag(Package, L"-s")) {\r
102 FileAttributesToRemove |= EFI_FILE_SYSTEM;\r
103 }\r
104 if (ShellCommandLineGetFlag(Package, L"+h")) {\r
105 FileAttributesToAdd |= EFI_FILE_HIDDEN;\r
106 }\r
107 if (ShellCommandLineGetFlag(Package, L"-h")) {\r
108 FileAttributesToRemove |= EFI_FILE_HIDDEN;\r
109 }\r
110 if (ShellCommandLineGetFlag(Package, L"+r")) {\r
111 FileAttributesToAdd |= EFI_FILE_READ_ONLY;\r
112 }\r
113 if (ShellCommandLineGetFlag(Package, L"-r")) {\r
114 FileAttributesToRemove |= EFI_FILE_READ_ONLY;\r
115 }\r
116\r
117 if (FileAttributesToRemove == 0 && FileAttributesToAdd == 0) {\r
118 //\r
119 // Do display as we have no attributes to change\r
120 //\r
121 for ( ParamNumberCount = 1\r
122 ;\r
123 ; ParamNumberCount++\r
124 ){\r
125 FileName = ShellCommandLineGetRawValue(Package, ParamNumberCount);\r
126 // if we dont have anything left, move on...\r
127 if (FileName == NULL && ParamNumberCount == 1) {\r
128 FileName = (CHAR16*)AllFiles;\r
129 } else if (FileName == NULL) {\r
130 break;\r
131 }\r
132 ASSERT(ListOfFiles == NULL);\r
133 Status = ShellOpenFileMetaArg((CHAR16*)FileName, EFI_FILE_MODE_READ, &ListOfFiles);\r
134 if (EFI_ERROR(Status)) {\r
135 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
136 ShellStatus = SHELL_NOT_FOUND;\r
137 } else {\r
138 for (FileNode = (EFI_SHELL_FILE_INFO*)GetFirstNode(&ListOfFiles->Link)\r
139 ; !IsNull(&ListOfFiles->Link, &FileNode->Link)\r
140 ; FileNode = (EFI_SHELL_FILE_INFO*)GetNextNode(&ListOfFiles->Link, &FileNode->Link)\r
141 ){\r
142 ShellPrintHiiEx(\r
143 -1,\r
144 -1,\r
145 NULL,\r
146 STRING_TOKEN (STR_ATTRIB_OUTPUT_LINE),\r
147 gShellLevel2HiiHandle,\r
148 FileNode->Info->Attribute&EFI_FILE_DIRECTORY? L'D':L' ',\r
149 FileNode->Info->Attribute&EFI_FILE_ARCHIVE? L'A':L' ',\r
150 FileNode->Info->Attribute&EFI_FILE_SYSTEM? L'S':L' ',\r
151 FileNode->Info->Attribute&EFI_FILE_HIDDEN? L'H':L' ',\r
152 FileNode->Info->Attribute&EFI_FILE_READ_ONLY? L'R':L' ',\r
153 FileNode->FileName\r
154 );\r
155 }\r
156 Status = ShellCloseFileMetaArg(&ListOfFiles);\r
157 ListOfFiles = NULL;\r
158 if (EFI_ERROR(Status)) {\r
159 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
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
168 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellLevel2HiiHandle);\r
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
185 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellLevel2HiiHandle);\r
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
202 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
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
227 if (EFI_ERROR(Status)) {;\r
228 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
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
244 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_AD), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
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
253 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_CLOSE_FAIL), gShellLevel2HiiHandle, ShellCommandLineGetRawValue(Package, ParamNumberCount));\r
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