time: Move time related functions to separate files
authorMartin Willi <martin@revosec.ch>
Wed, 15 Apr 2015 14:52:19 +0000 (16:52 +0200)
committerMartin Willi <martin@revosec.ch>
Thu, 16 Apr 2015 12:50:24 +0000 (14:50 +0200)
src/libstrongswan/Android.mk
src/libstrongswan/Makefile.am
src/libstrongswan/utils/utils.c
src/libstrongswan/utils/utils.h
src/libstrongswan/utils/utils/time.c [new file with mode: 0644]
src/libstrongswan/utils/utils/time.h [new file with mode: 0644]

index afd2f4a..bb21302 100644 (file)
@@ -41,7 +41,7 @@ utils/utils.c utils/chunk.c utils/debug.c utils/enum.c utils/identification.c \
 utils/lexparser.c utils/optionsfrom.c utils/capabilities.c utils/backtrace.c \
 utils/parser_helper.c utils/test.c utils/process.c utils/utils/strerror.c \
 utils/utils/atomics.c utils/utils/string.c utils/utils/memory.c \
-utils/utils/tty.c utils/utils/path.c utils/utils/status.c
+utils/utils/tty.c utils/utils/path.c utils/utils/status.c utils/utils/time.c
 
 libstrongswan_la_SOURCES += \
     threading/thread.c \
index aead047..17e3c80 100644 (file)
@@ -39,7 +39,7 @@ utils/utils.c utils/chunk.c utils/debug.c utils/enum.c utils/identification.c \
 utils/lexparser.c utils/optionsfrom.c utils/capabilities.c utils/backtrace.c \
 utils/parser_helper.c utils/test.c utils/process.c utils/utils/strerror.c \
 utils/utils/atomics.c utils/utils/string.c utils/utils/memory.c \
-utils/utils/tty.c utils/utils/path.c utils/utils/status.c
+utils/utils/tty.c utils/utils/path.c utils/utils/status.c utils/utils/time.c
 
 if !USE_WINDOWS
   libstrongswan_la_SOURCES += \
@@ -111,7 +111,7 @@ utils/parser_helper.h utils/test.h utils/integrity_checker.h utils/process.h \
 utils/utils/strerror.h utils/compat/windows.h utils/compat/apple.h \
 utils/utils/atomics.h utils/utils/types.h utils/utils/byteorder.h \
 utils/utils/string.h utils/utils/memory.h utils/utils/tty.h utils/utils/path.h \
-utils/utils/status.h utils/utils/object.h
+utils/utils/status.h utils/utils/object.h utils/utils/time.h
 endif
 
 library.lo :   $(top_builddir)/config.status
index 399b915..3de663a 100644 (file)
  * for more details.
  */
 
-#ifdef WIN32
-/* for GetTickCount64, Windows 7 */
-# define _WIN32_WINNT 0x0601
-#endif
-
 #include "utils.h"
 
 #include <string.h>
@@ -209,58 +204,6 @@ void closefrom(int lowfd)
 #endif /* HAVE_CLOSEFROM */
 
 /**
- * Return monotonic time
- */
-time_t time_monotonic(timeval_t *tv)
-{
-#ifdef WIN32
-       ULONGLONG ms;
-       time_t s;
-
-       ms = GetTickCount64();
-       s = ms / 1000;
-       if (tv)
-       {
-               tv->tv_sec = s;
-               tv->tv_usec = (ms - (s * 1000)) * 1000;
-       }
-       return s;
-#else /* !WIN32 */
-#if defined(HAVE_CLOCK_GETTIME) && \
-       (defined(HAVE_CONDATTR_CLOCK_MONOTONIC) || \
-        defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC))
-       /* as we use time_monotonic() for condvar operations, we use the
-        * monotonic time source only if it is also supported by pthread. */
-       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_GETTIME && (...) */
-       /* 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.
-        * But keep in mind: we need the same time source here as in condvar! */
-       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;
-#endif /* !WIN32 */
-}
-
-/**
  * return null
  */
 void *return_null()
@@ -314,68 +257,3 @@ void utils_deinit()
        atomics_deinit();
        strerror_deinit();
 }
