]> granicus.if.org Git - strace/blob - tests/umode_t.c
Update copyright headers
[strace] / tests / umode_t.c
1 /*
2  * Check decoding of umode_t type syscall arguments.
3  *
4  * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
5  * Copyright (c) 2016-2018 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 }