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
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/** @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
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) {
126 printf("%s: Failed registering server.: %s\n", NAME, str_error(rc));
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) {
144 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
145 return rc;
146 }
147
148 rc = loc_service_register(SERVICE_NAME_CHARDEV_TEST_LARGEX, &largex_svc_id);
149 if (rc != EOK) {
150 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
151 return rc;
152 }
153
154 rc = loc_service_register(SERVICE_NAME_CHARDEV_TEST_PARTIALX, &partialx_svc_id);
155 if (rc != EOK) {
156 printf("%s: Failed registering service.: %s\n", NAME, str_error(rc));
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
168static errno_t smallx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
169{
170 return EOK;
171}
172
173static errno_t smallx_close(chardev_srv_t *srv)
174{
175 return EOK;
176}
177
178static errno_t smallx_write(chardev_srv_t *srv, const void *data, size_t size,
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
190static errno_t smallx_read(chardev_srv_t *srv, void *buf, size_t size,
191 size_t *nread, chardev_flags_t flags)
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
203static errno_t largex_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
204{
205 return EOK;
206}
207
208static errno_t largex_close(chardev_srv_t *srv)
209{
210 return EOK;
211}
212
213static errno_t largex_write(chardev_srv_t *srv, const void *data, size_t size,
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
225static errno_t largex_read(chardev_srv_t *srv, void *buf, size_t size,
226 size_t *nread, chardev_flags_t flags)
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
238static errno_t partialx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
239{
240 return EOK;
241}
242
243static errno_t partialx_close(chardev_srv_t *srv)
244{
245 return EOK;
246}
247
248static errno_t partialx_write(chardev_srv_t *srv, const void *data, size_t size,
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
260static errno_t partialx_read(chardev_srv_t *srv, void *buf, size_t size,
261 size_t *nread, chardev_flags_t flags)
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}
272
273/**
274 * @}
275 */
Note: See TracBrowser for help on using the repository browser.