1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
| // SPDX-License-Identifier: GPL-2.0
| #include <stdio.h>
| #include <errno.h>
| #include <unistd.h>
| #include <string.h>
| #include <sys/types.h>
| #include <sys/socket.h>
| #include <netinet/in.h>
|
| struct socket_testcase {
| int domain;
| int type;
| int protocol;
|
| /* 0 = valid file descriptor
| * -foo = error foo
| */
| int expect;
|
| /* If non-zero, accept EAFNOSUPPORT to handle the case
| * of the protocol not being configured into the kernel.
| */
| int nosupport_ok;
| };
|
| static struct socket_testcase tests[] = {
| { AF_MAX, 0, 0, -EAFNOSUPPORT, 0 },
| { AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 1 },
| { AF_INET, SOCK_DGRAM, IPPROTO_TCP, -EPROTONOSUPPORT, 1 },
| { AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, 1 },
| { AF_INET, SOCK_STREAM, IPPROTO_UDP, -EPROTONOSUPPORT, 1 },
| };
|
| #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
| #define ERR_STRING_SZ 64
|
| static int run_tests(void)
| {
| char err_string1[ERR_STRING_SZ];
| char err_string2[ERR_STRING_SZ];
| int i, err;
|
| err = 0;
| for (i = 0; i < ARRAY_SIZE(tests); i++) {
| struct socket_testcase *s = &tests[i];
| int fd;
|
| fd = socket(s->domain, s->type, s->protocol);
| if (fd < 0) {
| if (s->nosupport_ok &&
| errno == EAFNOSUPPORT)
| continue;
|
| if (s->expect < 0 &&
| errno == -s->expect)
| continue;
|
| strerror_r(-s->expect, err_string1, ERR_STRING_SZ);
| strerror_r(errno, err_string2, ERR_STRING_SZ);
|
| fprintf(stderr, "socket(%d, %d, %d) expected "
| "err (%s) got (%s)\n",
| s->domain, s->type, s->protocol,
| err_string1, err_string2);
|
| err = -1;
| break;
| } else {
| close(fd);
|
| if (s->expect < 0) {
| strerror_r(errno, err_string1, ERR_STRING_SZ);
|
| fprintf(stderr, "socket(%d, %d, %d) expected "
| "success got err (%s)\n",
| s->domain, s->type, s->protocol,
| err_string1);
|
| err = -1;
| break;
| }
| }
| }
|
| return err;
| }
|
| int main(void)
| {
| int err = run_tests();
|
| return err;
| }
|
|