]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
build: move gettimeofday() emulation to compat
authorAlon Bar-Lev <alon.barlev@gmail.com>
Wed, 29 Feb 2012 20:12:15 +0000 (22:12 +0200)
committerDavid Sommerseth <davids@redhat.com>
Thu, 22 Mar 2012 21:53:39 +0000 (22:53 +0100)
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>
17 files changed:
config-msvc.h
configure.ac
src/compat/Makefile.am
src/compat/compat-gettimeofday.c [new file with mode: 0644]
src/compat/compat.h
src/compat/compat.vcproj
src/openvpn/forward.c
src/openvpn/init.c
src/openvpn/misc.c
src/openvpn/openvpn.h
src/openvpn/options.c
src/openvpn/options.h
src/openvpn/otime.c
src/openvpn/otime.h
src/openvpn/shaper.c
src/openvpn/shaper.h
src/openvpn/syshead.h

index 577371fa5d067e1ab7f37aab12f5bb8e114f0572..0e42505138be0eb93095aebd2769765588d8d503 100644 (file)
@@ -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
index ff3df28aaf7a06d64c15d592a0e48c700d71e5a2..dc138ba21dd9b681a9021cc39aa55cdc4ea1725f 100644 (file)
@@ -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),
index e33e5e7a17d2a843e56ad4f5e31c586fed817b41..5e9db5f2165b21db1ce2fa4901e97b4e1ce746d9 100644 (file)
@@ -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 (file)
index 0000000..0f32d5d
--- /dev/null
@@ -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 */
index 57754da57c6907b859bfc1a3ec86d177b0a47b9a..3f9ac31a02c1037dcf0ad2094c59e41aed40ca84 100644 (file)
 #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 */
index 1ece7492f2a4d3a8b29bbdf22b1d956da2047b82..235163caf2b699a2c8841fd13d38b6d8642fcca6 100644 (file)
                                RelativePath=".\compat-dirname.c"
                                >
                        </File>
+                       <File
+                               RelativePath=".\compat-gettimeofday.c"
+                               >
+                       </File>
                </Filter>
                <Filter
                        Name="Header Files"
index e13b81a826e8ccc4fcac8599347d5720c575efa7..57c7846248a738e0a26df4c6a8aad3332c7caea0 100644 (file)
@@ -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));
@@ -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 */
@@ -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
        {
index a07f02167dd4ff6ce1377ece2b7d283665d40e5b..e7edb05acb722d0fbb6b5fca7f720bb146a946c6 100644 (file)
@@ -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)
     {
@@ -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
index f211a1df34ef8d4363304771b48c7076d0dd5885..898a183806b9ba2409146cd347c94076ae8f21eb 100644 (file)
@@ -720,7 +720,6 @@ 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))
@@ -728,10 +727,6 @@ init_random_seed(void)
       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 */
index f4f877b35550a13ea0882a96609a6a6f36da62f4..b314885f4e796c74f02ba32acaac487c3b07dba4 100644 (file)
@@ -269,7 +269,7 @@ struct context_2
   struct frame frame_fragment_omit;
 #endif
 
-#ifdef HAVE_GETTIMEOFDAY
+#ifdef ENABLE_FEATURE_SHAPER
   /*
    * Traffic shaper object.
    */
index 842f72c55c61ffb39e4d108eb1f766931616061a..258b060f9b3da1c21eedca8bd0f43f42825df55e 100644 (file)
@@ -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
@@ -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);
@@ -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])
     {
index 4e5b7a48fe88e898eb481396d973c1f4cc9daac4..9e78d00b5aaea1d3a974bcd36baf2921281d80f5 100644 (file)
@@ -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
 
@@ -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)
index 173573c8948ad42c8826f023bcb9adf19908b95e..2c1e5b1347e92bbd23cae900758551cb1cfcdf04 100644 (file)
@@ -36,7 +36,7 @@
 
 time_t now = 0;            /* GLOBAL */
 
-#if TIME_BACKTRACK_PROTECTION && defined(HAVE_GETTIMEOFDAY)
+#if TIME_BACKTRACK_PROTECTION
 
 static time_t now_adj = 0; /* GLOBAL */
 time_t now_usec = 0;       /* GLOBAL */
@@ -76,7 +76,7 @@ update_now_usec (struct timeval *tv)
     now_usec = tv->tv_usec;
 }
 
-#endif /* TIME_BACKTRACK_PROTECTION && defined(HAVE_GETTIMEOFDAY) */
+#endif /* TIME_BACKTRACK_PROTECTION */
 
 /* 
  * Return a numerical string describing a struct timeval.
@@ -120,13 +120,7 @@ time_string (time_t t, int usec, bool show_usec, struct gc_arena *gc)
     }
   else
     {
-#ifdef HAVE_GETTIMEOFDAY
-      if (gettimeofday (&tv, NULL))
-#endif
-       {
-         tv.tv_sec = time (NULL);
-         tv.tv_usec = 0;
-       }
+      gettimeofday (&tv, NULL);
     }
 
   t = tv.tv_sec;
@@ -185,78 +179,6 @@ frequency_limit_event_allowed (struct frequency_limit *f)
     return true;
 }
 
-#ifdef WIN32
-
-static time_t gtc_base = 0;
-static DWORD gtc_last = 0;
-static time_t last_sec = 0;
-static unsigned int last_msec = 0;
-static bool bt_last = false;
-
-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();
-  bool bt = false;
-  time_t sec;
-  unsigned int msec;
-  const int backtrack_hold_seconds = 10;
-
-  /* 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 = true;
-       }
-    }
-  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 = true;
-    }
-
-  tv->tv_sec = last_sec = sec;
-  tv->tv_usec = (last_msec = msec) * 1000;
-
-  if (bt && !bt_last)
-    gettimeofday_calibrate ();
-  bt_last = bt;
-
-  return 0;
-}
-
-#endif /* WIN32 */
-
 #ifdef TIME_TEST
 void
 time_test (void)
