#include <sys/timex.h>
#include <time.h>
#include <errno.h>
#include "syscall.h"
#define IS32BIT(x) !((x)+0x80000000ULL>>32)
struct ktimex64 {
unsigned modes;
int :32;
long long offset, freq, maxerror, esterror;
int status;
int :32;
long long constant, precision, tolerance;
long long time_sec, time_usec;
long long tick, ppsfreq, jitter;
int shift;
int :32;
long long stabil, jitcnt, calcnt, errcnt, stbcnt;
int tai;
int __padding[11];
};
struct ktimex {
unsigned modes;
long offset, freq, maxerror, esterror;
int status;
long constant, precision, tolerance;
long time_sec, time_usec;
long tick, ppsfreq, jitter;
int shift;
long stabil, jitcnt, calcnt, errcnt, stbcnt;
int tai;
int __padding[11];
};
int clock_adjtime (clockid_t clock_id, struct timex *utx)
{
int r = -ENOSYS;
#ifdef SYS_clock_adjtime64
struct ktimex64 ktx = {
.modes = utx->modes,
.offset = utx->offset,
.freq = utx->freq,
.maxerror = utx->maxerror,
.esterror = utx->esterror,
.status = utx->status,
.constant = utx->constant,
.precision = utx->precision,
.tolerance = utx->tolerance,
.time_sec = utx->time.tv_sec,
.time_usec = utx->time.tv_usec,
.tick = utx->tick,
.ppsfreq = utx->ppsfreq,
.jitter = utx->jitter,
.shift = utx->shift,
.stabil = utx->stabil,
.jitcnt = utx->jitcnt,
.calcnt = utx->calcnt,
.errcnt = utx->errcnt,
.stbcnt = utx->stbcnt,
.tai = utx->tai,
};
r = __syscall(SYS_clock_adjtime64, clock_id, &ktx);
if (r>=0) {
utx->modes = ktx.modes;
utx->offset = ktx.offset;
utx->freq = ktx.freq;
utx->maxerror = ktx.maxerror;
utx->esterror = ktx.esterror;
utx->status = ktx.status;
utx->constant = ktx.constant;
utx->precision = ktx.precision;
utx->tolerance = ktx.tolerance;
utx->time.tv_sec = ktx.time_sec;
utx->time.tv_usec = ktx.time_usec;
utx->tick = ktx.tick;
utx->ppsfreq = ktx.ppsfreq;
utx->jitter = ktx.jitter;
utx->shift = ktx.shift;
utx->stabil = ktx.stabil;
utx->jitcnt = ktx.jitcnt;
utx->calcnt = ktx.calcnt;
utx->errcnt = ktx.errcnt;
utx->stbcnt = ktx.stbcnt;
utx->tai = ktx.tai;
}
if (SYS_clock_adjtime == SYS_clock_adjtime64 || r!=-ENOSYS)
return __syscall_ret(r);
if ((utx->modes & ADJ_SETOFFSET) && !IS32BIT(utx->time.tv_sec))
return __syscall_ret(-ENOTSUP);
#endif
if (sizeof(time_t) > sizeof(long)) {
struct ktimex ktx = {
.modes = utx->modes,
.offset = utx->offset,
.freq = utx->freq,
.maxerror = utx->maxerror,
.esterror = utx->esterror,
.status = utx->status,
.constant = utx->constant,
.precision = utx->precision,
.tolerance = utx->tolerance,
.time_sec = utx->time.tv_sec,
.time_usec = utx->time.tv_usec,
.tick = utx->tick,
.ppsfreq = utx->ppsfreq,
.jitter = utx->jitter,
.shift = utx->shift,
.stabil = utx->stabil,
.jitcnt = utx->jitcnt,
.calcnt = utx->calcnt,
.errcnt = utx->errcnt,
.stbcnt = utx->stbcnt,
.tai = utx->tai,
};
#ifdef SYS_adjtimex
if (clock_id==CLOCK_REALTIME) r = __syscall(SYS_adjtimex, &ktx);
else
#endif
r = __syscall(SYS_clock_adjtime, clock_id, &ktx);
if (r>=0) {
utx->modes = ktx.modes;
utx->offset = ktx.offset;
utx->freq = ktx.freq;
utx->maxerror = ktx.maxerror;
utx->esterror = ktx.esterror;
utx->status = ktx.status;
utx->constant = ktx.constant;
utx->precision = ktx.precision;
utx->tolerance = ktx.tolerance;
utx->time.tv_sec = ktx.time_sec;
utx->time.tv_usec = ktx.time_usec;
utx->tick = ktx.tick;
utx->ppsfreq = ktx.ppsfreq;
utx->jitter = ktx.jitter;
utx->shift = ktx.shift;
utx->stabil = ktx.stabil;
utx->jitcnt = ktx.jitcnt;
utx->calcnt = ktx.calcnt;
utx->errcnt = ktx.errcnt;
utx->stbcnt = ktx.stbcnt;
utx->tai = ktx.tai;
}
return __syscall_ret(r);
}
#ifdef SYS_adjtimex
if (clock_id==CLOCK_REALTIME) return syscall(SYS_adjtimex, utx);
#endif
return syscall(SYS_clock_adjtime, clock_id, utx);
}