1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "close_core.h"
17
18 #include <cstring>
19 #include <tuple>
20 #include <unistd.h>
21
22 #include "file_utils.h"
23 #include "filemgmt_libhilog.h"
24
25 namespace OHOS::FileManagement::ModuleFileIO {
26 using namespace std;
27
CloseFd(int fd)28 static int32_t CloseFd(int fd)
29 {
30 unique_ptr<uv_fs_t, decltype(FsUtils::FsReqCleanup) *> closeReq = { new uv_fs_t, FsUtils::FsReqCleanup };
31 if (!closeReq) {
32 HILOGE("Failed to request heap memory.");
33 return ENOMEM;
34 }
35 int ret = uv_fs_close(nullptr, closeReq.get(), fd, nullptr);
36 if (ret < 0) {
37 HILOGE("Failed to close file with ret: %{public}d", ret);
38 return ret;
39 }
40 return ERRNO_NOERR;
41 }
42
ValidFd(const int32_t & fd)43 static bool ValidFd(const int32_t &fd)
44 {
45 if (fd < 0) {
46 HILOGE("Invalid fd");
47 return false;
48 }
49 return true;
50 }
51
DoClose(const int32_t & fd)52 FsResult<void> CloseCore::DoClose(const int32_t &fd)
53 {
54 if (!ValidFd(fd)) {
55 return FsResult<void>::Error(EINVAL);
56 }
57 auto err = CloseFd(fd);
58 if (err) {
59 HILOGE("Failed to close fd");
60 return FsResult<void>::Error(err);
61 }
62 return FsResult<void>::Success();
63 }
64
DoClose(FsFile * file)65 FsResult<void> CloseCore::DoClose(FsFile *file)
66 {
67 auto ret = file->GetFD();
68 if (!ret.IsSuccess()) {
69 HILOGE("Failed to get fd");
70 return FsResult<void>::Error(EINVAL);
71 }
72 auto err = CloseFd(ret.GetData().value());
73 if (err) {
74 HILOGE("Failed to close file");
75 return FsResult<void>::Error(err);
76 }
77
78 file->RemoveEntity();
79 return FsResult<void>::Success();
80 }
81 } // namespace OHOS::FileManagement::ModuleFileIO
82