-
-/**
- * Described in header.
- */
-int time_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
-                                        const void *const *args)
-{
-       static const char* months[] = {
-               "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-       };
-       time_t *time = *((time_t**)(args[0]));
-       bool utc = *((int*)(args[1]));
-       struct tm t, *ret = NULL;
-
-       if (*time != UNDEFINED_TIME)
-       {
-               if (utc)
-               {
-                       ret = gmtime_r(time, &t);
-               }
-               else
-               {
-                       ret = localtime_r(time, &t);
-               }
-       }
-       if (ret == NULL)
-       {
-               return print_in_hook(data, "--- -- --:--:--%s----",
-                                                        utc ? " UTC " : " ");
-       }
-       return print_in_hook(data, "%s %02d %02d:%02d:%02d%s%04d",
-                                                months[t.tm_mon], t.tm_mday, t.tm_hour, t.tm_min,
-                                                t.tm_sec, utc ? " UTC " : " ", t.tm_year + 1900);
-}
-
-/**
- * Described in header.
- */
-int time_delta_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
-                                                  const void *const *args)
-{
-       char* unit = "second";
-       time_t *arg1 = *((time_t**)(args[0]));
-       time_t *arg2 = *((time_t**)(args[1]));
-       u_int64_t delta = llabs(*arg1 - *arg2);
-
-       if (delta > 2 * 60 * 60 * 24)
-       {
-               delta /= 60 * 60 * 24;
-               unit = "day";
-       }
-       else if (delta > 2 * 60 * 60)
-       {
-               delta /= 60 * 60;
-               unit = "hour";
-       }
-       else if (delta > 2 * 60)
-       {
-               delta /= 60;
-               unit = "minute";
-       }
-       return print_in_hook(data, "%" PRIu64 " %s%s", delta, unit,
-                                                (delta == 1) ? "" : "s");
-}
index 38e06bd..f74e301 100644 (file)
@@ -84,6 +84,7 @@
 #include "utils/status.h"
 #include "utils/object.h"
 #include "utils/path.h"
+#include "utils/time.h"
 #include "utils/tty.h"
 #ifdef __APPLE__
 # include "compat/apple.h"
@@ -163,26 +164,6 @@ void utils_deinit();
 #define ignore_result(call) { if(call){}; }
 
 /**
- * time_t not defined
- */
-#define UNDEFINED_TIME 0
-
-/**
- * Maximum time since epoch causing wrap-around on Jan 19 03:14:07 UTC 2038
- */
-#define TIME_32_BIT_SIGNED_MAX 0x7fffffff
-
-/**
- * Handle struct timeval like an own type.
- */
-typedef struct timeval timeval_t;
-
-/**
- * Handle struct timespec like an own type.
- */
-typedef struct timespec timespec_t;
-
-/**
  * malloc(), but returns aligned memory.
  *
  * The returned pointer must be freed using free_align(), not free().
@@ -215,34 +196,6 @@ void closefrom(int lowfd);
 #endif
 
 /**
- * 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);
-
-/**
- * Add the given number of milliseconds to the given timeval struct
- *
- * @param tv           timeval struct to modify
- * @param ms           number of milliseconds
- */
-static inline void timeval_add_ms(timeval_t *tv, u_int ms)
-{
-       tv->tv_usec += ms * 1000;
-       while (tv->tv_usec >= 1000000 /* 1s */)
-       {
-               tv->tv_usec -= 1000000;
-               tv->tv_sec++;
-       }
-}
-
-/**
  * returns null
  */
 void *return_null();
@@ -289,22 +242,4 @@ static inline size_t round_down(size_t size, size_t alignment)
        return size - (size % alignment);
 }
 
-/**
- * printf hook for time_t.
- *
- * Arguments are:
- *     time_t* time, bool utc
- */
-int time_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
-                                        const void *const *args);
-
-/**
- * printf hook for time_t deltas.
- *
- * Arguments are:
- *     time_t* begin, time_t* end
- */
-int time_delta_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
-                                                  const void *const *args);
-
 #endif /** UTILS_H_ @}*/
