blob: 13ab958105d38906d960e9a5ecaea09ee4cda442 [file] [log] [blame]
// Copyright 2018 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/process-launcher/launcher.h>
#include "launcher.h"
#include <fuchsia/process/c/fidl.h>
#include <zircon/status.h>
#include <zircon/syscalls.h>
static zx_status_t connect(void* ctx, async_dispatcher_t* dispatcher, const char* service_name,
zx_handle_t request) {
if (!strcmp(service_name, fuchsia_process_Launcher_Name)) {
auto launcher = new launcher::LauncherImpl(zx::channel(request));
zx_status_t status = launcher->Begin(dispatcher);
if (status != ZX_OK) {
delete launcher;
return status;
}
launcher->set_error_handler([launcher](zx_status_t status) {
// If we encounter an error, we tear down the launcher.
delete launcher;
});
return ZX_OK;
}
zx_handle_close(request);
return ZX_ERR_NOT_SUPPORTED;
}
static constexpr const char* launcher_services[] = {
fuchsia_process_Launcher_Name,
nullptr,
};
static constexpr zx_service_ops_t launcher_ops = {
.init = nullptr,
.connect = connect,
.release = nullptr,
};
static constexpr zx_service_provider_t launcher_service_provider = {
.version = SERVICE_PROVIDER_VERSION,
.services = launcher_services,
.ops = &launcher_ops,
};
const zx_service_provider_t* launcher_get_service_provider() {
return &launcher_service_provider;
}