162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci#include <stdio.h> 362306a36Sopenharmony_ci#include <errno.h> 462306a36Sopenharmony_ci#include <unistd.h> 562306a36Sopenharmony_ci#include <string.h> 662306a36Sopenharmony_ci#include <sys/types.h> 762306a36Sopenharmony_ci#include <sys/socket.h> 862306a36Sopenharmony_ci#include <netinet/in.h> 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "../kselftest.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct socket_testcase { 1362306a36Sopenharmony_ci int domain; 1462306a36Sopenharmony_ci int type; 1562306a36Sopenharmony_ci int protocol; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci /* 0 = valid file descriptor 1862306a36Sopenharmony_ci * -foo = error foo 1962306a36Sopenharmony_ci */ 2062306a36Sopenharmony_ci int expect; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci /* If non-zero, accept EAFNOSUPPORT to handle the case 2362306a36Sopenharmony_ci * of the protocol not being configured into the kernel. 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_ci int nosupport_ok; 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic struct socket_testcase tests[] = { 2962306a36Sopenharmony_ci { AF_MAX, 0, 0, -EAFNOSUPPORT, 0 }, 3062306a36Sopenharmony_ci { AF_INET, SOCK_STREAM, IPPROTO_TCP, 0, 1 }, 3162306a36Sopenharmony_ci { AF_INET, SOCK_DGRAM, IPPROTO_TCP, -EPROTONOSUPPORT, 1 }, 3262306a36Sopenharmony_ci { AF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, 1 }, 3362306a36Sopenharmony_ci { AF_INET, SOCK_STREAM, IPPROTO_UDP, -EPROTONOSUPPORT, 1 }, 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#define ERR_STRING_SZ 64 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistatic int run_tests(void) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci char err_string1[ERR_STRING_SZ]; 4162306a36Sopenharmony_ci char err_string2[ERR_STRING_SZ]; 4262306a36Sopenharmony_ci int i, err; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci err = 0; 4562306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(tests); i++) { 4662306a36Sopenharmony_ci struct socket_testcase *s = &tests[i]; 4762306a36Sopenharmony_ci int fd; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci fd = socket(s->domain, s->type, s->protocol); 5062306a36Sopenharmony_ci if (fd < 0) { 5162306a36Sopenharmony_ci if (s->nosupport_ok && 5262306a36Sopenharmony_ci errno == EAFNOSUPPORT) 5362306a36Sopenharmony_ci continue; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci if (s->expect < 0 && 5662306a36Sopenharmony_ci errno == -s->expect) 5762306a36Sopenharmony_ci continue; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci strerror_r(-s->expect, err_string1, ERR_STRING_SZ); 6062306a36Sopenharmony_ci strerror_r(errno, err_string2, ERR_STRING_SZ); 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci fprintf(stderr, "socket(%d, %d, %d) expected " 6362306a36Sopenharmony_ci "err (%s) got (%s)\n", 6462306a36Sopenharmony_ci s->domain, s->type, s->protocol, 6562306a36Sopenharmony_ci err_string1, err_string2); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci err = -1; 6862306a36Sopenharmony_ci break; 6962306a36Sopenharmony_ci } else { 7062306a36Sopenharmony_ci close(fd); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci if (s->expect < 0) { 7362306a36Sopenharmony_ci strerror_r(errno, err_string1, ERR_STRING_SZ); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci fprintf(stderr, "socket(%d, %d, %d) expected " 7662306a36Sopenharmony_ci "success got err (%s)\n", 7762306a36Sopenharmony_ci s->domain, s->type, s->protocol, 7862306a36Sopenharmony_ci err_string1); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci err = -1; 8162306a36Sopenharmony_ci break; 8262306a36Sopenharmony_ci } 8362306a36Sopenharmony_ci } 8462306a36Sopenharmony_ci } 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci return err; 8762306a36Sopenharmony_ci} 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciint main(void) 9062306a36Sopenharmony_ci{ 9162306a36Sopenharmony_ci int err = run_tests(); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci return err; 9462306a36Sopenharmony_ci} 95