Skip to content

Commit

Permalink
build: move gettimeofday() emulation to compat
Browse files Browse the repository at this point in the history
Remove all references to gettimeofday() from main project.

SIDE EFFECT: mingw will use its own internal gettimeofday().

Signed-off-by: Alon Bar-Lev <[email protected]>
Acked-by: David Sommerseth <[email protected]>
Signed-off-by: David Sommerseth <[email protected]>
  • Loading branch information
alonbl authored and David Sommerseth committed Mar 22, 2012
1 parent dc81e74 commit 3d163bc
Show file tree
Hide file tree
Showing 17 changed files with 192 additions and 119 deletions.
1 change: 0 additions & 1 deletion config-msvc.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@
#define HAVE_CPP_VARARG_MACRO_ISO 1
#define HAVE_CTIME 1
#define HAVE_EVP_CIPHER_CTX_SET_KEY_LENGTH 1
#define HAVE_GETTIMEOFDAY 1
#define HAVE_IN_PKTINFO 1
#define HAVE_MEMSET 1
#define HAVE_PUTENV 1
Expand Down
1 change: 0 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -541,7 +541,6 @@ m4_define(
[setsockopt getsockopt getsockname poll]dnl
)
if test "${WIN32}" = "yes"; then
AC_DEFINE([HAVE_GETTIMEOFDAY], [1], [We fake gettimeofday for win32 at otime.c])
m4_foreach(
[F],
m4_split(SOCKET_FUNCS SOCKET_OPT_FUNCS),
Expand Down
3 changes: 2 additions & 1 deletion src/compat/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -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
131 changes: 131 additions & 0 deletions src/compat/compat-gettimeofday.c
Original file line number Diff line number Diff line change
@@ -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. <[email protected]>
*
* 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 */
13 changes: 13 additions & 0 deletions src/compat/compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand All @@ -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 */
4 changes: 4 additions & 0 deletions src/compat/compat.vcproj
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,10 @@
RelativePath=".\compat-dirname.c"
>
</File>
<File
RelativePath=".\compat-gettimeofday.c"
>
</File>
</Filter>
<Filter
Name="Header Files"
Expand Down
8 changes: 4 additions & 4 deletions src/openvpn/forward.c
Original file line number Diff line number Diff line change
Expand Up @@ -1094,7 +1094,7 @@ process_outgoing_link (struct context *c)
* Let the traffic shaper know how many bytes
* we wrote.
*/
#ifdef HAVE_GETTIMEOFDAY
#ifdef ENABLE_FEATURE_SHAPER
if (c->options.shaper)
shaper_wrote_bytes (&c->c2.shaper, BLEN (&c->c2.to_link)
+ datagram_overhead (c->options.ce.proto));
Expand Down Expand Up @@ -1383,7 +1383,7 @@ io_wait_dowork (struct context *c, const unsigned int flags)
* quota, don't send -- instead compute the delay we must wait
* until it will be OK to send the packet.
*/
#ifdef HAVE_GETTIMEOFDAY
#ifdef ENABLE_FEATURE_SHAPER
int delay = 0;

/* set traffic shaping delay in microseconds */
Expand All @@ -1398,9 +1398,9 @@ io_wait_dowork (struct context *c, const unsigned int flags)
{
shaper_soonest_event (&c->c2.timeval, delay);
}
#else /* HAVE_GETTIMEOFDAY */
#else /* ENABLE_FEATURE_SHAPER */
socket |= EVENT_WRITE;
#endif /* HAVE_GETTIMEOFDAY */
#endif /* ENABLE_FEATURE_SHAPER */
}
else
{
Expand Down
4 changes: 2 additions & 2 deletions src/openvpn/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -1180,7 +1180,7 @@ do_init_timers (struct context *c, bool deferred)
static void
do_init_traffic_shaper (struct context *c)
{
#ifdef HAVE_GETTIMEOFDAY
#ifdef ENABLE_FEATURE_SHAPER
/* initialize traffic shaper (i.e. transmit bandwidth limiter) */
if (c->options.shaper)
{
Expand Down Expand Up @@ -3056,7 +3056,7 @@ do_setup_fast_io (struct context *c)
msg (M_INFO, "NOTE: --fast-io is disabled since we are not using UDP");
else
{
#ifdef HAVE_GETTIMEOFDAY
#ifdef ENABLE_FEATURE_SHAPER
if (c->options.shaper)
msg (M_INFO, "NOTE: --fast-io is disabled since we are using --shaper");
else
Expand Down
5 changes: 0 additions & 5 deletions src/openvpn/misc.c
Original file line number Diff line number Diff line change
Expand Up @@ -720,18 +720,13 @@ openvpn_popen (const struct argv *a, const struct env_set *es)
void
init_random_seed(void)
{
#ifdef HAVE_GETTIMEOFDAY
struct timeval tv;

if (!gettimeofday (&tv, NULL))
{
const unsigned int seed = (unsigned int) tv.tv_sec ^ tv.tv_usec;
srandom (seed);
}
#else /* HAVE_GETTIMEOFDAY */
const time_t current = time (NULL);
srandom ((unsigned int)current);
#endif /* HAVE_GETTIMEOFDAY */
}

/* thread-safe strerror */
Expand Down
2 changes: 1 addition & 1 deletion src/openvpn/openvpn.h
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ struct context_2
struct frame frame_fragment_omit;
#endif

#ifdef HAVE_GETTIMEOFDAY
#ifdef ENABLE_FEATURE_SHAPER
/*
* Traffic shaper object.
*/
Expand Down
8 changes: 4 additions & 4 deletions src/openvpn/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -1455,7 +1455,7 @@ show_settings (const struct options *o)
SHOW_INT (ifconfig_ipv6_netbits);
SHOW_STR (ifconfig_ipv6_remote);

#ifdef HAVE_GETTIMEOFDAY
#ifdef ENABLE_FEATURE_SHAPER
SHOW_INT (shaper);
#endif
#ifdef ENABLE_OCC
Expand Down Expand Up @@ -4833,7 +4833,7 @@ add_option (struct options *options,
}
else if (streq (p[0], "shaper") && p[1])
{
#ifdef HAVE_GETTIMEOFDAY
#ifdef ENABLE_FEATURE_SHAPER
int shaper;

VERIFY_PERMISSION (OPT_P_SHAPER);
Expand All @@ -4845,11 +4845,11 @@ add_option (struct options *options,
goto err;
}
options->shaper = shaper;
#else /* HAVE_GETTIMEOFDAY */
#else /* ENABLE_FEATURE_SHAPER */
VERIFY_PERMISSION (OPT_P_GENERAL);
msg (msglevel, "--shaper requires the gettimeofday() function which is missing");
goto err;
#endif /* HAVE_GETTIMEOFDAY */
#endif /* ENABLE_FEATURE_SHAPER */
}
else if (streq (p[0], "port") && p[1])
{
Expand Down
4 changes: 2 additions & 2 deletions src/openvpn/options.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ struct options
const char *ifconfig_ipv6_remote;
bool ifconfig_noexec;
bool ifconfig_nowarn;
#ifdef HAVE_GETTIMEOFDAY
#ifdef ENABLE_FEATURE_SHAPER
int shaper;
#endif

Expand Down Expand Up @@ -680,7 +680,7 @@ struct options
#define ROUTE_OPTION_FLAGS(o) (0)
#endif

#ifdef HAVE_GETTIMEOFDAY
#ifdef ENABLE_FEATURE_SHAPER
#define SHAPER_DEFINED(opt) ((opt)->shaper)
#else
#define SHAPER_DEFINED(opt) (false)
Expand Down
Loading

0 comments on commit 3d163bc

Please sign in to comment.