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
RevLine 
[57914494]1/*
[ca48672]2 * Copyright (c) 2025 Jiri Svoboda
[57914494]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
[3b3fcf36]29/** @addtogroup chardev-test
30 * @{
31 */
32/**
33 * @file
34 * @brief Character device interface test service
35 */
36
[57914494]37#include <async.h>
38#include <errno.h>
[c1694b6b]39#include <str_error.h>
[57914494]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
[b7fd2a0]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 *);
[f2d88f3]52static errno_t smallx_read(chardev_srv_t *, void *, size_t, size_t *,
53 chardev_flags_t);
[57914494]54
[b7fd2a0]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 *);
[f2d88f3]58static errno_t largex_read(chardev_srv_t *, void *, size_t, size_t *,
59 chardev_flags_t);
[57914494]60
[b7fd2a0]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 *);
[f2d88f3]64static errno_t partialx_read(chardev_srv_t *, void *, size_t, size_t *,
65 chardev_flags_t);
[57914494]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
[984a9ba]97static void chardev_test_connection(ipc_call_t *icall, void *arg)
[57914494]98{
99 chardev_srvs_t *svc;
100 sysarg_t svcid;
101
[fafb8e5]102 svcid = ipc_get_arg2(icall);
[57914494]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 {
[984a9ba]110 async_answer_0(icall, ENOENT);
[57914494]111 return;
112 }
113
[984a9ba]114 chardev_conn(icall, svc);
[57914494]115}
116
117int main(int argc, char *argv[])
118{
[b7fd2a0]119 errno_t rc;
[4c6fd56]120 loc_srv_t *srv;
[57914494]121
122 printf("%s: Character device test service\n", NAME);
123 async_set_fallback_port_handler(chardev_test_connection, NULL);
124
[4c6fd56]125 rc = loc_server_register(NAME, &srv);
[57914494]126 if (rc != EOK) {
[c1694b6b]127 printf("%s: Failed registering server.: %s\n", NAME, str_error(rc));
[57914494]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
[4c6fd56]143 rc = loc_service_register(srv, SERVICE_NAME_CHARDEV_TEST_SMALLX,
[ca48672]144 fallback_port_id, &smallx_svc_id);
[57914494]145 if (rc != EOK) {
[c1694b6b]146 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
[4c6fd56]147 goto error;
[57914494]148 }
149
[4c6fd56]150 rc = loc_service_register(srv, SERVICE_NAME_CHARDEV_TEST_LARGEX,
[ca48672]151 fallback_port_id, &largex_svc_id);
[57914494]152 if (rc != EOK) {
[c1694b6b]153 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
[4c6fd56]154 goto error;
[57914494]155 }
156
[4c6fd56]157 rc = loc_service_register(srv, SERVICE_NAME_CHARDEV_TEST_PARTIALX,
[ca48672]158 fallback_port_id, &partialx_svc_id);
[57914494]159 if (rc != EOK) {
[c1694b6b]160 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
[4c6fd56]161 goto error;
[57914494]162 }
163
164 printf("%s: Accepting connections\n", NAME);
165 task_retval(0);
166 async_manager();
167
168 /* Not reached */
169 return 0;
[4c6fd56]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;
[57914494]179}
180
[b7fd2a0]181static errno_t smallx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
[57914494]182{
183 return EOK;
184}
185
[b7fd2a0]186static errno_t smallx_close(chardev_srv_t *srv)
[57914494]187{
188 return EOK;
189}
190
[b7fd2a0]191static errno_t smallx_write(chardev_srv_t *srv, const void *data, size_t size,
[57914494]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
[b7fd2a0]203static errno_t smallx_read(chardev_srv_t *srv, void *buf, size_t size,
[f2d88f3]204 size_t *nread, chardev_flags_t flags)
[57914494]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
[b7fd2a0]216static errno_t largex_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
[57914494]217{
218 return EOK;
219}
220
[b7fd2a0]221static errno_t largex_close(chardev_srv_t *srv)
[57914494]222{
223 return EOK;
224}
225
[b7fd2a0]226static errno_t largex_write(chardev_srv_t *srv, const void *data, size_t size,
[57914494]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
[b7fd2a0]238static errno_t largex_read(chardev_srv_t *srv, void *buf, size_t size,
[f2d88f3]239 size_t *nread, chardev_flags_t flags)
[57914494]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
[b7fd2a0]251static errno_t partialx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
[57914494]252{
253 return EOK;
254}
255
[b7fd2a0]256static errno_t partialx_close(chardev_srv_t *srv)
[57914494]257{
258 return EOK;
259}
260
[b7fd2a0]261static errno_t partialx_write(chardev_srv_t *srv, const void *data, size_t size,
[57914494]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
[b7fd2a0]273static errno_t partialx_read(chardev_srv_t *srv, void *buf, size_t size,
[f2d88f3]274 size_t *nread, chardev_flags_t flags)
[57914494]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}
[3b3fcf36]285
286/**
287 * @}
288 */
Note: See TracBrowser for help on using the repository browser.