[Nice] libnice and mingw
Nader Morshed
morshed.nader at gmail.com
Wed Nov 30 12:48:11 PST 2011
Good to hear, thanks!
On Wed, 30 Nov 2011 15:35:48 -0500
Youness Alaoui <youness.alaoui at collabora.co.uk> wrote:
> 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
>
--
Nader Morshed <morshed.nader at gmail.com>
More information about the nice
mailing list