root/tools/testing/selftests/net/socket.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. run_tests
  2. main

   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 struct 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 
  26 static 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 
  37 static 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 
  88 int main(void)
  89 {
  90         int err = run_tests();
  91 
  92         return err;
  93 }

/* [<][>][^][v][top][bottom][index][help] */