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

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

Wrap returns of errno from main() with EXIT_RC().

Returns of error code from main() prevent type checking when errno_t
and int are considered incompatible. In order to avoid the philosophical
discussion of what should and shouldn't be returned for main(), we simply
wrap the error values and leave the answer to the question for future
generations to decide.

  • 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 int smallx_open(chardev_srvs_t *, chardev_srv_t *);
43static int smallx_close(chardev_srv_t *);
44static int smallx_write(chardev_srv_t *, const void *, size_t, size_t *);
45static int smallx_read(chardev_srv_t *, void *, size_t, size_t *);
46
47static int largex_open(chardev_srvs_t *, chardev_srv_t *);
48static int largex_close(chardev_srv_t *);
49static int largex_write(chardev_srv_t *, const void *, size_t, size_t *);
50static int largex_read(chardev_srv_t *, void *, size_t, size_t *);
51
52static int partialx_open(chardev_srvs_t *, chardev_srv_t *);
53static int partialx_close(chardev_srv_t *);
54static int partialx_write(chardev_srv_t *, const void *, size_t, size_t *);
55static int 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 int 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 EXIT_RC(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 EXIT_RC(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 EXIT_RC(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 EXIT_RC(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 int smallx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
160{
161 return EOK;
162}
163
164static int smallx_close(chardev_srv_t *srv)
165{
166 return EOK;
167}
168
169static int 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 int 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 int largex_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
195{
196 return EOK;
197}
198
199static int largex_close(chardev_srv_t *srv)
200{
201 return EOK;
202}
203
204static int 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 int 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 int partialx_open(chardev_srvs_t *srvs, chardev_srv_t *srv)
230{
231 return EOK;
232}
233
234static int partialx_close(chardev_srv_t *srv)
235{
236 return EOK;
237}
238
239static int 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 int 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.