source: mainline/uspace/srv/test/chardev-test/main.c@ 984a9ba

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 984a9ba 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: 6.3 KB
Line 
1/*
2 * Copyright (c) 2017 Jiri Svoboda
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#include <async.h>
30#include <errno.h>
31#include <str_error.h>
32#include <io/chardev_srv.h>
33#include <ipc/services.h>
34#include <loc.h>
35#include <mem.h>
36#include <stdio.h>
37#include <task.h>
38
39#define NAME "chardev-test"
40
41static errno_t smallx_open(chardev_srvs_t *, chardev_srv_t *);
42static errno_t smallx_close(chardev_srv_t *);
43static errno_t smallx_write(chardev_srv_t *, const void *, size_t, size_t *);
44static errno_t smallx_read(chardev_srv_t *, void *, size_t, size_t *);
45
46static errno_t largex_open(chardev_srvs_t *, chardev_srv_t *);
47static errno_t largex_close(chardev_srv_t *);
48static errno_t largex_write(chardev_srv_t *, const void *, size_t, size_t *);
49static errno_t largex_read(chardev_srv_t *, void *, size_t, size_t *);
50
51static errno_t partialx_open(chardev_srvs_t *, chardev_srv_t *);
52static errno_t partialx_close(chardev_srv_t *);
53static errno_t partialx_write(chardev_srv_t *, const void *, size_t, size_t *);
54static errno_t partialx_read(chardev_srv_t *, void *, size_t, size_t *);
55
56static service_id_t smallx_svc_id;
57static chardev_srvs_t smallx_srvs;
58
59static service_id_t largex_svc_id;
60static chardev_srvs_t largex_srvs;
61
62static service_id_t partialx_svc_id;
63static chardev_srvs_t partialx_srvs;
64
65static chardev_ops_t chardev_test_smallx_ops = {
66 .open = smallx_open,
67 .close = smallx_close,
68 .write = smallx_write,
69 .read = smallx_read
70};
71
72static chardev_ops_t chardev_test_largex_ops = {
73 .open = largex_open,
74 .close = largex_close,
75 .write = largex_write,
76 .read = largex_read
77};
78
79static chardev_ops_t chardev_test_partialx_ops = {
80 .open = partialx_open,
81 .close = partialx_close,
82 .write = partialx_write,
83 .read = partialx_read
84};
85
86static void chardev_test_connection(ipc_call_t *icall, void *arg)
87{
88 chardev_srvs_t *svc;
89 sysarg_t svcid;
90
91 svcid = IPC_GET_ARG2(*icall);
92 if (svcid == smallx_svc_id) {
93 svc = &smallx_srvs;
94 } else if (svcid == largex_svc_id) {
95 svc = &largex_srvs;
96 } else if (svcid == partialx_svc_id) {
97 svc = &partialx_srvs;
98 } else {
99 async_answer_0(icall, ENOENT);
100 return;
101 }
102
103 chardev_conn(icall, svc);
104}
105
106int main(int argc, char *argv[])
107{
108 errno_t rc;
109
110 printf("%s: Character device test service\n", NAME);
111 async_set_fallback_port_handler(chardev_test_connection, NULL);
112
113 rc = loc_server_register(NAME);
114 if (rc != EOK) {
115 printf("%s: Failed registering server.: %s\n", NAME, str_error(rc));
116 return rc;
117 }
118
119 chardev_srvs_init(&smallx_srvs);
120 smallx_srvs.ops = &chardev_test_smallx_ops;
121 smallx_srvs.sarg = NULL;
122
123 chardev_srvs_init(&largex_srvs);
124 largex_srvs.ops = &chardev_test_largex_ops;
125 largex_srvs.sarg = NULL;
126
127 chardev_srvs_init(&partialx_srvs);
128 partialx_srvs.ops = &chardev_test_partialx_ops;
129 partialx_srvs.sarg = NULL;
130
131 rc = loc_service_register(SERVICE_NAME_CHARDEV_TEST_SMALLX, &smallx_svc_id);
132 if (rc != EOK) {
133 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
134 return rc;
135 }
136
137 rc = loc_service_register(SERVICE_NAME_CHARDEV_TEST_LARGEX, &largex_svc_id);
138 if (rc != EOK) {
139 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
140 return rc;
141 }
142
143 rc = loc_service_register(SERVICE_NAME_CHARDEV_TEST_PARTIALX, &partialx_svc_id);
144 if (rc != EOK) {
145 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
146 return rc;
147 }
148
149
150 printf("%s: Accepting connections\n", NAME);
151 task_retval(0);
152 async_manager();
153
154 /* Not reached */
155 return 0;
156}
157
158static errno_t smallx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
159{
160 return EOK;
161}
162
163static errno_t smallx_close(chardev_srv_t *srv)
164{
165 return EOK;
166}
167
168static errno_t smallx_write(chardev_srv_t *srv, const void *data, size_t size,
169 size_t *nwritten)
170{
171 if (size < 1) {
172 *nwritten = 0;
173 return EOK;
174 }
175
176 *nwritten = 1;
177 return EOK;
178}
179
180static errno_t smallx_read(chardev_srv_t *srv, void *buf, size_t size,
181 size_t *nread)
182{
183 if (size < 1) {
184 *nread = 0;
185 return EOK;
186 }
187
188 memset(buf, 0, 1);
189 *nread = 1;
190 return EOK;
191}
192
193static errno_t largex_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
194{
195 return EOK;
196}
197
198static errno_t largex_close(chardev_srv_t *srv)
199{
200 return EOK;
201}
202
203static errno_t largex_write(chardev_srv_t *srv, const void *data, size_t size,
204 size_t *nwritten)
205{
206 if (size < 1) {
207 *nwritten = 0;
208 return EOK;
209 }
210
211 *nwritten = size;
212 return EOK;
213}
214
215static errno_t largex_read(chardev_srv_t *srv, void *buf, size_t size,
216 size_t *nread)
217{
218 if (size < 1) {
219 *nread = 0;
220 return EOK;
221 }
222
223 memset(buf, 0, size);
224 *nread = size;
225 return EOK;
226}
227
228static errno_t partialx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
229{
230 return EOK;
231}
232
233static errno_t partialx_close(chardev_srv_t *srv)
234{
235 return EOK;
236}
237
238static errno_t partialx_write(chardev_srv_t *srv, const void *data, size_t size,
239 size_t *nwritten)
240{
241 if (size < 1) {
242 *nwritten = 0;
243 return EOK;
244 }
245
246 *nwritten = 1;
247 return EIO;
248}
249
250static errno_t partialx_read(chardev_srv_t *srv, void *buf, size_t size,
251 size_t *nread)
252{
253 if (size < 1) {
254 *nread = 0;
255 return EOK;
256 }
257
258 memset(buf, 0, 1);
259 *nread = 1;
260 return EIO;
261}
Note: See TracBrowser for help on using the repository browser.