[Nice] libnice and mingw

Nader Morshed morshed.nader at gmail.com
Mon Nov 21 13:22:19 PST 2011


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hey, I was poking at the trunk of libnice yesterday to see if I can get
it to compile with mingw on windows.

At this point, it compiles, -Werror and all, though one of the stun
tools is still left with the windows version returning from main()
immediately. I couldn't get the test suite running properly, either, so
I'm not entirely sure how functional my changes are.

A patch of my changes is listed below.

I realize it probably won't fully fix the mingw support, but it's a
start, and I didn't feel like letting my progress be in vain before I
abandoned the effort.

Some of the changes probably won't be fully compatible with MSVC, but I
don't have a copy of it to check with. I'll watch this thread and
respond to any questions regarding details in the patch, since I'm
sure some of them may go against someone's code development
philosophy. :)

diff -r 0cfb9569bae9 agent/Makefile.am
- --- a/agent/Makefile.am	Tue Sep 20 23:33:39 2011 -0400
+++ b/agent/Makefile.am	Mon Nov 21 13:16:06 2011 -0800
@@ -18,7 +18,11 @@
 	-I $(top_srcdir)/socket \
 	-I $(top_srcdir)/stun
 
- -COMMON_LDADD = libagent.la $(GLIB_LIBS) (GUPNP_LIBS)
+if WINDOWS
+  AM_CFLAGS += -DWINVER=0x0501 # _WIN32_WINNT_WINXP
+endif
+
+# COMMON_LDADD = libagent.la $(GLIB_LIBS) (GUPNP_LIBS)
 
 dist_noinst_DATA = agent-signals-marshal.list
 noinst_LTLIBRARIES = libagent.la
@@ -71,3 +75,7 @@
 	$(top_builddir)/stun/libstun.la
 
 pkginclude_HEADERS = agent.h candidate.h debug.h address.h
interfaces.h pseudotcp.h +
+if WINDOWS
+  libagent_la_LIBADD += -lws2_32
+endif
diff -r 0cfb9569bae9 agent/address.h
- --- a/agent/address.h	Tue Sep 20 23:33:39 2011 -0400
+++ b/agent/address.h	Mon Nov 21 13:16:06 2011 -0800
@@ -55,7 +55,6 @@
 #ifdef G_OS_WIN32
 #include <winsock2.h>
 #include <ws2tcpip.h>
- -#include <wspiapi.h>
 #else
 #include <sys/types.h>
 #include <sys/socket.h>
diff -r 0cfb9569bae9 agent/agent.c
- --- a/agent/agent.c	Tue Sep 20 23:33:39 2011 -0400
+++ b/agent/agent.c	Mon Nov 21 13:16:06 2011 -0800
@@ -50,7 +50,8 @@
 #include <errno.h>
 
 #ifdef G_OS_WIN32
- -#include <winsock2.h>
+#  include <winsock2.h>
+#  define EWOULDBLOCK WSAEWOULDBLOCK
 #else
 #include <sys/socket.h>
 #include <netinet/in.h>
@@ -2881,13 +2882,13 @@
 _priv_set_socket_tos (NiceAgent *agent, NiceSocket *sock, gint tos)
 {
   if (setsockopt (sock->fileno, IPPROTO_IP,
- -          IP_TOS, &tos, sizeof (tos)) < 0) {
+          IP_TOS, (const char *) &tos, sizeof (tos)) < 0) {
     nice_debug ("Agent %p: Could not set socket ToS", agent,
         g_strerror (errno));
   }
 #ifdef IPV6_TCLASS
   if (setsockopt (sock->fileno, IPPROTO_IPV6,
- -          IPV6_TCLASS, &tos, sizeof (tos)) < 0) {
+          IPV6_TCLASS, (const char *) &tos, sizeof (tos)) < 0) {
     nice_debug ("Agent %p: Could not set IPV6 socket ToS", agent,
         g_strerror (errno));
   }
diff -r 0cfb9569bae9 agent/interfaces.c
- --- a/agent/interfaces.c	Tue Sep 20 23:33:39 2011 -0400
+++ b/agent/interfaces.c	Mon Nov 21 13:16:06 2011 -0800
@@ -350,6 +350,20 @@
 #include <winsock2.h>
 #include <Iphlpapi.h>
 
