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

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

Use accept() from FreeBSD

  • Property mode set to 100644
File size: 17.7 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/stat.h>
35#include <sys/socket.h>
36#include <sys/filio.h>
37#include <netinet/in.h>
38#include <arpa/inet.h>
39
40#include <assert.h>
41#include <errno.h>
42#include <stdbool.h>
43#include <stdio.h>
44#include <stdlib.h>
45#include <string.h>
46#include <unistd.h>
47
48#include <rtems/libcsupport.h>
49
50#define TEST_NAME "LIBBSD SYSCALLS 1"
51
52typedef void (*no_mem_test_body)(int fd);
53
54typedef struct {
55        no_mem_test_body body;
56        int fd;
57        rtems_id master_task;
58} no_mem_test;
59
60typedef struct {
61        int domain;
62        int type;
63        int protocol;
64        int expect_errno;
65} socket_test;
66
67static socket_test socket_tests[] = {
68        { -1, SOCK_RAW, 0, EPROTONOSUPPORT },
69        { PF_UNSPEC, SOCK_DGRAM, 0, EPROTONOSUPPORT },
70        { PF_UNIX, SOCK_DGRAM, 0, EPROTONOSUPPORT },
71        { PF_INET, -1, 0, EPROTONOSUPPORT },
72        { PF_INET, SOCK_RAW, -1, EPROTONOSUPPORT },
73        { PF_INET, SOCK_STREAM, 0, 0 },
74        { PF_INET, SOCK_DGRAM, 0, 0 },
75        { PF_INET, SOCK_SEQPACKET, 0, EPROTONOSUPPORT },
76        { PF_INET, SOCK_RAW, IPPROTO_3PC, 0 },
77        { PF_INET, SOCK_RAW, IPPROTO_ADFS, 0 },
78        { PF_INET, SOCK_RAW, IPPROTO_AH, EPROTONOSUPPORT },
79        { PF_INET, SOCK_RAW, IPPROTO_AHIP, 0 },
80        { PF_INET, SOCK_RAW, IPPROTO_APES, 0 },
81        { PF_INET, SOCK_RAW, IPPROTO_ARGUS, 0 },
82        { PF_INET, SOCK_RAW, IPPROTO_AX25, 0 },
83        { PF_INET, SOCK_RAW, IPPROTO_BHA, 0 },
84        { PF_INET, SOCK_RAW, IPPROTO_BLT, 0 },
85        { PF_INET, SOCK_RAW, IPPROTO_BRSATMON, 0 },
86        { PF_INET, SOCK_RAW, IPPROTO_CARP, 0 },
87        { PF_INET, SOCK_RAW, IPPROTO_CFTP, 0 },
88        { PF_INET, SOCK_RAW, IPPROTO_CHAOS, 0 },
89        { PF_INET, SOCK_RAW, IPPROTO_CMTP, 0 },
90        { PF_INET, SOCK_RAW, IPPROTO_CPHB, 0 },
91        { PF_INET, SOCK_RAW, IPPROTO_CPNX, 0 },
92        { PF_INET, SOCK_RAW, IPPROTO_DDP, 0 },
93        { PF_INET, SOCK_RAW, IPPROTO_DGP, 0 },
94        { PF_INET, SOCK_RAW, IPPROTO_DSTOPTS, 0 },
95        { PF_INET, SOCK_RAW, IPPROTO_EGP, 0 },
96        { PF_INET, SOCK_RAW, IPPROTO_EMCON, 0 },
97        { PF_INET, SOCK_RAW, IPPROTO_ENCAP, 0 },
98        { PF_INET, SOCK_RAW, IPPROTO_EON, 0 },
99        { PF_INET, SOCK_RAW, IPPROTO_ESP, EPROTONOSUPPORT },
100        { PF_INET, SOCK_RAW, IPPROTO_ETHERIP, 0 },
101        { PF_INET, SOCK_RAW, IPPROTO_FRAGMENT, 0 },
102        { PF_INET, SOCK_RAW, IPPROTO_GGP, 0 },
103        { PF_INET, SOCK_RAW, IPPROTO_GMTP, 0 },
104        { PF_INET, SOCK_RAW, IPPROTO_GRE, 0 },
105        { PF_INET, SOCK_RAW, IPPROTO_HELLO, 0 },
106        { PF_INET, SOCK_RAW, IPPROTO_HMP, 0 },
107        { PF_INET, SOCK_RAW, IPPROTO_ICMP, 0 },
108        { PF_INET, SOCK_RAW, IPPROTO_ICMPV6, 0 },
109        { PF_INET, SOCK_RAW, IPPROTO_IDP, 0 },
110        { PF_INET, SOCK_RAW, IPPROTO_IDPR, 0 },
111        { PF_INET, SOCK_RAW, IPPROTO_IDRP, 0 },
112        { PF_INET, SOCK_RAW, IPPROTO_IGMP, 0 },
113        { PF_INET, SOCK_RAW, IPPROTO_IGP, 0 },
114        { PF_INET, SOCK_RAW, IPPROTO_IGRP, 0 },
115        { PF_INET, SOCK_RAW, IPPROTO_IL, 0 },
116        { PF_INET, SOCK_RAW, IPPROTO_INLSP, 0 },
117        { PF_INET, SOCK_RAW, IPPROTO_INP, 0 },
118        { PF_INET, SOCK_RAW, IPPROTO_IP, 0 },
119        { PF_INET, SOCK_RAW, IPPROTO_IPCOMP, EPROTONOSUPPORT },
120        { PF_INET, SOCK_RAW, IPPROTO_IPCV, 0 },
121        { PF_INET, SOCK_RAW, IPPROTO_IPEIP, 0 },
122        { PF_INET, SOCK_RAW, IPPROTO_IPIP, 0 },
123        { PF_INET, SOCK_RAW, IPPROTO_IPPC, 0 },
124        { PF_INET, SOCK_RAW, IPPROTO_IPV4, 0 },
125        { PF_INET, SOCK_RAW, IPPROTO_IPV6, 0 },
126        { PF_INET, SOCK_RAW, IPPROTO_IRTP, 0 },
127        { PF_INET, SOCK_RAW, IPPROTO_KRYPTOLAN, 0 },
128        { PF_INET, SOCK_RAW, IPPROTO_LARP, 0 },
129        { PF_INET, SOCK_RAW, IPPROTO_LEAF1, 0 },
130        { PF_INET, SOCK_RAW, IPPROTO_LEAF2, 0 },
131        { PF_INET, SOCK_RAW, IPPROTO_MEAS, 0 },
132        { PF_INET, SOCK_RAW, IPPROTO_MHRP, 0 },
133        { PF_INET, SOCK_RAW, IPPROTO_MICP, 0 },
134        { PF_INET, SOCK_RAW, IPPROTO_MOBILE, 0 },
135        { PF_INET, SOCK_RAW, IPPROTO_MTP, 0 },
136        { PF_INET, SOCK_RAW, IPPROTO_MUX, 0 },
137        { PF_INET, SOCK_RAW, IPPROTO_ND, 0 },
138        { PF_INET, SOCK_RAW, IPPROTO_NHRP, 0 },
139        { PF_INET, SOCK_RAW, IPPROTO_NONE, 0 },
140        { PF_INET, SOCK_RAW, IPPROTO_NSP, 0 },
141        { PF_INET, SOCK_RAW, IPPROTO_NVPII, 0 },
142        { PF_INET, SOCK_RAW, IPPROTO_OLD_DIVERT, 0 },
143        { PF_INET, SOCK_RAW, IPPROTO_OSPFIGP, 0 },
144        { PF_INET, SOCK_RAW, IPPROTO_PFSYNC, 0 },
145        { PF_INET, SOCK_RAW, IPPROTO_PGM, 0 },
146        { PF_INET, SOCK_RAW, IPPROTO_PIGP, 0 },
147        { PF_INET, SOCK_RAW, IPPROTO_PIM, 0 },
148        { PF_INET, SOCK_RAW, IPPROTO_PRM, 0 },
149        { PF_INET, SOCK_RAW, IPPROTO_PUP, 0 },
150        { PF_INET, SOCK_RAW, IPPROTO_PVP, 0 },
151        { PF_INET, SOCK_RAW, IPPROTO_RCCMON, 0 },
152        { PF_INET, SOCK_RAW, IPPROTO_RDP, 0 },
153        { PF_INET, SOCK_RAW, IPPROTO_ROUTING, 0 },
154        { PF_INET, SOCK_RAW, IPPROTO_RSVP, 0 },
155        { PF_INET, SOCK_RAW, IPPROTO_RVD, 0 },
156        { PF_INET, SOCK_RAW, IPPROTO_SATEXPAK, 0 },
157        { PF_INET, SOCK_RAW, IPPROTO_SATMON, 0 },
158        { PF_INET, SOCK_RAW, IPPROTO_SCCSP, 0 },
159        { PF_INET, SOCK_RAW, IPPROTO_SCTP, 0 },
160        { PF_INET, SOCK_RAW, IPPROTO_SDRP, 0 },
161        { PF_INET, SOCK_RAW, IPPROTO_SEP, 0 },
162        { PF_INET, SOCK_RAW, IPPROTO_SKIP, 0 },
163        { PF_INET, SOCK_RAW, IPPROTO_SRPC, 0 },
164        { PF_INET, SOCK_RAW, IPPROTO_ST, 0 },
165        { PF_INET, SOCK_RAW, IPPROTO_SVMTP, 0 },
166        { PF_INET, SOCK_RAW, IPPROTO_SWIPE, 0 },
167        { PF_INET, SOCK_RAW, IPPROTO_TCF, 0 },
168        { PF_INET, SOCK_RAW, IPPROTO_TCP, 0 },
169        { PF_INET, SOCK_RAW, IPPROTO_TLSP, 0 },
170        { PF_INET, SOCK_RAW, IPPROTO_TP, 0 },
171        { PF_INET, SOCK_RAW, IPPROTO_TPXX, 0 },
172        { PF_INET, SOCK_RAW, IPPROTO_TRUNK1, 0 },
173        { PF_INET, SOCK_RAW, IPPROTO_TRUNK2, 0 },
174        { PF_INET, SOCK_RAW, IPPROTO_TTP, 0 },
175        { PF_INET, SOCK_RAW, IPPROTO_UDP, 0 },
176        { PF_INET, SOCK_RAW, IPPROTO_VINES, 0 },
177        { PF_INET, SOCK_RAW, IPPROTO_VISA, 0 },
178        { PF_INET, SOCK_RAW, IPPROTO_VMTP, 0 },
179        { PF_INET, SOCK_RAW, IPPROTO_WBEXPAK, 0 },
180        { PF_INET, SOCK_RAW, IPPROTO_WBMON, 0 },
181        { PF_INET, SOCK_RAW, IPPROTO_WSN, 0 },
182        { PF_INET, SOCK_RAW, IPPROTO_XNET, 0 },
183        { PF_INET, SOCK_RAW, IPPROTO_XTP, 0 },
184        { PF_IMPLINK, SOCK_DGRAM, 0, EPROTONOSUPPORT },
185        { PF_PUP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
186        { PF_CHAOS, SOCK_DGRAM, 0, EPROTONOSUPPORT },
187        { PF_NETBIOS, SOCK_DGRAM, 0, EPROTONOSUPPORT },
188        { PF_ISO, SOCK_DGRAM, 0, EPROTONOSUPPORT },
189        { PF_ECMA, SOCK_DGRAM, 0, EPROTONOSUPPORT },
190        { PF_DATAKIT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
191        { PF_CCITT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
192        { PF_SNA, SOCK_DGRAM, 0, EPROTONOSUPPORT },
193        { PF_DECnet, SOCK_DGRAM, 0, EPROTONOSUPPORT },
194        { PF_DLI, SOCK_DGRAM, 0, EPROTONOSUPPORT },
195        { PF_LAT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
196        { PF_HYLINK, SOCK_DGRAM, 0, EPROTONOSUPPORT },
197        { PF_APPLETALK, SOCK_DGRAM, 0, EPROTONOSUPPORT },
198        { PF_ROUTE, SOCK_DGRAM, 0, EPROTONOSUPPORT },
199        { PF_LINK, SOCK_DGRAM, 0, EPROTONOSUPPORT },
200        { PF_XTP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
201        { PF_COIP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
202        { PF_CNT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
203        { PF_RTIP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
204        { PF_IPX, SOCK_DGRAM, 0, EPROTONOSUPPORT },
205        { PF_SIP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
206        { PF_PIP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
207        { PF_ISDN, SOCK_DGRAM, 0, EPROTONOSUPPORT },
208        { PF_KEY, SOCK_DGRAM, 0, EPROTONOSUPPORT },
209        { PF_INET6, SOCK_DGRAM, 0, EPROTONOSUPPORT },
210        { PF_NATM, SOCK_DGRAM, 0, EPROTONOSUPPORT },
211        { PF_ATM, SOCK_DGRAM, 0, EPROTONOSUPPORT },
212        { pseudo_AF_HDRCMPLT, SOCK_DGRAM, 0, EPROTONOSUPPORT },
213        { PF_NETGRAPH, SOCK_DGRAM, 0, EPROTONOSUPPORT },
214        { PF_SLOW, SOCK_DGRAM, 0, EPROTONOSUPPORT },
215        { PF_SCLUSTER, SOCK_DGRAM, 0, EPROTONOSUPPORT },
216        { PF_ARP, SOCK_DGRAM, 0, EPROTONOSUPPORT },
217        { PF_BLUETOOTH, SOCK_DGRAM, 0, EPROTONOSUPPORT },
218        { AF_IEEE80211, SOCK_DGRAM, 0, EPROTONOSUPPORT }
219};
220
221static void
222init_addr(struct sockaddr_in *addr)
223{
224        int ok;
225
226        memset(addr, 0, sizeof(*addr));
227        addr->sin_family = AF_INET;
228        addr->sin_port = htons(1234);
229        ok = inet_aton("127.0.0.1", &addr->sin_addr);
230        assert(ok != 0);
231}
232
233static void
234no_mem_task(rtems_task_argument arg)
235{
236        const no_mem_test *self = (const no_mem_test *) arg;
237        rtems_status_code sc;
238        void *greedy;
239
240        assert(rtems_configuration_get_unified_work_area());
241
242        greedy = rtems_workspace_greedy_allocate(NULL, 0);
243        (*self->body)(self->fd);
244        rtems_workspace_greedy_free(greedy);
245
246        sc = rtems_event_transient_send(self->master_task);
247        assert(sc == RTEMS_SUCCESSFUL);
248
249        sc = rtems_task_suspend(RTEMS_SELF);
250        assert(sc == RTEMS_SUCCESSFUL);
251}
252
253static void
254do_no_mem_test(no_mem_test_body body, int fd)
255{
256        no_mem_test test = {
257                .body = body,
258                .fd = fd,
259                .master_task = rtems_task_self()
260        };
261        rtems_status_code sc;
262        rtems_id id;
263        rtems_resource_snapshot snapshot;
264
265        rtems_resource_snapshot_take(&snapshot);
266
267        sc = rtems_task_create(
268                rtems_build_name('N', 'M', 'E', 'M'),
269                RTEMS_MINIMUM_PRIORITY,
270                RTEMS_MINIMUM_STACK_SIZE,
271                RTEMS_DEFAULT_MODES,
272                RTEMS_DEFAULT_ATTRIBUTES,
273                &id
274        );
275        assert(sc == RTEMS_SUCCESSFUL);
276
277        sc = rtems_task_start(id, no_mem_task, (rtems_task_argument) &test);
278        assert(sc == RTEMS_SUCCESSFUL);
279
280        sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
281        assert(sc == RTEMS_SUCCESSFUL);
282
283        sc = rtems_task_delete(id);
284        assert(sc == RTEMS_SUCCESSFUL);
285
286        assert(rtems_resource_snapshot_check(&snapshot));
287}
288
289static void
290test_socket(const socket_test *st)
291{
292        int sd;
293        int rv;
294
295        errno = 0;
296        sd = socket(st->domain, st->type, st->protocol);
297        if (st->expect_errno == 0) {
298                assert(sd >= 0);
299
300                rv = close(sd);
301                assert(rv == 0);
302        } else {
303                assert(st->expect_errno == errno);
304        }
305}
306
307static void
308test_sockets(void)
309{
310        size_t n = sizeof(socket_tests) / sizeof(socket_tests[0]);
311        size_t i;
312
313        puts("test sockets");
314
315        for (i = 0; i < n; ++i) {
316                const socket_test *st = &socket_tests[i];
317
318                test_socket(st);
319        }
320
321        puts("test sockets and check resources");
322
323        for (i = 0; i < n; ++i) {
324                const socket_test *st = &socket_tests[i];
325                rtems_resource_snapshot snapshot;
326
327                rtems_resource_snapshot_take(&snapshot);
328
329                test_socket(st);
330
331                assert(rtems_resource_snapshot_check(&snapshot));
332        }
333}
334
335static void
336test_socket_unsupported_ops(void)
337{
338        rtems_resource_snapshot snapshot;
339        int sd;
340        int rv;
341        off_t off;
342
343        puts("test socket unsupported ops");
344
345        rtems_resource_snapshot_take(&snapshot);
346
347        sd = socket(PF_INET, SOCK_DGRAM, 0);
348        assert(sd >= 0);
349
350        errno = 0;
351        off = lseek(sd, 0, SEEK_CUR);
352        assert(off == -1);
353        assert(errno == ESPIPE);
354
355        errno = 0;
356        rv = ftruncate(sd, 0);
357        assert(rv == -1);
358        assert(errno == EINVAL);
359
360        errno = 0;
361        rv = fsync(sd);
362        assert(rv == -1);
363        assert(errno == EINVAL);
364
365        errno = 0;
366        rv = fdatasync(sd);
367        assert(rv == -1);
368        assert(errno == EINVAL);
369
370        rv = close(sd);
371        assert(rv == 0);
372
373        assert(rtems_resource_snapshot_check(&snapshot));
374}
375
376static void
377no_mem_socket_fstat(int fd)
378{
379        struct stat st;
380        int rv;
381
382        rv = fstat(fd, &st);
383        assert(rv == 0);
384}
385
386static void
387no_mem_socket_shutdown(int fd)
388{
389        int rv;
390
391        rv = shutdown(fd, SHUT_RDWR);
392        assert(rv == 0);
393}
394
395static void
396test_socket_fstat_and_shutdown(void)
397{
398        mode_t canrecv = S_IRUSR | S_IRGRP | S_IROTH;
399        mode_t cansend = S_IWUSR | S_IWGRP | S_IWOTH;
400        rtems_resource_snapshot snapshot;
401        struct stat st;
402        int sd;
403        int rv;
404
405        puts("test socket fstat and shutdown");
406
407        rtems_resource_snapshot_take(&snapshot);
408
409        sd = socket(PF_INET, SOCK_DGRAM, 0);
410        assert(sd >= 0);
411
412        do_no_mem_test(no_mem_socket_fstat, sd);
413
414        rv = fstat(sd, &st);
415        assert(rv == 0);
416        assert(st.st_mode == (S_IFSOCK | canrecv | cansend));
417
418        rv = shutdown(sd, SHUT_RD);
419        assert(rv == 0);
420
421        rv = fstat(sd, &st);
422        assert(rv == 0);
423        assert(st.st_mode == (S_IFSOCK | cansend));
424
425        rv = shutdown(sd, SHUT_WR);
426        assert(rv == 0);
427
428        rv = fstat(sd, &st);
429        assert(rv == 0);
430        assert(st.st_mode == S_IFSOCK);
431
432        errno = 0;
433        rv = shutdown(sd, ~SHUT_RDWR);
434        assert(rv == -1);
435        assert(errno == EINVAL);
436
437        rv = close(sd);
438        assert(rv == 0);
439
440        sd = socket(PF_INET, SOCK_DGRAM, 0);
441        assert(sd >= 0);
442
443        do_no_mem_test(no_mem_socket_shutdown, sd);
444
445        rv = close(sd);
446        assert(rv == 0);
447
448        errno = 0;
449        rv = shutdown(sd, SHUT_RDWR);
450        assert(rv == -1);
451        assert(errno == EBADF);
452
453        errno = 0;
454        rv = shutdown(0, SHUT_RDWR);
455        assert(rv == -1);
456        assert(errno == ENOTSOCK);
457
458        assert(rtems_resource_snapshot_check(&snapshot));
459}
460
461static void
462no_mem_socket_ioctl(int fd)
463{
464        int rv;
465        int data;
466
467        errno = 0;
468        rv = ioctl(fd, FIONREAD, &data);
469        assert(rv == -1);
470        assert(errno == ENOMEM);
471}
472
473static void
474test_socket_ioctl(void)
475{
476        rtems_resource_snapshot snapshot;
477        int sd;
478        int rv;
479        int data;
480
481        puts("test socket ioctl");
482
483        rtems_resource_snapshot_take(&snapshot);
484
485        sd = socket(PF_INET, SOCK_DGRAM, 0);
486        assert(sd >= 0);
487
488        do_no_mem_test(no_mem_socket_ioctl, sd);
489
490        errno = 0;
491        rv = ioctl(sd, 0xffffffff);
492        assert(rv == -1);
493        assert(errno == EOPNOTSUPP);
494
495        data = -1;
496        rv = ioctl(sd, FIONREAD, &data);
497        assert(rv == 0);
498        assert(data == 0);
499
500        rv = close(sd);
501        assert(rv == 0);
502
503        errno = 0;
504        rv = ioctl(sd, 0);
505        assert(rv == -1);
506        assert(errno == EBADF);
507
508        assert(rtems_resource_snapshot_check(&snapshot));
509}
510
511static void
512no_mem_socket_bind(int fd)
513{
514        struct sockaddr_in addr;
515        int rv;
516
517        errno = 0;
518        rv = bind(fd, (const struct sockaddr *) &addr, sizeof(addr));
519        assert(rv == -1);
520        assert(errno == ENOMEM);
521}
522
523static void
524test_socket_bind(void)
525{
526        rtems_resource_snapshot snapshot;
527        struct sockaddr_in addr;
528        int sd;
529        int rv;
530
531        puts("test socket bind");
532
533        rtems_resource_snapshot_take(&snapshot);
534
535        init_addr(&addr);
536
537        sd = socket(PF_INET, SOCK_DGRAM, 0);
538        assert(sd >= 0);
539
540        do_no_mem_test(no_mem_socket_bind, sd);
541
542        errno = 0;
543        rv = bind(sd, (const struct sockaddr *) &addr, SOCK_MAXADDRLEN + 1);
544        assert(rv == -1);
545        assert(errno == ENAMETOOLONG);
546
547        errno = 0;
548        rv = bind(sd, (const struct sockaddr *) &addr, 0);
549        assert(rv == -1);
550        assert(errno == EINVAL);
551
552        errno = 0;
553        rv = bind(sd, (const struct sockaddr *) &addr, sizeof(addr));
554        assert(rv == -1);
555        assert(errno == EADDRNOTAVAIL);
556
557        rv = close(sd);
558        assert(rv == 0);
559
560        errno = 0;
561        rv = bind(sd, (struct sockaddr *) &addr, sizeof(addr));
562        assert(rv == -1);
563        assert(errno == EBADF);
564
565        assert(rtems_resource_snapshot_check(&snapshot));
566}
567
568static void
569no_mem_socket_connect(int fd)
570{
571        struct sockaddr_in addr;
572        int rv;
573
574        errno = 0;
575        rv = connect(fd, (const struct sockaddr *) &addr, sizeof(addr));
576        assert(rv == -1);
577        assert(errno == ENOMEM);
578}
579
580static void
581test_socket_connect(void)
582{
583        rtems_resource_snapshot snapshot;
584        struct sockaddr_in addr;
585        int sd;
586        int rv;
587
588        puts("test socket connect");
589
590        rtems_resource_snapshot_take(&snapshot);
591
592        init_addr(&addr);
593
594        sd = socket(PF_INET, SOCK_DGRAM, 0);
595        assert(sd >= 0);
596
597        do_no_mem_test(no_mem_socket_connect, sd);
598
599        errno = 0;
600        rv = connect(sd, (const struct sockaddr *) &addr, SOCK_MAXADDRLEN + 1);
601        assert(rv == -1);
602        assert(errno == ENAMETOOLONG);
603
604        errno = 0;
605        rv = connect(sd, (const struct sockaddr *) &addr, 0);
606        assert(rv == -1);
607        assert(errno == EINVAL);
608
609        errno = 0;
610        rv = connect(sd, (const struct sockaddr *) &addr, sizeof(addr));
611        assert(rv == -1);
612        assert(errno == ENETUNREACH);
613
614        rv = close(sd);
615        assert(rv == 0);
616
617        errno = 0;
618        rv = connect(sd, (struct sockaddr *) &addr, sizeof(addr));
619        assert(rv == -1);
620        assert(errno == EBADF);
621
622        assert(rtems_resource_snapshot_check(&snapshot));
623}
624
625static void
626no_mem_socket_listen(int fd)
627{
628        int rv;
629
630        errno = 0;
631        rv = listen(fd, 0);
632        assert(rv == -1);
633        assert(errno == ENOMEM);
634}
635
636static void
637test_socket_listen(void)
638{
639        rtems_resource_snapshot snapshot;
640        int sd;
641        int rv;
642
643        puts("test socket listen");
644
645        rtems_resource_snapshot_take(&snapshot);
646
647        sd = socket(PF_INET, SOCK_DGRAM, 0);
648        assert(sd >= 0);
649
650        do_no_mem_test(no_mem_socket_listen, sd);
651
652        errno = 0;
653        rv = listen(sd, 0);
654        assert(rv == -1);
655        assert(errno == EOPNOTSUPP);
656
657        rv = close(sd);
658        assert(rv == 0);
659
660        errno = 0;
661        rv = listen(sd, 0);
662        assert(rv == -1);
663        assert(errno == EBADF);
664
665        sd = socket(PF_INET, SOCK_STREAM, 0);
666        assert(sd >= 0);
667
668        errno = 0;
669        rv = listen(sd, 0);
670        assert(rv == -1);
671        assert(errno == EADDRNOTAVAIL);
672
673        rv = close(sd);
674        assert(rv == 0);
675
676        assert(rtems_resource_snapshot_check(&snapshot));
677}
678
679static void
680no_mem_socket_accept(int fd)
681{
682        struct sockaddr_in addr;
683        socklen_t addr_len;
684        int rv;
685
686        errno = 0;
687        addr_len = sizeof(addr);
688        rv = accept(fd, (struct sockaddr *) &addr, &addr_len);
689        assert(rv == -1);
690        assert(errno == ENOMEM);
691}
692
693static void
694test_socket_accept(void)
695{
696        rtems_resource_snapshot snapshot;
697        struct sockaddr_in addr;
698        socklen_t addr_len;
699        int sd;
700        int ad;
701        int rv;
702
703        puts("test socket accept");
704
705        rtems_resource_snapshot_take(&snapshot);
706
707        sd = socket(PF_INET, SOCK_STREAM, 0);
708        assert(sd >= 0);
709
710        do_no_mem_test(no_mem_socket_accept, sd);
711
712        errno = 0;
713        addr_len = sizeof(addr);
714        ad = accept(sd, (struct sockaddr *) &addr, &addr_len);
715        assert(ad == -1);
716        assert(errno == EINVAL);
717
718        rv = close(sd);
719        assert(rv == 0);
720
721        errno = 0;
722        addr_len = sizeof(addr);
723        ad = accept(sd, (struct sockaddr *) &addr, &addr_len);
724        assert(ad == -1);
725        assert(errno == EBADF);
726
727        assert(rtems_resource_snapshot_check(&snapshot));
728}
729
730static void
731test_main(void)
732{
733        /* Must be first test to ensure resource checks work */
734        test_sockets();
735
736        test_socket_unsupported_ops();
737        test_socket_fstat_and_shutdown();
738        test_socket_ioctl();
739        test_socket_bind();
740        test_socket_connect();
741        test_socket_listen();
742        test_socket_accept();
743
744        puts("*** END OF " TEST_NAME " TEST ***");
745        exit(0);
746}
747
748#include <rtems/bsd/test/default-init.h>
Note: See TracBrowser for help on using the repository browser.