(root)/
strace-6.5/
tests/
accept.c
       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