index fd73bbdd50287babf3180147920fc536dfeff65f..4ca103266c56899c728af0d3345d7e06fb126edb 100644 (file)
@@ -41,10 +41,6 @@ struct frequency_limit *frequency_limit_init (int max, int per);
 void frequency_limit_free (struct frequency_limit *f);
 bool frequency_limit_event_allowed (struct frequency_limit *f);
 
-#ifdef WIN32
-int gettimeofday(struct timeval *tv, void *tz);
-#endif
-
 /* format a time_t as ascii, or use current time if 0 */
 const char* time_string (time_t t, int usec, bool show_usec, struct gc_arena *gc);
 
@@ -57,7 +53,7 @@ extern time_t now; /* updated frequently to time(NULL) */
 
 void time_test (void);
 
-#if TIME_BACKTRACK_PROTECTION && defined(HAVE_GETTIMEOFDAY)
+#if TIME_BACKTRACK_PROTECTION
 
 void update_now (const time_t system_time);
 
@@ -89,12 +85,13 @@ update_time (void)
 #endif
 }
 
-#else /* !(TIME_BACKTRACK_PROTECTION && defined(HAVE_GETTIMEOFDAY)) */
+#else /* !TIME_BACKTRACK_PROTECTION */
 
 static inline void
 update_time (void)
 {
-#if defined(WIN32) && defined(HAVE_GETTIMEOFDAY)
+#if defined(WIN32)
+  /* on WIN32, gettimeofday is faster than time(NULL) */
   struct timeval tv;
   if (!gettimeofday (&tv, NULL))
     {
@@ -108,17 +105,13 @@ update_time (void)
 #endif
 }
 
-#ifdef HAVE_GETTIMEOFDAY
-
 static inline int
 openvpn_gettimeofday (struct timeval *tv, void *tz)
 {
   return gettimeofday (tv, tz);
 }
 
-#endif
-
-#endif /* TIME_BACKTRACK_PROTECTION && defined(HAVE_GETTIMEOFDAY) */
+#endif /* TIME_BACKTRACK_PROTECTION */
 
 static inline time_t
 openvpn_time (time_t *t)
index 6b445e228e938d23d9a0caa0179d48177a1ed763..c8a7d38b2d31159fe1ac826f136d9f9d1b93db48 100644 (file)
@@ -32,7 +32,7 @@
 #include "shaper.h"
 #include "memdbg.h"
 
-#ifdef HAVE_GETTIMEOFDAY
+#ifdef ENABLE_FEATURE_SHAPER
 
 /*
  * We want to wake up in delay microseconds.  If timeval is larger
@@ -98,4 +98,4 @@ shaper_msg (struct shaper *s)
 
 #else
 static void dummy(void) {}
-#endif /* HAVE_GETTIMEOFDAY */
+#endif /* ENABLE_FEATURE_SHAPER */
index 4825011ce4b278724881d106e12c999b57b18435..afeb9c3cd042f440af657485a85a0ab8bf4efeba 100644 (file)
@@ -27,7 +27,7 @@
 
 /*#define SHAPER_DEBUG*/
 
-#ifdef HAVE_GETTIMEOFDAY
+#ifdef ENABLE_FEATURE_SHAPER
 
 #include "basic.h"
 #include "integer.h"
@@ -173,6 +173,6 @@ shaper_change_pct (struct shaper *s, int pct)
 }
 #endif
 
-#endif /* HAVE_GETTIMEOFDAY */
+#endif /* ENABLE_FEATURE_SHAPER */
 
 #endif
index e8da88ccf4418c559b2b4e00ab13ec2536e98d17..e60dc44d61585e6a431a04d94a141a1b6492c3ab 100644 (file)
 #define PASSTOS_CAPABILITY 0
 #endif
 
+/*
+ * Do we have nanoseconds gettimeofday?
+ */
+#if defined(HAVE_GETTIMEOFDAY) || defined(WIN32)
+#define HAVE_GETTIMEOFDAY_NANOSECONDS 1
+#endif
+
 /*
  * Do we have the capability to report extended socket errors?
  */
@@ -486,7 +493,7 @@ socket_defined (const socket_descriptor_t sd)
  * Do we have point-to-multipoint capability?
  */
 
-#if defined(ENABLE_CLIENT_SERVER) && defined(ENABLE_CRYPTO) && defined(ENABLE_SSL) && defined(HAVE_GETTIMEOFDAY)
+#if defined(ENABLE_CLIENT_SERVER) && defined(ENABLE_CRYPTO) && defined(ENABLE_SSL) && defined(HAVE_GETTIMEOFDAY_NANOSECONDS)
 #define P2MP 1
 #else
 #define P2MP 0
@@ -667,7 +674,16 @@ socket_defined (const socket_descriptor_t sd)
  * Reduce sensitivity to system clock instability
  * and backtracks.
  */
+#if defined(HAVE_GETTIMEOFDAY_NANOSECONDS)
 #define TIME_BACKTRACK_PROTECTION 1
+#endif
+
+/*
+ * Enable traffic shaper.
+ */
+#if defined(HAVE_GETTIMEOFDAY_NANOSECONDS)
+#define ENABLE_FEATURE_SHAPER 1
+#endif
 
 /*
  * Is non-blocking connect() supported?