mirror of
git://git.musl-libc.org/musl
synced 2025-04-01 14:38:46 +00:00
setitimer, getitimer: decouple time_t from long
these functions have no new time64 syscall, so the existence of a time64 syscall cannot be used as the condition for the new code. instead, assume the syscall takes timevals as longs, which is true everywhere but x32, and interface with the kernel through long[4] objects. rather than adding new hacks to special-case x32 here, just add x32-specific source files since a trivial syscall wrapper suffices there. the new code paths added in this commit are statically unreachable on all current archs, but will become reachable when 32-bit archs get 64-bit time_t.
This commit is contained in:
parent
b74b3eb4a2
commit
558c01338b
@ -3,5 +3,16 @@
|
||||
|
||||
int getitimer(int which, struct itimerval *old)
|
||||
{
|
||||
if (sizeof(time_t) > sizeof(long)) {
|
||||
long old32[4];
|
||||
int r = __syscall(SYS_getitimer, which, old32);
|
||||
if (!r) {
|
||||
old->it_interval.tv_sec = old32[0];
|
||||
old->it_interval.tv_usec = old32[1];
|
||||
old->it_value.tv_sec = old32[2];
|
||||
old->it_value.tv_usec = old32[3];
|
||||
}
|
||||
return __syscall_ret(r);
|
||||
}
|
||||
return syscall(SYS_getitimer, which, old);
|
||||
}
|
||||
|
@ -1,7 +1,26 @@
|
||||
#include <sys/time.h>
|
||||
#include <errno.h>
|
||||
#include "syscall.h"
|
||||
|
||||
#define IS32BIT(x) !((x)+0x80000000ULL>>32)
|
||||
|
||||
int setitimer(int which, const struct itimerval *restrict new, struct itimerval *restrict old)
|
||||
{
|
||||
if (sizeof(time_t) > sizeof(long)) {
|
||||
time_t is = new->it_interval.tv_sec, vs = new->it_value.tv_sec;
|
||||
long ius = new->it_interval.tv_usec, vus = new->it_value.tv_usec;
|
||||
if (!IS32BIT(is) || !IS32BIT(vs))
|
||||
return __syscall_ret(-ENOTSUP);
|
||||
long old32[4];
|
||||
int r = __syscall(SYS_setitimer, which,
|
||||
((long[]){is, ius, vs, vus}), old32);
|
||||
if (!r && old) {
|
||||
old->it_interval.tv_sec = old32[0];
|
||||
old->it_interval.tv_usec = old32[1];
|
||||
old->it_value.tv_sec = old32[2];
|
||||
old->it_value.tv_usec = old32[3];
|
||||
}
|
||||
return __syscall_ret(r);
|
||||
}
|
||||
return syscall(SYS_setitimer, which, new, old);
|
||||
}
|
||||
|
7
src/signal/x32/getitimer.c
Normal file
7
src/signal/x32/getitimer.c
Normal file
@ -0,0 +1,7 @@
|
||||
#include <sys/time.h>
|
||||
#include "syscall.h"
|
||||
|
||||
int getitimer(int which, struct itimerval *old)
|
||||
{
|
||||
return syscall(SYS_getitimer, which, old);
|
||||
}
|
7
src/signal/x32/setitimer.c
Normal file
7
src/signal/x32/setitimer.c
Normal file
@ -0,0 +1,7 @@
|
||||
#include <sys/time.h>
|
||||
#include "syscall.h"
|
||||
|
||||
int setitimer(int which, const struct itimerval *restrict new, struct itimerval *restrict old)
|
||||
{
|
||||
return syscall(SYS_setitimer, which, new, old);
|
||||
}
|
Loading…
Reference in New Issue
Block a user