Provided by: manpages-dev_6.03-1_all bug


       adjtimex, clock_adjtime, ntp_adjtime - tune kernel clock


       Standard C library (libc, -lc)


       #include <sys/timex.h>

       int adjtimex(struct timex *buf);

       int clock_adjtime(clockid_t clk_id, struct timex *buf);

       int ntp_adjtime(struct timex *buf);


       Linux  uses  David  L.  Mills' clock adjustment algorithm (see RFC 5905).  The system call
       adjtimex() reads and optionally sets adjustment parameters for this algorithm.  It takes a
       pointer  to a timex structure, updates kernel parameters from (selected) field values, and
       returns the same structure updated with the current  kernel  values.   This  structure  is
       declared as follows:

           struct timex {
               int  modes;      /* Mode selector */
               long offset;     /* Time offset; nanoseconds, if STA_NANO
                                   status flag is set, otherwise
                                   microseconds */
               long freq;       /* Frequency offset; see NOTES for units */
               long maxerror;   /* Maximum error (microseconds) */
               long esterror;   /* Estimated error (microseconds) */
               int  status;     /* Clock command/status */
               long constant;   /* PLL (phase-locked loop) time constant */
               long precision;  /* Clock precision
                                   (microseconds, read-only) */
               long tolerance;  /* Clock frequency tolerance (read-only);
                                   see NOTES for units */
               struct timeval time;
                                /* Current time (read-only, except for
                                   ADJ_SETOFFSET); upon return, time.tv_usec
                                   contains nanoseconds, if STA_NANO status
                                   flag is set, otherwise microseconds */
               long tick;       /* Microseconds between clock ticks */
               long ppsfreq;    /* PPS (pulse per second) frequency
                                   (read-only); see NOTES for units */
               long jitter;     /* PPS jitter (read-only); nanoseconds, if
                                   STA_NANO status flag is set, otherwise
                                   microseconds */
               int  shift;      /* PPS interval duration
                                   (seconds, read-only) */
               long stabil;     /* PPS stability (read-only);
                                   see NOTES for units */
               long jitcnt;     /* PPS count of jitter limit exceeded
                                   events (read-only) */
               long calcnt;     /* PPS count of calibration intervals
                                   (read-only) */
               long errcnt;     /* PPS count of calibration errors
                                   (read-only) */
               long stbcnt;     /* PPS count of stability limit exceeded
                                   events (read-only) */
               int tai;         /* TAI offset, as set by previous ADJ_TAI
                                   operation (seconds, read-only,
                                   since Linux 2.6.26) */
               /* Further padding bytes to allow for future expansion */

       The  modes field determines which parameters, if any, to set.  (As described later in this
       page, the constants used for ntp_adjtime() are equivalent but differently named.)  It is a
       bit mask containing a bitwise-or combination of zero or more of the following bits:

              Set time offset from buf.offset.  Since Linux 2.6.26, the supplied value is clamped
              to the range (-0.5s, +0.5s).  In older kernels,  an  EINVAL  error  occurs  if  the
              supplied value is out of range.

              Set  frequency  offset  from  buf.freq.   Since Linux 2.6.26, the supplied value is
              clamped to the range (-32768000, +32768000).  In older  kernels,  an  EINVAL  error
              occurs if the supplied value is out of range.

              Set maximum time error from buf.maxerror.

              Set estimated time error from buf.esterror.

              Set  clock  status  bits  from buf.status.  A description of these bits is provided

              Set PLL time constant from buf.constant.  If the STA_NANO status flag  (see  below)
              is clear, the kernel adds 4 to this value.

       ADJ_SETOFFSET (since Linux 2.6.39)
              Add  buf.time  to the current time.  If buf.status includes the ADJ_NANO flag, then
              buf.time.tv_usec is interpreted as a nanosecond value; otherwise it is  interpreted
              as microseconds.

              The  value of buf.time is the sum of its two fields, but the field buf.time.tv_usec
              must always be nonnegative.  The following example shows how to normalize a timeval
              with nanosecond resolution.

                  while (buf.time.tv_usec < 0) {
                      buf.time.tv_sec  -= 1;
                      buf.time.tv_usec += 1000000000;

       ADJ_MICRO (since Linux 2.6.26)
              Select microsecond resolution.

       ADJ_NANO (since Linux 2.6.26)
              Select  nanosecond  resolution.   Only  one  of  ADJ_MICRO  and  ADJ_NANO should be

       ADJ_TAI (since Linux 2.6.26)
              Set TAI (Atomic International Time) offset from buf.constant.

              ADJ_TAI should not be used in conjunction with ADJ_TIMECONST, since the latter mode
              also employs the buf.constant field.

              For  a complete explanation of TAI and the difference between TAI and UTC, see BIPM
              Set tick value from buf.tick.

       Alternatively, modes can be specified as either of the following (multibit  mask)  values,
       in which case other bits should not be specified in modes:

              Old-fashioned adjtime(3): (gradually) adjust time by value specified in buf.offset,
              which specifies an adjustment in microseconds.

       ADJ_OFFSET_SS_READ (functional since Linux 2.6.28)
              Return (in buf.offset) the remaining amount of time to be adjusted after an earlier
              ADJ_OFFSET_SINGLESHOT  operation.   This feature was added in Linux 2.6.24, but did
              not work correctly until Linux 2.6.28.

       Ordinary users are restricted to a value of either  0  or  ADJ_OFFSET_SS_READ  for  modes.
       Only the superuser may set any parameters.

       The  buf.status  field  is  a  bit  mask  that  is used to set and/or retrieve status bits
       associated with the NTP implementation.  Some bits in  the  mask  are  both  readable  and
       settable, while others are read-only.

       STA_PLL (read-write)
              Enable phase-locked loop (PLL) updates via ADJ_OFFSET.

       STA_PPSFREQ (read-write)
              Enable PPS (pulse-per-second) frequency discipline.

       STA_PPSTIME (read-write)
              Enable PPS time discipline.

       STA_FLL (read-write)
              Select frequency-locked loop (FLL) mode.

       STA_INS (read-write)
              Insert  a leap second after the last second of the UTC day, thus extending the last
              minute of the day by one second.  Leap-second insertion will  occur  each  day,  so
              long as this flag remains set.

       STA_DEL (read-write)
              Delete  a leap second at the last second of the UTC day.  Leap second deletion will
              occur each day, so long as this flag remains set.

       STA_UNSYNC (read-write)
              Clock unsynchronized.

       STA_FREQHOLD (read-write)
              Hold frequency.  Normally  adjustments  made  via  ADJ_OFFSET  result  in  dampened
              frequency  adjustments  also  being  made.   So  a single call corrects the current
              offset, but as offsets in  the  same  direction  are  made  repeatedly,  the  small
              frequency adjustments will accumulate to fix the long-term skew.

              This  flag  prevents the small frequency adjustment from being made when correcting
              for an ADJ_OFFSET value.

       STA_PPSSIGNAL (read-only)
              A valid PPS (pulse-per-second) signal is present.

       STA_PPSJITTER (read-only)
              PPS signal jitter exceeded.

       STA_PPSWANDER (read-only)
              PPS signal wander exceeded.

       STA_PPSERROR (read-only)
              PPS signal calibration error.

       STA_CLOCKERR (read-only)
              Clock hardware fault.

       STA_NANO (read-only; since Linux 2.6.26)
              Resolution (0 = microsecond, 1 =  nanoseconds).   Set  via  ADJ_NANO,  cleared  via

       STA_MODE (since Linux 2.6.26)
              Mode (0 = Phase Locked Loop, 1 = Frequency Locked Loop).

       STA_CLK (read-only; since Linux 2.6.26)
              Clock source (0 = A, 1 = B); currently unused.

       Attempts to set read-only status bits are silently ignored.

   clock_adjtime ()
       The  clock_adjtime() system call (added in Linux 2.6.39) behaves like adjtimex() but takes
       an additional clk_id argument to specify the particular clock on which to act.

   ntp_adjtime ()
       The ntp_adjtime() library function (described in the NTP "Kernel Application Program API",
       KAPI) is a more portable interface for performing the same task as adjtimex().  Other than
       the following points, it is identical to adjtimex():

       •  The constants used in modes are prefixed with "MOD_" rather than "ADJ_", and  have  the
          same  suffixes  (thus, MOD_OFFSET, MOD_FREQUENCY, and so on), other than the exceptions
          noted in the following points.

       •  MOD_CLKA is the synonym for ADJ_OFFSET_SINGLESHOT.

       •  MOD_CLKB is the synonym for ADJ_TICK.

       •  The is no synonym for ADJ_OFFSET_SS_READ, which is not described in the KAPI.


       On success, adjtimex() and ntp_adjtime() return the clock  state;  that  is,  one  of  the
       following values:

       TIME_OK     Clock synchronized, no leap second adjustment pending.

       TIME_INS    Indicates that a leap second will be added at the end of the UTC day.

       TIME_DEL    Indicates that a leap second will be deleted at the end of the UTC day.

       TIME_OOP    Insertion of a leap second is in progress.

       TIME_WAIT   A  leap-second  insertion  or deletion has been completed.  This value will be
                   returned until the next ADJ_STATUS operation clears the  STA_INS  and  STA_DEL

       TIME_ERROR  The  system  clock  is  not  synchronized to a reliable server.  This value is
                   returned when any of the following holds true:

                   •  Either STA_UNSYNC or STA_CLOCKERR is set.

                   •  STA_PPSSIGNAL is clear and either STA_PPSFREQ or STA_PPSTIME is set.

                   •  STA_PPSTIME and STA_PPSJITTER are both set.

                   •  STA_PPSFREQ is set and either STA_PPSWANDER or STA_PPSJITTER is set.

                   The symbolic name TIME_BAD is a synonym for TIME_ERROR, provided for  backward

       Note  that  starting with Linux 3.4, the call operates asynchronously and the return value
       usually will not reflect a state change caused by the call itself.

       On failure, these calls return -1 and set errno to indicate the error.


       EFAULT buf does not point to writable memory.

       EINVAL (before Linux 2.6.26)
              An attempt was made to set buf.freq  to  a  value  outside  the  range  (-33554432,

       EINVAL (before Linux 2.6.26)
              An  attempt  was  made  to  set  buf.offset to a value outside the permitted range.
              Before Linux 2.0, the permitted range  was  (-131072,  +131072).   From  Linux  2.0
              onwards, the permitted range was (-512000, +512000).

       EINVAL An attempt was made to set buf.status to a value other than those listed above.

       EINVAL The  clk_id given to clock_adjtime() is invalid for one of two reasons.  Either the
              System-V style hard-coded positive clock ID value is out of range, or  the  dynamic
              clk_id  does not refer to a valid instance of a clock object.  See clock_gettime(2)
              for a discussion of dynamic clocks.

       EINVAL An attempt was made to set buf.tick to a  value  outside  the  range  900000/HZ  to
              1100000/HZ, where HZ is the system timer interrupt frequency.

       ENODEV The hot-pluggable device (like USB for example) represented by a dynamic clk_id has
              disappeared after its character device was  opened.   See  clock_gettime(2)  for  a
              discussion of dynamic clocks.

              The given clk_id does not support adjustment.

       EPERM  buf.modes  is  neither  0  nor  ADJ_OFFSET_SS_READ,  and  the  caller does not have
              sufficient privilege.  Under Linux, the CAP_SYS_TIME capability is required.


       For an explanation of the terms used in this section, see attributes(7).

       │InterfaceAttributeValue   │
       │ntp_adjtime()                                                  │ Thread safety │ MT-Safe │


       None of these interfaces is described in POSIX.1

       adjtimex() and clock_adjtime() are Linux-specific and  should  not  be  used  in  programs
       intended to be portable.

       The preferred API for the NTP daemon is ntp_adjtime().


       In  struct  timex,  freq,  ppsfreq,  and  stabil are ppm (parts per million) with a 16-bit
       fractional part, which means that a value of 1 in one of those fields actually means 2^-16
       ppm,  and  2^16=65536  is  1  ppm.  This is the case for both input values (in the case of
       freq) and output values.

       The leap-second processing triggered by STA_INS and STA_DEL is done by the kernel in timer
       context.   Thus,  it will take one tick into the second for the leap second to be inserted
       or deleted.


       clock_gettime(2),   clock_settime(2),   settimeofday(2),    adjtime(3),    ntp_gettime(3),
       capabilities(7), time(7), adjtimex(8), hwclock(8)

       NTP "Kernel Application Program Interface" ⟨