• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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