source: rtems-libbsd/testsuite/syscalls01/test_main.c @ caf8ede

4.1155-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since caf8ede was caf8ede, checked in by Sebastian Huber <sebastian.huber@…>, on 10/10/13 at 09:29:33

Import socket() implementation from FreeBSD

Add new test syscalls01.

  • Property mode set to 100644
File size: 9.8 KB
Line 
1/*
2 * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32#include <sys/cdefs.h>
33#include <sys/types.h>
34#include <sys/socket.h>
35#include <netinet/in.h>
36
37#include <assert.h>
38#include <errno.h>
39#include <stdbool.h>
40#include <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43#include <unistd.h>
44
45#include <rtems/libcsupport.h>
46
47#define TEST_NAME "LIBBSD SYSCALLS 1"
48
49typedef struct {
50        int domain;
51        int type;
52        int protocol;
53        int expect_errno;
54} socket_test;
55
56static socket_test socket_tests[] = {
57        { -1, SOCK_RAW, 0, EPROTONOSUPPORT },
58        { PF_UNSPEC, SOCK_DGRAM, 0, EPROTONOSUPPORT },
59        { PF_UNIX, SOCK_DGRAM, 0, EPROTONOSUPPORT },
60        { PF_INET, -1, 0, EPROTONOSUPPORT },
61        { PF_INET, SOCK_RAW, -1, EPROTONOSUPPORT },
62        { PF_INET, SOCK_STREAM, 0, 0 },
63        { PF_INET, SOCK_DGRAM, 0, 0 },
64        { PF_INET, SOCK_SEQPACKET, 0, EPROTONOSUPPORT },
65        { PF_INET, SOCK_RAW, IPPROTO_3PC, 0 },
66        { PF_INET, SOCK_RAW, IPPROTO_ADFS, 0 },
67        { PF_INET, SOCK_RAW, IPPROTO_AH, EPROTONOSUPPORT },
68        { PF_INET, SOCK_RAW, IPPROTO_AHIP, 0 },
69        { PF_INET, SOCK_RAW, IPPROTO_APES, 0 },
70        { PF_INET, SOCK_RAW, IPPROTO_ARGUS, 0 },
71        { PF_INET, SOCK_RAW, IPPROTO_AX25, 0 },
72        { PF_INET, SOCK_RAW, IPPROTO_BHA, 0 },
73        { PF_INET, SOCK_RAW, IPPROTO_BLT, 0 },
74        { PF_INET, SOCK_RAW, IPPROTO_BRSATMON, 0 },
75        { PF_INET, SOCK_RAW, IPPROTO_CARP, 0 },
76        { PF_INET, SOCK_RAW, IPPROTO_CFTP, 0 },
77        { PF_INET, SOCK_RAW, IPPROTO_CHAOS, 0 },
78        { PF_INET, SOCK_RAW, IPPROTO_CMTP, 0 },
79        { PF_INET, SOCK_RAW, IPPROTO_CPHB, 0 },
80        { PF_INET, SOCK_RAW, IPPROTO_CPNX, 0 },
81        { PF_INET, SOCK_RAW, IPPROTO_DDP, 0 },
82        { PF_INET, SOCK_RAW, IPPROTO_DGP, 0 },
83        { PF_INET, SOCK_RAW, IPPROTO_DSTOPTS, 0 },
84        { PF_INET, SOCK_RAW, IPPROTO_EGP, 0 },
85        { PF_INET, SOCK_RAW, IPPROTO_EMCON, 0 },
86        { PF_INET, SOCK_RAW, IPPROTO_ENCAP, 0 },
87        { PF_INET, SOCK_RAW, IPPROTO_EON, 0 },
88        { PF_INET, SOCK_RAW, IPPROTO_ESP, EPROTONOSUPPORT },
89        { PF_INET, SOCK_RAW, IPPROTO_ETHERIP, 0 },
90        { PF_INET, SOCK_RAW, IPPROTO_FRAGMENT, 0 },
91        { PF_INET, SOCK_RAW, IPPROTO_GGP, 0 },
92        { PF_INET, SOCK_RAW, IPPROTO_GMTP, 0 },
93        { PF_INET, SOCK_RAW, IPPROTO_GRE, 0 },
94        { PF_INET, SOCK_RAW, IPPROTO_HELLO, 0 },
95        { PF_INET, SOCK_RAW, IPPROTO_HMP, 0 },
96        { PF_INET, SOCK_RAW, IPPROTO_ICMP, 0 },
97        { PF_INET, SOCK_RAW, IPPROTO_ICMPV6, 0 },
98        { PF_INET, SOCK_RAW, IPPROTO_IDP, 0 },
99        { PF_INET, SOCK_RAW, IPPROTO_IDPR, 0 },
100        { PF_INET, SOCK_RAW, IPPROTO_IDRP, 0 },
101        { PF_INET, SOCK_RAW, IPPROTO_IGMP, 0 },
102        { PF_INET, SOCK_RAW, IPPROTO_IGP, 0 },
103        { PF_INET, SOCK_RAW, IPPROTO_IGRP, 0 },
104        { PF_INET, SOCK_RAW, IPPROTO_IL, 0 },
105        { PF_INET, SOCK_RAW, IPPROTO_INLSP, 0 },
106        { PF_INET, SOCK_RAW, IPPROTO_INP, 0 },
107        { PF_INET, SOCK_RAW, IPPROTO_IP, 0 },
108        { PF_INET, SOCK_RAW, IPPROTO_IPCOMP, EPROTONOSUPPORT },
109        { PF_INET, SOCK_RAW, IPPROTO_IPCV, 0 },
110        { PF_INET, SOCK_RAW, IPPROTO_IPEIP, 0 },
111        { PF_INET, SOCK_RAW, IPPROTO_IPIP, 0 },
112        { PF_INET, SOCK_RAW, IPPROTO_IPPC, 0 },
113        { PF_INET, SOCK_RAW, IPPROTO_IPV4, 0 },
114        { PF_INET, SOCK_RAW, IPPROTO_IPV6, 0 },
115        { PF_INET, SOCK_RAW, IPPROTO_IRTP, 0 },
116        { PF_INET, SOCK_RAW, IPPROTO_KRYPTOLAN, 0 },
117        { PF_INET, SOCK_RAW, IPPROTO_LARP, 0 },
118        { PF_INET, SOCK_RAW, IPPROTO_LEAF1, 0 },
119        { PF_INET, SOCK_RAW, IPPROTO_LEAF2, 0 },
120        { PF_INET, SOCK_RAW, IPPROTO_MEAS, 0 },
121        { PF_INET, SOCK_RAW, IPPROTO_MHRP, 0 },
122        { PF_INET, SOCK_RAW, IPPROTO_MICP, 0 },
123        { PF_INET, SOCK_RAW, IPPROTO_MOBILE, 0 },
124        { PF_INET, SOCK_RAW, IPPROTO_MTP, 0 },
125        { PF_INET, SOCK_RAW, IPPROTO_MUX, 0 },
126        { PF_INET, SOCK_RAW, IPPROTO_ND, 0 },
127        { PF_INET, SOCK_RAW, IPPROTO_NHRP, 0 },
128        { PF_INET, SOCK_RAW, IPPROTO_NONE, 0 },
129        { PF_INET, SOCK_RAW, IPPROTO_NSP, 0 },
130        { PF_INET, SOCK_RAW, IPPROTO_NVPII, 0 },
131        { PF_INET, SOCK_RAW, IPPROTO_OLD_DIVERT, 0 },
132        { PF_INET, SOCK_RAW, IPPROTO_OSPFIGP, 0 },
133        { PF_INET, SOCK_RAW, IPPROTO_PFSYNC, 0 },
134        { PF_INET, SOCK_RAW, IPPROTO_PGM, 0 },
135        { PF_INET, SOCK_RAW, IPPROTO_PIGP, 0 },
136        { PF_INET, SOCK_RAW, IPPROTO_PIM, 0 },
137        { PF_INET, SOCK_RAW, IPPROTO_PRM, 0 },
138        { PF_INET, SOCK_RAW, IPPROTO_PUP, 0 },
139        { PF_INET, SOCK_RAW, IPPROTO_PVP, 0 },
140        { PF_INET, SOCK_RAW, IPPROTO_RCCMON, 0 },
141        { PF_INET, SOCK_RAW, IPPROTO_RDP, 0 },
142        { PF_INET, SOCK_RAW, IPPROTO_ROUTING, 0 },
143        { PF_INET, SOCK_RAW, IPPROTO_RSVP, 0 },
144        { PF_INET, SOCK_RAW, IPPROTO_RVD, 0 },
145        { PF_INET, SOCK_RAW, IPPROTO_SATEXPAK, 0 },
146        { PF_INET, SOCK_RAW, IPPROTO_SATMON, 0 },
147        { PF_INET, SOCK_RAW, IPPROTO_SCCSP, 0 },
148        { PF_INET, SOCK_RAW, IPPROTO_SCTP, 0 },
149        { PF_INET, SOCK_RAW, IPPROTO_SDRP, 0 },
150        { PF_INET, SOCK_RAW, IPPROTO_SEP, 0 },
151        { PF_INET, SOCK_RAW, IPPROTO_SKIP, 0 },
152        { PF_INET, SOCK_RAW, IPPROTO_SRPC, 0 },
153        { PF_INET, SOCK_RAW, IPPROTO_ST, 0 },
154        { PF_INET, SOCK_RAW, IPPROTO_SVMTP, 0 },
155        { PF_INET, SOCK_RAW, IPPROTO_SWIPE, 0 },
156        { PF_INET, SOCK_RAW, IPPROTO_TCF, 0 },
157        { PF_INET, SOCK_RAW, IPPROTO_TCP, 0 },
158        { PF_INET, SOCK_RAW, IPPROTO_TLSP, 0 },
159        { PF_INET, SOCK_RAW, IPPROTO_TP, 0 },
160        { PF_INET, SOCK_RAW, IPPROTO_TPXX, 0 },
161        { PF_INET, SOCK_RAW, IPPROTO_TRUNK1, 0 },
162        { PF_INET, SOCK_RAW, IPPROTO_TRUNK2, 0 },
163        { PF_INET, SOCK_RAW, IPPROTO_TTP, 0 },
164        { PF_INET, SOCK_RAW, IPPROTO_UDP, 0 },
165        { PF_INET, SOCK_RAW, IPPROTO_VINES, 0 },
166        { PF_INET, SOCK_RAW, IPPROTO_VISA, 0 },
167        { PF_INET, SOCK_RAW, IPPROTO_VMTP, 0 },
168        { PF_INET, SOCK_RAW, IPPROTO_WBEXPAK, 0 },
169        { PF_INET, SOCK_RAW, IPPROTO_WBMON, 0 },
170        { PF_INET, SOCK_RAW, IPPROTO_WSN, 0 },
171        { PF_INET, SOCK_RAW, IPPROTO_XNET, 0 },
172        { PF_INET, SOCK_RAW, IPPROTO_XTP, 0 },
173        { PF_IMPLINK, SOCK_DGRAM, 0, EPROTONOSUPPORT },
174        { PF_PUP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
175        { PF_CHAOS, SOCK_DGRAM, 0, EPROTONOSUPPORT },
176        { PF_NETBIOS, SOCK_DGRAM, 0, EPROTONOSUPPORT },
177        { PF_ISO, SOCK_DGRAM, 0, EPROTONOSUPPORT },
178        { PF_ECMA, SOCK_DGRAM, 0, EPROTONOSUPPORT },
179        { PF_DATAKIT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
180        { PF_CCITT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
181        { PF_SNA, SOCK_DGRAM, 0, EPROTONOSUPPORT },
182        { PF_DECnet, SOCK_DGRAM, 0, EPROTONOSUPPORT },
183        { PF_DLI, SOCK_DGRAM, 0, EPROTONOSUPPORT },
184        { PF_LAT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
185        { PF_HYLINK, SOCK_DGRAM, 0, EPROTONOSUPPORT },
186        { PF_APPLETALK, SOCK_DGRAM, 0, EPROTONOSUPPORT },
187        { PF_ROUTE, SOCK_DGRAM, 0, EPROTONOSUPPORT },
188        { PF_LINK, SOCK_DGRAM, 0, EPROTONOSUPPORT },
189        { PF_XTP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
190        { PF_COIP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
191        { PF_CNT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
192        { PF_RTIP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
193        { PF_IPX, SOCK_DGRAM, 0, EPROTONOSUPPORT },
194        { PF_SIP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
195        { PF_PIP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
196        { PF_ISDN, SOCK_DGRAM, 0, EPROTONOSUPPORT },
197        { PF_KEY, SOCK_DGRAM, 0, EPROTONOSUPPORT },
198        { PF_INET6, SOCK_DGRAM, 0, EPROTONOSUPPORT },
199        { PF_NATM, SOCK_DGRAM, 0, EPROTONOSUPPORT },
200        { PF_ATM, SOCK_DGRAM, 0, EPROTONOSUPPORT },
201        { pseudo_AF_HDRCMPLT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
202        { PF_NETGRAPH, SOCK_DGRAM, 0, EPROTONOSUPPORT },
203        { PF_SLOW, SOCK_DGRAM, 0, EPROTONOSUPPORT },
204        { PF_SCLUSTER, SOCK_DGRAM, 0, EPROTONOSUPPORT },
205        { PF_ARP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
206        { PF_BLUETOOTH, SOCK_DGRAM, 0, EPROTONOSUPPORT },
207        { AF_IEEE80211, SOCK_DGRAM, 0, EPROTONOSUPPORT }
208};
209
210static void
211test_socket(const socket_test *st)
212{
213        int sd;
214        int rv;
215
216        errno = 0;
217        sd = socket(st->domain, st->type, st->protocol);
218        if (st->expect_errno == 0) {
219                assert(sd >= 0);
220
221                rv = close(sd);
222                assert(rv == 0);
223        } else {
224                assert(st->expect_errno == errno);
225        }
226}
227
228static void
229test_sockets(void)
230{
231        size_t n = sizeof(socket_tests) / sizeof(socket_tests[0]);
232        size_t i;
233
234        puts("test sockets");
235
236        for (i = 0; i < n; ++i) {
237                const socket_test *st = &socket_tests[i];
238
239                test_socket(st);
240        }
241
242        puts("test sockets and check resources");
243
244        for (i = 0; i < n; ++i) {
245                const socket_test *st = &socket_tests[i];
246                rtems_resource_snapshot snapshot;
247
248                rtems_resource_snapshot_take(&snapshot);
249
250                test_socket(st);
251
252                assert(rtems_resource_snapshot_check(&snapshot));
253        }
254}
255
256static void
257test_socket_unsupported_ops(void)
258{
259        rtems_resource_snapshot snapshot;
260        int sd;
261        int rv;
262        off_t off;
263
264        puts("test socket unsupported ops");
265
266        rtems_resource_snapshot_take(&snapshot);
267
268        sd = socket(PF_INET, SOCK_DGRAM, 0);
269        assert(sd >= 0);
270
271        errno = 0;
272        off = lseek(sd, 0, SEEK_CUR);
273        assert(off == -1);
274        assert(errno == ESPIPE);
275
276        errno = 0;
277        rv = ftruncate(sd, 0);
278        assert(rv == -1);
279        assert(errno == EINVAL);
280
281        errno = 0;
282        rv = fsync(sd);
283        assert(rv == -1);
284        assert(errno == EINVAL);
285
286        errno = 0;
287        rv = fdatasync(sd);
288        assert(rv == -1);
289        assert(errno == EINVAL);
290
291        rv = close(sd);
292        assert(rv == 0);
293
294        assert(rtems_resource_snapshot_check(&snapshot));
295}
296
297
298static void
299test_main(void)
300{
301        /* Must be first test to ensure resource checks work */
302        test_sockets();
303
304        test_socket_unsupported_ops();
305
306        puts("*** END OF " TEST_NAME " TEST ***");
307        exit(0);
308}
309
310#include <rtems/bsd/test/default-init.h>
Note: See TracBrowser for help on using the repository browser.