network 2.2.1.1 → 2.2.1.2
raw patch · 6 files changed
+88/−17 lines, 6 files
Files
- Network/BSD.hsc +4/−0
- Network/Socket.hsc +8/−2
- Network/Socket/Internal.hsc +5/−5
- configure.ac +41/−5
- include/HsNet.h +29/−4
- network.cabal +1/−1
Network/BSD.hsc view
@@ -352,7 +352,11 @@ return (HostEntry { hostName = h_name, hostAliases = h_aliases,+#if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)+ hostFamily = unpackFamily (fromIntegral (h_addrtype :: CShort)),+#else hostFamily = unpackFamily h_addrtype,+#endif hostAddresses = h_addr_list })
Network/Socket.hsc view
@@ -1502,6 +1502,8 @@ #ifdef AF_BLUETOOTH (#const AF_BLUETOOTH) -> AF_BLUETOOTH #endif+ unknown -> error ("Network.Socket.unpackFamily: unknown address " +++ "family " ++ show unknown) -- Socket Types. @@ -1986,19 +1988,23 @@ as <- (#peek struct addrinfo, ai_next) ptr_ai >>= followAddrInfo return (a:as) -foreign import ccall safe "getaddrinfo"+foreign import ccall safe "hsnet_getaddrinfo" c_getaddrinfo :: CString -> CString -> Ptr AddrInfo -> Ptr (Ptr AddrInfo) -> IO CInt -foreign import ccall safe "freeaddrinfo"+foreign import ccall safe "hsnet_freeaddrinfo" c_freeaddrinfo :: Ptr AddrInfo -> IO () gai_strerror :: CInt -> IO String +#ifdef HAVE_GAI_STRERROR gai_strerror n = c_gai_strerror n >>= peekCString foreign import ccall safe "gai_strerror" c_gai_strerror :: CInt -> IO CString+#else+gai_strerror n = return ("error " ++ show n)+#endif withCStringIf :: Bool -> Int -> (CSize -> CString -> IO a) -> IO a withCStringIf False _ f = f 0 nullPtr
Network/Socket/Internal.hsc view
@@ -18,7 +18,7 @@ #include "HsNet.h" -#if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS) #define WITH_WINSOCK 1 #endif @@ -57,7 +57,7 @@ Family(..), -- * Socket error functions-#if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS) c_getLastError, #endif throwSocketError,@@ -82,7 +82,7 @@ import Foreign.Ptr ( Ptr, castPtr, plusPtr ) import Foreign.Storable ( Storable(..) ) -#if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)+#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS) import Control.Exception ( finally ) # if __GLASGOW_HASKELL__ import GHC.IOBase ( IOErrorType(..) )@@ -556,7 +556,7 @@ {-# SPECIALIZE throwSocketErrorIfMinus1RetryMayBlock :: String -> IO b -> IO CInt -> IO CInt #-} -#if defined(__GLASGOW_HASKELL__) && (!defined(HAVE_WINSOCK_H) || defined(cygwin32_HOST_OS))+#if defined(__GLASGOW_HASKELL__) && (!defined(HAVE_WINSOCK2_H) || defined(cygwin32_HOST_OS)) throwSocketErrorIfMinus1RetryMayBlock name on_block act = throwErrnoIfMinus1RetryMayBlock name act on_block@@ -576,7 +576,7 @@ throwSocketErrorIfMinus1Retry name act return () -# if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)+# if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS) throwSocketErrorIfMinus1Retry name act = do r <- act if (r == -1)
configure.ac view
@@ -1,5 +1,19 @@ AC_INIT([Haskell network package], [1.0], [libraries@haskell.org], [network]) +ac_includes_default="$ac_includes_default+#ifdef HAVE_NETDB_H+# include <netdb.h>+#endif+#ifdef HAVE_WINSOCK2_H+# include <winsock2.h>+#endif+#ifdef HAVE_WS2TCPIP_H+# include <ws2tcpip.h>+#endif+#ifdef HAVE_WSPIAPI_H+# include <wspiapi.h>+#endif"+ # Safety check: Ensure that we are in the correct source directory. AC_CONFIG_SRCDIR([include/HsNet.h]) @@ -15,7 +29,7 @@ AC_C_CONST dnl ** check for specific header (.h) files that we are interested in-AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock.h])+AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock2.h ws2tcpip.h wspiapi.h]) AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h netinet/tcp.h sys/socket.h sys/uio.h sys/un.h]) AC_CHECK_FUNCS([readlink symlink])@@ -81,15 +95,37 @@ fi dnl --------------------------------------------------+dnl * check for Windows networking libraries+dnl --------------------------------------------------+AC_CHECK_LIB(ws2_32, _head_libws2_32_a)++dnl -------------------------------------------------- dnl * test for getaddrinfo as proxy for IPv6 support dnl ---------------------------------------------------AC_CHECK_FUNCS(getaddrinfo)+AC_MSG_CHECKING(for getaddrinfo)+dnl Can't use AC_CHECK_FUNC here, because it doesn't do the right+dnl thing on Windows.+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default+int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) ac_have_getaddrinfo=yes; AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)]) +dnl Under mingw, we may need to set WINVER to 0x0501 to expose getaddrinfo.+if test "x$ac_have_getaddrinfo" = x; then+ old_CFLAGS="$CFLAGS"+ if test "z$ac_cv_lib_ws2_32__head_libws2_32_a" = zyes; then+ CFLAGS="-DWINVER=0x0501 $CFLAGS"+ AC_MSG_CHECKING(for getaddrinfo if WINVER is 0x0501)+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default+ int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) AC_DEFINE([NEED_WINVER_XP], [1], [Define to 1 if the `getaddrinfo' function needs WINVER set.]) EXTRA_CPPFLAGS="-DWINVER=0x0501 $EXTRA_CPPFLAGS"; AC_MSG_RESULT(yes)],[CFLAGS="$old_CFLAGS"; AC_MSG_RESULT(no)])+ fi+fi++dnl Missing under mingw, sigh.+AC_CHECK_FUNCS(gai_strerror)+ dnl ------------------------------------------------------- dnl * test for AI_* flags that not all implementations have dnl --------------------------------------------------------AC_CHECK_DECLS([AI_ADDRCONFIG, AI_ALL, AI_NUMERICSERV, AI_V4MAPPED], , ,- [#include <netdb.h>])+AC_CHECK_DECLS([AI_ADDRCONFIG, AI_ALL, AI_NUMERICSERV, AI_V4MAPPED]) dnl -------------------------------------------------- dnl * test for Linux sendfile(2)@@ -112,7 +148,7 @@ case "$host" in *-mingw32) EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"- EXTRA_LIBS=wsock32+ EXTRA_LIBS=ws2_32 CALLCONV=stdcall ;; *-solaris2*) EXTRA_SRCS="cbits/ancilData.c"
include/HsNet.h view
@@ -9,6 +9,10 @@ #include "HsNetworkConfig.h" +#ifdef NEED_WINVER+# define WINVER 0x0501+#endif+ /* ultra-evil... */ #undef PACKAGE_BUGREPORT #undef PACKAGE_NAME@@ -32,8 +36,14 @@ # undef IPV6_SOCKET_SUPPORT #endif -#if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__)-#include <winsock.h>+#if defined(HAVE_WINSOCK2_H) && !defined(__CYGWIN__)+#include <winsock2.h>+# ifdef HAVE_WS2TCPIP_H+# include <ws2tcpip.h>+# endif+# ifdef HAVE_WSPIAPI_H+# include <wspiapi.h>+# endif extern void shutdownWinSock(); extern int initWinSock ();@@ -118,11 +128,11 @@ void** pData, int* pLen); -#endif /* HAVE_WINSOCK_H && !__CYGWIN */+#endif /* HAVE_WINSOCK2_H && !__CYGWIN */ INLINE char * my_inet_ntoa(-#if defined(HAVE_WINSOCK_H)+#if defined(HAVE_WINSOCK2_H) u_long addr #elif defined(HAVE_IN_ADDR_T) in_addr_t addr@@ -137,5 +147,20 @@ a.s_addr = addr; return inet_ntoa(a); }++#ifdef HAVE_GETADDRINFO+INLINE int+hsnet_getaddrinfo(const char *hostname, const char *servname,+ const struct addrinfo *hints, struct addrinfo **res)+{+ return getaddrinfo(hostname, servname, hints, res);+}++INLINE void+hsnet_freeaddrinfo(struct addrinfo *ai)+{+ freeaddrinfo(ai);+}+#endif #endif
network.cabal view
@@ -1,5 +1,5 @@ name: network-version: 2.2.1.1+version: 2.2.1.2 license: BSD3 license-file: LICENSE maintainer: Johan Tibell <johan.tibell@gmail.com>