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

Last change on this file since 3b47db6 was 3b47db6, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 7 years ago

(optional) Remove EXIT_RC().

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