mirror of
https://github.com/strongswan/strongswan.git
synced 2025-10-06 00:00:47 -04:00
time: Move time related functions to separate files
This commit is contained in:
parent
1f2326ce58
commit
eaa02bc925
@ -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 \
|
||||
|
@ -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
|
||||
|
@ -14,11 +14,6 @@
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#ifdef WIN32
|
||||
/* for GetTickCount64, Windows 7 */
|
||||
# define _WIN32_WINNT 0x0601
|
||||
#endif
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
#include <string.h>
|
||||
@ -208,58 +203,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
|
||||
*/
|
||||
@ -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");
|
||||
}
|
||||
|
@ -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"
|
||||
@ -162,26 +163,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.
|
||||
*
|
||||
@ -214,34 +195,6 @@ void wait_sigint();
|
||||
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
|
||||
*/
|
||||
@ -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_ @}*/
|
||||
|
143
src/libstrongswan/utils/utils/time.c
Normal file
143
src/libstrongswan/utils/utils/time.c
Normal file
@ -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");
|
||||
}
|
91
src/libstrongswan/utils/utils/time.h
Normal file
91
src/libstrongswan/utils/utils/time.h
Normal file
@ -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_ @} */
|
Loading…
x
Reference in New Issue
Block a user