1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
/*
* ntp_unixtime.h - contains constants and macros for converting between
* NTP time stamps (l_fp) and Unix times (struct timeval)
*/
#include "ntp_types.h"
#ifdef SIM
#include "ntpsim.h"
#endif
#ifdef SIM
# define GETTIMEOFDAY(a, b) (node_gettime(&ntp_node, a))
# define SETTIMEOFDAY(a, b) (node_settime(&ntp_node, a))
# define ADJTIMEOFDAY(a, b) (node_adjtime(&ntp_node, a, b))
#else
# define ADJTIMEOFDAY(a, b) (adjtime(a, b))
/* gettimeofday() takes two args in BSD and only one in SYSV */
# if defined(HAVE_SYS_TIMERS_H) && defined(HAVE_GETCLOCK)
# include <sys/timers.h>
int getclock (int clock_type, struct timespec *tp);
/* Don't #define GETTIMEOFDAY because we shouldn't be using it in this case. */
# define SETTIMEOFDAY(a, b) (settimeofday(a, b))
# else /* not (HAVE_SYS_TIMERS_H && HAVE_GETCLOCK) */
# ifdef SYSV_TIMEOFDAY
# define GETTIMEOFDAY(a, b) (gettimeofday(a))
# define SETTIMEOFDAY(a, b) (settimeofday(a))
# else /* ! SYSV_TIMEOFDAY */
#if defined SYS_CYGWIN32
# define GETTIMEOFDAY(a, b) (gettimeofday(a, b))
# define SETTIMEOFDAY(a, b) (settimeofday_NT(a))
#else
# define GETTIMEOFDAY(a, b) (gettimeofday(a, b))
# define SETTIMEOFDAY(a, b) (settimeofday(a, b))
#endif
# endif /* SYSV_TIMEOFDAY */
# endif /* not (HAVE_SYS_TIMERS_H && HAVE_GETCLOCK) */
#endif /* SIM */
/*
* Time of day conversion constant. Ntp's time scale starts in 1900,
* Unix in 1970.
*/
#define JAN_1970 0x83aa7e80 /* 2208988800 1970 - 1900 in seconds */
/*
* These constants are used to round the time stamps computed from
* a struct timeval to the microsecond (more or less). This keeps
* things neat.
*/
#define TS_MASK 0xfffff000 /* mask to usec, for time stamps */
#define TS_ROUNDBIT 0x00000800 /* round at this bit */
/*
* Convert usec to a time stamp fraction. If you use this the program
* must include the following declarations:
*/
extern u_long ustotslo[];
extern u_long ustotsmid[];
extern u_long ustotshi[];
#define TVUTOTSF(tvu, tsf) \
(tsf) = ustotslo[(tvu) & 0xff] \
+ ustotsmid[((tvu) >> 8) & 0xff] \
+ ustotshi[((tvu) >> 16) & 0xf]
/*
* Convert a struct timeval to a time stamp.
*/
#define TVTOTS(tv, ts) \
do { \
(ts)->l_ui = (u_long)(tv)->tv_sec; \
TVUTOTSF((tv)->tv_usec, (ts)->l_uf); \
} while(0)
#define sTVTOTS(tv, ts) \
do { \
int isneg = 0; \
long usec; \
(ts)->l_ui = (tv)->tv_sec; \
usec = (tv)->tv_usec; \
if (((tv)->tv_sec < 0) || ((tv)->tv_usec < 0)) { \
usec = -usec; \
(ts)->l_ui = -(ts)->l_ui; \
isneg = 1; \
} \
TVUTOTSF(usec, (ts)->l_uf); \
if (isneg) { \
L_NEG((ts)); \
} \
} while(0)
/*
* TV_SHIFT is used to turn the table result into a usec value. To round,
* add in TV_ROUNDBIT before shifting
*/
#define TV_SHIFT 3
#define TV_ROUNDBIT 0x4
/*
* Convert a time stamp fraction to microseconds. The time stamp
* fraction is assumed to be unsigned. To use this in a program, declare:
*/
extern long tstouslo[];
extern long tstousmid[];
extern long tstoushi[];
#define TSFTOTVU(tsf, tvu) \
(tvu) = (tstoushi[((tsf) >> 24) & 0xff] \
+ tstousmid[((tsf) >> 16) & 0xff] \
+ tstouslo[((tsf) >> 9) & 0x7f] \
+ TV_ROUNDBIT) >> TV_SHIFT
/*
* Convert a time stamp to a struct timeval. The time stamp
* has to be positive.
*/
#define TSTOTV(ts, tv) \
do { \
(tv)->tv_sec = (ts)->l_ui; \
TSFTOTVU((ts)->l_uf, (tv)->tv_usec); \
if ((tv)->tv_usec == 1000000) { \
(tv)->tv_sec++; \
(tv)->tv_usec = 0; \
} \
} while (0)
/*
* Convert milliseconds to a time stamp fraction. This shouldn't be
* here, but it is convenient since the guys who use the definition will
* often be including this file anyway.
*/
extern u_long msutotsflo[];
extern u_long msutotsfhi[];
#define MSUTOTSF(msu, tsf) \
(tsf) = msutotsfhi[((msu) >> 5) & 0x1f] + msutotsflo[(msu) & 0x1f]
|