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