blob: e6812df8c78e087450f2b3ffb8338c13e127f11f [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/logger/provider.h>
#include <lib/logger/logger.h>
#include <fuchsia/logger/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_logger_LogSink_Name)) {
auto logger = new logger::LoggerImpl(zx::channel(request), STDOUT_FILENO);
zx_status_t status = logger->Begin(dispatcher);
if (status != ZX_OK) {
delete logger;
return status;
}
logger->set_error_handler([logger](zx_status_t status) {
// If we encounter an error, we tear down the logger.
delete logger;
});
return ZX_OK;
}
zx_handle_close(request);
return ZX_ERR_NOT_SUPPORTED;
}
static constexpr const char* logger_services[] = {
fuchsia_logger_LogSink_Name,
nullptr,
};
static constexpr zx_service_ops_t logger_ops = {
.init = nullptr,
.connect = connect,
.release = nullptr,
};
static constexpr zx_service_provider_t logger_service_provider = {
.version = SERVICE_PROVIDER_VERSION,
.services = logger_services,
.ops = &logger_ops,
};
const zx_service_provider_t* logger_get_service_provider() { return &logger_service_provider; }