win32: accomodate old and new mingw setups
authorFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 28 Jan 2014 13:16:25 +0000 (14:16 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Tue, 28 Jan 2014 13:16:25 +0000 (14:16 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
Tested-By: Henning Rogger <henning.rogge@fkie.fraunhofer.de>
make/Makefile.win32
make/getmingwversion.bash [new file with mode: 0755]
src/defs.h
src/win32/arpa/inet.h
src/win32/compat.c
src/win32/compat.h [new file with mode: 0644]
src/win32/compat/sys/time.h [moved from src/win32/sys/time.h with 97% similarity]

index 217446a..c0bcc0b 100644 (file)
@@ -46,6 +46,14 @@ OS_LIB_DYNLOAD =
 #   make clean_all
 #   CC=i586-mingw32msvc-gcc make build_all OS=win32
 
+MINGW_VERSION = $(shell "$(TOPDIR)/make/getmingwversion.bash" "$(CC)")
+
+MINGW_VERSION_OK := $(shell expr "$(MINGW_VERSION)" \>= 40600)
+ifneq "$(MINGW_VERSION_OK)" "1"
+  CFLAGS += -I$(TOPDIR)/src/win32/compat
+endif
+
+CFLAGS += -DMINGW_VERSION=$(MINGW_VERSION)
 
 # Notes for compiling olsrd.exe under Windows using Cygwin
 # ----------------------------------------------------
diff --git a/make/getmingwversion.bash b/make/getmingwversion.bash
new file mode 100755 (executable)
index 0000000..dde48fd
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+if [ ! $# -eq 1 ]; then
+  echo "ERROR: specify 1 argument: the mingw gcc"
+  exit 1
+fi
+
+GCC="$1"
+if [ ! -x "$GCC" ]; then
+  GCC="$(which "$GCC" | head -1)"
+  if [ ! -x "$GCC" ]; then
+    echo "ERROR: the mingw gcc ($GCC) is not executable"
+    exit 1
+  fi
+fi
+
+versions=( $("$GCC" -dumpversion | sed -r -e "s/\./ /g") )
+while [ ${#versions[*]} -lt 3 ]; do \
+  versions[${#versions[*]}]="0"; \
+done
+if [ ${#versions[*]} -ne 3 ]; then
+  echo "WARNING: could not detect the mingw gcc version, setting to 0.0.0"
+  versions=( 0 0 0 )
+fi
+
+version=$(( versions[0]*10000 + versions[1]*100 + versions[2] ))
+echo "$version"
index 7b51986..2c3cc76 100644 (file)
 #include <errno.h>
 #include <time.h>
 
+#ifdef _WIN32
+#include "compat.h"
+#endif /* _WIN32 */
+
 #include "olsr_protocol.h"
 #include "olsr_cfg.h"
 
index 92f8f1d..4d250f3 100644 (file)
 #include <ws2tcpip.h>
 #undef interface
 
+#if !defined(MINGW_VERSION) || MINGW_VERSION < 40600
 #ifndef InetNtopA
 int inet_aton(const char *cp, struct in_addr *addr);
 int inet_pton(int af, const char *src, void *dst);
 char *inet_ntop(int af, const void *src, char *dst, int size);
-#endif
+#endif /* InetNtopA */
+#endif /* !defined(MINGW_VERSION) || MINGW_VERSION < 40600 */
 
 #endif /* !defined TL_ARPA_INET_H_INCLUDED */
 
index f9a6875..0a06954 100644 (file)
@@ -93,6 +93,7 @@ random(void)
   return (RandState ^ (RandState >> 16)) & RAND_MAX;
 }
 
+#if !defined(MINGW_VERSION) || MINGW_VERSION < 40600
 int
 nanosleep(struct timespec *Req, struct timespec *Rem)
 {
@@ -122,6 +123,7 @@ gettimeofday(struct timeval *TVal, void *TZone __attribute__ ((unused)))
   TVal->tv_usec = (unsigned int)(Ticks % 10000000) / 10;
   return 0;
 }
+#endif /* !defined(MINGW_VERSION) || MINGW_VERSION < 40600 */
 
 long
 times(struct tms *Dummy __attribute__ ((unused)))
@@ -129,6 +131,7 @@ times(struct tms *Dummy __attribute__ ((unused)))
   return (long)GetTickCount();
 }
 
+#if !defined(MINGW_VERSION) || MINGW_VERSION < 40600
 int
 inet_aton(const char *AddrStr, struct in_addr *Addr)
 {
@@ -136,6 +139,7 @@ inet_aton(const char *AddrStr, struct in_addr *Addr)
 
   return 1;
 }
+#endif /* !defined(MINGW_VERSION) || MINGW_VERSION < 40600 */
 
 char *
 StrError(unsigned int ErrNo)
diff --git a/src/win32/compat.h b/src/win32/compat.h
new file mode 100644 (file)
index 0000000..e9a7149
--- /dev/null
@@ -0,0 +1,77 @@
+
+/*
+ * The olsr.org Optimized Link-State Routing daemon (olsrd)
+ * Copyright (c) 2004, Thomas Lopatic (thomas@lopatic.de)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ * * Neither the name of olsr.org, olsrd nor the names of its
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Visit http://www.olsr.org for more information.
+ *
+ * If you find this software useful feel free to make a donation
+ * to the project. For more information see the website or contact
+ * the copyright holders.
+ *
+ */
+
+#ifdef _WIN32
+
+#if defined(MINGW_VERSION) && MINGW_VERSION >= 40600
+
+#ifndef COMPAT_H_
+#define COMPAT_H_
+
+#include <sys/time.h>
+
+#define inet_ntop(af, src, dst, size) inet_ntop(af, (void *)(src), dst, size)
+
+# define timeradd(a, b, result)                 \
+  do {                        \
+    (result)->tv_sec = (a)->tv_sec + (b)->tv_sec;           \
+    (result)->tv_usec = (a)->tv_usec + (b)->tv_usec;            \
+    if ((result)->tv_usec >= 1000000)               \
+      {                       \
+  ++(result)->tv_sec;                 \
+  (result)->tv_usec -= 1000000;               \
+      }                       \
+  } while (0)
+# define timersub(a, b, result)                 \
+  do {                        \
+    (result)->tv_sec = (a)->tv_sec - (b)->tv_sec;           \
+    (result)->tv_usec = (a)->tv_usec - (b)->tv_usec;            \
+    if ((result)->tv_usec < 0) {                \
+      --(result)->tv_sec;                 \
+      (result)->tv_usec += 1000000;               \
+    }                       \
+  } while (0)
+
+#endif /* COMPAT_H_ */
+
+#endif /* defined(MINGW_VERSION) && MINGW_VERSION >= 40600 */
+
+#endif /* _WIN32 */
similarity index 97%
rename from src/win32/sys/time.h
rename to src/win32/compat/sys/time.h
index 7361df0..7b8d466 100644 (file)
@@ -40,6 +40,8 @@
 
 #ifdef _WIN32
 
+#if !defined(MINGW_VERSION) || MINGW_VERSION < 40600
+
 #if !defined TL_SYS_TIME_H_INCLUDED
 
 #define TL_SYS_TIME_H_INCLUDED
@@ -98,6 +100,8 @@ int gettimeofday(struct timeval *TVal, void *TZone);
 
 #endif /* !defined TL_SYS_TIME_H_INCLUDED */
 
+#endif /* !defined(MINGW_VERSION) || MINGW_VERSION < 40600 */
+
 #endif /* _WIN32 */
 
 /*