mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	Currently glibc uses in_time_t_range to detects time_t overflow, and if it occurs fallbacks to 64 bit syscall version. The function name is confusing because internally time_t might be either 32 bits or 64 bits (depending on __TIMESIZE). This patch refactors the in_time_t_range by replacing it with in_int32_t_range for the case to check if the 64 bit time_t syscall should be used. The in_time_t range is used to detect overflow of the syscall return value. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
		
			
				
	
	
		
			546 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			546 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _TIME_H
 | |
| #include <time/time.h>
 | |
| 
 | |
| #ifndef _ISOMAC
 | |
| # include <bits/types/struct_timeval.h>
 | |
| # include <struct___timespec64.h>
 | |
| # include <struct___timeval64.h>
 | |
| # include <bits/types/locale_t.h>
 | |
| # include <stdbool.h>
 | |
| # include <time/mktime-internal.h>
 | |
| # include <sys/time.h>
 | |
| # include <time-clockid.h>
 | |
| # include <sys/time.h>
 | |
| # include <stdint.h>
 | |
| 
 | |
| extern __typeof (strftime_l) __strftime_l;
 | |
| libc_hidden_proto (__strftime_l)
 | |
| extern __typeof (strptime_l) __strptime_l;
 | |
| 
 | |
| libc_hidden_proto (asctime)
 | |
| libc_hidden_proto (mktime)
 | |
| libc_hidden_proto (timelocal)
 | |
| libc_hidden_proto (localtime)
 | |
| libc_hidden_proto (strftime)
 | |
| libc_hidden_proto (strptime)
 | |
| 
 | |
| extern __typeof (clock_gettime) __clock_gettime;
 | |
| libc_hidden_proto (__clock_gettime)
 | |
| extern __typeof (clock_settime) __clock_settime;
 | |
| libc_hidden_proto (__clock_settime)
 | |
| 
 | |
| extern __typeof (clock_getres) __clock_getres;
 | |
| libc_hidden_proto (__clock_getres)
 | |
| 
 | |
| extern __typeof (clock_nanosleep) __clock_nanosleep;
 | |
| libc_hidden_proto (__clock_nanosleep);
 | |
| 
 | |
| #ifdef __linux__
 | |
| extern __typeof (clock_adjtime) __clock_adjtime;
 | |
| libc_hidden_proto (__clock_adjtime);
 | |
| #endif
 | |
| 
 | |
| /* Now define the internal interfaces.  */
 | |
| struct tm;
 | |
| 
 | |
| /* Defined in mktime.c.  */
 | |
| extern const unsigned short int __mon_yday[2][13] attribute_hidden;
 | |
| 
 | |
| /* Defined in localtime.c.  */
 | |
| extern struct tm _tmbuf attribute_hidden;
 | |
| 
 | |
| /* Defined in tzset.c.  */
 | |
| extern char *__tzstring (const char *string) attribute_hidden;
 | |
| 
 | |
| extern int __use_tzfile attribute_hidden;
 | |
| 
 | |
| extern void __tzfile_read (const char *file, size_t extra,
 | |
| 			   char **extrap) attribute_hidden;
 | |
| extern void __tzfile_compute (__time64_t timer, int use_localtime,
 | |
| 			      long int *leap_correct, int *leap_hit,
 | |
| 			      struct tm *tp) attribute_hidden;
 | |
| extern void __tzfile_default (const char *std, const char *dst,
 | |
| 			      int stdoff, int dstoff)
 | |
|   attribute_hidden;
 | |
| extern void __tzset_parse_tz (const char *tz) attribute_hidden;
 | |
| extern void __tz_compute (__time64_t timer, struct tm *tm, int use_localtime)
 | |
|   __THROW attribute_hidden;
 | |
| 
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __itimerspec64 itimerspec
 | |
| #else
 | |
| /* The glibc's internal representation of the struct itimerspec.  */
 | |
| struct __itimerspec64
 | |
| {
 | |
|   struct __timespec64 it_interval;
 | |
|   struct __timespec64 it_value;
 | |
| };
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __utimbuf64 utimbuf
 | |
