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