5 #define IS32BIT(x) !((x)+0x80000000ULL>>32)
6 #define CLAMP(x) (int)(IS32BIT(x) ? (x) : 0x7fffffffU+((0ULL+(x))>>63))
8 static int do_sigtimedwait(const sigset_t
*restrict mask
, siginfo_t
*restrict si
, const struct timespec
*restrict ts
)
10 #ifdef SYS_rt_sigtimedwait_time64
11 time_t s
= ts
? ts
->tv_sec
: 0;
12 long ns
= ts
? ts
->tv_nsec
: 0;
14 if (SYS_rt_sigtimedwait
== SYS_rt_sigtimedwait_time64
|| !IS32BIT(s
))
15 r
= __syscall_cp(SYS_rt_sigtimedwait_time64
, mask
, si
,
16 ts
? ((long long[]){s
, ns
}) : 0, _NSIG
/8);
17 if (SYS_rt_sigtimedwait
== SYS_rt_sigtimedwait_time64
|| r
!=-ENOSYS
)
19 return __syscall_cp(SYS_rt_sigtimedwait
, mask
, si
,
20 ts
? ((long[]){CLAMP(s
), ns
}) : 0, _NSIG
/8);;
22 return __syscall_cp(SYS_rt_sigtimedwait
, mask
, si
, ts
, _NSIG
/8);
26 int sigtimedwait(const sigset_t
*restrict mask
, siginfo_t
*restrict si
, const struct timespec
*restrict timeout
)
29 do ret
= do_sigtimedwait(mask
, si
, timeout
);
31 return __syscall_ret(ret
);