| // 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. |
| |
| #ifndef SRC_DEVICES_BIN_DRIVER_MANAGER_SYSTEM_INSTANCE_H_ |
| #define SRC_DEVICES_BIN_DRIVER_MANAGER_SYSTEM_INSTANCE_H_ |
| |
| #include <lib/async-loop/cpp/loop.h> |
| #include <lib/fdio/namespace.h> |
| #include <lib/stdcompat/span.h> |
| |
| #include "src/devices/bin/driver_manager/coordinator.h" |
| #include "src/lib/storage/vfs/cpp/managed_vfs.h" |
| #include "src/lib/storage/vfs/cpp/pseudo_dir.h" |
| |
| // Host's a vfs which forwards a subset of requests to a channel. |
| class DirectoryFilter { |
| public: |
| DirectoryFilter(async_dispatcher_t* dispatcher) |
| : root_dir_(fbl::MakeRefCounted<fs::PseudoDir>()), vfs_(dispatcher) {} |
| ~DirectoryFilter(); |
| |
| zx_status_t Initialize(zx::channel forwarding_dir, cpp20::span<const char*> allow_filter); |
| |
| zx_status_t Serve(fidl::ServerEnd<fuchsia_io::Directory> request) { |
| return vfs_.ServeDirectory(root_dir_, std::move(request)); |
| } |
| |
| private: |
| zx::channel forwarding_dir_; |
| fbl::RefPtr<fs::PseudoDir> root_dir_; |
| fs::ManagedVfs vfs_; |
| }; |
| |
| class SystemInstance : public FsProvider { |
| public: |
| // Implementation required to implement FsProvider |
| fidl::ClientEnd<fuchsia_io::Directory> CloneFs(const char* path) override; |
| |
| zx_status_t CreateDriverHostJob(const zx::job& root_job, zx::job* driver_host_job_out); |
| void InstallDevFsIntoNamespace(); |
| |
| void ServiceStarter(Coordinator* coordinator); |
| |
| private: |
| zx_status_t InitializeDriverHostSvcDir(); |
| |
| // Hosts vfs which filters driver host svc requests to /svc provided by svchost. |
| // Lazily initialized. |
| async::Loop loop_{&kAsyncLoopConfigNeverAttachToThread}; |
| std::optional<DirectoryFilter> driver_host_svc_; |
| }; |
| |
| #endif // SRC_DEVICES_BIN_DRIVER_MANAGER_SYSTEM_INSTANCE_H_ |