| // Copyright 2021 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "fusebox/fuse_file_handles.h" |
| |
| #include <ostream> |
| #include <unordered_map> |
| #include <utility> |
| |
| #include <base/check.h> |
| #include <base/no_destructor.h> |
| |
| namespace fusebox { |
| |
| static auto& GetFileHandles() { |
| static base::NoDestructor<std::unordered_map<uint64_t, HandleData>> handles; |
| return *handles; |
| } |
| |
| uint64_t OpenFile(base::ScopedFD fd) { |
| static uint64_t next = 0; |
| uint64_t handle = ++next; |
| CHECK(handle) << "file handles wrapped"; |
| GetFileHandles()[handle].fd = fd.release(); |
| return handle; |
| } |
| |
| uint64_t GetFile(uint64_t handle) { |
| const auto it = GetFileHandles().find(handle); |
| if (it == GetFileHandles().end()) |
| return 0; |
| return handle; |
| } |
| |
| int GetFileDescriptor(uint64_t handle) { |
| const auto it = GetFileHandles().find(handle); |
| if (it == GetFileHandles().end()) |
| return -1; |
| return it->second.fd; |
| } |
| |
| HandleData GetFileData(uint64_t handle) { |
| const auto it = GetFileHandles().find(handle); |
| if (it == GetFileHandles().end()) |
| return {}; |
| return it->second; |
| } |
| |
| bool SetFileData(uint64_t handle, std::string path, std::string type) { |
| const auto it = GetFileHandles().find(handle); |
| if (it == GetFileHandles().end()) |
| return false; |
| std::swap(it->second.path, path); |
| std::swap(it->second.type, type); |
| return true; |
| } |
| |
| base::ScopedFD CloseFile(uint64_t handle) { |
| const auto it = GetFileHandles().find(handle); |
| if (it == GetFileHandles().end()) |
| return {}; |
| base::ScopedFD fd(it->second.fd); |
| GetFileHandles().erase(it); |
| return fd; |
| } |
| |
| } // namespace fusebox |