clock_adjtime.c raw

   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  }
 152