| |
| // Copyright 2019 The Fuchsia 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 "src/ledger/bin/platform/fuchsia_platform.h" |
| |
| #include <stdio.h> |
| |
| #include "src/ledger/bin/platform/fuchsia_scoped_tmp_location.h" |
| #include "src/ledger/lib/convert/convert.h" |
| #include "src/ledger/lib/files/directory.h" |
| #include "src/ledger/lib/files/file.h" |
| #include "src/ledger/lib/files/path.h" |
| #include "src/ledger/lib/files/scoped_tmp_dir.h" |
| #include "src/ledger/lib/logging/logging.h" |
| #include "third_party/abseil-cpp/absl/strings/string_view.h" |
| #include "util/env_fuchsia.h" |
| |
| namespace ledger { |
| |
| constexpr absl::string_view kCurrentPath = "."; |
| |
| unique_fd FuchsiaFileSystem::OpenFD(DetachedPath path, DetachedPath* result_path) { |
| unique_fd fd(openat(path.root_fd(), path.path().c_str(), O_RDONLY | O_DIRECTORY)); |
| if (fd.is_valid()) { |
| *result_path = DetachedPath(fd.get()); |
| } |
| return fd; |
| } |
| |
| std::unique_ptr<leveldb::Env> FuchsiaFileSystem::MakeLevelDbEnvironment( |
| DetachedPath db_path, DetachedPath* updated_db_path) { |
| unique_fd fd; |
| *updated_db_path = db_path; |
| if (db_path.path() != ".") { |
| // Open a FileDescriptor at the db path. |
| fd = OpenFD(db_path, updated_db_path); |
| if (!fd.is_valid()) { |
| LEDGER_LOG(ERROR) << "Unable to open directory at " << db_path.path() << ". errno: " << errno; |
| return nullptr; |
| } |
| } |
| return leveldb::MakeFuchsiaEnv(updated_db_path->root_fd()); |
| } |
| |
| bool FuchsiaFileSystem::ReadFileToString(DetachedPath path, std::string* content) { |
| return ReadFileToStringAt(path.root_fd(), path.path(), content); |
| } |
| |
| bool FuchsiaFileSystem::WriteFile(DetachedPath path, const std::string& content) { |
| return WriteFileAt(path.root_fd(), path.path(), content.c_str(), content.size()); |
| } |
| |
| bool FuchsiaFileSystem::IsFile(DetachedPath path) { return IsFileAt(path.root_fd(), path.path()); } |
| |
| bool FuchsiaFileSystem::GetFileSize(DetachedPath path, uint64_t* size) { |
| return GetFileSizeAt(path.root_fd(), path.path(), size); |
| } |
| |
| bool FuchsiaFileSystem::CreateDirectory(DetachedPath path) { |
| return CreateDirectoryAt(path.root_fd(), path.path()); |
| } |
| |
| bool FuchsiaFileSystem::IsDirectory(DetachedPath path) { |
| return IsDirectoryAt(path.root_fd(), path.path()); |
| } |
| |
| bool FuchsiaFileSystem::GetDirectoryContents(DetachedPath path, |
| std::vector<std::string>* dir_contents) { |
| if (!ReadDirContentsAt(path.root_fd(), path.path(), dir_contents)) { |
| return false; |
| } |
| // Remove the current directory string from the result. |
| auto it = std::find(dir_contents->begin(), dir_contents->end(), convert::ToString(kCurrentPath)); |
| LEDGER_DCHECK(it != dir_contents->end()); |
| dir_contents->erase(it); |
| return true; |
| } |
| |
| std::unique_ptr<ScopedTmpDir> FuchsiaFileSystem::CreateScopedTmpDir(DetachedPath parent_path) { |
| return std::make_unique<ScopedTmpDir>(parent_path); |
| } |
| |
| std::unique_ptr<ScopedTmpLocation> FuchsiaFileSystem::CreateScopedTmpLocation() { |
| return std::make_unique<FuchsiaScopedTmpLocation>(); |
| } |
| |
| bool FuchsiaFileSystem::DeletePath(DetachedPath path) { |
| return DeletePathAt(path.root_fd(), path.path(), /*recursive*/ false); |
| } |
| |
| bool FuchsiaFileSystem::DeletePathRecursively(DetachedPath path) { |
| return DeletePathAt(path.root_fd(), path.path(), /*recursive*/ true); |
| } |
| |
| bool FuchsiaFileSystem::Rename(DetachedPath origin, DetachedPath destination) { |
| return renameat(origin.root_fd(), origin.path().c_str(), destination.root_fd(), |
| destination.path().c_str()); |
| } |
| |
| std::unique_ptr<Platform> MakePlatform() { return std::make_unique<FuchsiaPlatform>(); } |
| |
| } // namespace ledger |