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