// Copyright 2018 The Chromium 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 "base/fuchsia/component_context.h" #include #include "base/fuchsia/scoped_zx_handle.h" #include "base/fuchsia/services_directory.h" #include "base/no_destructor.h" namespace base { namespace fuchsia { namespace { // static ScopedZxHandle ConnectToServiceRoot() { ScopedZxHandle h1; ScopedZxHandle h2; zx_status_t result = zx_channel_create(0, h1.receive(), h2.receive()); ZX_CHECK(result == ZX_OK, result) << "zx_channel_create()"; result = fdio_service_connect("/svc/.", h1.release()); ZX_CHECK(result == ZX_OK, result) << "Failed to open /svc"; return h2; } } // namespace ComponentContext::ComponentContext(ScopedZxHandle service_root) : service_root_(std::move(service_root)) { DCHECK(service_root_); } ComponentContext::~ComponentContext() = default; // static ComponentContext* ComponentContext::GetDefault() { static base::NoDestructor component_context( ConnectToServiceRoot()); return component_context.get(); } void ComponentContext::ConnectToService(FidlInterfaceRequest request) { DCHECK(request.is_valid()); zx_status_t result = fdio_service_connect_at(service_root_.get(), request.interface_name(), request.TakeChannel().release()); ZX_CHECK(result == ZX_OK, result) << "fdio_service_connect_at()"; } } // namespace fuchsia } // namespace base