aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-08-31 15:03:35 +0200
committerMartin Willi <martin@strongswan.org>2009-08-31 15:03:35 +0200
commit3f310c0d1f664f5811327c5a89b5d6c2f3e42bdc (patch)
treef49413d140adadc222c553b24dea6ea2a2577fed /src
parent1d39663f7a0bfd7399ea0db24e4190bdbf196c46 (diff)
downloadstrongswan-3f310c0d1f664f5811327c5a89b5d6c2f3e42bdc.tar.bz2
strongswan-3f310c0d1f664f5811327c5a89b5d6c2f3e42bdc.tar.xz
implemented a monotonic timestamping function, unaffected from system time changes
Diffstat (limited to 'src')
-rw-r--r--src/libstrongswan/Makefile.am2
-rw-r--r--src/libstrongswan/utils.c33
-rw-r--r--src/libstrongswan/utils.h17
3 files changed, 49 insertions, 3 deletions
diff --git a/src/libstrongswan/Makefile.am b/src/libstrongswan/Makefile.am
index 922a37614..570c14e40 100644
--- a/src/libstrongswan/Makefile.am
+++ b/src/libstrongswan/Makefile.am
@@ -49,7 +49,7 @@ utils/mutex.c utils/mutex.h \
utils/backtrace.c utils/backtrace.h \
plugins/plugin_loader.c plugins/plugin_loader.h plugins/plugin.h
-libstrongswan_la_LIBADD = -lpthread $(DLLIB) $(BTLIB) $(SOCKLIB)
+libstrongswan_la_LIBADD = -lpthread $(DLLIB) $(BTLIB) $(SOCKLIB) $(RTLIB)
INCLUDES = -I$(top_srcdir)/src/libstrongswan
AM_CFLAGS = \
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
@@ -163,6 +163,39 @@ bool mkdir_p(const char *path, mode_t mode)
}
/**
+ * 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
*/
void *return_null()
diff --git a/src/libstrongswan/utils.h b/src/libstrongswan/utils.h
index 5d273d272..6b0990f5e 100644
--- a/src/libstrongswan/utils.h
+++ b/src/libstrongswan/utils.h
@@ -25,6 +25,7 @@
#include <sys/types.h>
#include <stdlib.h>
#include <stddef.h>
+#include <sys/time.h>
#include <enum.h>
@@ -269,13 +270,25 @@ void *memstr(const void *haystack, const char *needle, size_t n);
/**
* Creates a directory and all required parent directories.
*
- * @param path path to the new directory
- * @param mode permissions of the new directory/directories
+ * @param path path to the new directory
+ * @param mode permissions of the new directory/directories
* @return TRUE on success
*/
bool mkdir_p(const char *path, mode_t mode);
/**
+ * Get a timestamp from a monotonic time source.
+ *
+ * While the time()/gettimeofday() functions are affected by leap seconds
+ * and system time changes, this function returns ever increasing monotonic
+ * time stamps.
+ *
+ * @param tv timeval struct receiving monotonic timestamps, or NULL
+ * @return monotonic timestamp in seconds
+ */
+time_t time_monotonic(timeval_t *tv);
+
+/**
* returns null
*/
void *return_null();