// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/fuchsia/file_utils.h" #include #include #include #include #include #include #include #include "base/files/scoped_file.h" #include "base/fuchsia/fuchsia_logging.h" namespace base { namespace { fidl::InterfaceHandle<::fuchsia::io::Directory> OpenDirectoryHandleInternal( const base::FilePath& path, bool read_only) { ScopedFD fd(open(path.value().c_str(), O_DIRECTORY | (read_only ? O_RDONLY : O_RDWR))); if (!fd.is_valid()) { DPLOG(ERROR) << "Failed to open " << path; return fidl::InterfaceHandle<::fuchsia::io::Directory>(); } zx::channel channel; zx_status_t status = fdio_fd_transfer(fd.get(), channel.reset_and_get_address()); if (status != ZX_ERR_UNAVAILABLE) std::ignore = fd.release(); if (status != ZX_OK) { ZX_DLOG(ERROR, status) << "fdio_fd_transfer"; return fidl::InterfaceHandle<::fuchsia::io::Directory>(); } return fidl::InterfaceHandle<::fuchsia::io::Directory>(std::move(channel)); } } // namespace const char kPersistedDataDirectoryPath[] = "/data"; const char kPersistedCacheDirectoryPath[] = "/cache"; const char kServiceDirectoryPath[] = "/svc"; const char kPackageRootDirectoryPath[] = "/pkg"; fidl::InterfaceHandle<::fuchsia::io::Directory> OpenDirectoryHandle( const base::FilePath& path) { return OpenDirectoryHandleInternal(path, true); } fidl::InterfaceHandle<::fuchsia::io::Directory> OpenWritableDirectoryHandle( const base::FilePath& path) { return OpenDirectoryHandleInternal(path, false); } } // namespace base