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