source: mainline/uspace/srv/logger/writer.c@ 40abf56a

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 40abf56a was 984a9ba, checked in by Martin Decky <martin@…>, 7 years ago

do not expose the call capability handler from the async framework

Keep the call capability handler encapsulated within the async framework
and do not expose it explicitly via its API. Use the pointer to
ipc_call_t as the sole object identifying an IPC call in the code that
uses the async framework.

This plugs a major leak in the abstraction and also simplifies both the
async framework (slightly) and all IPC servers.

  • Property mode set to 100644
File size: 3.6 KB
Line 
1/*
2 * Copyright (c) 2012 Vojtech Horky
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/**
30 * @defgroup logger Logging service.
31 * @brief HelenOS logging service.
32 * @{
33 */
34
35/** @file
36 */
37
38#include <ipc/services.h>
39#include <ipc/logger.h>
40#include <io/log.h>
41#include <io/logctl.h>
42#include <io/klog.h>
43#include <ns.h>
44#include <async.h>
45#include <errno.h>
46#include <stdio.h>
47#include <stdlib.h>
48#include <str_error.h>
49#include "logger.h"
50
51
52static logger_log_t *handle_create_log(sysarg_t parent)
53{
54 void *name;
55 errno_t rc = async_data_write_accept(&name, true, 1, 0, 0, NULL);
56 if (rc != EOK)
57 return NULL;
58
59 logger_log_t *log = find_or_create_log_and_lock(name, parent);
60
61 free(name);
62
63 return log;
64}
65
66static errno_t handle_receive_message(sysarg_t log_id, sysarg_t level)
67{
68 logger_log_t *log = find_log_by_id_and_lock(log_id);
69 if (log == NULL)
70 return ENOENT;
71
72 void *message = NULL;
73 errno_t rc = async_data_write_accept(&message, true, 1, 0, 0, NULL);
74 if (rc != EOK)
75 goto leave;
76
77 if (!shall_log_message(log, level)) {
78 rc = EOK;
79 goto leave;
80 }
81
82 KLOG_PRINTF(level, "[%s] %s: %s",
83 log->full_name, log_level_str(level),
84 (const char *) message);
85 write_to_log(log, level, message);
86
87 rc = EOK;
88
89leave:
90 log_unlock(log);
91 free(message);
92
93 return rc;
94}
95
96void logger_connection_handler_writer(ipc_call_t *icall)
97{
98 logger_log_t *log;
99 errno_t rc;
100
101 /* Acknowledge the connection. */
102 async_answer_0(icall, EOK);
103
104 logger_log("writer: new client.\n");
105
106 logger_registered_logs_t registered_logs;
107 registered_logs_init(&registered_logs);
108
109 while (true) {
110 ipc_call_t call;
111 async_get_call(&call);
112
113 if (!IPC_GET_IMETHOD(call))
114 break;
115
116 switch (IPC_GET_IMETHOD(call)) {
117 case LOGGER_WRITER_CREATE_LOG:
118 log = handle_create_log(IPC_GET_ARG1(call));
119 if (log == NULL) {
120 async_answer_0(&call, ENOMEM);
121 break;
122 }
123 if (!register_log(&registered_logs, log)) {
124 log_unlock(log);
125 async_answer_0(&call, ELIMIT);
126 break;
127 }
128 log_unlock(log);
129 async_answer_1(&call, EOK, (sysarg_t) log);
130 break;
131 case LOGGER_WRITER_MESSAGE:
132 rc = handle_receive_message(IPC_GET_ARG1(call),
133 IPC_GET_ARG2(call));
134 async_answer_0(&call, rc);
135 break;
136 default:
137 async_answer_0(&call, EINVAL);
138 break;
139 }
140 }
141
142 unregister_logs(&registered_logs);
143 logger_log("writer: client terminated.\n");
144}
145
146/**
147 * @}
148 */
Note: See TracBrowser for help on using the repository browser.