(root)/
strace-6.5/
tests/
umode_t.c
       1  /*
       2   * Check decoding of umode_t type syscall arguments.
       3   *
       4   * Copyright (c) 2016 Dmitry V. Levin <ldv@strace.io>
       5   * Copyright (c) 2016-2021 The strace developers.
       6   * All rights reserved.
       7   *
       8   * SPDX-License-Identifier: GPL-2.0-or-later
       9   */
      10  
      11  #include <stdio.h>
      12  #include <unistd.h>
      13  #include <sys/stat.h>
      14  
      15  #ifndef TEST_SYSCALL_PREFIX_ARGS
      16  # define TEST_SYSCALL_PREFIX_ARGS
      17  #endif
      18  #ifndef TEST_SYSCALL_PREFIX_STR
      19  # define TEST_SYSCALL_PREFIX_STR ""
      20  #endif
      21  
      22  static const char *sample;
      23  
      24  static void
      25  test_syscall(unsigned short mode)
      26  {
      27  	unsigned long lmode = (unsigned long) 0xffffffffffff0000ULL | mode;
      28  	long rc = syscall(TEST_SYSCALL_NR, TEST_SYSCALL_PREFIX_ARGS
      29  			  sample, lmode);
      30  
      31  	if (mode <= 07)
      32  		printf("%s(%s\"%s\", 00%d) = %ld %s (%m)\n",
      33  		       TEST_SYSCALL_STR, TEST_SYSCALL_PREFIX_STR,
      34  		       sample, (int) mode, rc, errno2name());
      35  	else
      36  		printf("%s(%s\"%s\", %#03ho) = %ld %s (%m)\n",
      37  		       TEST_SYSCALL_STR, TEST_SYSCALL_PREFIX_STR,
      38  		       sample, mode, rc, errno2name());
      39  }
      40  
      41  int
      42  main(int ac, char **av)
      43  {
      44  	sample = av[0];
      45  	test_syscall(0);
      46  	test_syscall(0xffff);
      47  	test_syscall(06);
      48  	test_syscall(060);
      49  	test_syscall(0600);
      50  	test_syscall(024);
      51  	test_syscall(S_IFREG);
      52  	test_syscall(S_IFDIR | 06);
      53  	test_syscall(S_IFLNK | 060);
      54  	test_syscall(S_IFIFO | 0600);
      55  	test_syscall(S_IFCHR | 024);
      56  	test_syscall((0xffff & ~S_IFMT) | S_IFBLK);
      57  
      58  	puts("+++ exited with 0 +++");
      59  	return 0;
      60  }