github.com/afumu/libc@v0.0.6/musl/src/linux/clock_adjtime.c (about) 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 8 struct 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 24 struct 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 37 int 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 }