| # define __itimerval64 itimerval
 | |
| #else
 | |
| /* The glibc Y2038-proof struct __utimbuf64 structure for file's access
 | |
|    and modification time values.  */
 | |
| struct __utimbuf64
 | |
| {
 | |
|   __time64_t actime;		/* Access time.  */
 | |
|   __time64_t modtime;		/* Modification time.  */
 | |
| };
 | |
| /* The glibc's internal representation of the struct itimerval.  */
 | |
| struct __itimerval64
 | |
| {
 | |
|   struct __timeval64 it_interval;
 | |
|   struct __timeval64 it_value;
 | |
| };
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __getitimer64 __getitimer
 | |
| # define __setitimer64 __setitimer
 | |
| #else
 | |
| extern int __getitimer64 (enum __itimer_which __which,
 | |
|                           struct __itimerval64 *__value);
 | |
| 
 | |
| libc_hidden_proto (__getitimer64)
 | |
| extern int __setitimer64 (enum __itimer_which __which,
 | |
|                           const struct __itimerval64 *__restrict __new,
 | |
|                           struct __itimerval64 *__restrict __old);
 | |
| libc_hidden_proto (__setitimer64)
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __ctime64 ctime
 | |
| #else
 | |
| extern char *__ctime64 (const __time64_t *__timer) __THROW;
 | |
| libc_hidden_proto (__ctime64)
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __ctime64_r ctime_r
 | |
| #else
 | |
| extern char *__ctime64_r (const __time64_t *__restrict __timer,
 | |
| 		          char *__restrict __buf) __THROW;
 | |
| libc_hidden_proto (__ctime64_r)
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __localtime64 localtime
 | |
| #else
 | |
| extern struct tm *__localtime64 (const __time64_t *__timer);
 | |
| libc_hidden_proto (__localtime64)
 | |
| #endif
 | |
| 
 | |
| extern struct tm *__localtime_r (const time_t *__timer,
 | |
| 				 struct tm *__tp) attribute_hidden;
 | |
| #if __TIMESIZE != 64
 | |
| extern struct tm *__localtime64_r (const __time64_t *__timer,
 | |
| 				   struct tm *__tp);
 | |
| libc_hidden_proto (__localtime64_r)
 | |
| 
 | |
| extern __time64_t __mktime64 (struct tm *__tp) __THROW;
 | |
| libc_hidden_proto (__mktime64)
 | |
| #endif
 | |
| 
 | |
| extern struct tm *__gmtime_r (const time_t *__restrict __timer,
 | |
| 			      struct tm *__restrict __tp);
 | |
| libc_hidden_proto (__gmtime_r)
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __gmtime64 gmtime
 | |
| #else
 | |
| extern struct tm *__gmtime64 (const __time64_t *__timer);
 | |
| libc_hidden_proto (__gmtime64)
 | |
| 
 | |
| extern struct tm *__gmtime64_r (const __time64_t *__restrict __timer,
 | |
| 				struct tm *__restrict __tp);
 | |
| libc_hidden_proto (__gmtime64_r)
 | |
| 
 | |
| extern __time64_t __timegm64 (struct tm *__tp) __THROW;
 | |
| libc_hidden_proto (__timegm64)
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __clock_settime64 __clock_settime
 | |
| #else
 | |
| extern int __clock_settime64 (clockid_t clock_id,
 | |
|                               const struct __timespec64 *tp) __nonnull((2));
 | |
| libc_hidden_proto (__clock_settime64)
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __clock_getres64 __clock_getres
 | |
| #else
 | |
| extern int __clock_getres64 (clockid_t clock_id,
 | |
|                              struct __timespec64 *tp);
 | |
| libc_hidden_proto (__clock_getres64);
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __utime64 __utime
 | |
| # define __utimes64 __utimes
 | |
| # define __utimensat64 __utimensat
 | |
| #else
 | |
| extern int __utime64 (const char *file, const struct __utimbuf64 *times);
 | |
