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

Last change on this file was ca48672, checked in by Jiri Svoboda <jiri@…>, 8 days ago

loc_service_register() needs to take a port ID argument.

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