diff --git a/src/libstrongswan/utils/utils/time.c b/src/libstrongswan/utils/utils/time.c
new file mode 100644 (file)
index 0000000..c67ae93
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2008-2014 Tobias Brunner
+ * Copyright (C) 2005-2008 Martin Willi
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+#ifdef WIN32
+/* for GetTickCount64, Windows 7 */
+# define _WIN32_WINNT 0x0601
+#endif
+
+#define _GNU_SOURCE
+#include <utils/utils.h>
+
+#include <inttypes.h>
+#include <time.h>
+
+/**
+ * Return monotonic time
+ */
+time_t time_monotonic(timeval_t *tv)
+{
+#ifdef WIN32
+       ULONGLONG ms;
+       time_t s;
+
+       ms = GetTickCount64();
+       s = ms / 1000;
+       if (tv)
+       {
+               tv->tv_sec = s;
+               tv->tv_usec = (ms - (s * 1000)) * 1000;
+       }
+       return s;
+#else /* !WIN32 */
+#if defined(HAVE_CLOCK_GETTIME) && \
+       (defined(HAVE_CONDATTR_CLOCK_MONOTONIC) || \
+        defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC))
+       /* as we use time_monotonic() for condvar operations, we use the
+        * monotonic time source only if it is also supported by pthread. */
+       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_GETTIME && (...) */
+       /* 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.
+        * But keep in mind: we need the same time source here as in condvar! */
+       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;
+#endif /* !WIN32 */
+}
+
+/**
+ * Described in header.
+ */
+int time_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
+                                        const void *const *args)
+{
+       static const char* months[] = {
+               "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+               "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+       };
+       time_t *time = *((time_t**)(args[0]));
+       bool utc = *((int*)(args[1]));
+       struct tm t, *ret = NULL;
+
+       if (*time != UNDEFINED_TIME)
+       {
+               if (utc)
+               {
+                       ret = gmtime_r(time, &t);
+               }
+               else
+               {
+                       ret = localtime_r(time, &t);
+               }
+       }
+       if (ret == NULL)
+       {
+               return print_in_hook(data, "--- -- --:--:--%s----",
+                                                        utc ? " UTC " : " ");
+       }
+       return print_in_hook(data, "%s %02d %02d:%02d:%02d%s%04d",
+                                                months[t.tm_mon], t.tm_mday, t.tm_hour, t.tm_min,
+                                                t.tm_sec, utc ? " UTC " : " ", t.tm_year + 1900);
+}
+
+/**
+ * Described in header.
+ */
+int time_delta_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
+                                                  const void *const *args)
+{
+       char* unit = "second";
+       time_t *arg1 = *((time_t**)(args[0]));
+       time_t *arg2 = *((time_t**)(args[1]));
+       u_int64_t delta = llabs(*arg1 - *arg2);
+
+       if (delta > 2 * 60 * 60 * 24)
+       {
+               delta /= 60 * 60 * 24;
+               unit = "day";
+       }
+       else if (delta > 2 * 60 * 60)
+       {
+               delta /= 60 * 60;
+               unit = "hour";
+       }
+       else if (delta > 2 * 60)
+       {
+               delta /= 60;
+               unit = "minute";
+       }
+       return print_in_hook(data, "%" PRIu64 " %s%s", delta, unit,
+                                                (delta == 1) ? "" : "s");
+}
diff --git a/src/libstrongswan/utils/utils/time.h b/src/libstrongswan/utils/utils/time.h
new file mode 100644 (file)
index 0000000..2626d9a
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2008-2014 Tobias Brunner
+ * Copyright (C) 2008 Martin Willi
+ * Hochschule fuer Technik Rapperswil
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ */
+
+/**
+ * @defgroup time_i time
+ * @{ @ingroup utils_i
+ */
+
+#ifndef TIME_H_
+#define TIME_H_
+
+/**
+ * time_t not defined
+ */
+#define UNDEFINED_TIME 0
+
+/**
+ * Maximum time since epoch causing wrap-around on Jan 19 03:14:07 UTC 2038
+ */
+#define TIME_32_BIT_SIGNED_MAX 0x7fffffff
+
+/**
+ * Handle struct timeval like an own type.
+ */
+typedef struct timeval timeval_t;
+
+/**
+ * Handle struct timespec like an own type.
+ */
+typedef struct timespec timespec_t;
+
+/**
+ * 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);
+
+/**
+ * Add the given number of milliseconds to the given timeval struct
+ *
+ * @param tv           timeval struct to modify
+ * @param ms           number of milliseconds
+ */
+static inline void timeval_add_ms(timeval_t *tv, u_int ms)
+{
+       tv->tv_usec += ms * 1000;
+       while (tv->tv_usec >= 1000000 /* 1s */)
+       {
+               tv->tv_usec -= 1000000;
+               tv->tv_sec++;
+       }
+}
+
+/**
+ * printf hook for time_t.
+ *
+ * Arguments are:
+ *     time_t* time, bool utc
+ */
+int time_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
+                                        const void *const *args);
+
+/**
+ * printf hook for time_t deltas.
+ *
+ * Arguments are:
+ *     time_t* begin, time_t* end
+ */
+int time_delta_printf_hook(printf_hook_data_t *data, printf_hook_spec_t *spec,
+                                                  const void *const *args);
+
+#endif /** TIME_H_ @} */