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>