95 lines · c
1// SPDX-License-Identifier: GPL-2.02#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 12struct socket_testcase {13 int domain;14 int type;15 int protocol;16 17 /* 0 = valid file descriptor18 * -foo = error foo19 */20 int expect;21 22 /* If non-zero, accept EAFNOSUPPORT to handle the case23 * of the protocol not being configured into the kernel.24 */25 int nosupport_ok;26};27 28static 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 6437 38static 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 89int main(void)90{91 int err = run_tests();92 93 return err;94}95