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