| libc_hidden_proto (__utime64)
 | |
| extern int __utimes64 (const char *file, const struct __timeval64 tvp[2]);
 | |
| libc_hidden_proto (__utimes64)
 | |
| extern int __utimensat64 (int fd, const char *file,
 | |
|                           const struct __timespec64 tsp[2], int flags);
 | |
| libc_hidden_proto (__utimensat64);
 | |
| #endif
 | |
| 
 | |
| extern int __utimensat64_helper (int fd, const char *file,
 | |
|                                  const struct __timespec64 tsp[2], int flags);
 | |
| libc_hidden_proto (__utimensat64_helper);
 | |
| 
 | |
| extern int __futimesat (int __fd, const char *__file, const struct timeval __tvp[2]);
 | |
| #if __TIMESIZE == 64
 | |
| # define __futimes64 __futimes
 | |
| # define __futimesat64 __futimesat
 | |
| # define __lutimes64 __lutimes
 | |
| # define __futimens64 __futimens
 | |
| #else
 | |
| extern int __futimes64 (int fd, const struct __timeval64 tvp64[2]);
 | |
| libc_hidden_proto (__futimes64);
 | |
| extern int __futimesat64 (int fd, const char *file,
 | |
|                           const struct __timeval64 tvp[2]);
 | |
| libc_hidden_proto (__futimesat64);
 | |
| extern int __lutimes64 (const char *file, const struct __timeval64 tvp64[2]);
 | |
| libc_hidden_proto (__lutimes64);
 | |
| extern int __futimens64 (int fd, const struct __timespec64 tsp[2]);
 | |
| libc_hidden_proto (__futimens64);
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __timer_gettime64 __timer_gettime
 | |
| # define __timerfd_gettime64 __timerfd_gettime
 | |
| #else
 | |
| extern int __timer_gettime64 (timer_t timerid, struct __itimerspec64 *value);
 | |
| extern int __timerfd_gettime64 (int fd, struct __itimerspec64 *value);
 | |
| # if PTHREAD_IN_LIBC
 | |
| libc_hidden_proto (__timer_gettime64)
 | |
| # else
 | |
| librt_hidden_proto (__timer_gettime64)
 | |
| # endif
 | |
| libc_hidden_proto (__timerfd_gettime64);
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __timer_settime64 __timer_settime
 | |
| # define __timerfd_settime64 __timerfd_settime
 | |
| #else
 | |
| extern int __timer_settime64 (timer_t timerid, int flags,
 | |
|                               const struct __itimerspec64 *value,
 | |
|                               struct __itimerspec64 *ovalue);
 | |
| extern int __timerfd_settime64 (int fd, int flags,
 | |
|                                 const struct __itimerspec64 *value,
 | |
|                                 struct __itimerspec64 *ovalue);
 | |
| # if PTHREAD_IN_LIBC
 | |
| libc_hidden_proto (__timer_settime64)
 | |
| #else
 | |
| librt_hidden_proto (__timer_settime64)
 | |
| #endif
 | |
| libc_hidden_proto (__timerfd_settime64);
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __sched_rr_get_interval64 __sched_rr_get_interval
 | |
| #else
 | |
| extern int __sched_rr_get_interval64 (pid_t pid, struct __timespec64 *tp);
 | |
| libc_hidden_proto (__sched_rr_get_interval64);
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __settimeofday64 __settimeofday
 | |
| # define __gettimeofday64 __gettimeofday
 | |
| #else
 | |
| extern int __settimeofday64 (const struct __timeval64 *tv,
 | |
|                              const struct timezone *tz);
 | |
| libc_hidden_proto (__settimeofday64)
 | |
| extern int __gettimeofday64 (struct __timeval64 *restrict tv,
 | |
|                              void *restrict tz);
 | |
| libc_hidden_proto (__gettimeofday64)
 | |
| #endif
 | |
| 
 | |
| /* Compute the `struct tm' representation of T,
 | |
|    offset OFFSET seconds east of UTC,
 | |
|    and store year, yday, mon, mday, wday, hour, min, sec into *TP.
 | |
|    Return nonzero if successful.  */
 | |
