diff options
-rw-r--r-- | lib/util/time.c | 117 | ||||
-rw-r--r-- | lib/util/time.h | 10 | ||||
-rw-r--r-- | source3/include/proto.h | 10 | ||||
-rw-r--r-- | source3/lib/time.c | 146 |
4 files changed, 127 insertions, 156 deletions
diff --git a/lib/util/time.c b/lib/util/time.c index 31aa05cd0f5..7216ea6e08b 100644 --- a/lib/util/time.c +++ b/lib/util/time.c @@ -817,4 +817,121 @@ bool null_timespec(struct timespec ts) ts.tv_sec == (time_t)-1; } +/**************************************************************************** + Convert a normalized timeval to a timespec. +****************************************************************************/ +struct timespec convert_timeval_to_timespec(const struct timeval tv) +{ + struct timespec ts; + ts.tv_sec = tv.tv_sec; + ts.tv_nsec = tv.tv_usec * 1000; + return ts; +} + +/**************************************************************************** + Convert a normalized timespec to a timeval. +****************************************************************************/ + +struct timeval convert_timespec_to_timeval(const struct timespec ts) +{ + struct timeval tv; + tv.tv_sec = ts.tv_sec; + tv.tv_usec = ts.tv_nsec / 1000; + return tv; +} + +/**************************************************************************** + Return a timespec for the current time +****************************************************************************/ + +struct timespec timespec_current(void) +{ + struct timespec ts; + clock_gettime(CLOCK_REALTIME, &ts); + return ts; +} + +/**************************************************************************** + Return the lesser of two timespecs. +****************************************************************************/ + +struct timespec timespec_min(const struct timespec *ts1, + const struct timespec *ts2) +{ + if (ts1->tv_sec < ts2->tv_sec) return *ts1; + if (ts1->tv_sec > ts2->tv_sec) return *ts2; + if (ts1->tv_nsec < ts2->tv_nsec) return *ts1; + return *ts2; +} + +/**************************************************************************** + compare two timespec structures. + Return -1 if ts1 < ts2 + Return 0 if ts1 == ts2 + Return 1 if ts1 > ts2 +****************************************************************************/ + +int timespec_compare(const struct timespec *ts1, const struct timespec *ts2) +{ + if (ts1->tv_sec > ts2->tv_sec) return 1; + if (ts1->tv_sec < ts2->tv_sec) return -1; + if (ts1->tv_nsec > ts2->tv_nsec) return 1; + if (ts1->tv_nsec < ts2->tv_nsec) return -1; + return 0; +} + +/**************************************************************************** + Round up a timespec if nsec > 500000000, round down if lower, + then zero nsec. +****************************************************************************/ + +void round_timespec_to_sec(struct timespec *ts) +{ + ts->tv_sec = convert_timespec_to_time_t(*ts); + ts->tv_nsec = 0; +} + +/**************************************************************************** + Round a timespec to usec value. +****************************************************************************/ + +void round_timespec_to_usec(struct timespec *ts) +{ + struct timeval tv = convert_timespec_to_timeval(*ts); + *ts = convert_timeval_to_timespec(tv); + while (ts->tv_nsec > 1000000000) { + ts->tv_sec += 1; + ts->tv_nsec -= 1000000000; + } +} + +/**************************************************************************** + Put a 8 byte filetime from a struct timespec. Uses GMT. +****************************************************************************/ + +void unix_timespec_to_nt_time(NTTIME *nt, struct timespec ts) +{ + uint64_t d; + + if (ts.tv_sec ==0 && ts.tv_nsec == 0) { + *nt = 0; + return; + } + if (ts.tv_sec == TIME_T_MAX) { + *nt = 0x7fffffffffffffffLL; + return; + } + if (ts.tv_sec == (time_t)-1) { + *nt = (uint64_t)-1; + return; + } + + d = ts.tv_sec; + d += TIME_FIXUP_CONSTANT_INT; + d *= 1000*1000*10; + /* d is now in 100ns units. */ + d += (ts.tv_nsec / 100); + + *nt = d; +} diff --git a/lib/util/time.h b/lib/util/time.h index 204c261c1d2..047daecdbff 100644 --- a/lib/util/time.h +++ b/lib/util/time.h @@ -300,4 +300,14 @@ struct timespec convert_time_t_to_timespec(time_t t); bool null_timespec(struct timespec ts); +struct timespec convert_timeval_to_timespec(const struct timeval tv); +struct timeval convert_timespec_to_timeval(const struct timespec ts); +struct timespec timespec_current(void); +struct timespec timespec_min(const struct timespec *ts1, + const struct timespec *ts2); +int timespec_compare(const struct timespec *ts1, const struct timespec *ts2); +void round_timespec_to_sec(struct timespec *ts); +void round_timespec_to_usec(struct timespec *ts); +void unix_timespec_to_nt_time(NTTIME *nt, struct timespec ts); + #endif /* _SAMBA_TIME_H_ */ diff --git a/source3/include/proto.h b/source3/include/proto.h index d3ea6fc8834..f6e72366646 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -463,22 +463,12 @@ time_t make_unix_date3(const void *date_ptr, int zone_offset); time_t srv_make_unix_date(const void *date_ptr); time_t srv_make_unix_date2(const void *date_ptr); time_t srv_make_unix_date3(const void *date_ptr); -struct timespec convert_time_t_to_timespec(time_t t); -struct timespec convert_timeval_to_timespec(const struct timeval tv); -struct timeval convert_timespec_to_timeval(const struct timespec ts); -struct timespec timespec_current(void); -struct timespec timespec_min(const struct timespec *ts1, - const struct timespec *ts2); -int timespec_compare(const struct timespec *ts1, const struct timespec *ts2); -void round_timespec_to_sec(struct timespec *ts); -void round_timespec_to_usec(struct timespec *ts); struct timespec interpret_long_date(const char *p); void TimeInit(void); void get_process_uptime(struct timeval *ret_time); void get_startup_time(struct timeval *ret_time); time_t nt_time_to_unix_abs(const NTTIME *nt); time_t uint64s_nt_time_to_unix_abs(const uint64_t *src); -void unix_timespec_to_nt_time(NTTIME *nt, struct timespec ts); void unix_to_nt_time_abs(NTTIME *nt, time_t t); const char *time_to_asc(const time_t t); const char *display_time(NTTIME nttime); diff --git a/source3/lib/time.c b/source3/lib/time.c index db9ec0a34fb..7fe53928ab7 100644 --- a/source3/lib/time.c +++ b/source3/lib/time.c @@ -264,95 +264,6 @@ time_t srv_make_unix_date3(const void *date_ptr) } /**************************************************************************** - Convert a normalized timeval to a timespec. -****************************************************************************/ - -struct timespec convert_timeval_to_timespec(const struct timeval tv) -{ - struct timespec ts; - ts.tv_sec = tv.tv_sec; - ts.tv_nsec = tv.tv_usec * 1000; - return ts; -} - -/**************************************************************************** - Convert a normalized timespec to a timeval. -****************************************************************************/ - -struct timeval convert_timespec_to_timeval(const struct timespec ts) -{ - struct timeval tv; - tv.tv_sec = ts.tv_sec; - tv.tv_usec = ts.tv_nsec / 1000; - return tv; -} - -/**************************************************************************** - Return a timespec for the current time -****************************************************************************/ - -struct timespec timespec_current(void) -{ - struct timespec ts; - clock_gettime(CLOCK_REALTIME, &ts); - return ts; -} - -/**************************************************************************** - Return the lesser of two timespecs. -****************************************************************************/ - -struct timespec timespec_min(const struct timespec *ts1, - const struct timespec *ts2) -{ - if (ts1->tv_sec < ts2->tv_sec) return *ts1; - if (ts1->tv_sec > ts2->tv_sec) return *ts2; - if (ts1->tv_nsec < ts2->tv_nsec) return *ts1; - return *ts2; -} - -/**************************************************************************** - compare two timespec structures. - Return -1 if ts1 < ts2 - Return 0 if ts1 == ts2 - Return 1 if ts1 > ts2 -****************************************************************************/ - -int timespec_compare(const struct timespec *ts1, const struct timespec *ts2) -{ - if (ts1->tv_sec > ts2->tv_sec) return 1; - if (ts1->tv_sec < ts2->tv_sec) return -1; - if (ts1->tv_nsec > ts2->tv_nsec) return 1; - if (ts1->tv_nsec < ts2->tv_nsec) return -1; - return 0; -} - -/**************************************************************************** - Round up a timespec if nsec > 500000000, round down if lower, - then zero nsec. -****************************************************************************/ - -void round_timespec_to_sec(struct timespec *ts) -{ - ts->tv_sec = convert_timespec_to_time_t(*ts); - ts->tv_nsec = 0; -} - -/**************************************************************************** - Round a timespec to usec value. -****************************************************************************/ - -void round_timespec_to_usec(struct timespec *ts) -{ - struct timeval tv = convert_timespec_to_timeval(*ts); - *ts = convert_timeval_to_timespec(tv); - while (ts->tv_nsec > 1000000000) { - ts->tv_sec += 1; - ts->tv_nsec -= 1000000000; - } -} - -/**************************************************************************** Interprets an nt time into a unix struct timespec. Differs from nt_time_to_unix in that an 8 byte value of 0xffffffffffffffff will be returned as (time_t)-1, whereas nt_time_to_unix returns 0 in this case. @@ -469,63 +380,6 @@ time_t uint64s_nt_time_to_unix_abs(const uint64_t *src) } /**************************************************************************** - Put a 8 byte filetime from a struct timespec. Uses GMT. -****************************************************************************/ - -void unix_timespec_to_nt_time(NTTIME *nt, struct timespec ts) -{ - uint64_t d; - - if (ts.tv_sec ==0 && ts.tv_nsec == 0) { - *nt = 0; - return; - } - if (ts.tv_sec == TIME_T_MAX) { - *nt = 0x7fffffffffffffffLL; - return; - } - if (ts.tv_sec == (time_t)-1) { - *nt = (uint64_t)-1; - return; - } - - d = ts.tv_sec; - d += TIME_FIXUP_CONSTANT_INT; - d *= 1000*1000*10; - /* d is now in 100ns units. */ - d += (ts.tv_nsec / 100); - - *nt = d; -} - -#if 0 -void nt_time_to_unix_timespec(struct timespec *ts, NTTIME t) -{ - if (ts == NULL) { - return; - } - - /* t starts in 100 nsec units since 1601-01-01. */ - - t *= 100; - /* t is now in nsec units since 1601-01-01. */ - - t -= TIME_FIXUP_CONSTANT*1000*1000*100; - /* t is now in nsec units since the UNIX epoch 1970-01-01. */ - - ts->tv_sec = t / 1000000000LL; - - if (TIME_T_MIN > ts->tv_sec || ts->tv_sec > TIME_T_MAX) { - ts->tv_sec = 0; - ts->tv_nsec = 0; - return; - } - - ts->tv_nsec = t - ts->tv_sec*1000000000LL; -} -#endif - -/**************************************************************************** Convert a time_t to a NTTIME structure This is an absolute version of the one above. |