File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / include / ntp_unixtime.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    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>