| extern int __offtime (__time64_t __timer,
 | |
| 		      long int __offset,
 | |
| 		      struct tm *__tp) attribute_hidden;
 | |
| 
 | |
| extern char *__asctime_r (const struct tm *__tp, char *__buf)
 | |
|   attribute_hidden;
 | |
| extern void __tzset (void) attribute_hidden;
 | |
| 
 | |
| /* Prototype for the internal function to get information based on TZ.  */
 | |
| extern struct tm *__tz_convert (__time64_t timer, int use_localtime,
 | |
| 				struct tm *tp) attribute_hidden;
 | |
| 
 | |
| extern int __nanosleep (const struct timespec *__requested_time,
 | |
| 			struct timespec *__remaining);
 | |
| hidden_proto (__nanosleep)
 | |
| #if __TIMESIZE == 64
 | |
| # define __nanosleep64 __nanosleep
 | |
| #else
 | |
| extern int __nanosleep64 (const struct __timespec64 *__requested_time,
 | |
| 			  struct __timespec64 *__remaining);
 | |
| hidden_proto (__nanosleep64)
 | |
| #endif
 | |
| 
 | |
| 
 | |
| extern int __getdate_r (const char *__string, struct tm *__resbufp);
 | |
| libc_hidden_proto (__getdate_r);
 | |
| 
 | |
| 
 | |
| /* Determine CLK_TCK value.  */
 | |
| extern int __getclktck (void) attribute_hidden;
 | |
| 
 | |
| 
 | |
| /* strptime support.  */
 | |
| extern char * __strptime_internal (const char *rp, const char *fmt,
 | |
| 				   struct tm *tm, void *statep,
 | |
| 				   locale_t locparam) attribute_hidden;
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __difftime64 __difftime
 | |
| #else
 | |
| extern double __difftime64 (__time64_t time1, __time64_t time0);
 | |
| libc_hidden_proto (__difftime64)
 | |
| #endif
 | |
| 
 | |
| extern double __difftime (time_t time1, time_t time0);
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __clock_nanosleep_time64 __clock_nanosleep
 | |
| # define __clock_gettime64 __clock_gettime
 | |
| # define __timespec_get64 __timespec_get
 | |
| # define __timespec_getres64 __timespec_getres
 | |
| #else
 | |
| extern int __clock_nanosleep_time64 (clockid_t clock_id,
 | |
|                                      int flags, const struct __timespec64 *req,
 | |
|                                      struct __timespec64 *rem);
 | |
| libc_hidden_proto (__clock_nanosleep_time64)
 | |
| extern int __clock_gettime64 (clockid_t clock_id, struct __timespec64 *tp) __nonnull((2));
 | |
| libc_hidden_proto (__clock_gettime64)
 | |
| extern int __timespec_get64 (struct __timespec64 *ts, int base);
 | |
| libc_hidden_proto (__timespec_get64)
 | |
| extern int __timespec_getres64 (struct __timespec64 *ts, int base);
 | |
| libc_hidden_proto (__timespec_getres64)
 | |
| #endif
 | |
| 
 | |
| #if __TIMESIZE == 64
 | |
| # define __time64 __time
 | |
| #else
 | |
| extern __time64_t __time64 (__time64_t *timer);
 | |
| libc_hidden_proto (__time64)
 | |
| #endif
 | |
| 
 | |
| /* Use in the clock_* functions.  Size of the field representing the
 | |
|    actual clock ID.  */
 | |
| #define CLOCK_IDFIELD_SIZE	3
 | |
| 
 | |
| /* Check whether T fits in int32_t, assume all usages are for
 | |
|    sizeof(time_t) == 32.  */
 | |
| static inline bool
 | |
| in_int32_t_range (__time64_t t)
 | |
| {
 | |
|   int32_t s = t;
 | |
|   return s == t;
 | |
| }
 | |
| 
 | |
| /* Check whether T fits in time_t.  */
 | |
| static inline bool
 | |
