]> git.proxmox.com Git - mirror_edk2.git/blob - FatPkg/EnhancedFatDxe/Delete.c
FatPkg: Refine casting expression result to bigger size
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / Delete.c
1 /** @file
2 Function that deletes a file.
3
4 Copyright (c) 2005 - 2013, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials are licensed and made available
6 under the terms and conditions of the BSD License which accompanies this
7 distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13
14 **/
15
16 #include "Fat.h"
17
18 /**
19
20 Deletes the file & Closes the file handle.
21
22 @param FHand - Handle to the file to delete.
23
24 @retval EFI_SUCCESS - Delete the file successfully.
25 @retval EFI_WARN_DELETE_FAILURE - Fail to delete the file.
26
27 **/
28 EFI_STATUS
29 EFIAPI
30 FatDelete (
31 IN EFI_FILE_PROTOCOL *FHand
32 )
33 {
34 FAT_IFILE *IFile;
35 FAT_OFILE *OFile;
36 FAT_DIRENT *DirEnt;
37 EFI_STATUS Status;
38 UINTN Round;
39
40 IFile = IFILE_FROM_FHAND (FHand);
41 OFile = IFile->OFile;
42
43 FatWaitNonblockingTask (IFile);
44
45 //
46 // Lock the volume
47 //
48 FatAcquireLock ();
49
50 //
51 // If the file is read-only, then don't delete it
52 //
53 if (IFile->ReadOnly) {
54 Status = EFI_WRITE_PROTECTED;
55 goto Done;
56 }
57 //
58 // If the file is the root dir, then don't delete it
59 //
60 if (OFile->Parent == NULL) {
61 Status = EFI_ACCESS_DENIED;
62 goto Done;
63 }
64 //
65 // If the file has a permanant error, skip the delete
66 //
67 Status = OFile->Error;
68 if (!EFI_ERROR (Status)) {
69 //
70 // If this is a directory, make sure it's empty before
71 // allowing it to be deleted
72 //
73 if (OFile->ODir != NULL) {
74 //
75 // We do not allow to delete nonempty directory
76 //
77 FatResetODirCursor (OFile);
78 for (Round = 0; Round < 3; Round++) {
79 Status = FatGetNextDirEnt (OFile, &DirEnt);
80 if ((EFI_ERROR (Status)) ||
81 ((Round < 2) && (DirEnt == NULL || !FatIsDotDirEnt (DirEnt))) ||
82 ((Round == 2) && (DirEnt != NULL))
83 ) {
84 Status = EFI_ACCESS_DENIED;
85 goto Done;
86 }
87 }
88 }
89 //
90 // Return the file's space by setting its size to 0
91 //
92 FatTruncateOFile (OFile, 0);
93 //
94 // Free the directory entry for this file
95 //
96 Status = FatRemoveDirEnt (OFile->Parent, OFile->DirEnt);
97 if (EFI_ERROR (Status)) {
98 goto Done;
99 }
100 //
101 // Set a permanent error for this OFile in case there
102 // are still opened IFiles attached
103 //
104 OFile->Error = EFI_NOT_FOUND;
105 } else if (OFile->Error == EFI_NOT_FOUND) {
106 Status = EFI_SUCCESS;
107 }
108
109 Done:
110 //
111 // Always close the handle
112 //
113 FatIFileClose (IFile);
114 //
115 // Done
116 //
117 Status = FatCleanupVolume (OFile->Volume, NULL, Status, NULL);
118 FatReleaseLock ();
119
120 if (EFI_ERROR (Status)) {
121 Status = EFI_WARN_DELETE_FAILURE;
122 }
123
124 return Status;
125 }