diff --git a/Network.hs b/Network.hs
--- a/Network.hs
+++ b/Network.hs
@@ -222,6 +222,7 @@
 listen' serv = do
     proto <- getProtocolNumber "tcp"
     let hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_PASSIVE]
+                             , addrSocketType = Stream
                              , addrProtocol = proto }
     addrs <- getAddrInfo (Just hints) Nothing (Just serv)
     let addr = head addrs
@@ -240,7 +241,7 @@
 -- accept
 
 -- | Accept a connection on a socket created by 'listenOn'.  Normal
--- I\/O opertaions (see "System.IO") can be used on the 'Handle'
+-- I\/O operations (see "System.IO") can be used on the 'Handle'
 -- returned to communicate with the client.
 -- Notice that although you can pass any Socket to Network.accept,
 -- only sockets of either AF_UNIX, AF_INET, or AF_INET6 will work
diff --git a/Network/Socket.hsc b/Network/Socket.hsc
--- a/Network/Socket.hsc
+++ b/Network/Socket.hsc
@@ -95,7 +95,7 @@
     getPeerName,	-- :: Socket -> IO SockAddr
     getSocketName,	-- :: Socket -> IO SockAddr
 
-#ifdef SO_PEERCRED
+#ifdef HAVE_STRUCT_UCRED
 	-- get the credentials of our domain socket peer.
     getPeerCred,         -- :: Socket -> IO (CUInt{-pid-}, CUInt{-uid-}, CUInt{-gid-})
 #endif
@@ -201,7 +201,7 @@
 import Foreign.C.String ( CString, withCString, peekCString, peekCStringLen, castCharToCChar )
 import Foreign.C.Types ( CInt, CUInt, CChar, CSize )
 import Foreign.Marshal.Alloc ( alloca, allocaBytes )
-import Foreign.Marshal.Array ( peekArray, pokeArray0 )
+import Foreign.Marshal.Array ( peekArray, pokeArray, pokeArray0 )
 import Foreign.Marshal.Utils ( maybeWith, with )
 
 import System.IO
@@ -228,6 +228,26 @@
 type HostName       = String
 type ServiceName    = String
 
+-- ----------------------------------------------------------------------------
+-- On Windows, our sockets are not put in non-blocking mode (non-blocking
+-- is not supported for regular file descriptors on Windows, and it would
+-- be a pain to support it only for sockets).  So there are two cases:
+--
+--  - the threaded RTS uses safe calls for socket operations to get
+--    non-blocking I/O, just like the rest of the I/O library
+--
+--  - with the non-threaded RTS, only some operations on sockets will be
+--    non-blocking.  Reads and writes go through the normal async I/O
+--    system.  accept() uses asyncDoProc so is non-blocking.  A handful
+--    of others (recvFrom, sendFd, recvFd) will block all threads - if this
+--    is a problem, -threaded is the workaround.
+--
+##if defined(mingw32_HOST_OS)
+##define SAFE_ON_WIN safe
+##else
+##define SAFE_ON_WIN unsafe
+##endif
+
 -----------------------------------------------------------------------------
 -- Socket types
 
@@ -428,6 +448,7 @@
 -- don't require 32-bit-wide address fields to be present.  We can
 -- only portably rely on an 8-bit field, s6_addr.
 
