154359Sroberto/*
254359Sroberto * ntp_unixtime.h - contains constants and macros for converting between
354359Sroberto *		    NTP time stamps (l_fp) and Unix times (struct timeval)
454359Sroberto */
554359Sroberto
654359Sroberto#include "ntp_types.h"
754359Sroberto
8132451Sroberto#ifdef SIM
9132451Sroberto#include "ntpsim.h"
10132451Sroberto#endif
11132451Sroberto
12132451Sroberto#ifdef SIM
13132451Sroberto#   define GETTIMEOFDAY(a, b) (node_gettime(&ntp_node, a))
14132451Sroberto#   define SETTIMEOFDAY(a, b) (node_settime(&ntp_node, a))
15132451Sroberto#   define ADJTIMEOFDAY(a, b) (node_adjtime(&ntp_node, a, b))
16132451Sroberto#else
17132451Sroberto#   define ADJTIMEOFDAY(a, b) (adjtime(a, b))
1854359Sroberto/* gettimeofday() takes two args in BSD and only one in SYSV */
1954359Sroberto# if defined(HAVE_SYS_TIMERS_H) && defined(HAVE_GETCLOCK)
2054359Sroberto#  include <sys/timers.h>
2154359Srobertoint getclock (int clock_type, struct timespec *tp);
2254359Sroberto/* Don't #define GETTIMEOFDAY because we shouldn't be using it in this case. */
2354359Sroberto#   define SETTIMEOFDAY(a, b) (settimeofday(a, b))
2454359Sroberto# else /* not (HAVE_SYS_TIMERS_H && HAVE_GETCLOCK) */
2554359Sroberto#  ifdef SYSV_TIMEOFDAY
2654359Sroberto#   define GETTIMEOFDAY(a, b) (gettimeofday(a))
2754359Sroberto#   define SETTIMEOFDAY(a, b) (settimeofday(a))
2854359Sroberto#  else /* ! SYSV_TIMEOFDAY */
2954359Sroberto#if defined SYS_CYGWIN32
3054359Sroberto#   define GETTIMEOFDAY(a, b) (gettimeofday(a, b))
3154359Sroberto#   define SETTIMEOFDAY(a, b) (settimeofday_NT(a))
3254359Sroberto#else
3354359Sroberto#   define GETTIMEOFDAY(a, b) (gettimeofday(a, b))
3454359Sroberto#   define SETTIMEOFDAY(a, b) (settimeofday(a, b))
3554359Sroberto#endif
3654359Sroberto#  endif /* SYSV_TIMEOFDAY */
3754359Sroberto# endif /* not (HAVE_SYS_TIMERS_H && HAVE_GETCLOCK) */
38132451Sroberto#endif /* SIM */
3954359Sroberto
4054359Sroberto/*
4154359Sroberto * Time of day conversion constant.  Ntp's time scale starts in 1900,
4254359Sroberto * Unix in 1970.
4354359Sroberto */
4454359Sroberto#define	JAN_1970	0x83aa7e80	/* 2208988800 1970 - 1900 in seconds */
4554359Sroberto
4654359Sroberto/*
4754359Sroberto * These constants are used to round the time stamps computed from
4854359Sroberto * a struct timeval to the microsecond (more or less).  This keeps
4954359Sroberto * things neat.
5054359Sroberto */
5154359Sroberto#define	TS_MASK		0xfffff000	/* mask to usec, for time stamps */
5254359Sroberto#define	TS_ROUNDBIT	0x00000800	/* round at this bit */
5354359Sroberto
5454359Sroberto
5554359Sroberto/*
5654359Sroberto * Convert usec to a time stamp fraction.  If you use this the program
5754359Sroberto * must include the following declarations:
5854359Sroberto */
5954359Srobertoextern u_long ustotslo[];
6054359Srobertoextern u_long ustotsmid[];
6154359Srobertoextern u_long ustotshi[];
6254359Sroberto
6354359Sroberto#define	TVUTOTSF(tvu, tsf) \
6454359Sroberto	(tsf) = ustotslo[(tvu) & 0xff] \
6554359Sroberto	    + ustotsmid[((tvu) >> 8) & 0xff] \
6654359Sroberto	    + ustotshi[((tvu) >> 16) & 0xf]
6754359Sroberto
6854359Sroberto/*
6954359Sroberto * Convert a struct timeval to a time stamp.
7054359Sroberto */
7154359Sroberto#define TVTOTS(tv, ts) \
7254359Sroberto	do { \
7354359Sroberto		(ts)->l_ui = (u_long)(tv)->tv_sec; \
7454359Sroberto		TVUTOTSF((tv)->tv_usec, (ts)->l_uf); \
7554359Sroberto	} while(0)
7654359Sroberto
7754359Sroberto#define sTVTOTS(tv, ts) \
7854359Sroberto	do { \
7954359Sroberto		int isneg = 0; \
8054359Sroberto		long usec; \
8154359Sroberto		(ts)->l_ui = (tv)->tv_sec; \
8254359Sroberto		usec = (tv)->tv_usec; \
8354359Sroberto		if (((tv)->tv_sec < 0) || ((tv)->tv_usec < 0)) { \
8454359Sroberto			usec = -usec; \
8554359Sroberto			(ts)->l_ui = -(ts)->l_ui; \
8654359Sroberto			isneg = 1; \
8754359Sroberto		} \
8854359Sroberto		TVUTOTSF(usec, (ts)->l_uf); \
8954359Sroberto		if (isneg) { \
9054359Sroberto			L_NEG((ts)); \
9154359Sroberto		} \
9254359Sroberto	} while(0)
9354359Sroberto
9454359Sroberto/*
9554359Sroberto * TV_SHIFT is used to turn the table result into a usec value.  To round,
9654359Sroberto * add in TV_ROUNDBIT before shifting
9754359Sroberto */
9854359Sroberto#define	TV_SHIFT	3
9954359Sroberto#define	TV_ROUNDBIT	0x4
10054359Sroberto
10154359Sroberto
10254359Sroberto/*
10354359Sroberto * Convert a time stamp fraction to microseconds.  The time stamp
10454359Sroberto * fraction is assumed to be unsigned.  To use this in a program, declare:
10554359Sroberto */
10654359Srobertoextern long tstouslo[];
10754359Srobertoextern long tstousmid[];
10854359Srobertoextern long tstoushi[];
10954359Sroberto
11054359Sroberto#define	TSFTOTVU(tsf, tvu) \
11154359Sroberto	(tvu) = (tstoushi[((tsf) >> 24) & 0xff] \
11254359Sroberto	    + tstousmid[((tsf) >> 16) & 0xff] \
11354359Sroberto	    + tstouslo[((tsf) >> 9) & 0x7f] \
11454359Sroberto	    + TV_ROUNDBIT) >> TV_SHIFT
11554359Sroberto/*
11654359Sroberto * Convert a time stamp to a struct timeval.  The time stamp
11754359Sroberto * has to be positive.
11854359Sroberto */
11954359Sroberto#define	TSTOTV(ts, tv) \
12054359Sroberto	do { \
12154359Sroberto		(tv)->tv_sec = (ts)->l_ui; \
12254359Sroberto		TSFTOTVU((ts)->l_uf, (tv)->tv_usec); \
12354359Sroberto		if ((tv)->tv_usec == 1000000) { \
12454359Sroberto			(tv)->tv_sec++; \
12554359Sroberto			(tv)->tv_usec = 0; \
12654359Sroberto		} \
12754359Sroberto	} while (0)
12854359Sroberto
12954359Sroberto/*
13054359Sroberto * Convert milliseconds to a time stamp fraction.  This shouldn't be
13154359Sroberto * here, but it is convenient since the guys who use the definition will
13254359Sroberto * often be including this file anyway.
13354359Sroberto */
13454359Srobertoextern u_long msutotsflo[];
13554359Srobertoextern u_long msutotsfhi[];
13654359Sroberto
13754359Sroberto#define	MSUTOTSF(msu, tsf) \
13854359Sroberto	(tsf) = msutotsfhi[((msu) >> 5) & 0x1f] + msutotsflo[(msu) & 0x1f]
13954359Sroberto
14054359Srobertoextern	char *	tvtoa		P((const struct timeval *));
14154359Srobertoextern	char *	utvtoa		P((const struct timeval *));
142