+// Should be in Iphlpapi.h, but mingw doesn't seem to have these
+// Values copied directly from:
+// http://msdn.microsoft.com/en-us/library/aa366845(v=vs.85).aspx
+// (Title: MIB_IPADDRROW structure)
+
+#ifndef MIB_IPADDR_DISCONNECTED
+#define MIB_IPADDR_DISCONNECTED 0x0008
+#endif
+
+#ifndef MIB_IPADDR_DELETED
+#define MIB_IPADDR_DELETED 0x0040
+#endif
+
+#if 0
 static gboolean started_wsa_engine = FALSE;
 
 /*
@@ -383,6 +397,7 @@
 
   return sock;
 }
+#endif
 
 GList * nice_interfaces_get_local_interfaces ()
 {
@@ -450,7 +465,7 @@
             continue;
         }
 
- -        ipstr = g_strdup_printf ("%d.%d.%d.%d",
+        ipstr = g_strdup_printf ("%lu.%lu.%lu.%lu",
             (ipaddr->dwAddr      ) & 0xFF,
             (ipaddr->dwAddr >>  8) & 0xFF,
             (ipaddr->dwAddr >> 16) & 0xFF,
@@ -471,8 +486,11 @@
 /*
  * returns ip address as an utf8 string
  */
+// Source for idx's type (Was IF_INDEX):
+// http://msdn.microsoft.com/en-us/library/aa366836(v=VS.85).aspx
+// (Title: MIB_IFROW structure)
 static gchar *
