| // 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 "registry_vnode.h" |
| |
| #include <fuchsia/fshost/llcpp/fidl.h> |
| #include <inttypes.h> |
| #include <lib/fidl-async/cpp/bind.h> |
| #include <lib/memfs/cpp/vnode.h> |
| |
| #include <fs/service.h> |
| #include <fs/tracked_remote_dir.h> |
| #include <fs/vfs_types.h> |
| |
| namespace devmgr { |
| namespace fshost { |
| |
| RegistryVnode::RegistryVnode(async_dispatcher_t* dispatcher, fbl::RefPtr<fs::PseudoDir> filesystems) |
| : fs::Service([dispatcher, this](zx::channel server_end) { |
| return fidl::BindSingleInFlightOnly(dispatcher, std::move(server_end), this); |
| }), |
| filesystems_(std::move(filesystems)), |
| filesystem_counter_(0), |
| dispatcher_(dispatcher) {} |
| |
| zx_status_t RegistryVnode::AddFilesystem( |
| fidl::ClientEnd<::llcpp::fuchsia::io::Directory> directory) { |
| char buf[32]; |
| snprintf(buf, sizeof(buf), "%" PRIu64 "", filesystem_counter_++); |
| |
| auto directory_vnode = fbl::MakeRefCounted<fs::TrackedRemoteDir>(std::move(directory)); |
| |
| return directory_vnode->AddAsTrackedEntry(dispatcher_, filesystems_.get(), fbl::String(buf)); |
| } |
| |
| void RegistryVnode::RegisterFilesystem(zx::channel public_export, |
| RegisterFilesystemCompleter::Sync& completer) { |
| completer.Reply(AddFilesystem(std::move(public_export))); |
| } |
| |
| } // namespace fshost |
| } // namespace devmgr |