+s6_addr_offset :: Int
 s6_addr_offset = (#offset struct in6_addr, s6_addr)
 
 peek32 :: Ptr a -> Int -> IO Word32
@@ -480,14 +501,21 @@
 #if defined(darwin_TARGET_OS)
 	zeroMemory p (#const sizeof(struct sockaddr_un))
 #endif
+#if defined(netbsd_TARGET_OS)
+	(#poke struct sockaddr_un, sun_len) p ((#const sizeof(struct sockaddr_un)) :: Word8)
+#endif
 	(#poke struct sockaddr_un, sun_family) p ((#const AF_UNIX) :: CSaFamily)
 	let pathC = map castCharToCChar path
-	pokeArray0 0 ((#ptr struct sockaddr_un, sun_path) p) pathC
+            poker = case path of ('\0':_) -> pokeArray; _ -> pokeArray0 0
+	poker ((#ptr struct sockaddr_un, sun_path) p) pathC
 #endif
 pokeSockAddr p (SockAddrInet (PortNum port) addr) = do
 #if defined(darwin_TARGET_OS)
 	zeroMemory p (#const sizeof(struct sockaddr_in))
 #endif
+#if defined(netbsd_TARGET_OS)
+	(#poke struct sockaddr_in, sin_len) p ((#const sizeof(struct sockaddr_in)) :: Word8)
+#endif
 	(#poke struct sockaddr_in, sin_family) p ((#const AF_INET) :: CSaFamily)
 	(#poke struct sockaddr_in, sin_port) p port
 	(#poke struct sockaddr_in, sin_addr) p addr	
@@ -496,6 +524,9 @@
 #if defined(darwin_TARGET_OS)
 	zeroMemory p (#const sizeof(struct sockaddr_in6))
 #endif
+#if defined(netbsd_TARGET_OS)
+	(#poke struct sockaddr_in6, sin6_len) p ((#const sizeof(struct sockaddr_in6)) :: Word8)
+#endif
 	(#poke struct sockaddr_in6, sin6_family) p ((#const AF_INET6) :: CSaFamily)
 	(#poke struct sockaddr_in6, sin6_port) p port
 	(#poke struct sockaddr_in6, sin6_flowinfo) p flow
@@ -542,7 +573,10 @@
 
 -- size of struct sockaddr by SockAddr
 #if defined(DOMAIN_SOCKET_SUPPORT)
-sizeOfSockAddr (SockAddrUnix _)   = #const sizeof(struct sockaddr_un)
+sizeOfSockAddr (SockAddrUnix path) =
+    case path of
+        '\0':_ -> (#const sizeof(sa_family_t)) + length path
+        _      -> #const sizeof(struct sockaddr_un)
 #endif
 sizeOfSockAddr (SockAddrInet _ _) = #const sizeof(struct sockaddr_in)
 #if defined(IPV6_SOCKET_SUPPORT)
@@ -812,6 +846,8 @@
 -----------------------------------------------------------------------------
 -- sendTo & recvFrom
 
+-- | NOTE: blocking on Windows unless you compile with -threaded (see
+-- GHC ticket #1129)
 sendTo :: Socket	-- (possibly) bound/connected Socket
        -> String	-- Data to send
        -> SockAddr
@@ -836,6 +872,8 @@
 	c_sendto s ptr (fromIntegral $ nbytes) 0{-flags-} 
 			p_addr (fromIntegral sz)
 
+-- | NOTE: blocking on Windows unless you compile with -threaded (see
+-- GHC ticket #1129)
 recvFrom :: Socket -> Int -> IO (String, Int, SockAddr)
 recvFrom sock nbytes =
   allocaBytes nbytes $ \ptr -> do
@@ -1133,7 +1171,7 @@
        fromIntegral `liftM` peek ptr_v
 
 
-#ifdef SO_PEERCRED
+#ifdef HAVE_STRUCT_UCRED
 -- | Returns the processID, userID and groupID of the socket's peer.
 --
 -- Only available on platforms that support SO_PEERCRED on domain sockets.
@@ -1222,14 +1260,14 @@
       ty  <- fromIntegral `liftM` peek ptr_ty
       pD  <- peek ptr_pData
       return (lev,ty,pD, len)
-foreign import ccall unsafe "sendAncillary"
+foreign import ccall SAFE_ON_WIN "sendAncillary"
   c_sendAncillary :: CInt -> CInt -> CInt -> CInt -> Ptr a -> CInt -> IO CInt
 
-foreign import ccall unsafe "recvAncillary"
+foreign import ccall SAFE_ON_WIN "recvAncillary"
   c_recvAncillary :: CInt -> Ptr CInt -> Ptr CInt -> CInt -> Ptr (Ptr a) -> Ptr CInt -> IO CInt
 
-foreign import ccall unsafe "sendFd" c_sendFd :: CInt -> CInt -> IO CInt
-foreign import ccall unsafe "recvFd" c_recvFd :: CInt -> IO CInt
+foreign import ccall SAFE_ON_WIN "sendFd" c_sendFd :: CInt -> CInt -> IO CInt
+foreign import ccall SAFE_ON_WIN "recvFd" c_recvFd :: CInt -> IO CInt
 
 #endif
 
@@ -1762,7 +1800,7 @@
 #ifdef AF_GOSSIP
 	(#const AF_GOSSIP) -> AF_GOSSIP
 #endif
-#ifdef AF_IPX
+#if defined(AF_IPX) && (!defined(AF_NS) || AF_NS != AF_IPX)
 	(#const AF_IPX) -> AF_IPX
 #endif
 #ifdef Pseudo_AF_XTP
@@ -2068,10 +2106,9 @@
 	else do
 # if __GLASGOW_HASKELL__ >= 608
     h <- fdToHandle' (fromIntegral fd) (Just System.Posix.Internals.Stream) True (show s) mode True{-bin-}
-# elif __GLASGOW_HASKELL__ < 608
+# elif __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ < 608
     h <- openFd (fromIntegral fd) (Just System.Posix.Internals.Stream) True (show s) mode True{-bin-}
-# endif
-# ifdef __HUGS__
+# elif defined(__HUGS__)
     h <- openFd (fromIntegral fd) True{-is a socket-} mode True{-bin-}
 # endif
     return (ConvertedToHandle, h)
@@ -2518,11 +2555,11 @@
 
 foreign import CALLCONV unsafe "send"
   c_send :: CInt -> Ptr a -> CSize -> CInt -> IO CInt
-foreign import CALLCONV unsafe "sendto"
+foreign import CALLCONV SAFE_ON_WIN "sendto"
   c_sendto :: CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> CInt -> IO CInt
 foreign import CALLCONV unsafe "recv"
   c_recv :: CInt -> Ptr CChar -> CSize -> CInt -> IO CInt
-foreign import CALLCONV unsafe "recvfrom"
+foreign import CALLCONV SAFE_ON_WIN "recvfrom"
   c_recvfrom :: CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt
 foreign import CALLCONV unsafe "getpeername"
   c_getpeername :: CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt
diff --git a/configure b/configure
--- a/configure
+++ b/configure
@@ -671,6 +671,7 @@
 GREP
 EGREP
 CALLCONV
+EXTRA_CPPFLAGS
 EXTRA_LIBS
 EXTRA_SRCS
 LIBOBJS
@@ -4158,7 +4159,124 @@
 rm -f conftest*
 
 
+{ echo "$as_me:$LINENO: checking for SO_PEERCRED and struct ucred in sys/socket.h" >&5
+echo $ECHO_N "checking for SO_PEERCRED and struct ucred in sys/socket.h... $ECHO_C" >&6; }
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/socket.h>
+#ifndef SO_PEERCRED
+# error no SO_PEERCRED
+#endif
+struct ucred u;
+int
+main ()
+{
 
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_ucred=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_ucred=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+if test "x$ac_cv_ucred" = xno; then
+    old_CFLAGS="$CFLAGS"
+    CFLAGS="-D_GNU_SOURCE $CFLAGS"
+    cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/socket.h>
+#ifndef SO_PEERCRED
+# error no SO_PEERCRED
+#endif
+struct ucred u;
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_ucred=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_ucred=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+    if test "x$ac_cv_ucred" = xyes; then
+        EXTRA_CPPFLAGS=-D_GNU_SOURCE
+    fi
+else
+    old_CFLAGS="$CFLAGS"
+fi
+if test "x$ac_cv_ucred" = xno; then
+    CFLAGS="$old_CFLAGS"
+    { echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6; }
+else
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_STRUCT_UCRED 1
+_ACEOF
+
+    { echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6; }
+fi
+
+
 for ac_func in getaddrinfo
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
@@ -4676,7 +4794,7 @@
 	EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"
 	EXTRA_LIBS=wsock32
 	CALLCONV=stdcall ;;
-*-solaris2)
+*-solaris2*)
 	EXTRA_SRCS="cbits/ancilData.c"
 	EXTRA_LIBS="nsl, socket"
 	CALLCONV=ccall ;;
@@ -4689,6 +4807,7 @@
 
 
 
+
 ac_config_files="$ac_config_files network.buildinfo"
 
 
@@ -5363,13 +5482,14 @@
 GREP!$GREP$ac_delim
 EGREP!$EGREP$ac_delim
 CALLCONV!$CALLCONV$ac_delim
+EXTRA_CPPFLAGS!$EXTRA_CPPFLAGS$ac_delim
 EXTRA_LIBS!$EXTRA_LIBS$ac_delim
 EXTRA_SRCS!$EXTRA_SRCS$ac_delim
 LIBOBJS!$LIBOBJS$ac_delim
 LTLIBOBJS!$LTLIBOBJS$ac_delim
 _ACEOF
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 60; then
+  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 61; then
     break
   elif $ac_last_try; then
     { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -40,6 +40,39 @@
  AC_MSG_RESULT(no))
 
 dnl --------------------------------------------------
+dnl * test for SO_PEERCRED and struct ucred
+dnl --------------------------------------------------
+AC_MSG_CHECKING(for SO_PEERCRED and struct ucred in sys/socket.h)
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#include <sys/socket.h>
+#ifndef SO_PEERCRED
+# error no SO_PEERCRED
+#endif
+struct ucred u;]])],ac_cv_ucred=yes,ac_cv_ucred=no)
+if test "x$ac_cv_ucred" = xno; then
+    old_CFLAGS="$CFLAGS"
+    CFLAGS="-D_GNU_SOURCE $CFLAGS"
+    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#include <sys/socket.h>
+#ifndef SO_PEERCRED
+# error no SO_PEERCRED
+#endif
+struct ucred u;]])],ac_cv_ucred=yes,ac_cv_ucred=no)
+    if test "x$ac_cv_ucred" = xyes; then
+        EXTRA_CPPFLAGS=-D_GNU_SOURCE
+    fi
+else
+    old_CFLAGS="$CFLAGS"
+fi
+if test "x$ac_cv_ucred" = xno; then
+    CFLAGS="$old_CFLAGS"
+    AC_MSG_RESULT(no)
+else
+    AC_DEFINE([HAVE_STRUCT_UCRED], [1], [Define to 1 if you have both SO_PEERCRED and struct ucred.])
+    AC_MSG_RESULT(yes)
+fi
+
+dnl --------------------------------------------------
 dnl * test for getaddrinfo as proxy for IPv6 support
 dnl --------------------------------------------------
 AC_CHECK_FUNCS(getaddrinfo)
@@ -73,7 +106,7 @@
 	EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"
 	EXTRA_LIBS=wsock32
 	CALLCONV=stdcall ;;
-*-solaris2)
+*-solaris2*)
 	EXTRA_SRCS="cbits/ancilData.c"
 	EXTRA_LIBS="nsl, socket"
 	CALLCONV=ccall ;;
@@ -83,6 +116,7 @@
 	CALLCONV=ccall ;;
 esac
 AC_SUBST([CALLCONV])
+AC_SUBST([EXTRA_CPPFLAGS])
 AC_SUBST([EXTRA_LIBS])
 AC_SUBST([EXTRA_SRCS])
 
diff --git a/include/HsNetworkConfig.h b/include/HsNetworkConfig.h
--- a/include/HsNetworkConfig.h
+++ b/include/HsNetworkConfig.h
@@ -1,123 +0,0 @@
-/* include/HsNetworkConfig.h.  Generated from HsNetworkConfig.h.in by configure.  */
-/* include/HsNetworkConfig.h.in.  Generated from configure.ac by autoheader.  */
-
-/* Define to 1 if you have the <arpa/inet.h> header file. */
-#define HAVE_ARPA_INET_H 1
-
-/* Define to 1 if you have a BSDish sendfile(2) implementation. */
-/* #undef HAVE_BSD_SENDFILE */
-
-/* Define to 1 if you have the declaration of `AI_ADDRCONFIG', and to 0 if you
-   don't. */
-#define HAVE_DECL_AI_ADDRCONFIG 1
-
-/* Define to 1 if you have the declaration of `AI_ALL', and to 0 if you don't.
-   */
-#define HAVE_DECL_AI_ALL 1
-
-/* Define to 1 if you have the declaration of `AI_NUMERICSERV', and to 0 if
-   you don't. */
-#define HAVE_DECL_AI_NUMERICSERV 1
-
-/* Define to 1 if you have the declaration of `AI_V4MAPPED', and to 0 if you
-   don't. */
-#define HAVE_DECL_AI_V4MAPPED 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the `getaddrinfo' function. */
-#define HAVE_GETADDRINFO 1
-
-/* Define to 1 if you have the `gethostent' function. */
-#define HAVE_GETHOSTENT 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if in_addr_t is available. */
-#define HAVE_IN_ADDR_T 1
-
-/* Define to 1 if you have the <limits.h> header file. */
-#define HAVE_LIMITS_H 1
-
-/* Define to 1 if you have a Linux sendfile(2) implementation. */
-#define HAVE_LINUX_SENDFILE 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <netdb.h> header file. */
-#define HAVE_NETDB_H 1
-
-/* Define to 1 if you have the <netinet/in.h> header file. */
-#define HAVE_NETINET_IN_H 1
-
-/* Define to 1 if you have the <netinet/tcp.h> header file. */
-#define HAVE_NETINET_TCP_H 1
-
-/* Define to 1 if you have the `readlink' function. */
-#define HAVE_READLINK 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if `msg_accrights' is member of `struct msghdr'. */
-/* #undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */
-
-/* Define to 1 if `msg_control' is member of `struct msghdr'. */
-#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1
-
-/* Define to 1 if you have the `symlink' function. */
-#define HAVE_SYMLINK 1
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#define HAVE_SYS_SOCKET_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <sys/uio.h> header file. */
-#define HAVE_SYS_UIO_H 1
-
-/* Define to 1 if you have the <sys/un.h> header file. */
-#define HAVE_SYS_UN_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the <winsock.h> header file. */
-/* #undef HAVE_WINSOCK_H */
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "libraries@haskell.org"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "Haskell network package"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "Haskell network package 1.0"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "network"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.0"
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
diff --git a/include/HsNetworkConfig.h.in b/include/HsNetworkConfig.h.in
--- a/include/HsNetworkConfig.h.in
+++ b/include/HsNetworkConfig.h.in
@@ -76,6 +76,9 @@
 /* Define to 1 if `msg_control' is member of `struct msghdr'. */
 #undef HAVE_STRUCT_MSGHDR_MSG_CONTROL
 
+/* Define to 1 if you have both SO_PEERCRED and struct ucred. */
+#undef HAVE_STRUCT_UCRED
+
 /* Define to 1 if you have the `symlink' function. */
 #undef HAVE_SYMLINK
 
diff --git a/network.buildinfo.in b/network.buildinfo.in
--- a/network.buildinfo.in
+++ b/network.buildinfo.in
@@ -1,4 +1,4 @@
-ghc-options: -DCALLCONV=@CALLCONV@
-cc-options: -DCALLCONV=@CALLCONV@
+ghc-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@
+cc-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@
 c-sources: @EXTRA_SRCS@
 extra-libraries: @EXTRA_LIBS@
diff --git a/network.cabal b/network.cabal
--- a/network.cabal
+++ b/network.cabal
@@ -1,5 +1,5 @@
 name:		network
-version:	2.1.0.0
+version:	2.2.0.0
 license:	BSD3
 license-file:	LICENSE
 maintainer:	libraries@haskell.org
