blob: ac1321e0bd8e18a4429c86d744651f641ccd868d [file] [log] [blame]
// 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 <fuchsia/boot/c/fidl.h>
#include <fuchsia/ldsvc/llcpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fdio/namespace.h>
#include <lib/zx/vmo.h>
#include <fbl/span.h>
#include <fs/pseudo_dir.h>
#include <fs/synchronous_vfs.h>
#include "coordinator.h"
#include "fdio.h"
#include "fuchsia/boot/llcpp/fidl.h"
constexpr char kItemsPath[] = "/svc/" fuchsia_boot_Items_Name;
zx_status_t wait_for_file(const char* path, zx::time deadline);
// 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) {}
zx_status_t Initialize(zx::channel forwarding_dir, fbl::Span<const char*> allow_filter);
zx_status_t Serve(zx::channel request) {
return vfs_.ServeDirectory(root_dir_, std::move(request));
}
private:
zx::channel forwarding_dir_;
fbl::RefPtr<fs::PseudoDir> root_dir_;
fs::SynchronousVfs vfs_;
};
class SystemInstance : public FsProvider {
public:
SystemInstance();
~SystemInstance() { loop_.Shutdown(); }
// Implementation required to implement FsProvider
zx::channel 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);
int WaitForSystemAvailable(Coordinator* coordinator);
// TODO(fxbug.dev/34633): DEPRECATED. Do not add new dependencies on the fshost loader service!
zx_status_t clone_fshost_ldsvc(zx::channel* loader);
protected:
DevmgrLauncher& launcher() { return launcher_; }
private:
zx_status_t InitializeDriverHostSvcDir();
DevmgrLauncher launcher_;
// Hosts vfs which filters driver host svc requests to /svc provided by svchost.
// Lazily initialized.
std::optional<DirectoryFilter> driver_host_svc_;
async::Loop loop_{&kAsyncLoopConfigNeverAttachToThread};
};
#endif // SRC_DEVICES_BIN_DRIVER_MANAGER_SYSTEM_INSTANCE_H_