| in_time_t_range (__time64_t t)
 | |
| {
 | |
|   time_t s = t;
 | |
|   return s == t;
 | |
| }
 | |
| 
 | |
| /* Convert a known valid struct timeval into a struct __timespec64.  */
 | |
| static inline struct __timespec64
 | |
| valid_timeval_to_timespec64 (const struct timeval tv)
 | |
| {
 | |
|   struct __timespec64 ts64;
 | |
| 
 | |
|   ts64.tv_sec = tv.tv_sec;
 | |
|   ts64.tv_nsec = tv.tv_usec * 1000;
 | |
| 
 | |
|   return ts64;
 | |
| }
 | |
| 
 | |
| /* Convert a known valid struct timeval into a struct __timeval64.  */
 | |
| static inline struct __timeval64
 | |
| valid_timeval_to_timeval64 (const struct timeval tv)
 | |
| {
 | |
|   struct __timeval64 tv64;
 | |
| 
 | |
|   tv64.tv_sec = tv.tv_sec;
 | |
|   tv64.tv_usec = tv.tv_usec;
 | |
| 
 | |
|   return tv64;
 | |
| }
 | |
| 
 | |
| /* Convert a valid and within range of struct timeval, struct
 | |
|    __timeval64 into a struct timeval.  */
 | |
| static inline struct timeval
 | |
| valid_timeval64_to_timeval (const struct __timeval64 tv64)
 | |
| {
 | |
|   struct timeval tv;
 | |
| 
 | |
|   tv.tv_sec = (time_t) tv64.tv_sec;
 | |
|   tv.tv_usec = (suseconds_t) tv64.tv_usec;
 | |
| 
 | |
|   return tv;
 | |
| }
 | |
| 
 | |
| /* Convert a struct __timeval64 into a struct __timespec64.  */
 | |
| static inline struct __timespec64
 | |
| timeval64_to_timespec64 (const struct __timeval64 tv64)
 | |
| {
 | |
|   struct __timespec64 ts64;
 | |
| 
 | |
|   ts64.tv_sec = tv64.tv_sec;
 | |
|   ts64.tv_nsec = tv64.tv_usec * 1000;
 | |
| 
 | |
|   return ts64;
 | |
| }
 | |
| 
 | |
| /* Convert a known valid struct timespec into a struct __timespec64.  */
 | |
| static inline struct __timespec64
 | |
| valid_timespec_to_timespec64 (const struct timespec ts)
 | |
| {
 | |
|   struct __timespec64 ts64;
 | |
| 
 | |
|   ts64.tv_sec = ts.tv_sec;
 | |
|   ts64.tv_nsec = ts.tv_nsec;
 | |
| 
 | |
|   return ts64;
 | |
| }
 | |
| 
 | |
| /* Convert a valid and within range of struct timespec, struct
 | |
|    __timespec64 into a struct timespec.  */
 | |
| static inline struct timespec
 | |
| valid_timespec64_to_timespec (const struct __timespec64 ts64)
 | |
| {
 | |
|   struct timespec ts;
 | |
| 
 | |
|   ts.tv_sec = (time_t) ts64.tv_sec;
 | |
|   ts.tv_nsec = ts64.tv_nsec;
 | |
| 
 | |
|   return ts;
 | |
| }
 | |
| 
 | |
| /* Convert a valid and within range of struct timeval struct
 | |
|    __timespec64 into a struct timeval.  */
 | |
| static inline struct timeval
 | |
| valid_timespec64_to_timeval (const struct __timespec64 ts64)
 | |
| {
 | |
|   struct timeval tv;
 | |
| 
 | |
|   tv.tv_sec = (time_t) ts64.tv_sec;
 | |
|   tv.tv_usec = ts64.tv_nsec / 1000;
 | |
| 
 | |
|   return tv;
 | |
| }
 | |
| 
 | |
| /* Convert a struct __timespec64 into a struct __timeval64.  */
 | |
| static inline struct __timeval64
 | |
| timespec64_to_timeval64 (const struct __timespec64 ts64)
 | |
