xref: /aosp_15_r20/external/ltp/testcases/kernel/syscalls/accept/accept01.c (revision 49cdfc7efb34551c7342be41a7384b9c40d7cab7)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 /*
4  *   Copyright (c) International Business Machines  Corp., 2001
5  *   07/2001 Ported by Wayne Boyer
6  */
7 
8 /*\
9  * [Description]
10  * Verify that accept() returns the proper errno for various failure cases.
11  */
12 
13 #include <stdio.h>
14 #include <unistd.h>
15 #include <errno.h>
16 #include <fcntl.h>
17 
18 #include <sys/types.h>
19 #include <sys/socket.h>
20 #include <sys/signal.h>
21 
22 #include <netinet/in.h>
23 
24 #include "tst_test.h"
25 
26 struct sockaddr_in sin0, sin1, fsin1;
27 
28 int invalid_socketfd = 400; /* anything that is not an open file */
29 int socket_fd;
30 int udp_fd;
31 
32 static struct test_case {
33 	int domain;		/* PF_INET, PF_UNIX, ... */
34 	int type;		/* SOCK_STREAM, SOCK_DGRAM ... */
35 	int proto;		/* protocol number (usually 0 = default) */
36 	int *fd;		/* File descriptor for the test case */
37 	struct sockaddr *sockaddr;	/* socket address buffer */
38 	socklen_t salen;	/* accept's 3rd argument */
39 	int experrno;		/* expected errno */
40 	char *desc;
41 } tcases[] = {
42 	{
43 		PF_INET, SOCK_STREAM, 0, &invalid_socketfd,
44 		(struct sockaddr *)&fsin1, sizeof(fsin1), EBADF,
45 		"bad file descriptor"
46 	},
47 	{
48 		PF_INET, SOCK_STREAM, 0, &socket_fd, (struct sockaddr *)3,
49 		sizeof(fsin1), EINVAL, "invalid socket buffer"
50 	},
51 	{
52 		PF_INET, SOCK_STREAM, 0, &socket_fd, (struct sockaddr *)&fsin1,
53 		1, EINVAL, "invalid salen"
54 	},
55 	{
56 		PF_INET, SOCK_STREAM, 0, &socket_fd, (struct sockaddr *)&fsin1,
57 		sizeof(fsin1), EINVAL, "no queued connections"
58 	},
59 	{
60 		PF_INET, SOCK_STREAM, 0, &udp_fd, (struct sockaddr *)&fsin1,
61 		sizeof(fsin1), EOPNOTSUPP, "UDP accept"
62 	},
63 };
64 
test_setup(void)65 static void test_setup(void)
66 {
67 	sin0.sin_family = AF_INET;
68 	sin0.sin_port = 0;
69 	sin0.sin_addr.s_addr = INADDR_ANY;
70 
71 	socket_fd = SAFE_SOCKET(PF_INET, SOCK_STREAM, 0);
72 	SAFE_BIND(socket_fd, (struct sockaddr *)&sin0, sizeof(sin0));
73 
74 	sin1.sin_family = AF_INET;
75 	sin1.sin_port = 0;
76 	sin1.sin_addr.s_addr = INADDR_ANY;
77 
78 	udp_fd = SAFE_SOCKET(PF_INET, SOCK_DGRAM, 0);
79 	SAFE_BIND(udp_fd, (struct sockaddr *)&sin1, sizeof(sin1));
80 }
81 
test_cleanup(void)82 static void test_cleanup(void)
83 {
84 	SAFE_CLOSE(socket_fd);
85 	SAFE_CLOSE(udp_fd);
86 }
87 
verify_accept(unsigned int nr)88 void verify_accept(unsigned int nr)
89 {
90 	struct test_case *tcase = &tcases[nr];
91 
92 	TST_EXP_FAIL2(accept(*tcase->fd, tcase->sockaddr, &tcase->salen),
93 	             tcase->experrno, "%s", tcase->desc);
94 }
95 
96 static struct tst_test test = {
97 	.tcnt = ARRAY_SIZE(tcases),
98 	.setup = test_setup,
99 	.cleanup = test_cleanup,
100 	.test = verify_accept,
101 };
102