152 lines
3.8 KiB
C
152 lines
3.8 KiB
C
#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);
|
|
}
|