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 
connect(void * ctx,async_dispatcher_t * dispatcher,const char * service_name,zx_handle_t request)12 static 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 
35 static constexpr const char* logger_services[] = {
36     fuchsia_logger_LogSink_Name,
37     nullptr,
38 };
39 
40 static constexpr zx_service_ops_t logger_ops = {
41     .init = nullptr,
42     .connect = connect,
43     .release = nullptr,
44 };
45 
46 static constexpr zx_service_provider_t logger_service_provider = {
47     .version = SERVICE_PROVIDER_VERSION,
48     .services = logger_services,
49     .ops = &logger_ops,
50 };
51 
logger_get_service_provider()52 const zx_service_provider_t* logger_get_service_provider() {
53     return &logger_service_provider;
54 }
55