master
  1#include <sys/timex.h>
  2#include <time.h>
  3#include <errno.h>
  4#include "syscall.h"
  5
  6#define IS32BIT(x) !((x)+0x80000000ULL>>32)
  7
  8struct ktimex64 {
  9	unsigned modes;
 10	int :32;
 11	long long offset, freq, maxerror, esterror;
 12	int status;
 13	int :32;
 14	long long constant, precision, tolerance;
 15	long long time_sec, time_usec;
 16	long long tick, ppsfreq, jitter;
 17	int shift;
 18	int :32;
 19	long long stabil, jitcnt, calcnt, errcnt, stbcnt;
 20	int tai;
 21	int __padding[11];
 22};
 23
 24struct ktimex {
 25	unsigned modes;
 26	long offset, freq, maxerror, esterror;
 27	int status;
 28	long constant, precision, tolerance;
 29	long time_sec, time_usec;
 30	long tick, ppsfreq, jitter;
 31	int shift;
 32	long stabil, jitcnt, calcnt, errcnt, stbcnt;
 33	int tai;
 34	int __padding[11];
 35};
 36
 37int clock_adjtime (clockid_t clock_id, struct timex *utx)
 38{
 39	int r = -ENOSYS;
 40#ifdef SYS_clock_adjtime64
 41	struct ktimex64 ktx = {
 42		.modes = utx->modes,
 43		.offset = utx->offset,
 44		.freq = utx->freq,
 45		.maxerror = utx->maxerror,
 46		.esterror = utx->esterror,
 47		.status = utx->status,
 48		.constant = utx->constant,
 49		.precision = utx->precision,
 50		.tolerance = utx->tolerance,
 51		.time_sec = utx->time.tv_sec,
 52		.time_usec = utx->time.tv_usec,
 53		.tick = utx->tick,
 54		.ppsfreq = utx->ppsfreq,
 55		.jitter = utx->jitter,
 56		.shift = utx->shift,
 57		.stabil = utx->stabil,
 58		.jitcnt = utx->jitcnt,
 59		.calcnt = utx->calcnt,
 60		.errcnt = utx->errcnt,
 61		.stbcnt = utx->stbcnt,
 62		.tai = utx->tai,
 63	};
 64	r = __syscall(SYS_clock_adjtime64, clock_id, &ktx);
 65	if (r>=0) {
 66		utx->modes = ktx.modes;
 67		utx->offset = ktx.offset;
 68		utx->freq = ktx.freq;
 69		utx->maxerror = ktx.maxerror;
 70		utx->esterror = ktx.esterror;
 71		utx->status = ktx.status;
 72		utx->constant = ktx.constant;
 73		utx->precision = ktx.precision;
 74		utx->tolerance = ktx.tolerance;
 75		utx->time.tv_sec = ktx.time_sec;
 76		utx->time.tv_usec = ktx.time_usec;
 77		utx->tick = ktx.tick;
 78		utx->ppsfreq = ktx.ppsfreq;
 79		utx->jitter = ktx.jitter;
 80		utx->shift = ktx.shift;
 81		utx->stabil = ktx.stabil;
 82		utx->jitcnt = ktx.jitcnt;
 83		utx->calcnt = ktx.calcnt;
 84		utx->errcnt = ktx.errcnt;
 85		utx->stbcnt = ktx.stbcnt;
 86		utx->tai = ktx.tai;
 87	}
 88	if (SYS_clock_adjtime == SYS_clock_adjtime64 || r!=-ENOSYS)
 89		return __syscall_ret(r);
 90	if ((utx->modes & ADJ_SETOFFSET) && !IS32BIT(utx->time.tv_sec))
 91		return __syscall_ret(-ENOTSUP);
 92#endif
 93	if (sizeof(time_t) > sizeof(long)) {
 94		struct ktimex ktx = {
 95			.modes = utx->modes,
 96			.offset = utx->offset,
 97			.freq = utx->freq,
 98			.maxerror = utx->maxerror,
 99			.esterror = utx->esterror,
100			.status = utx->status,
101			.constant = utx->constant,
102			.precision = utx->precision,
103			.tolerance = utx->tolerance,
104			.time_sec = utx->time.tv_sec,
105			.time_usec = utx->time.tv_usec,
106			.tick = utx->tick,
107			.ppsfreq = utx->ppsfreq,
108			.jitter = utx->jitter,
109			.shift = utx->shift,
110			.stabil = utx->stabil,
111			.jitcnt = utx->jitcnt,
112			.calcnt = utx->calcnt,
113			.errcnt = utx->errcnt,
114			.stbcnt = utx->stbcnt,
115			.tai = utx->tai,
116		};
117#ifdef SYS_adjtimex
118		if (clock_id==CLOCK_REALTIME) r = __syscall(SYS_adjtimex, &ktx);
119		else
120#endif
121		r = __syscall(SYS_clock_adjtime, clock_id, &ktx);
122		if (r>=0) {
123			utx->modes = ktx.modes;
124			utx->offset = ktx.offset;
125			utx->freq = ktx.freq;
126			utx->maxerror = ktx.maxerror;
127			utx->esterror = ktx.esterror;
128			utx->status = ktx.status;
129			utx->constant = ktx.constant;
130			utx->precision = ktx.precision;
131			utx->tolerance = ktx.tolerance;
132			utx->time.tv_sec = ktx.time_sec;
133			utx->time.tv_usec = ktx.time_usec;
134			utx->tick = ktx.tick;
135			utx->ppsfreq = ktx.ppsfreq;
136			utx->jitter = ktx.jitter;
137			utx->shift = ktx.shift;
138			utx->stabil = ktx.stabil;
139			utx->jitcnt = ktx.jitcnt;
140			utx->calcnt = ktx.calcnt;
141			utx->errcnt = ktx.errcnt;
142			utx->stbcnt = ktx.stbcnt;
143			utx->tai = ktx.tai;
144		}
145		return __syscall_ret(r);
146	}
147#ifdef SYS_adjtimex
148	if (clock_id==CLOCK_REALTIME) return syscall(SYS_adjtimex, utx);
149#endif
150	return syscall(SYS_clock_adjtime, clock_id, utx);
151}