| #define _GNU_SOURCE |
| #include <sys/time.h> |
| #include <sys/timex.h> |
| #include <errno.h> |
| #include "syscall.h" |
| |
| int adjtime(const struct timeval *in, struct timeval *out) |
| { |
| struct timex tx = { 0 }; |
| if (in) { |
| if (in->tv_sec > 1000 || in->tv_usec > 1000000000) { |
| errno = EINVAL; |
| return -1; |
| } |
| tx.offset = in->tv_sec*1000000 + in->tv_usec; |
| tx.modes = ADJ_OFFSET_SINGLESHOT; |
| } |
| if (syscall(SYS_adjtimex, &tx) < 0) return -1; |
| if (out) { |
| out->tv_sec = tx.offset / 1000000; |
| if ((out->tv_usec = tx.offset % 1000000) < 0) { |
| out->tv_sec--; |
| out->tv_usec += 1000000; |
| } |
| } |
| return 0; |
| } |