#include <stdio.h>
#include <time.h>
#include <sys/timex.h>
#include <stdlib.h>
#include <stdint.h>
#include <err.h>
#include <unistd.h>

#ifndef NANOSECOND
#define NANOSECOND 1000000000L
#endif

static void
show_ts(const char *str, struct timespec *ts)
{

	printf("%s={tv_sec=%jd, tv_nsec=%ld}\n",
	    str, (intmax_t)ts->tv_sec, ts->tv_nsec);
}

int
main(int argc, char **argv)
{
	struct timespec tv1, tv2;
	struct timespec ts1, ts2;
	long delta;
	long nsec_delay;

	nsec_delay = 1000000L;
	if (argc > 1)
		nsec_delay = atoi(argv[1]) * 1000L;

	clock_getres(CLOCK_MONOTONIC, &ts1);
	show_ts("res", &ts1);
	if (nsec_delay < ts1.tv_nsec) 
		err(1, "delay %ld < resolution %ld", nsec_delay, ts1.tv_nsec);
	ts1.tv_sec = nsec_delay / NANOSECOND;
	ts1.tv_nsec = nsec_delay % NANOSECOND;

	clock_gettime(CLOCK_MONOTONIC, &tv1);
	clock_nanosleep(CLOCK_MONOTONIC, 0, &ts1, &ts2);
	clock_gettime(CLOCK_MONOTONIC, &tv2);

	delta = (tv2.tv_sec - tv1.tv_sec) * NANOSECOND +
	    (tv2.tv_nsec - tv1.tv_nsec);

	show_ts("tv1", &tv1);
	show_ts("tv2", &tv2);
	show_ts("ts1", &ts1);
	show_ts("ts2", &ts2);
	printf("nsec_delay: %ld delta: %ld\n", nsec_delay, delta);
	return 0;
}