1 /*
2 * Check decoding of accept syscall.
3 *
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@strace.io>
5 * Copyright (c) 2016-2023 The strace developers.
6 * All rights reserved.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11 #include "tests.h"
12 #include "scno.h"
13 #include <unistd.h>
14
15 #ifndef TEST_SYSCALL_NAME
16
17 # if defined __NR_accept || defined __NR_socketcall
18
19 # define TEST_SYSCALL_NAME do_accept
20 # define TEST_SYSCALL_STR "accept"
21
22 static int
23 do_accept(int sockfd, void *addr, void *addrlen)
24 {
25 # ifdef __NR_accept
26 return syscall(__NR_accept, sockfd, addr, addrlen);
27 # else /* __NR_socketcall */
28 const long args[] = { sockfd, (long) addr, (long) addrlen };
29 return syscall(__NR_socketcall, 5, args);
30 # endif
31 }
32
33 # endif /* __NR_accept || __NR_socketcall */
34
35 #endif /* !TEST_SYSCALL_NAME */
36
37 #ifdef TEST_SYSCALL_NAME
38
39 # define TEST_SYSCALL_PREPARE connect_un()
40 static void connect_un(void);
41 # include "sockname.c"
42
43 static void
44 connect_un(void)
45 {
46 int cfd = socket(AF_UNIX, SOCK_STREAM, 0);
47 if (cfd < 0)
48 perror_msg_and_skip("socket");
49
50 struct sockaddr_un un = {
51 .sun_family = AF_UNIX,
52 .sun_path = TEST_SOCKET ".connect"
53 };
54
55 (void) unlink(un.sun_path);
56 if (bind(cfd, (const void *) &un, sizeof(un)))
57 perror_msg_and_skip("bind");
58 (void) unlink(un.sun_path);
59
60 un.sun_path[sizeof(TEST_SOCKET) - 1] = '\0';
61 if (connect(cfd, (const void *) &un, sizeof(un)))
62 perror_msg_and_skip("connect");
63 }
64
65 int
66 main(void)
67 {
68 int lfd = socket(AF_UNIX, SOCK_STREAM, 0);
69 if (lfd < 0)
70 perror_msg_and_skip("socket");
71
72 (void) unlink(TEST_SOCKET);
73
74 const struct sockaddr_un un = {
75 .sun_family = AF_UNIX,
76 .sun_path = TEST_SOCKET
77 };
78
79 if (bind(lfd, (const void *) &un, sizeof(un)))
80 perror_msg_and_skip("bind");
81 if (listen(lfd, 16))
82 perror_msg_and_skip("listen");
83
84 test_sockname_syscall(lfd);
85
86 (void) unlink(TEST_SOCKET);
87
88 puts("+++ exited with 0 +++");
89 return 0;
90 }
91
92 #else
93
94 SKIP_MAIN_UNDEFINED("__NR_accept || __NR_socketcall")
95
96 #endif