diff options
author | Alon Bar-Lev <alon.barlev@gmail.com> | 2012-02-29 22:12:15 +0200 |
---|---|---|
committer | David Sommerseth <davids@redhat.com> | 2012-03-22 22:53:39 +0100 |
commit | 3d163bc544ab9dfc62d9a2c865f8abb865bf6eb3 (patch) | |
tree | d4ec60463290c45c2b201797099214d854edc042 /src/compat | |
parent | dc81e743989640cc681a40e69455cc9fc736ab9c (diff) | |
download | openvpn-3d163bc544ab9dfc62d9a2c865f8abb865bf6eb3.tar.gz openvpn-3d163bc544ab9dfc62d9a2c865f8abb865bf6eb3.tar.xz openvpn-3d163bc544ab9dfc62d9a2c865f8abb865bf6eb3.zip |
build: move gettimeofday() emulation to compat
Remove all references to gettimeofday() from main project.
SIDE EFFECT: mingw will use its own internal gettimeofday().
Signed-off-by: Alon Bar-Lev <alon.barlev@gmail.com>
Acked-by: David Sommerseth <davids@redhat.com>
Signed-off-by: David Sommerseth <davids@redhat.com>
Diffstat (limited to 'src/compat')
-rw-r--r-- | src/compat/Makefile.am | 3 | ||||
-rw-r--r-- | src/compat/compat-gettimeofday.c | 131 | ||||
-rw-r--r-- | src/compat/compat.h | 13 | ||||
-rw-r--r-- | src/compat/compat.vcproj | 4 |
4 files changed, 150 insertions, 1 deletions
diff --git a/src/compat/Makefile.am b/src/compat/Makefile.am index e33e5e7..5e9db5f 100644 --- a/src/compat/Makefile.am +++ b/src/compat/Makefile.am @@ -20,4 +20,5 @@ noinst_LTLIBRARIES = libcompat.la libcompat_la_SOURCES = \ compat.h \ compat-dirname.c \ - compat-basename.c + compat-basename.c \ + compat-gettimeofday.c diff --git a/src/compat/compat-gettimeofday.c b/src/compat/compat-gettimeofday.c new file mode 100644 index 0000000..0f32d5d --- /dev/null +++ b/src/compat/compat-gettimeofday.c @@ -0,0 +1,131 @@ +/* + * OpenVPN -- An application to securely tunnel IP networks + * over a single UDP port, with support for SSL/TLS-based + * session authentication and key exchange, + * packet encryption, packet authentication, and + * packet compression. + * + * Copyright (C) 2002-2010 OpenVPN Technologies, Inc. <sales@openvpn.net> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation. + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program (see the file COPYING included with this + * distribution); if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#elif defined(_MSC_VER) +#include "config-msvc.h" +#endif + +#ifndef HAVE_GETTIMEOFDAY + +#include "compat.h" + +#ifdef WIN32 +/* + * NOTICE: mingw has much faster gettimeofday! + * autoconf will set HAVE_GETTIMEOFDAY + */ + +#include <windows.h> +#include <time.h> + +static time_t gtc_base = 0; +static DWORD gtc_last = 0; +static time_t last_sec = 0; +static unsigned int last_msec = 0; +static int bt_last = 0; + +static void +gettimeofday_calibrate (void) +{ + const time_t t = time(NULL); + const DWORD gtc = GetTickCount(); + gtc_base = t - gtc/1000; + gtc_last = gtc; +} + +/* + * Rewritten by JY for OpenVPN 2.1, after I realized that + * QueryPerformanceCounter takes nearly 2 orders of magnitude + * more processor cycles than GetTickCount. + */ +int +gettimeofday (struct timeval *tv, void *tz) +{ + const DWORD gtc = GetTickCount(); + int bt = 0; + time_t sec; + unsigned int msec; + const int backtrack_hold_seconds = 10; + + (void)tz; + + /* recalibrate at the dreaded 49.7 day mark */ + if (!gtc_base || gtc < gtc_last) + gettimeofday_calibrate (); + gtc_last = gtc; + + sec = gtc_base + gtc / 1000; + msec = gtc % 1000; + + if (sec == last_sec) + { + if (msec < last_msec) + { + msec = last_msec; + bt = 1; + } + } + else if (sec < last_sec) + { + /* We try to dampen out backtracks of less than backtrack_hold_seconds. + Larger backtracks will be passed through and dealt with by the + TIME_BACKTRACK_PROTECTION code (if enabled) */ + if (sec > last_sec - backtrack_hold_seconds) + { + sec = last_sec; + msec = last_msec; + } + bt = 1; + } + + tv->tv_sec = (long)last_sec = (long)sec; + tv->tv_usec = (last_msec = msec) * 1000; + + if (bt && !bt_last) + gettimeofday_calibrate (); + bt_last = bt; + + return 0; +} + +#else + +#ifdef HAVE_TIME_H +#include <time.h> +#endif + +int +gettimeofday (struct timeval *tv, void *tz) +{ + (void)tz; + tv->tv_sec = time(NULL); + tv->tv_usec = 0; + return 0; +} + +#endif /* WIN32 */ + +#endif /* HAVE_GETTIMEOFDAY */ diff --git a/src/compat/compat.h b/src/compat/compat.h index 57754da..3f9ac31 100644 --- a/src/compat/compat.h +++ b/src/compat/compat.h @@ -25,6 +25,15 @@ #ifndef COMPAT_H #define COMPAT_H +#ifdef HAVE_WINSOCK2_H +/* timeval */ +#include <winsock2.h> +#endif + +#ifdef HAVE_SYS_TIME_H +#include <sys/time.h> +#endif + #ifndef HAVE_DIRNAME char * dirname(char *str); #endif /* HAVE_DIRNAME */ @@ -33,4 +42,8 @@ char * dirname(char *str); char * basename(char *str); #endif /* HAVE_BASENAME */ +#ifndef HAVE_GETTIMEOFDAY +int gettimeofday (struct timeval *tv, void *tz); +#endif + #endif /* COMPAT_H */ diff --git a/src/compat/compat.vcproj b/src/compat/compat.vcproj index 1ece749..235163c 100644 --- a/src/compat/compat.vcproj +++ b/src/compat/compat.vcproj @@ -158,6 +158,10 @@ RelativePath=".\compat-dirname.c" > </File> + <File + RelativePath=".\compat-gettimeofday.c" + > + </File> </Filter> <Filter Name="Header Files" |