blob: 4bda543f6b04e4c7d4ce8e7277e0a1deee4d1ca1 [file] [log] [blame]
// Copyright 2016 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 "lib/component/cpp/outgoing.h"
#include <fuchsia/inspect/cpp/fidl.h>
#include <lib/async/default.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/fdio/directory.h>
#include <zircon/process.h>
#include <zircon/processargs.h>
namespace component {
Outgoing::Outgoing()
: vfs_(async_get_default_dispatcher()),
root_dir_(fbl::AdoptRef(new fs::PseudoDir())),
public_dir_(fbl::AdoptRef(new fs::PseudoDir())),
debug_dir_(fbl::AdoptRef(new fs::PseudoDir())),
ctrl_dir_(fbl::AdoptRef(new fs::PseudoDir())),
deprecated_outgoing_services_(public_dir_) {
root_dir_->AddEntry("public", public_dir_);
root_dir_->AddEntry("debug", debug_dir_);
root_dir_->AddEntry("ctrl", ctrl_dir_);
auto objects = Object::Make("objects");
object_dir_ = std::make_unique<ObjectDir>(objects);
auto out_objects = fbl::MakeRefCounted<fs::PseudoDir>();
out_objects->AddEntry(
fuchsia::inspect::Inspect::Name_,
fbl::MakeRefCounted<fs::Service>([this](zx::channel chan) {
inspect_bindings_.AddBinding(
object_dir_->object(),
fidl::InterfaceRequest<fuchsia::inspect::Inspect>(std::move(chan)),
nullptr);
return ZX_OK;
}));
root_dir_->AddEntry("objects", out_objects);
}
Outgoing::~Outgoing() = default;
zx_status_t Outgoing::Serve(zx::channel dir_request) {
if (!dir_request)
return ZX_ERR_BAD_HANDLE;
return vfs_.ServeDirectory(root_dir_, std::move(dir_request));
}
zx_status_t Outgoing::ServeFromStartupInfo() {
zx_handle_t dir_request = zx_take_startup_handle(PA_DIRECTORY_REQUEST);
return Serve(zx::channel(dir_request));
}
} // namespace component