mirror of
https://github.com/strongswan/strongswan.git
synced 2025-10-08 00:02:03 -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/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/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/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 += \
|
libstrongswan_la_SOURCES += \
|
||||||
threading/thread.c \
|
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/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/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/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
|
if !USE_WINDOWS
|
||||||
libstrongswan_la_SOURCES += \
|
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/strerror.h utils/compat/windows.h utils/compat/apple.h \
|
||||||
utils/utils/atomics.h utils/utils/types.h utils/utils/byteorder.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/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
|
endif
|
||||||
|
|
||||||
library.lo : $(top_builddir)/config.status
|
library.lo : $(top_builddir)/config.status
|
||||||
|
@ -14,11 +14,6 @@
|
|||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
/* for GetTickCount64, Windows 7 */
|
|
||||||
# define _WIN32_WINNT 0x0601
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -208,58 +203,6 @@ void closefrom(int lowfd)
|
|||||||
}
|
}
|
||||||
#endif /* HAVE_CLOSEFROM */
|
#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
|
* return null
|
||||||
*/
|
*/
|
||||||
@ -314,68 +257,3 @@ void utils_deinit()
|
|||||||
atomics_deinit();
|
atomics_deinit();
|
||||||
strerror_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/status.h"
|
||||||
#include "utils/object.h"
|
#include "utils/object.h"
|
||||||
#include "utils/path.h"
|
#include "utils/path.h"
|
||||||
|
#include "utils/time.h"
|
||||||
#include "utils/tty.h"
|
#include "utils/tty.h"
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
# include "compat/apple.h"
|
# include "compat/apple.h"
|
||||||
@ -162,26 +163,6 @@ void utils_deinit();
|
|||||||
*/
|
*/
|
||||||
#define ignore_result(call) { if(call){}; }
|
#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.
|
* malloc(), but returns aligned memory.
|
||||||
*
|
*
|
||||||
@ -214,34 +195,6 @@ void wait_sigint();
|
|||||||
void closefrom(int lowfd);
|
void closefrom(int lowfd);
|
||||||
#endif
|
#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
|
* returns null
|
||||||
*/
|
*/
|
||||||
@ -289,22 +242,4 @@ static inline size_t round_down(size_t size, size_t alignment)
|
|||||||
return size - (size % 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_ @}*/
|
#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