From 3f310c0d1f664f5811327c5a89b5d6c2f3e42bdc Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Mon, 31 Aug 2009 15:03:35 +0200 Subject: implemented a monotonic timestamping function, unaffected from system time changes --- src/libstrongswan/utils.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/libstrongswan/utils.c') diff --git a/src/libstrongswan/utils.c b/src/libstrongswan/utils.c index 305841172..91242da2e 100644 --- a/src/libstrongswan/utils.c +++ b/src/libstrongswan/utils.c @@ -162,6 +162,39 @@ bool mkdir_p(const char *path, mode_t mode) return TRUE; } +/** + * Return monotonic time + */ +time_t time_monotonic(timeval_t *tv) +{ +#if defined(HAVE_CLOCK_GETTIME) + timespec_t ts; + + if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) + { + if (tv) + { + tv->tv_sec = ts.tv_sec; + tv->tv_usec = ts.tv_nsec / 1000; + } + return ts.tv_sec; + } +#endif /* HAVE_CLOCK_MONOTONIC */ + /* Fallback to non-monotonic timestamps: + * On MAC OS X, creating monotonic timestamps is rather difficult. We + * could use mach_absolute_time() and catch sleep/wakeup notifications. + * We stick to the simpler (non-monotonic) gettimeofday() for now. */ + if (!tv) + { + return time(NULL); + } + if (gettimeofday(tv, NULL) != 0) + { /* should actually never fail if passed pointers are valid */ + return -1; + } + return tv->tv_sec; +} + /** * return null */ -- cgit v1.2.3