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