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