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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since fafb8e5 was fafb8e5, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 6 years ago

Mechanically lowercase IPC_SET_*/IPC_GET_*

  • Property mode set to 100644
File size: 6.5 KB
RevLine 
[57914494]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
[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;
[57914494]120
121 printf("%s: Character device test service\n", NAME);
122 async_set_fallback_port_handler(chardev_test_connection, NULL);
123
124 rc = loc_server_register(NAME);
125 if (rc != EOK) {
[c1694b6b]126 printf("%s: Failed registering server.: %s\n", NAME, str_error(rc));
[57914494]127 return rc;
128 }
129
130 chardev_srvs_init(&smallx_srvs);
131 smallx_srvs.ops = &chardev_test_smallx_ops;
132 smallx_srvs.sarg = NULL;
133
134 chardev_srvs_init(&largex_srvs);
135 largex_srvs.ops = &chardev_test_largex_ops;
136 largex_srvs.sarg = NULL;
137
138 chardev_srvs_init(&partialx_srvs);
139 partialx_srvs.ops = &chardev_test_partialx_ops;
140 partialx_srvs.sarg = NULL;
141
142 rc = loc_service_register(SERVICE_NAME_CHARDEV_TEST_SMALLX, &smallx_svc_id);
143 if (rc != EOK) {
[c1694b6b]144 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
[57914494]145 return rc;
146 }
147
148 rc = loc_service_register(SERVICE_NAME_CHARDEV_TEST_LARGEX, &largex_svc_id);
149 if (rc != EOK) {
[c1694b6b]150 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
[57914494]151 return rc;
152 }
153
154 rc = loc_service_register(SERVICE_NAME_CHARDEV_TEST_PARTIALX, &partialx_svc_id);
155 if (rc != EOK) {
[c1694b6b]156 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
[57914494]157 return rc;
158 }
159
160 printf("%s: Accepting connections\n", NAME);
161 task_retval(0);
162 async_manager();
163
164 /* Not reached */
165 return 0;
166}
167
[b7fd2a0]168static errno_t smallx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
[57914494]169{
170 return EOK;
171}
172
[b7fd2a0]173static errno_t smallx_close(chardev_srv_t *srv)
[57914494]174{
175 return EOK;
176}
177
[b7fd2a0]178static errno_t smallx_write(chardev_srv_t *srv, const void *data, size_t size,
[57914494]179 size_t *nwritten)
180{
181 if (size < 1) {
182 *nwritten = 0;
183 return EOK;
184 }
185
186 *nwritten = 1;
187 return EOK;
188}
189
[b7fd2a0]190static errno_t smallx_read(chardev_srv_t *srv, void *buf, size_t size,
[f2d88f3]191 size_t *nread, chardev_flags_t flags)
[57914494]192{
193 if (size < 1) {
194 *nread = 0;
195 return EOK;
196 }
197
198 memset(buf, 0, 1);
199 *nread = 1;
200 return EOK;
201}
202
[b7fd2a0]203static errno_t largex_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
[57914494]204{
205 return EOK;
206}
207
[b7fd2a0]208static errno_t largex_close(chardev_srv_t *srv)
[57914494]209{
210 return EOK;
211}
212
[b7fd2a0]213static errno_t largex_write(chardev_srv_t *srv, const void *data, size_t size,
[57914494]214 size_t *nwritten)
215{
216 if (size < 1) {
217 *nwritten = 0;
218 return EOK;
219 }
220
221 *nwritten = size;
222 return EOK;
223}
224
[b7fd2a0]225static errno_t largex_read(chardev_srv_t *srv, void *buf, size_t size,
[f2d88f3]226 size_t *nread, chardev_flags_t flags)
[57914494]227{
228 if (size < 1) {
229 *nread = 0;
230 return EOK;
231 }
232
233 memset(buf, 0, size);
234 *nread = size;
235 return EOK;
236}
237
[b7fd2a0]238static errno_t partialx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
[57914494]239{
240 return EOK;
241}
242
[b7fd2a0]243static errno_t partialx_close(chardev_srv_t *srv)
[57914494]244{
245 return EOK;
246}
247
[b7fd2a0]248static errno_t partialx_write(chardev_srv_t *srv, const void *data, size_t size,
[57914494]249 size_t *nwritten)
250{
251 if (size < 1) {
252 *nwritten = 0;
253 return EOK;
254 }
255
256 *nwritten = 1;
257 return EIO;
258}
259
[b7fd2a0]260static errno_t partialx_read(chardev_srv_t *srv, void *buf, size_t size,
[f2d88f3]261 size_t *nread, chardev_flags_t flags)
[57914494]262{
263 if (size < 1) {
264 *nread = 0;
265 return EOK;
266 }
267
268 memset(buf, 0, 1);
269 *nread = 1;
270 return EIO;
271}
[3b3fcf36]272
273/**
274 * @}
275 */
Note: See TracBrowser for help on using the repository browser.