adjtimex -- tune kernel clock


#include <sys/timex.h>

int adjtimex((struct timex *buf));


Linux uses David L. Mills' clock adjustment algorithm (see RFC 1305). adjtimex reads and optionally sets adjustment parameters for this algorithm. adjtimex takes a pointer to a timex structure, updates kernel parameters from field values, and returns the same structure with current kernel values. This structure is declared as follows:
  struct timex {
            int  modes;          /* mode selector */
            long offset;         /* time offset (usec) */
            long freq;           /* frequency offset (scaled ppm) */
            long maxerror;       /* maximum error (usec) */
            long esterror;       /* estimated error (usec) */
            int  status;         /* clock command/status */
            long constant;       /* pll time constant */
            long precision;      /* clock precision (usec) (read only) */
            long tolerance;      /* clock frequency tolerance (ppm)
                                          (read only) */
            struct timeval time; /* current time (read only) */
            long tick;           /* usecs between clock ticks */

modes determines which parameters, if any, to set. modes may contain a bitwise-or combination of zero or more of the following bits:
  #define ADJ_OFFSET            0x0001  /* time offset */
  #define ADJ_FREQUENCY         0x0002  /* frequency offset */
  #define ADJ_MAXERROR          0x0004  /* maximum time error */
  #define ADJ_ESTERROR          0x0008  /* estimated time error */
  #define ADJ_STATUS            0x0010  /* clock status */
  #define ADJ_TIMECONST         0x0020  /* pll time constant */
  #define ADJ_TICK              0x4000  /* tick value */
  #define ADJ_OFFSET_SINGLESHOT 0x8001  /* old-fashioned adjtime */

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

Return Value

On success, adjtimex returns the clock state:
  #define TIME_OK   0  /* clock synchronized */
  #define TIME_INS  1  /* insert leap second */
  #define TIME_DEL  2  /* delete leap second */
  #define TIME_OOP  3  /* leap second in progress */
  #define TIME_WAIT 4  /* leap second has occurred */
  #define TIME_BAD  5  /* clock not synchronized */

On error, the global variable errno is set to -1.



buf does not point to writable memory.


buf.mode is non-ZERO and the user is not super-user.


An attempt is made to set buf.offset to a value outside of the range -131071 to +131071, or to set buf.status to a value other than those listed above, or to set buf.tick to a value outside of the range 900000/HZ to 1100000/HZ, where HZ is the system timer interrupt frequency.