xref: /aosp_15_r20/external/musl/src/linux/adjtime.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #define _GNU_SOURCE
2*c9945492SAndroid Build Coastguard Worker #include <sys/time.h>
3*c9945492SAndroid Build Coastguard Worker #include <sys/timex.h>
4*c9945492SAndroid Build Coastguard Worker #include <errno.h>
5*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
6*c9945492SAndroid Build Coastguard Worker 
adjtime(const struct timeval * in,struct timeval * out)7*c9945492SAndroid Build Coastguard Worker int adjtime(const struct timeval *in, struct timeval *out)
8*c9945492SAndroid Build Coastguard Worker {
9*c9945492SAndroid Build Coastguard Worker 	struct timex tx = { 0 };
10*c9945492SAndroid Build Coastguard Worker 	if (in) {
11*c9945492SAndroid Build Coastguard Worker 		if (in->tv_sec > 1000 || in->tv_usec > 1000000000) {
12*c9945492SAndroid Build Coastguard Worker 			errno = EINVAL;
13*c9945492SAndroid Build Coastguard Worker 			return -1;
14*c9945492SAndroid Build Coastguard Worker 		}
15*c9945492SAndroid Build Coastguard Worker 		tx.offset = in->tv_sec*1000000 + in->tv_usec;
16*c9945492SAndroid Build Coastguard Worker 		tx.modes = ADJ_OFFSET_SINGLESHOT;
17*c9945492SAndroid Build Coastguard Worker 	}
18*c9945492SAndroid Build Coastguard Worker 	if (adjtimex(&tx) < 0) return -1;
19*c9945492SAndroid Build Coastguard Worker 	if (out) {
20*c9945492SAndroid Build Coastguard Worker 		out->tv_sec = tx.offset / 1000000;
21*c9945492SAndroid Build Coastguard Worker 		if ((out->tv_usec = tx.offset % 1000000) < 0) {
22*c9945492SAndroid Build Coastguard Worker 			out->tv_sec--;
23*c9945492SAndroid Build Coastguard Worker 			out->tv_usec += 1000000;
24*c9945492SAndroid Build Coastguard Worker 		}
25*c9945492SAndroid Build Coastguard Worker 	}
26*c9945492SAndroid Build Coastguard Worker 	return 0;
27*c9945492SAndroid Build Coastguard Worker }
28