[Nice] libnice and mingw

Youness Alaoui youness.alaoui at collabora.co.uk
Wed Nov 30 12:35:48 PST 2011


Hi Nader,
I am... shocked... I usually *always* have a comment to say when I review
someone's code, but I have to say that I didn't find anything to criticize about
your patch! I will merge it as is.

Thanks a lot for this contribution!

Youness.

On 11/28/2011 01:38 PM, Nader Morshed wrote:
> Re-attached the patch, feel free to change and modify it as you see
> necessary!
> 
> On Mon, 28 Nov 2011 08:15:10 -0500
> Youness Alaoui <youness.alaoui at collabora.co.uk> wrote:
> 
>> Hi Nader,
>>
>> Sorry for the late response, I've been travelling so haven't had
>> time/opportunity to check my mails in a week!
>>
>> Thank you for the diff, however for some reason, I don't see it
>> correctly, did you copy/paste it into the email? your mail client
>> seems to reformat it which breaks the patch format. Could you attach
>> the diff directly to the mail ? or zip it if necessary..
>>
>> I guess it would be interesting to debug all those issues you've had
>> and fix the tools/unit tests properly. it would be great to have it
>> fully working under mingw. Don't worry about MSVC, it should work
>> fine, but if it doesn't, it's ok as long as we have mingw support :p
>>
>> I will wait to receive a proper patch then I will review it and let
>> you know if I have any comments (I probably will.. I always do... :) )
>>
>> Thank you,
>> Youness.
>>
>> On 11/21/2011 04:22 PM, Nader Morshed wrote:
>>> 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)
>>>  
>>>
>>>
>>> _______________________________________________
>>> Nice mailing list
>>> Nice at lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/nice
>>
>>
> 
> 
> --
> Nader Morshed <morshed.nader at gmail.com>
> 
> 
> 
> _______________________________________________
> Nice mailing list
> Nice at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nice

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 262 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freedesktop.org/archives/nice/attachments/20111130/a4f8f838/attachment.pgp>


More information about the nice mailing list