1 /*
2 * Check decoding of timerfd_create, timerfd_gettime, and timerfd_settime
3 * syscalls.
4 *
5 * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@strace.io>
6 * Copyright (c) 2015-2023 The strace developers.
7 * All rights reserved.
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12 #include "tests.h"
13 #include "scno.h"
14
15 #if defined __NR_timerfd_gettime \
16 && defined __NR_timerfd_settime
17
18 # include <stdio.h>
19 # include <stdint.h>
20 # include <time.h>
21 # include <unistd.h>
22 # include "kernel_fcntl.h"
23
24 int
25 main(void)
26 {
27 (void) close(0);
28 if (syscall(__NR_timerfd_create, CLOCK_MONOTONIC, O_CLOEXEC | O_NONBLOCK))
29 perror_msg_and_skip("timerfd_create");
30 puts("timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC|TFD_NONBLOCK) = 0");
31
32 TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_new);
33 TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerspec, its_old);
34
35 its_new->it_interval.tv_sec = 0xdeadbeefU;
36 its_new->it_interval.tv_nsec = 0xfacefeedU;
37 its_new->it_value.tv_sec =
38 (typeof(its_new->it_value.tv_sec)) 0xcafef00ddeadbeefLL;
39 its_new->it_value.tv_nsec = (long) 0xbadc0dedfacefeedLL;
40
41 long rc = syscall(__NR_timerfd_settime, 0, 0, its_new, its_old);
42 printf("timerfd_settime(0, 0"
43 ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
44 ", it_value={tv_sec=%lld, tv_nsec=%llu}}, %p) = %s\n",
45 (long long) its_new->it_interval.tv_sec,
46 zero_extend_signed_to_ull(its_new->it_interval.tv_nsec),
47 (long long) its_new->it_value.tv_sec,
48 zero_extend_signed_to_ull(its_new->it_value.tv_nsec),
49 its_old, sprintrc(rc));
50
51 its_new->it_interval.tv_sec = 0xdeface1;
52 its_new->it_interval.tv_nsec = 0xdeface2;
53 its_new->it_value.tv_sec = 0xdeface3;
54 its_new->it_value.tv_nsec = 0xdeface4;
55 its_old->it_interval.tv_sec = 0xdeface5;
56 its_old->it_interval.tv_nsec = 0xdeface6;
57 its_old->it_value.tv_sec = 0xdeface7;
58 its_old->it_value.tv_nsec = 0xdeface8;
59
60 if (syscall(__NR_timerfd_settime, 0, 0, its_new, its_old))
61 perror_msg_and_skip("timerfd_settime");
62 printf("timerfd_settime(0, 0"
63 ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
64 ", it_value={tv_sec=%lld, tv_nsec=%llu}}"
65 ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
66 ", it_value={tv_sec=%lld, tv_nsec=%llu}}"
67 ") = 0\n",
68 (long long) its_new->it_interval.tv_sec,
69 zero_extend_signed_to_ull(its_new->it_interval.tv_nsec),
70 (long long) its_new->it_value.tv_sec,
71 zero_extend_signed_to_ull(its_new->it_value.tv_nsec),
72 (long long) its_old->it_interval.tv_sec,
73 zero_extend_signed_to_ull(its_old->it_interval.tv_nsec),
74 (long long) its_old->it_value.tv_sec,
75 zero_extend_signed_to_ull(its_old->it_value.tv_nsec));
76
77 if (syscall(__NR_timerfd_gettime, 0, its_old))
78 perror_msg_and_skip("timerfd_gettime");
79 printf("timerfd_gettime(0"
80 ", {it_interval={tv_sec=%lld, tv_nsec=%llu}"
81 ", it_value={tv_sec=%lld, tv_nsec=%llu}}) = 0\n",
82 (long long) its_old->it_interval.tv_sec,
83 zero_extend_signed_to_ull(its_old->it_interval.tv_nsec),
84 (long long) its_old->it_value.tv_sec,
85 zero_extend_signed_to_ull(its_old->it_value.tv_nsec));
86
87 puts("+++ exited with 0 +++");
88 return 0;
89 }
90
91 #else
92
93 SKIP_MAIN_UNDEFINED("__NR_timerfd_gettime && __NR_timerfd_settime")
94
95 #endif