1// Copyright 2018 The Fuchsia Authors. All rights reserved. 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 <lib/process-launcher/launcher.h> 6 7#include "launcher.h" 8#include <fuchsia/process/c/fidl.h> 9#include <zircon/status.h> 10#include <zircon/syscalls.h> 11 12static zx_status_t connect(void* ctx, async_dispatcher_t* dispatcher, const char* service_name, 13 zx_handle_t request) { 14 if (!strcmp(service_name, fuchsia_process_Launcher_Name)) { 15 auto launcher = new launcher::LauncherImpl(zx::channel(request)); 16 17 zx_status_t status = launcher->Begin(dispatcher); 18 if (status != ZX_OK) { 19 delete launcher; 20 return status; 21 } 22 23 launcher->set_error_handler([launcher](zx_status_t status) { 24 // If we encounter an error, we tear down the launcher. 25 delete launcher; 26 }); 27 28 return ZX_OK; 29 } 30 31 zx_handle_close(request); 32 return ZX_ERR_NOT_SUPPORTED; 33} 34 35static constexpr const char* launcher_services[] = { 36 fuchsia_process_Launcher_Name, 37 nullptr, 38}; 39 40static constexpr zx_service_ops_t launcher_ops = { 41 .init = nullptr, 42 .connect = connect, 43 .release = nullptr, 44}; 45 46static constexpr zx_service_provider_t launcher_service_provider = { 47 .version = SERVICE_PROVIDER_VERSION, 48 .services = launcher_services, 49 .ops = &launcher_ops, 50}; 51 52const zx_service_provider_t* launcher_get_service_provider() { 53 return &launcher_service_provider; 54} 55