1 #include <sys/timerfd.h>
5 #define IS32BIT(x) !((x)+0x80000000ULL>>32)
7 int timerfd_create(int clockid
, int flags
)
9 return syscall(SYS_timerfd_create
, clockid
, flags
);
12 int timerfd_settime(int fd
, int flags
, const struct itimerspec
*new, struct itimerspec
*old
)
14 #ifdef SYS_timerfd_settime64
15 time_t is
= new->it_interval
.tv_sec
, vs
= new->it_value
.tv_sec
;
16 long ins
= new->it_interval
.tv_nsec
, vns
= new->it_value
.tv_nsec
;
18 if (SYS_timerfd_settime
== SYS_timerfd_settime64
19 || !IS32BIT(is
) || !IS32BIT(vs
) || (sizeof(time_t)>4 && old
))
20 r
= __syscall(SYS_timerfd_settime64
, fd
, flags
,
21 ((long long[]){is
, ins
, vs
, vns
}), old
);
22 if (SYS_timerfd_settime
== SYS_timerfd_settime64
|| r
!=-ENOSYS
)
23 return __syscall_ret(r
);
24 if (!IS32BIT(is
) || !IS32BIT(vs
))
25 return __syscall_ret(-ENOTSUP
);
27 r
= __syscall(SYS_timerfd_settime
, fd
, flags
,
28 ((long[]){is
, ins
, vs
, vns
}), old32
);
30 old
->it_interval
.tv_sec
= old32
[0];
31 old
->it_interval
.tv_nsec
= old32
[1];
32 old
->it_value
.tv_sec
= old32
[2];
33 old
->it_value
.tv_nsec
= old32
[3];
35 return __syscall_ret(r
);
37 return syscall(SYS_timerfd_settime
, fd
, flags
, new, old
);
40 int timerfd_gettime(int fd
, struct itimerspec
*cur
)
42 #ifdef SYS_timerfd_gettime64
44 if (sizeof(time_t) > 4)
45 r
= __syscall(SYS_timerfd_gettime64
, fd
, cur
);
46 if (SYS_timerfd_gettime
== SYS_timerfd_gettime64
|| r
!=-ENOSYS
)
47 return __syscall_ret(r
);
49 r
= __syscall(SYS_timerfd_gettime
, fd
, cur32
);
51 cur
->it_interval
.tv_sec
= cur32
[0];
52 cur
->it_interval
.tv_nsec
= cur32
[1];
53 cur
->it_value
.tv_sec
= cur32
[2];
54 cur
->it_value
.tv_nsec
= cur32
[3];
56 return __syscall_ret(r
);
58 return syscall(SYS_timerfd_gettime
, fd
, cur
);