- -win32_get_ip_for_interface (IF_INDEX idx)
+win32_get_ip_for_interface (DWORD idx)
 {
   ULONG size = 0;
   PMIB_IPADDRTABLE ip_table;
@@ -491,7 +509,7 @@
       PMIB_IPADDRROW ipaddr = &ip_table->table[i];
       if (ipaddr->dwIndex == idx &&
           !(ipaddr->wType & (MIB_IPADDR_DISCONNECTED |
MIB_IPADDR_DELETED))) {
- -        ret = g_strdup_printf ("%d.%d.%d.%d",
+        ret = g_strdup_printf ("%lu.%lu.%lu.%lu",
             (ipaddr->dwAddr      ) & 0xFF,
             (ipaddr->dwAddr >>  8) & 0xFF,
             (ipaddr->dwAddr >> 16) & 0xFF,
diff -r 0cfb9569bae9 agent/pseudotcp.c
- --- a/agent/pseudotcp.c	Tue Sep 20 23:33:39 2011 -0400
+++ b/agent/pseudotcp.c	Mon Nov 21 13:16:06 2011 -0800
@@ -64,11 +64,19 @@
  */
 
 #include <stdlib.h>
- -#include <arpa/inet.h>
 #include <errno.h>
 #include <string.h>
 
 #include <glib.h>
+#ifdef G_OS_WIN32
+#  include <winsock2.h>
+#  define ECONNABORTED WSAECONNABORTED
+#  define ENOTCONN WSAENOTCONN
+#  define EWOULDBLOCK WSAEWOULDBLOCK
+#  define ECONNRESET WSAECONNRESET
+#else
+#  include <arpa/inet.h>
+#endif
 
 #include "pseudotcp.h"
 
@@ -176,17 +184,10 @@
 //////////////////////////////////////////////////////////////////////
 // Helper Functions
 //////////////////////////////////////////////////////////////////////
- -
- -static guint32
- -min (guint32 first, guint32 second)
- -{
- -  return (first < second? first:second);
- -}
- -static guint32
- -max (guint32 first, guint32 second)
- -{
- -  return (first > second? first:second);
- -}
+#ifndef G_OS_WIN32
+#  define min(first, second) ((first) < (second) ? (first) : (second))
+#  define max(first, second) ((first) > (second) ? (first) : (second))
+#endif
 
 static guint32
 bound(guint32 lower, guint32 middle, guint32 upper)
@@ -792,16 +793,16 @@
 
   g_assert(HEADER_SIZE + len <= MAX_PACKET);
 
- -  *((uint32_t *) buffer) = htonl(priv->conv);
- -  *((uint32_t *) (buffer + 4)) = htonl(seq);
- -  *((uint32_t *) (buffer + 8)) = htonl(priv->rcv_nxt);
+  *((guint32 *) buffer) = htonl(priv->conv);
+  *((guint32 *) (buffer + 4)) = htonl(seq);
+  *((guint32 *) (buffer + 8)) = htonl(priv->rcv_nxt);
   buffer[12] = 0;
   buffer[13] = flags;
- -  *((uint16_t *) (buffer + 14)) = htons((uint16_t)priv->rcv_wnd);
+  *((guint16 *) (buffer + 14)) = htons((guint16)priv->rcv_wnd);
 
   // Timestamp computations
- -  *((uint32_t *) (buffer + 16)) = htonl(now);
- -  *((uint32_t *) (buffer + 20)) = htonl(priv->ts_recent);
+  *((guint32 *) (buffer + 16)) = htonl(now);
+  *((guint32 *) (buffer + 20)) = htonl(priv->ts_recent);
   priv->ts_lastack = priv->rcv_nxt;
 
   if (data != NULL)
@@ -839,14 +840,14 @@
   if (size < 12)
     return FALSE;
 
- -  seg.conv = ntohl(*(uint32_t *)buffer);
- -  seg.seq = ntohl(*(uint32_t *)(buffer + 4));
- -  seg.ack = ntohl(*(uint32_t *)(buffer + 8));
+  seg.conv = ntohl(*(guint32 *)buffer);
+  seg.seq = ntohl(*(guint32 *)(buffer + 4));
+  seg.ack = ntohl(*(guint32 *)(buffer + 8));
   seg.flags = buffer[13];
- -  seg.wnd = ntohs(*(uint16_t *)(buffer + 14));
+  seg.wnd = ntohs(*(guint16 *)(buffer + 14));
 
- -  seg.tsval = ntohl(*(uint32_t *)(buffer + 16));
- -  seg.tsecr = ntohl(*(uint32_t *)(buffer + 20));
+  seg.tsval = ntohl(*(guint32 *)(buffer + 16));
+  seg.tsecr = ntohl(*(guint32 *)(buffer + 20));
 
   seg.data = ((gchar *)buffer) + HEADER_SIZE;
   seg.len = size - HEADER_SIZE;
diff -r 0cfb9569bae9 configure.ac
- --- a/configure.ac	Tue Sep 20 23:33:39 2011 -0400
+++ b/configure.ac	Mon Nov 21 13:16:06 2011 -0800
@@ -6,9 +6,12 @@
 AC_INIT(libnice, 0.1.1.1)
 LIBNICE_RELEASE="no"
 
+AC_CANONICAL_SYSTEM
+
 AC_CONFIG_SRCDIR([agent/agent.c])
 AC_CONFIG_HEADER([config.h])
 AM_INIT_AUTOMAKE([-Wall])
+
 AC_CONFIG_FILES([
 	Makefile
 	agent/Makefile
@@ -53,6 +56,20 @@
 AC_USE_SYSTEM_EXTENSIONS
 AC_PROG_LIBTOOL
 
+# Check Operating System
+AC_MSG_CHECKING([operating system])
+case "$host" in
+	*-*-*mingw*|*-*-*cygwin*)
+		platform=win32
+		AC_MSG_RESULT($platform)
+		;;
+	*)
+		platform=linux/other
+		AC_MSG_RESULT($platform)
+		;;
+esac
+
+AM_CONDITIONAL([WINDOWS], [test "$platform" = "win32"])
 
 # Checks for compiler features
 
diff -r 0cfb9569bae9 socket/tcp-bsd.c
- --- a/socket/tcp-bsd.c	Tue Sep 20 23:33:39 2011 -0400
+++ b/socket/tcp-bsd.c	Mon Nov 21 13:16:06 2011 -0800
@@ -90,7 +90,7 @@
   int sockfd = -1;
   int ret;
   struct sockaddr_storage name;
- -  guint name_len = sizeof (name);
+  gint name_len = sizeof (name);
   NiceSocket *sock;
   TcpPriv *priv;
 
diff -r 0cfb9569bae9 socket/udp-bsd.c
- --- a/socket/udp-bsd.c	Tue Sep 20 23:33:39 2011 -0400
+++ b/socket/udp-bsd.c	Mon Nov 21 13:16:06 2011 -0800
@@ -51,9 +51,7 @@
 
 #include "udp-bsd.h"
 
- -#ifdef G_OS_WIN32
- -typedef unsigned long ssize_t;
- -#else
+#ifndef G_OS_WIN32
 #include <unistd.h>
 #endif
 
diff -r 0cfb9569bae9 stun/Makefile.am
- --- a/stun/Makefile.am	Tue Sep 20 23:33:39 2011 -0400
+++ b/stun/Makefile.am	Mon Nov 21 13:16:06 2011 -0800
@@ -13,6 +13,10 @@
 AM_CFLAGS = -std=gnu99 -DG_LOG_DOMAIN=\"libnice-stun\" $(ERROR_CFLAGS)
 AM_CPPFLAGS = -I$(top_srcdir)
 
+if WINDOWS
+  AM_CFLAGS += -DWINVER=0x0501 # _WIN32_WINNT_WINXP
+endif
+
 noinst_LTLIBRARIES = libstun.la
 
 libstun_la_SOURCES = constants.h \
diff -r 0cfb9569bae9 stun/rand.c
- --- a/stun/rand.c	Tue Sep 20 23:33:39 2011 -0400
+++ b/stun/rand.c	Mon Nov 21 13:16:06 2011 -0800
@@ -43,6 +43,7 @@
 #ifdef _WIN32
 
 #include <windows.h>
+#include <Wincrypt.h>
 
 void RAND_bytes (uint8_t *dst, int len)
 {
@@ -51,7 +52,9 @@
 
   if(!CryptAcquireContext(&hCryptProv, container, NULL, PROV_RSA_FULL,
0)) { /* non existing container. try to create a new one */
- -    if (GetLastError() == NTE_BAD_KEYSET) {
+    // I hope this cast here doesn't cause issues
+    // gcc was complaining about comparing signed and unsigned values
+    if (GetLastError() == (DWORD) NTE_BAD_KEYSET) {
       if(!CryptAcquireContext(&hCryptProv, container, NULL,
PROV_RSA_FULL, CRYPT_NEWKEYSET)) { return;
       }
diff -r 0cfb9569bae9 stun/tools/Makefile.am
- --- a/stun/tools/Makefile.am	Tue Sep 20 23:33:39 2011 -0400
+++ b/stun/tools/Makefile.am	Mon Nov 21 13:16:06 2011 -0800
@@ -23,3 +23,7 @@
 stunbdc_LDADD = $(top_builddir)/stun/libstun.la
 
 
+if WINDOWS
+  AM_CFLAGS += -DWINVER=0x0501 # _WIN32_WINNT_WINXP
+  stunbdc_LDADD += -lws2_32
+endif
diff -r 0cfb9569bae9 stun/tools/stunbdc.c
- --- a/stun/tools/stunbdc.c	Tue Sep 20 23:33:39 2011 -0400
+++ b/stun/tools/stunbdc.c	Mon Nov 21 13:16:06 2011 -0800
@@ -40,9 +40,12 @@
 # include <config.h>
 #endif
 
- -#ifndef _WIN32
- -#include <sys/socket.h>
- -#include <netdb.h>
+#ifdef _WIN32
+#  include <winsock2.h>
+#else
+#  include <sys/socket.h>
+#  include <netdb.h>
+#endif
 
 #include <sys/types.h>
 #include "stun/stunagent.h"
@@ -184,8 +187,3 @@
 
   return run (family, server, port) ? 1 : 0;
 }
- -#else
- -int main () {
- -  return 0;
- -}
- -#endif
diff -r 0cfb9569bae9 stun/tools/stund.c
- --- a/stun/tools/stund.c	Tue Sep 20 23:33:39 2011 -0400
+++ b/stun/tools/stund.c	Mon Nov 21 13:16:06 2011 -0800
@@ -346,7 +346,7 @@
 }
 
 #else
- -int main () {
+int main (int argc, char **argv) {
   return 0;
 }
 #endif
diff -r 0cfb9569bae9 stun/usages/bind.c
- --- a/stun/usages/bind.c	Tue Sep 20 23:33:39 2011 -0400
+++ b/stun/usages/bind.c	Mon Nov 21 13:16:06 2011 -0800
@@ -54,6 +54,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <sys/time.h>
+#include <fcntl.h>
 #endif
 
 
@@ -70,7 +71,6 @@
 #include <stdlib.h>
 #include <time.h>
 #include <errno.h>
- -#include <fcntl.h>
 #include "timer.h"
 
 
@@ -394,11 +394,13 @@
 }
 
 
+#ifdef HAVE_POLL
 static int stun_trans_fd (const StunTransport *tr)
 {
   assert (tr != NULL);
   return tr->fd;
 }
+#endif
 
 
 /*
diff -r 0cfb9569bae9 stun/usages/bind.h
- --- a/stun/usages/bind.h	Tue Sep 20 23:33:39 2011 -0400
+++ b/stun/usages/bind.h	Mon Nov 21 13:16:06 2011 -0800
@@ -52,7 +52,7 @@
 
 
 #ifdef _WIN32
- -#include "win32_common.h"
+#  include "../win32_common.h"
 #else
 # include <stdbool.h>
 # include <stdint.h>
diff -r 0cfb9569bae9 stun/usages/turn.h
- --- a/stun/usages/turn.h	Tue Sep 20 23:33:39 2011 -0400
+++ b/stun/usages/turn.h	Mon Nov 21 13:16:06 2011 -0800
@@ -53,7 +53,7 @@
 
 
 #ifdef _WIN32
- -#include "win32_common.h"
+#  include "../win32_common.h"
 #else
 # include <stdbool.h>
 # include <stdint.h>
diff -r 0cfb9569bae9 stun/win32_common.h
- --- a/stun/win32_common.h	Tue Sep 20 23:33:39 2011 -0400
+++ b/stun/win32_common.h	Mon Nov 21 13:16:06 2011 -0800
@@ -57,6 +57,7 @@
 #ifndef _WIN32_COMMON_H
 #define _WIN32_COMMON_H
 
+#include <sys/types.h>
 
 /* 7.18.1.1  Exact-width integer types */
 typedef signed char int8_t;
@@ -67,8 +68,6 @@
 typedef unsigned   uint32_t;
 typedef long long  int64_t;
 typedef unsigned long long   uint64_t;
- -typedef unsigned int size_t;
- -typedef unsigned long ssize_t;
 
 typedef uint8_t bool;
 #define true 1
diff -r 0cfb9569bae9 tests/Makefile.am
- --- a/tests/Makefile.am	Tue Sep 20 23:33:39 2011 -0400
+++ b/tests/Makefile.am	Mon Nov 21 13:16:06 2011 -0800
@@ -62,7 +62,7 @@
 
 test_fallback_LDADD = $(COMMON_LDADD)
 
- -test_thread_LDADD = $(COMMON_LDADD)
+# test_thread_LDADD = $(COMMON_LDADD)
 
 test_dribble_LDADD = $(COMMON_LDADD)
 


- --
Nader Morshed <morshed.nader at gmail.com>
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (MingW32)

iQIcBAEBAgAGBQJOysBOAAoJEOjYntJceDDejqUP/1la5XrtYrwnEpAFHd3FrM7C
ytHE9V/qWzvv+UAqYfiO0GlH8/JHXCeiuiqKwcORkfHRm1PJmtTALblc6pG1vRm3
OrPpXBrL5QMuEDV1lAyei5u+TroLPcjOtt7WtmNKy0JChJiPSmLfkj7QzL24+eB5
hp/beeUKIiVa8WIlQvm4kRUyzQzF2mq8VEJJ9dtrju1oNbQP3x+LSOh5s6f83hQ+
k6MVY66aaYwEHDpiRls+KOVKbHbJkoZCkQcgR4vefjtH2bKmN8qjuO1lyJ2cMvsD
uao3jtsHrPAsVBWR2lcNQavvC9W+1Iy1esPeRfwtA6qL2MnecmqAAjsYWKrV3j4e
w/89owDYX+E/MoE+Mkq271xlPtbycjGMQ0nIOhLEp21CAjV6PLcsjaTefhLp7XZD
qRFVwXVQ/mA6VIxxbcQ4ep75CpvYWhKsPpyV5GRTxH1lbBFgnXaYxBK0QBvOrAyk
OwWbY5j619JJNlU0JNB6bnr58AR/ZFQaOf1T9zQ26Kpa7oRt4VRn/a7k3+BFGZuf
fKrPezRFxjxEvuAGVgf+Y6FdOePT31LThYAx/YXPYOmRfmDSOQQHzc/YZMw3N40u
/I5GB+KQh3d8NMuuyy1FRX5MFF6nsK89qRIAHOgIaFYz92621mW0K1F3wernUpgO
OL0h0hTQt5n0zNoVApYF
=Hhyd
-----END PGP SIGNATURE-----


More information about the nice mailing list