(root)/
strace-6.5/
tests-m32/
xet_robust_list.c
       1  /*
       2   * Check decoding of get_robust_list and set_robust_list syscalls.
       3   *
       4   * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@strace.io>
       5   * Copyright (c) 2015-2021 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 "pidns.h"
      14  
      15  #include <stdio.h>
      16  #include <unistd.h>
      17  
      18  static const char *
      19  sprintaddr(void *addr)
      20  {
      21  	static char buf[sizeof(addr) * 2 + sizeof("0x")];
      22  
      23  	if (!addr)
      24  		return "NULL";
      25  	else
      26  		snprintf(buf, sizeof(buf), "%p", addr);
      27  
      28  	return buf;
      29  }
      30  
      31  int
      32  main(void)
      33  {
      34  	PIDNS_TEST_INIT;
      35  
      36  	const pid_t pid = getpid();
      37  	const char *pid_str = pidns_pid2str(PT_TGID);
      38  	const long long_pid = (unsigned long) (0xdeadbeef00000000LL | pid);
      39  	TAIL_ALLOC_OBJECT_CONST_PTR(void *, p_head);
      40  	TAIL_ALLOC_OBJECT_CONST_PTR(size_t, p_len);
      41  
      42  	/* It has dual-use as a marker of the beginning of the test output */
      43  	long rc = syscall(__NR_get_robust_list, 0, 0, 0);
      44  	pidns_print_leader();
      45  	printf("get_robust_list(0, NULL, NULL) = %s\n", sprintrc(rc));
      46  
      47  	if (syscall(__NR_get_robust_list, long_pid, p_head, p_len))
      48  		perror_msg_and_skip("get_robust_list");
      49  	pidns_print_leader();
      50  	printf("get_robust_list(%d%s, [%s], [%lu]) = 0\n",
      51  	       pid, pid_str, sprintaddr(*p_head),
      52  	       (unsigned long) *p_len);
      53  
      54  	void *head = tail_alloc(*p_len);
      55  	if (syscall(__NR_set_robust_list, head, *p_len))
      56  		perror_msg_and_skip("set_robust_list");
      57  	pidns_print_leader();
      58  	printf("set_robust_list(%p, %lu) = 0\n",
      59  	       head, (unsigned long) *p_len);
      60  
      61  	if (syscall(__NR_get_robust_list, long_pid, p_head, p_len))
      62  		perror_msg_and_skip("get_robust_list");
      63  	pidns_print_leader();
      64  	printf("get_robust_list(%d%s, [%s], [%lu]) = 0\n",
      65  	       pid, pid_str, sprintaddr(*p_head),
      66  	       (unsigned long) *p_len);
      67  
      68  	pidns_print_leader();
      69  	puts("+++ exited with 0 +++");
      70  	return 0;
      71  }