| {
 | |
|   struct __timeval64 tv64;
 | |
| 
 | |
|   tv64.tv_sec = ts64.tv_sec;
 | |
|   tv64.tv_usec = ts64.tv_nsec / 1000;
 | |
| 
 | |
|   return tv64;
 | |
| }
 | |
| 
 | |
| /* A version of 'struct timeval' with 32-bit time_t
 | |
|    and suseconds_t.  */
 | |
| struct __timeval32
 | |
| {
 | |
|   int32_t tv_sec;         /* Seconds.  */
 | |
|   int32_t tv_usec;        /* Microseconds.  */
 | |
| };
 | |
| 
 | |
| /* Conversion functions for converting to/from __timeval32  */
 | |
| static inline struct __timeval64
 | |
| valid_timeval32_to_timeval64 (const struct __timeval32 tv)
 | |
| {
 | |
|   return (struct __timeval64) { tv.tv_sec, tv.tv_usec };
 | |
| }
 | |
| 
 | |
| static inline struct __timeval32
 | |
| valid_timeval64_to_timeval32 (const struct __timeval64 tv64)
 | |
| {
 | |
|   return (struct __timeval32) { tv64.tv_sec, tv64.tv_usec };
 | |
| }
 | |
| 
 | |
| static inline struct timeval
 | |
| valid_timeval32_to_timeval (const struct __timeval32 tv)
 | |
| {
 | |
|   return (struct timeval) { tv.tv_sec, tv.tv_usec };
 | |
| }
 | |
| 
 | |
| static inline struct __timeval32
 | |
| valid_timeval_to_timeval32 (const struct timeval tv)
 | |
| {
 | |
|   return (struct __timeval32) { tv.tv_sec, tv.tv_usec };
 | |
| }
 | |
| 
 | |
| static inline struct timespec
 | |
| valid_timeval32_to_timespec (const struct __timeval32 tv)
 | |
| {
 | |
|   return (struct timespec) { tv.tv_sec, tv.tv_usec * 1000 };
 | |
| }
 | |
| 
 | |
| static inline struct __timeval32
 | |
| valid_timespec_to_timeval32 (const struct timespec ts)
 | |
| {
 | |
|   return (struct __timeval32) { (time_t) ts.tv_sec, ts.tv_nsec / 1000 };
 | |
| }
 | |
| 
 | |
| static inline struct __timeval64
 | |
| valid_timespec_to_timeval64 (const struct timespec ts)
 | |
| {
 | |
|   return (struct __timeval64) { (time_t) ts.tv_sec, ts.tv_nsec / 1000 };
 | |
| }
 | |
| 
 | |
| /* Check if a value is in the valid nanoseconds range. Return true if
 | |
|    it is, false otherwise.  */
 | |
| static inline bool
 | |
| valid_nanoseconds (__syscall_slong_t ns)
 | |
| {
 | |
|   return __glibc_likely (0 <= ns && ns < 1000000000);
 | |
| }
 | |
| 
 | |
| /* Helper function to get time in seconds, similar to time.  */
 | |
| static inline time_t
 | |
| time_now (void)
 | |
| {
 | |
|   struct timespec ts;
 | |
|   __clock_gettime (TIME_CLOCK_GETTIME_CLOCKID, &ts);
 | |
|   return ts.tv_sec;
 | |
| }
 | |
| 
 | |
| static inline __time64_t
 | |
| time64_now (void)
 | |
| {
 | |
|   struct __timespec64 ts;
 | |
|   __clock_gettime64 (TIME_CLOCK_GETTIME_CLOCKID, &ts);
 | |
|   return ts.tv_sec;
 | |
| }
 | |
| 
 | |
| #define NSEC_PER_SEC    1000000000L  /* Nanoseconds per second.  */
 | |
| #define USEC_PER_SEC    1000000L     /* Microseconds per second.  */
 | |
| #define NSEC_PER_USEC   1000L        /* Nanoseconds per microsecond.  */
 | |
| 
 | |
| #endif
 | |
| 
 | |
| #endif
 |