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/logger/provider.h> 6 7#include <lib/logger/logger.h> 8#include <fuchsia/logger/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_logger_LogSink_Name)) { 15 auto logger = new logger::LoggerImpl(zx::channel(request), STDOUT_FILENO); 16 17 zx_status_t status = logger->Begin(dispatcher); 18 if (status != ZX_OK) { 19 delete logger; 20 return status; 21 } 22 23 logger->set_error_handler([logger](zx_status_t status) { 24 // If we encounter an error, we tear down the logger. 25 delete logger; 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* logger_services[] = { 36 fuchsia_logger_LogSink_Name, 37 nullptr, 38}; 39 40static constexpr zx_service_ops_t logger_ops = { 41 .init = nullptr, 42 .connect = connect, 43 .release = nullptr, 44}; 45 46static constexpr zx_service_provider_t logger_service_provider = { 47 .version = SERVICE_PROVIDER_VERSION, 48 .services = logger_services, 49 .ops = &logger_ops, 50}; 51 52const zx_service_provider_t* logger_get_service_provider() { 53 return &logger_service_provider; 54} 55