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