/*
 * Copyright (C) Miroslav Lichvar  2015
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

/* Check the frequency range of the system ntp_adjtime() implementation */

#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <sys/timex.h>

static int
try_ntpadjtime(struct timex *t)
{
  int r;
  r = ntp_adjtime(t);
  if (r < 0)
    printf("ntp_adjtime() failed : %s ", strerror(errno));
  return r;
}

static void
reset_ntpadjtime(void)
{
  struct timex t;

  t.modes = MOD_OFFSET | MOD_FREQUENCY;
  t.offset = 0;
  t.freq = 0;
  try_ntpadjtime(&t);
}

static void
test_freqrange(void)
{
  struct timex t;
  int i;

  printf("freq range:\n");

  for (i = -1000; i <= 1000; i += 50) {
    t.modes = MOD_FREQUENCY;
    t.freq = i * (1 << 16);
    printf("%4d ppm => ", i);
    if (try_ntpadjtime(&t) < 0)
      continue;

    printf("%4ld ppm : ", t.freq / (1 << 16));
    printf("%s\n", t.freq == i * (1 << 16) ? "ok" : "fail");
  }
}

int
main()
{
  test_freqrange();

  reset_ntpadjtime();

  return 0;
}
