1 // Copyright 2018 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/fuchsia/filtered_service_directory.h" 6 7 #include <lib/async/default.h> 8 #include <lib/vfs/cpp/pseudo_dir.h> 9 #include <lib/vfs/cpp/service.h> 10 #include <utility> 11 12 #include "base/fuchsia/fuchsia_logging.h" 13 #include "base/functional/bind.h" 14 #include "base/strings/string_piece.h" 15 16 namespace base { 17 FilteredServiceDirectory(std::shared_ptr<sys::ServiceDirectory> directory)18FilteredServiceDirectory::FilteredServiceDirectory( 19 std::shared_ptr<sys::ServiceDirectory> directory) 20 : directory_(directory) {} 21 22 FilteredServiceDirectory::~FilteredServiceDirectory() = default; 23 AddService(StringPiece service_name)24zx_status_t FilteredServiceDirectory::AddService(StringPiece service_name) { 25 return outgoing_directory_.AddPublicService( 26 std::make_unique<vfs::Service>( 27 [this, service_name = std::string(service_name)]( 28 zx::channel channel, async_dispatcher_t* dispatcher) { 29 DCHECK_EQ(dispatcher, async_get_default_dispatcher()); 30 directory_->Connect(service_name, std::move(channel)); 31 }), 32 std::string(service_name)); 33 } 34 ConnectClient(fidl::InterfaceRequest<fuchsia::io::Directory> dir_request)35zx_status_t FilteredServiceDirectory::ConnectClient( 36 fidl::InterfaceRequest<fuchsia::io::Directory> dir_request) { 37 // sys::OutgoingDirectory puts public services under ./svc . Connect to that 38 // directory and return client handle for the connection, 39 return outgoing_directory_.GetOrCreateDirectory("svc")->Serve( 40 fuchsia::io::OpenFlags::RIGHT_READABLE | 41 fuchsia::io::OpenFlags::RIGHT_WRITABLE, 42 dir_request.TakeChannel()); 43 } 44 45 } // namespace base 46