packages feed

network 3.1.4.0 → 3.2.12.0

raw patch · 51 files changed

Files

CHANGELOG.md view
@@ -1,3 +1,146 @@+# CHANGELOG for network++## Version 3.2.12.0++* Add unsafeGracefulClose and recvMsgWith+* Return the bytes sent from sendMsg on Windows+* Add withWritable, connectWith and the send functions which the caller can give up on+* Raise the error which the first read of recvWith meets, rather than dropping it and waiting+* Add recvBufMsgWith, sendBufMsgWith, the give-up functions of Network.Socket.Address and of Network.Socket.ByteString.Lazy+* On Windows, giving up on an operation no longer cancels other threads' operations on the socket+* recvBufFromWith takes Ptr a, as recvBufFrom does+* Emulate socketPair with TCP over loopback on Windows+  [#630](https://github.com/haskell/network/pull/630)+* Add isPortUnreachableError++## Version 3.2.11.0++* Add unsafeClose+  [#629](https://github.com/haskell/network/pull/629)++## Version 3.2.10.0++* Multicast support+  [#614](https://github.com/haskell/network/pull/614)+* Support for getHostName+  [#621](https://github.com/haskell/network/pull/621)+* Adding acceptWith, recvWith, recvFromWith, recvBufWith and recvBufFromWith, which take an STM action+  beside the operation and let the caller give up on it without closing+  the socket or interrupting the thread, and withReadable, which they are+  built from.+* Adding isClosedSocketError and isTransientAcceptError, which name what+  an accept loop has to tell apart: a socket closed under it, one queued+  connection which failed, and the rest.+* On Windows, the Winsock error code is kept in ioe_errno rather than+  dropped.  Winsock reports every error as OtherError, so the code was+  the only thing telling them apart and it was only in the description.+  isClosedSocketError and isTransientAcceptError read it, so an accept+  loop there now stops when its socket is closed and retries a+  connection the peer gave up on.+* gracefulClose waits for the peer's FIN through recvBufWith, which is+  one code path on every platform, and drains what arrived before it up+  to 128 KiB rather than reading once: data left unread makes close send+  RST.  It therefore keeps to its timeout on Windows, where+  System.Timeout cannot cut a receive short and a peer which stayed open+  and silent used to hold the caller for as long as it did.+* gracefulClose reads its timeout as the milliseconds it is documented+  to be without an event manager.  System.Timeout takes microseconds, so+  it was a thousandth of what was asked for.+* On Windows, a datagram socket hears an ICMP unreachable which a send+  of its own caused only once it is connected, as on POSIX.  Winsock+  reports it to every datagram socket, so one reply bouncing off a+  client which had gone ended a server's receive loop; socket turns that+  off and connect turns it back on.+* The readiness based waitReadSocketSTM and waitWriteSocketSTM cannot+  work on Windows, where completion ports report that an operation has+  finished rather than that one could be started, and now say so+  instead of blocking forever.++## Version 3.2.9.0++* Exporting recvBufNoWait.++## Version 3.2.8.0++* sockopt: add IP_DONTFRAG/IP_MTU_DISCOVER option.+  [#603](https://github.com/haskell/network/pull/603)+* Add new SocketOption KeepInit.+  [#600](https://github.com/haskell/network/pull/600)+* Remove withSocketsDo from examples.+  [#596](https://github.com/haskell/network/pull/596)++## Version 3.2.7.0++* Using nested `bracket` for `gracefulClose`.+  [#591](https://github.com/haskell/network/issues/590)+* Fix memory leak in getaddrinfo and make it async exception safe.+  [#591](https://github.com/haskell/network/pull/591)+* Make call to c_free async exception safe.+  [#592](https://github.com/haskell/network/pull/592)++## Version 3.2.6.0++* fixing the Show instance of IPv4-mapped IPv6 address on little endian machines++## Version 3.2.5.0++* `gracefulClose` based on STM racing and `timeout`.+  [#587](https://github.com/haskell/network/issues/587)++## Version 3.2.4.0++* New API: setSockOptValue.+  [#588](https://github.com/haskell/network/issues/588)++## Version 3.2.3.0++* Making getAddrInfo polymorphic+  [#587](https://github.com/haskell/network/issues/587)++## Version 3.2.2.0++* New API: waitReadSocketSTM, waitAndCancelReadSocketSTM,+  waitWriteSocketSTM, waitAndCancelWriteSocketSTM+  [#586](https://github.com/haskell/network/issues/586)+* Checking the length of ASCII string allowing trailing 0.+  [#585](https://github.com/haskell/network/issues/585)++## Version 3.2.1.0++* Trying to release with the latest autoreconf.+  Packing "network" in the local directory instead of CI.+* Remove includes from .cabal-file+  [#583](https://github.com/haskell/network/issues/583)+* making gracefulClose more graceful+  [#580](https://github.com/haskell/network/issues/580)+* Update config.guess, config.sub to their latest versions+  [#579](https://github.com/haskell/network/issues/579)++## Version 3.2.0.0++* Breaking change: Using Strict and StrictData.+* Breaking change: Allow a control message to contain multiple file descriptors+  [#567](https://github.com/haskell/network/issues/567)+* Breaking change: CmsgIdFd -> CmsgIdFds+  [#575](https://github.com/haskell/network/issues/575)+* SocketTypes: use UnsupportedSocketType instead of -1.+  [#560](https://github.com/haskell/network/issues/560)+* Expose NullSockAddr, add send-with-fds functions.+  [#562](https://github.com/haskell/network/issues/562)+* Allow bytestring-0.12 and replace deprecated memcpy by copyBytes.+  [#564](https://github.com/haskell/network/issues/564)+* Close file descriptor in accept when exception happens+  [#569](https://github.com/haskell/network/issues/569)+* Bump CI to GHC 9.8 and latest versions of actions+  [#573](https://github.com/haskell/network/issues/573)++## Version 3.1.5.0++* [#541](https://github.com/haskell/network/issues/541)+  * Export `Network.Socket.Internal.NullSockAddr`+  * Add `Network.Socket.ByteString.sendManyWithFds`+  * Add `Network.Socket.ByteString.Lazy.sendWithFds`+ ## Version 3.1.4.0  * Install and use afunix_compat.h header.
Network/Socket.hs view
@@ -3,6 +3,11 @@ #include "HsNetDef.h"  -----------------------------------------------------------------------------++-----------------------------------------------------------------------------++-- In order to process this file, you need to have CALLCONV defined.+ -- | -- Module      :  Network.Socket -- Copyright   :  (c) The University of Glasgow 2001@@ -28,6 +33,7 @@ -- > import qualified Control.Exception as E -- > import Control.Monad (unless, forever, void) -- > import qualified Data.ByteString as S+-- > import qualified Data.List.NonEmpty as NE -- > import Network.Socket -- > import Network.Socket.ByteString (recv, sendAll) -- >@@ -42,7 +48,7 @@ -- > -- > -- from the "network-run" package. -- > runTCPServer :: Maybe HostName -> ServiceName -> (Socket -> IO a) -> IO a--- > runTCPServer mhost port server = withSocketsDo $ do+-- > runTCPServer mhost port server = do -- >     addr <- resolve -- >     E.bracket (open addr) close loop -- >   where@@ -51,7 +57,7 @@ -- >                 addrFlags = [AI_PASSIVE] -- >               , addrSocketType = Stream -- >               }--- >         head <$> getAddrInfo (Just hints) mhost (Just port)+-- >         NE.head <$> getAddrInfo (Just hints) mhost (Just port) -- >     open addr = E.bracketOnError (openSocket addr) close $ \sock -> do -- >         setSocketOption sock ReuseAddr 1 -- >         withFdSocket sock setCloseOnExecIfNeeded@@ -72,6 +78,7 @@ -- > -- > import qualified Control.Exception as E -- > import qualified Data.ByteString.Char8 as C+-- > import qualified Data.List.NonEmpty as NE -- > import Network.Socket -- > import Network.Socket.ByteString (recv, sendAll) -- >@@ -84,13 +91,13 @@ -- > -- > -- from the "network-run" package. -- > runTCPClient :: HostName -> ServiceName -> (Socket -> IO a) -> IO a--- > runTCPClient host port client = withSocketsDo $ do+-- > runTCPClient host port client = do -- >     addr <- resolve -- >     E.bracket (open addr) close client -- >   where -- >     resolve = do -- >         let hints = defaultHints { addrSocketType = Stream }--- >         head <$> getAddrInfo (Just hints) (Just host) (Just port)+-- >         NE.head <$> getAddrInfo (Just hints) (Just host) (Just port) -- >     open addr = E.bracketOnError (openSocket addr) close $ \sock -> do -- >         connect sock $ addrAddress addr -- >         return sock@@ -100,187 +107,422 @@ -- unexpected things would happen. There is one exception for multiple -- threads vs a single 'Socket': one thread reads data from a 'Socket' -- only and the other thread writes data to the 'Socket' only.---------------------------------------------------------------------------------- In order to process this file, you need to have CALLCONV defined.--module Network.Socket-    (-    -- * Initialisation-      withSocketsDo-+module Network.Socket (     -- * Address information-    , getAddrInfo+    getAddrInfo,+     -- ** Types-    , HostName-    , ServiceName-    , AddrInfo(..)-    , defaultHints+    ServiceName,+    AddrInfo (..),+    defaultHints,+     -- ** Flags-    , AddrInfoFlag(..)-    , addrInfoFlagImplemented+    AddrInfoFlag (..),+    addrInfoFlagImplemented,      -- * Socket operations-    , connect-    , bind-    , listen-    , accept+    connect,+    bind,+    listen,+    accept,+     -- ** Closing-    , close-    , close'-    , gracefulClose-    , shutdown-    , ShutdownCmd(..)+    close,+    close',+    unsafeClose,+    gracefulClose,+    unsafeGracefulClose,+    shutdown,+    ShutdownCmd (..),      -- * Socket options-    , SocketOption(SockOpt-                  ,UnsupportedSocketOption-                  ,Debug,ReuseAddr,SoDomain,Type,SoProtocol,SoError,DontRoute-                  ,Broadcast,SendBuffer,RecvBuffer,KeepAlive,OOBInline-                  ,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort-                  ,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut-                  ,UseLoopBack,UserTimeout,IPv6Only-                  ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo-                  ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo)-    , StructLinger (..)-    , SocketTimeout (..)-    , isSupportedSocketOption-    , whenSupported-    , getSocketOption-    , setSocketOption-    , getSockOpt-    , setSockOpt+    SocketOption (+        SockOpt,+        UnsupportedSocketOption,+        Debug,+        ReuseAddr,+        SoDomain,+        Type,+        SoProtocol,+        SoError,+        DontRoute,+        Broadcast,+        SendBuffer,+        RecvBuffer,+        KeepAlive,+        KeepInit,+        OOBInline,+        TimeToLive,+        MaxSegment,+        NoDelay,+        Cork,+        Linger,+        ReusePort,+        RecvLowWater,+        SendLowWater,+        RecvTimeOut,+        SendTimeOut,+        UseLoopBack,+        UserTimeout,+        IPv6Only,+        RecvIPv4TTL,+        RecvIPv4TOS,+        RecvIPv4PktInfo,+        DontFragment,+        RecvIPv6HopLimit,+        RecvIPv6TClass,+        RecvIPv6PktInfo,+        MulticastIF,+        MulticastTTL,+        MulticastLoop,+        AddMembership,+        DropMembership+    ),+    isSupportedSocketOption,+    whenSupported,+    getSocketOption,+    setSocketOption, +    -- ** General socket options+    StructLinger (..),+    SocketTimeout (..),+    getSockOpt,+    setSockOpt,++    -- ** Integrated socket options+    SockOptValue (..),+    setSockOptValue,+     -- * Socket-    , Socket-    , socket-    , openSocket-    , withFdSocket-    , unsafeFdSocket-    , touchSocket-    , socketToFd-    , fdSocket-    , mkSocket-    , socketToHandle+    Socket,+    socket,+    openSocket,+    withFdSocket,+    unsafeFdSocket,+    touchSocket,+    socketToFd,+    fdSocket,+    mkSocket,+    socketToHandle,+     -- ** Types of Socket-    , SocketType(GeneralSocketType, UnsupportedSocketType, NoSocketType-                , Stream, Datagram, Raw, RDM, SeqPacket)-    , isSupportedSocketType-    , getSocketType+    SocketType (+        GeneralSocketType,+        UnsupportedSocketType,+        NoSocketType,+        Stream,+        Datagram,+        Raw,+        RDM,+        SeqPacket+    ),+    isSupportedSocketType,+    getSocketType,+     -- ** Family-    , Family(GeneralFamily, UnsupportedFamily-            ,AF_UNSPEC,AF_UNIX,AF_INET,AF_INET6,AF_IMPLINK,AF_PUP,AF_CHAOS-            ,AF_NS,AF_NBS,AF_ECMA,AF_DATAKIT,AF_CCITT,AF_SNA,AF_DECnet-            ,AF_DLI,AF_LAT,AF_HYLINK,AF_APPLETALK,AF_ROUTE,AF_NETBIOS-            ,AF_NIT,AF_802,AF_ISO,AF_OSI,AF_NETMAN,AF_X25,AF_AX25,AF_OSINET-            ,AF_GOSSIP,AF_IPX,Pseudo_AF_XTP,AF_CTF,AF_WAN,AF_SDL,AF_NETWARE-            ,AF_NDD,AF_INTF,AF_COIP,AF_CNT,Pseudo_AF_RTIP,Pseudo_AF_PIP-            ,AF_SIP,AF_ISDN,Pseudo_AF_KEY,AF_NATM,AF_ARP,Pseudo_AF_HDRCMPLT-            ,AF_ENCAP,AF_LINK,AF_RAW,AF_RIF,AF_NETROM,AF_BRIDGE,AF_ATMPVC-            ,AF_ROSE,AF_NETBEUI,AF_SECURITY,AF_PACKET,AF_ASH,AF_ECONET-            ,AF_ATMSVC,AF_IRDA,AF_PPPOX,AF_WANPIPE,AF_BLUETOOTH,AF_CAN)-    , isSupportedFamily-    , packFamily-    , unpackFamily+    Family (+        GeneralFamily,+        UnsupportedFamily,+        AF_UNSPEC,+        AF_UNIX,+        AF_INET,+        AF_INET6,+        AF_IMPLINK,+        AF_PUP,+        AF_CHAOS,+        AF_NS,+        AF_NBS,+        AF_ECMA,+        AF_DATAKIT,+        AF_CCITT,+        AF_SNA,+        AF_DECnet,+        AF_DLI,+        AF_LAT,+        AF_HYLINK,+        AF_APPLETALK,+        AF_ROUTE,+        AF_NETBIOS,+        AF_NIT,+        AF_802,+        AF_ISO,+        AF_OSI,+        AF_NETMAN,+        AF_X25,+        AF_AX25,+        AF_OSINET,+        AF_GOSSIP,+        AF_IPX,+        Pseudo_AF_XTP,+        AF_CTF,+        AF_WAN,+        AF_SDL,+        AF_NETWARE,+        AF_NDD,+        AF_INTF,+        AF_COIP,+        AF_CNT,+        Pseudo_AF_RTIP,+        Pseudo_AF_PIP,+        AF_SIP,+        AF_ISDN,+        Pseudo_AF_KEY,+        AF_NATM,+        AF_ARP,+        Pseudo_AF_HDRCMPLT,+        AF_ENCAP,+        AF_LINK,+        AF_RAW,+        AF_RIF,+        AF_NETROM,+        AF_BRIDGE,+        AF_ATMPVC,+        AF_ROSE,+        AF_NETBEUI,+        AF_SECURITY,+        AF_PACKET,+        AF_ASH,+        AF_ECONET,+        AF_ATMSVC,+        AF_IRDA,+        AF_PPPOX,+        AF_WANPIPE,+        AF_BLUETOOTH,+        AF_CAN+    ),+    isSupportedFamily,+    packFamily,+    unpackFamily,+     -- ** Protocol number-    , ProtocolNumber-    , defaultProtocol+    ProtocolNumber,+    defaultProtocol,+     -- * Basic socket address type-    , SockAddr(..)-    , isSupportedSockAddr-    , getPeerName-    , getSocketName+    SockAddr (..),+    isSupportedSockAddr,+    getPeerName,+    getSocketName,+     -- ** Host address-    , HostAddress-    , hostAddressToTuple-    , tupleToHostAddress+    HostAddress,+    hostAddressToTuple,+    tupleToHostAddress,+     -- ** Host address6-    , HostAddress6-    , hostAddress6ToTuple-    , tupleToHostAddress6+    HostAddress6,+    hostAddress6ToTuple,+    tupleToHostAddress6,+     -- ** Flow Info-    , FlowInfo+    FlowInfo,+     -- ** Scope ID-    , ScopeID-    , ifNameToIndex-    , ifIndexToName+    ScopeID,+    ifNameToIndex,+    ifIndexToName,+     -- ** Port number-    , PortNumber-    , defaultPort-    , socketPortSafe-    , socketPort+    PortNumber,+    defaultPort,+    socketPortSafe,+    socketPort,      -- * UNIX-domain socket-    , isUnixDomainSocketAvailable-    , socketPair-    , sendFd-    , recvFd-    , getPeerCredential+    isUnixDomainSocketAvailable,+    socketPair,+    sendFd,+    recvFd,+    getPeerCredential,      -- * Name information-    , getNameInfo-    , NameInfoFlag(..)+    getNameInfo,+    NameInfoFlag (..), +    -- * Host name information+    getHostName,+    HostName,+     -- * Low level+     -- ** socket operations-    , setCloseOnExecIfNeeded-    , getCloseOnExec-    , setNonBlockIfNeeded-    , getNonBlock+    setCloseOnExecIfNeeded,+    getCloseOnExec,+    setNonBlockIfNeeded,+    getNonBlock,+     -- ** Sending and receiving data-    , sendBuf-    , recvBuf-    , sendBufTo-    , recvBufFrom+    sendBuf,+    recvBuf,+    recvBufNoWait,+    sendBufTo,+    recvBufFrom,+     -- ** Advanced IO-    , sendBufMsg-    , recvBufMsg-    , MsgFlag(MSG_OOB,MSG_DONTROUTE,MSG_PEEK,MSG_EOR,MSG_TRUNC,MSG_CTRUNC,MSG_WAITALL)+    sendBufMsg,+    recvBufMsg,+    MsgFlag (+        MSG_OOB,+        MSG_DONTROUTE,+        MSG_PEEK,+        MSG_EOR,+        MSG_TRUNC,+        MSG_CTRUNC,+        MSG_WAITALL+    ),+     -- ** Control message (ancillary data)-    , Cmsg(..)-    , CmsgId(CmsgId-            ,CmsgIdIPv4TTL-            ,CmsgIdIPv6HopLimit-            ,CmsgIdIPv4TOS-            ,CmsgIdIPv6TClass-            ,CmsgIdIPv4PktInfo-            ,CmsgIdIPv6PktInfo-            ,CmsgIdFd-            ,UnsupportedCmsgId)+    Cmsg (..),+    CmsgId (+        CmsgId,+        CmsgIdIPv4TTL,+        CmsgIdIPv6HopLimit,+        CmsgIdIPv4TOS,+        CmsgIdIPv6TClass,+        CmsgIdIPv4PktInfo,+        CmsgIdIPv6PktInfo,+        CmsgIdFds,+        UnsupportedCmsgId+    ),+     -- ** APIs for control message-    , lookupCmsg-    , filterCmsg-    , decodeCmsg-    , encodeCmsg+    lookupCmsg,+    filterCmsg,+     -- ** Class and types for control message-    , ControlMessage(..)-    , IPv4TTL(..)-    , IPv6HopLimit(..)-    , IPv4TOS(..)-    , IPv6TClass(..)-    , IPv4PktInfo(..)-    , IPv6PktInfo(..)+    ControlMessage (..),+    IPv4TTL (..),+    IPv6HopLimit (..),+    IPv4TOS (..),+    IPv6TClass (..),+    IPv4PktInfo (..),+    IPv6PktInfo (..),+     -- * Special constants-    , maxListenQueue-    ) where+    maxListenQueue, -import Network.Socket.Buffer hiding (sendBufTo, recvBufFrom, sendBufMsg, recvBufMsg)+    -- * Event polling+    -- $eventpolling++    -- ** Giving up on a blocked operation+    withReadable,+    withWritable,+    acceptWith,+    connectWith,+    recvBufWith,+    recvBufFromWith,+    sendBufWith,+    sendBufToWith,+    sendBufMsgWith,+    recvBufMsgWith,++    -- ** What a given-up operation can fail with+    isClosedSocketError,+    isTransientAcceptError,+    isPortUnreachableError,++    -- ** Waiting for readiness (POSIX only)+    waitReadSocketSTM,+    waitAndCancelReadSocketSTM,+    waitWriteSocketSTM,+    waitAndCancelWriteSocketSTM,++    -- * Deprecated+    withSocketsDo,++    -- * Multicast Group+    MulticastGroup (..),+)+where++import Network.Socket.Buffer hiding (+    recvBufFrom,+    recvBufMsg,+    sendBufMsg,+    sendBufTo,+ ) import Network.Socket.Cbits import Network.Socket.Fcntl import Network.Socket.Flag import Network.Socket.Handle import Network.Socket.If import Network.Socket.Info+#if !defined(mingw32_HOST_OS)+import Network.Socket.Posix.HostName(getHostName)+#else+import Network.Socket.Win32.HostName(getHostName)+#endif import Network.Socket.Internal import Network.Socket.Name hiding (getPeerName, getSocketName) import Network.Socket.Options+import Network.Socket.STM import Network.Socket.Shutdown import Network.Socket.SockAddr-import Network.Socket.Syscall hiding (connect, bind, accept)+import Network.Socket.Syscall hiding (accept, bind, connect) import Network.Socket.Types import Network.Socket.Unix+import Network.Socket.Wait (+    recvBufFromWith,+    isClosedSocketError,+    isTransientAcceptError,+    isPortUnreachableError,+    recvBufWith,+    sendBufWith,+    withReadable,+    withWritable,+ ) #if !defined(mingw32_HOST_OS) import Network.Socket.Posix.Cmsg #else import Network.Socket.Win32.Cmsg #endif++-- $eventpolling+--+-- A thread blocked on a socket is stopped here by being told, not by+-- having the socket closed under it and not by an asynchronous exception+-- thrown into it.  Each of 'withReadable', 'acceptWith', 'recvBufWith'+-- and 'recvBufFromWith' takes an 'Control.Concurrent.STM.STM' action+-- beside the operation; whichever settles first decides, 'Left' when the+-- caller gave up and 'Right' when the operation completed, and an+-- operation which has completed wins a tie.  They are for one reader at+-- a time, and 'withReadable' says what else they ask of the caller.+-- 'withWritable', 'connectWith', 'sendBufWith' and 'sendBufToWith' do the+-- same for writing, one writer at a time; a stream given up on in the+-- middle of a send is to be closed.+--+-- The other two ways are going away or gone.  A close ends a wait only+-- because the event manager tells the waiter so, which 'GHC.Conc.closeFdWith'+-- is to stop doing, and a descriptor number is reused; an asynchronous+-- exception does not reach a thread blocked in a socket call on Windows+-- at all.+--+-- A server loop which is told to stop, rather than having its listening+-- socket closed under it:+--+-- > stopping <- newTVarIO False+-- > -- the shutdown handler runs: atomically $ writeTVar stopping True+-- > let loop = acceptWith sock (check =<< readTVar stopping) >>= \case+-- >         Left () -> return ()+-- >         Right (conn, _) -> forkIO (serve conn) >> loop+--+-- A receive which gives up on a deadline, where 'System.Timeout.timeout'+-- cannot cut one short:+--+-- > late <- registerDelay (milliseconds * 1000)+-- > r <- recvBufWith s buf size (check =<< readTVar late)+--+-- The 'Control.Concurrent.STM.STM' action is run more than once, so it+-- has to be a test rather than something which takes what it reads.+--+-- Readiness, which these are built from on POSIX, is not available on+-- Windows: completion ports report that an operation finished, not that+-- one could be started.  The four readiness functions say so rather than+-- blocking for good, and what runs there instead is the operation itself,+-- on a thread of its own, cancelled with @CancelIoEx@ when the caller+-- gives up.  Those for particular operations cancel their own alone,+-- and another thread's operation on the socket carries on; the action+-- given to 'withReadable' or 'withWritable' cannot be told apart, so its+-- cancel ends every operation pending on the socket.+-- "Network.Socket.ByteString" has @recvWith@ and @recvFromWith@ for+-- 'Data.ByteString.ByteString'.
Network/Socket/Address.hs view
@@ -1,28 +1,41 @@ -- | This module provides extensible APIs for socket addresses.--- module Network.Socket.Address (     -- * Socket Address-      SocketAddress(..)-    , getPeerName-    , getSocketName+    SocketAddress (..),+    getPeerName,+    getSocketName,+     -- * Socket operations-    , connect-    , bind-    , accept+    connect,+    connectWith,+    bind,+    accept,+    acceptWith,+     -- * Sending and receiving ByteString-    , sendTo-    , sendAllTo-    , recvFrom+    sendTo,+    sendAllTo,+    sendToWith,+    recvFrom,+    recvWith,+    recvFromWith,+     -- * Sending and receiving data from a buffer-    , sendBufTo-    , recvBufFrom+    sendBufTo,+    sendBufToWith,+    recvBufFrom,+    recvBufFromWith,+     -- * Advanced IO-    , sendBufMsg-    , recvBufMsg-    ) where+    sendBufMsg,+    sendBufMsgWith,+    recvBufMsg,+    recvBufMsgWith,+) where -import Network.Socket.ByteString.IO import Network.Socket.Buffer+import Network.Socket.ByteString.IO import Network.Socket.Name import Network.Socket.Syscall import Network.Socket.Types+import Network.Socket.Wait
Network/Socket/Buffer.hsc view
@@ -11,14 +11,19 @@   , recvBufFrom   , recvBuf   , recvBufNoWait+  , recvBufNoWaitOr   , sendBufMsg   , recvBufMsg+  , sendBufToOv+  , sendBufOv+  , recvBufFromOv+  , recvBufOv+  , sendBufMsgOv+  , recvBufMsgOv   ) where  #if !defined(mingw32_HOST_OS) import Foreign.C.Error (getErrno, eAGAIN, eWOULDBLOCK)-#else-import Foreign.Ptr (nullPtr) #endif import Foreign.Marshal.Alloc (alloca, allocaBytes) import Foreign.Marshal.Utils (with)@@ -57,14 +62,25 @@           -> Int         -- Data to send           -> sa           -> IO Int      -- Number of Bytes sent-sendBufTo s ptr nbytes sa =+sendBufTo = sendBufToOv nullPtr++-- | 'sendBufTo' issued with an OVERLAPPED on Windows, unless it is+--   'nullPtr', so that cancelling it reaches nothing else.  The+--   OVERLAPPED is ignored elsewhere.  So are the others ending in @Ov@.+sendBufToOv :: SocketAddress sa => Ptr () -> Socket -> Ptr a -> Int -> sa -> IO Int+sendBufToOv _ov s ptr nbytes sa =   withSocketAddress sa $ \p_sa siz -> fromIntegral <$> do     withFdSocket s $ \fd -> do         let sz = fromIntegral siz             n = fromIntegral nbytes             flags = 0         throwSocketErrorWaitWrite s "Network.Socket.sendBufTo" $-          c_sendto fd ptr n flags p_sa sz+#if defined(mingw32_HOST_OS)+          if _ov /= nullPtr+            then c_ovl_sendto fd (castPtr ptr) (fromIntegral nbytes) (castPtr p_sa) sz _ov+            else+#endif+              c_sendto fd ptr n flags p_sa sz  #if defined(mingw32_HOST_OS) socket2FD :: Socket -> IO FD@@ -81,8 +97,17 @@         -> Ptr Word8  -- Pointer to the data to send         -> Int        -- Length of the buffer         -> IO Int     -- Number of Bytes sent-sendBuf s str len = fromIntegral <$> do+sendBuf = sendBufOv nullPtr++-- | 'sendBuf' issued with an OVERLAPPED: see 'sendBufToOv'.+sendBufOv :: Ptr () -> Socket -> Ptr Word8 -> Int -> IO Int+sendBufOv _ov s str len = fromIntegral <$> do #if defined(mingw32_HOST_OS)+  if _ov /= nullPtr then+    withFdSocket s $ \fd ->+      throwSocketErrorWaitWrite s "Network.Socket.sendBuf" $+        c_ovl_send fd (castPtr str) (fromIntegral len) _ov+  else do -- writeRawBufferPtr is supposed to handle checking for errors, but it's broken -- on x86_64 because of GHC bug #12010 so we duplicate the check here. The call -- to throwSocketErrorIfMinus1Retry can be removed when no GHC version with the@@ -112,7 +137,11 @@ -- NOTE: blocking on Windows unless you compile with -threaded (see -- GHC ticket #1129) recvBufFrom :: SocketAddress sa => Socket -> Ptr a -> Int -> IO (Int, sa)-recvBufFrom s ptr nbytes+recvBufFrom = recvBufFromOv nullPtr++-- | 'recvBufFrom' issued with an OVERLAPPED: see 'sendBufToOv'.+recvBufFromOv :: SocketAddress sa => Ptr () -> Socket -> Ptr a -> Int -> IO (Int, sa)+recvBufFromOv _ov s ptr nbytes     | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvBufFrom")     | otherwise = withNewSocketAddress $ \ptr_sa sz -> alloca $ \ptr_len ->         withFdSocket s $ \fd -> do@@ -120,6 +149,11 @@             let cnbytes = fromIntegral nbytes                 flags = 0             len <- throwSocketErrorWaitRead s "Network.Socket.recvBufFrom" $+#if defined(mingw32_HOST_OS)+              if _ov /= nullPtr+                then c_ovl_recvfrom fd (castPtr ptr) (fromIntegral nbytes) (castPtr ptr_sa) ptr_len _ov+                else+#endif                      c_recvfrom fd ptr cnbytes flags ptr_sa ptr_len             sockaddr <- peekSocketAddress ptr_sa                 `catchIOError` \_ -> getPeerName s@@ -138,8 +172,17 @@ -- EOF. Historical note: Version 2.8.x.y or earlier, -- an EOF error was thrown. This was changed in version 3.0. recvBuf :: Socket -> Ptr Word8 -> Int -> IO Int-recvBuf s ptr nbytes+recvBuf = recvBufOv nullPtr++-- | 'recvBuf' issued with an OVERLAPPED: see 'sendBufToOv'.+recvBufOv :: Ptr () -> Socket -> Ptr Word8 -> Int -> IO Int+recvBufOv _ov s ptr nbytes  | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvBuf")+#if defined(mingw32_HOST_OS)+ | _ov /= nullPtr = withFdSocket s $ \fd -> fromIntegral <$>+    throwSocketErrorWaitRead s "Network.Socket.recvBuf"+        (c_ovl_recv fd (castPtr ptr) (fromIntegral nbytes) _ov)+#endif  | otherwise   = do #if defined(mingw32_HOST_OS) -- see comment in sendBuf above.@@ -159,24 +202,37 @@ --   involved. The length of data is returned if received. --   -1 is returned in the case of EAGAIN or EWOULDBLOCK. --   -2 is returned in other error cases.+--+-- @since 3.2.9.0 recvBufNoWait :: Socket -> Ptr Word8 -> Int -> IO Int-recvBufNoWait s ptr nbytes = withFdSocket s $ \fd -> do+recvBufNoWait = recvBufNoWaitOr $ return (-2)++-- | 'recvBufNoWait' which runs the action on an error, in place of+--   answering -2.  The error is gone from the socket once read, so this+--   is where to raise it.+recvBufNoWaitOr :: IO CInt -> Socket -> Ptr Word8 -> Int -> IO Int+recvBufNoWaitOr onError s ptr nbytes = withFdSocket s $ \fd -> do #if defined(mingw32_HOST_OS)     alloca $ \ptr_bytes -> do       res <- c_ioctlsocket fd #{const FIONREAD} ptr_bytes       avail <- peek ptr_bytes-      r <- if res == #{const NO_ERROR} && avail > 0 then-               c_recv fd (castPtr ptr) (fromIntegral nbytes) 0{-flags-}+      let failed = do+              err <- c_WSAGetLastError+              if err == #{const WSAEWOULDBLOCK}+                  || err == #{const WSAEINPROGRESS} then+                  return (-1)+                else+                  onError+      r <- if res == #{const NO_ERROR} && avail > 0 then do+               -- A pending error, such as an ICMP unreachable, counts as+               -- something to read, and recv takes it.+               n <- c_recv fd (castPtr ptr) (fromIntegral nbytes) 0{-flags-}+               if n == -1 then failed else return n            else if avail == 0 then                -- Socket would block, could also mean socket is closed but                -- can't distinguish                return (-1)-           else do err <- c_WSAGetLastError-                   if err == #{const WSAEWOULDBLOCK}-                       || err == #{const WSAEINPROGRESS} then-                       return (-1)-                     else-                        return (-2)+           else failed       return $ fromIntegral r  #else@@ -188,7 +244,7 @@         if err == eAGAIN || err == eWOULDBLOCK then             return (-1)           else-            return (-2)+            fromIntegral <$> onError #endif  mkInvalidRecvArgError :: String -> IOError@@ -204,7 +260,12 @@            -> [Cmsg]            -- ^ Control messages            -> MsgFlag           -- ^ Message flags            -> IO Int            -- ^ The length actually sent-sendBufMsg s sa bufsizs cmsgs flags = do+sendBufMsg = sendBufMsgOv nullPtr++-- | 'sendBufMsg' issued with an OVERLAPPED: see 'sendBufToOv'.+sendBufMsgOv :: SocketAddress sa+             => Ptr () -> Socket -> sa -> [(Ptr Word8,Int)] -> [Cmsg] -> MsgFlag -> IO Int+sendBufMsgOv _ov s sa bufsizs cmsgs flags = do   sz <- withSocketAddress sa $ \addrPtr addrSize -> #if !defined(mingw32_HOST_OS)     withIOVec bufsizs $ \(iovsPtr, iovsLen) -> do@@ -229,12 +290,17 @@             cflags = fromMsgFlag flags         withFdSocket s $ \fd ->           with msgHdr $ \msgHdrPtr ->-            throwSocketErrorWaitWrite s "Network.Socket.Buffer.sendMsg" $ #if !defined(mingw32_HOST_OS)+            throwSocketErrorWaitWrite s "Network.Socket.Buffer.sendMsg" $               c_sendmsg fd msgHdrPtr cflags #else-              alloca $ \send_ptr ->-                c_sendmsg fd msgHdrPtr (fromIntegral cflags) send_ptr nullPtr nullPtr+            -- WSASendMsg returns 0 and puts the bytes sent here.+            alloca $ \send_ptr -> do+              _ <- throwSocketErrorWaitWrite s "Network.Socket.Buffer.sendMsg" $+                if _ov /= nullPtr+                  then c_ovl_sendmsg fd msgHdrPtr (fromIntegral cflags) send_ptr _ov+                  else c_sendmsg fd msgHdrPtr (fromIntegral cflags) send_ptr nullPtr nullPtr+              peek send_ptr #endif   return $ fromIntegral sz @@ -252,7 +318,12 @@                                 --   'MSG_CTRUNC' is returned            -> MsgFlag           -- ^ Message flags            -> IO (sa,Int,[Cmsg],MsgFlag) -- ^ Source address, total bytes received, control messages and message flags-recvBufMsg s bufsizs clen flags = do+recvBufMsg = recvBufMsgOv nullPtr++-- | 'recvBufMsg' issued with an OVERLAPPED: see 'sendBufToOv'.+recvBufMsgOv :: SocketAddress sa+             => Ptr () -> Socket -> [(Ptr Word8,Int)] -> Int -> MsgFlag -> IO (sa,Int,[Cmsg],MsgFlag)+recvBufMsgOv _ov s bufsizs clen flags = do   withNewSocketAddress $ \addrPtr addrSize ->     allocaBytes clen $ \ctrlPtr -> #if !defined(mingw32_HOST_OS)@@ -287,7 +358,9 @@ #else                 alloca $ \len_ptr -> do                     _ <- throwSocketErrorWaitReadBut (== #{const WSAEMSGSIZE}) s "Network.Socket.Buffer.recvmsg" $-                            c_recvmsg fd msgHdrPtr len_ptr nullPtr nullPtr+                            if _ov /= nullPtr+                              then c_ovl_recvmsg fd msgHdrPtr len_ptr _ov+                              else c_recvmsg fd msgHdrPtr len_ptr nullPtr nullPtr                     peek len_ptr #endif             sockaddr <- peekSocketAddress addrPtr `catchIOError` \_ -> getPeerName s@@ -313,6 +386,21 @@   c_sendmsg :: CInt -> Ptr (MsgHdr sa) -> DWORD -> LPDWORD -> Ptr () -> Ptr ()  -> IO CInt foreign import CALLCONV SAFE_ON_WIN "WSARecvMsg"   c_recvmsg :: CInt -> Ptr (MsgHdr sa) -> LPDWORD -> Ptr () -> Ptr () -> IO CInt++-- Each waits for the operation it issues with the OVERLAPPED given, so+-- they are safe calls, and are run where the wait can be given up on.+foreign import ccall safe "hsnet_ovl_recv"+  c_ovl_recv :: CInt -> Ptr CChar -> CInt -> Ptr () -> IO CInt+foreign import ccall safe "hsnet_ovl_send"+  c_ovl_send :: CInt -> Ptr CChar -> CInt -> Ptr () -> IO CInt+foreign import ccall safe "hsnet_ovl_recvfrom"+  c_ovl_recvfrom :: CInt -> Ptr CChar -> CInt -> Ptr () -> Ptr CInt -> Ptr () -> IO CInt+foreign import ccall safe "hsnet_ovl_sendto"+  c_ovl_sendto :: CInt -> Ptr CChar -> CInt -> Ptr () -> CInt -> Ptr () -> IO CInt+foreign import ccall safe "hsnet_ovl_sendmsg"+  c_ovl_sendmsg :: CInt -> Ptr (MsgHdr sa) -> DWORD -> LPDWORD -> Ptr () -> IO CInt+foreign import ccall safe "hsnet_ovl_recvmsg"+  c_ovl_recvmsg :: CInt -> Ptr (MsgHdr sa) -> LPDWORD -> Ptr () -> IO CInt #endif  foreign import ccall unsafe "recv"
Network/Socket/ByteString.hs view
@@ -16,36 +16,51 @@ -- -- > import Network.Socket -- > import Network.Socket.ByteString----module Network.Socket.ByteString-    (+module Network.Socket.ByteString (     -- * Send data to a socket-      send-    , sendAll-    , sendTo-    , sendAllTo+    send,+    sendAll,+    sendTo,+    sendAllTo,+    sendWith,+    sendAllWith,+    sendToWith,      -- ** Vectored I/O     -- $vectored-    , sendMany-    , sendManyTo+    sendMany,+    sendManyTo,+    sendManyWithFds,+    sendManyWith,      -- * Receive data from a socket-    , recv-    , recvFrom+    recv,+    recvFrom,+    recvWith,+    recvFromWith,      -- * Advanced send and recv-    , sendMsg-    , recvMsg-    ) where+    sendMsg,+    sendMsgWith,+    recvMsg,+    recvMsgWith,+) where +import Control.Concurrent.STM (STM) import Data.ByteString (ByteString) +import Network.Socket.ByteString.IO hiding (+    recvFrom,+    recvFromWith,+    sendAllTo,+    sendTo,+    sendToWith,+ ) import qualified Network.Socket.ByteString.IO as G-import Network.Socket.ByteString.IO hiding (sendTo, sendAllTo, recvFrom) import Network.Socket.Types  -- ----------------------------------------------------------------------------+ -- ** Vectored I/O  -- $vectored@@ -89,3 +104,16 @@ -- 'SockAddr' representing the address of the sending socket. recvFrom :: Socket -> Int -> IO (ByteString, SockAddr) recvFrom = G.recvFrom++-- | 'recvFrom' which the caller can give up on.+--+--   @since 3.2.10.0+recvFromWith+    :: Socket -> Int -> STM a -> IO (Either a (ByteString, SockAddr))+recvFromWith = G.recvFromWith++-- | 'sendTo' which the caller can give up on.+--+--   @since 3.2.12.0+sendToWith :: Socket -> ByteString -> SockAddr -> STM a -> IO (Either a Int)+sendToWith = G.sendToWith
Network/Socket/ByteString/IO.hsc view
@@ -1,4 +1,3 @@-{-# LANGUAGE BangPatterns #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE OverloadedStrings #-} @@ -20,19 +19,28 @@     , sendAll     , sendTo     , sendAllTo+    , sendWith+    , sendAllWith+    , sendToWith      -- ** Vectored I/O     -- $vectored     , sendMany     , sendManyTo+    , sendManyWithFds+    , sendManyWith      -- * Receive data from a socket     , recv     , recvFrom+    , recvWith+    , recvFromWith+    , recvMsgWith     , waitWhen0      -- * Advanced send and recv     , sendMsg+    , sendMsgWith     , recvMsg     , MsgFlag(..)     , Cmsg(..)@@ -45,15 +53,19 @@ import Data.ByteString.Unsafe (unsafeUseAsCStringLen) import Foreign.Marshal.Alloc (allocaBytes) +import Control.Concurrent.STM (STM)+ import Network.Socket.Buffer import Network.Socket.ByteString.Internal import Network.Socket.Imports import Network.Socket.Types+import Network.Socket.Wait  import Data.ByteString.Internal (create, ByteString(..)) import Foreign.ForeignPtr (withForeignPtr) import Foreign.Marshal.Utils (with) import Network.Socket.Internal+import System.Posix.Types (Fd(..))  import Network.Socket.Flag @@ -77,9 +89,14 @@ send :: Socket     -- ^ Connected socket      -> ByteString  -- ^ Data to send      -> IO Int      -- ^ Number of bytes sent-send s xs = unsafeUseAsCStringLen xs $ \(str, len) ->-    sendBuf s (castPtr str) len+send = sendOv nullPtr +-- The give-ups below issue their operations with an OVERLAPPED of their+-- own on Windows, through these: see 'Network.Socket.Buffer.sendBufToOv'.+sendOv :: Ptr () -> Socket -> ByteString -> IO Int+sendOv ov s xs = unsafeUseAsCStringLen xs $ \(str, len) ->+    sendBufOv ov s (castPtr str) len+ waitWhen0 :: Int -> Socket -> IO () waitWhen0 0 s = when rtsSupportsBoundThreads $     withFdSocket s $ \fd -> threadWaitWrite $ fromIntegral fd@@ -102,6 +119,35 @@         waitWhen0 sent s         when (sent /= B.length bs) $ loop $ B.drop sent bs +-- | 'send' which the caller can give up on.  See+--   'Network.Socket.withWritable' for what is left of the stream after+--   giving up.+--+--   @since 3.2.12.0+sendWith :: Socket -> ByteString -> STM a -> IO (Either a Int)+sendWith s xs giveUp = withWritableOv s giveUp $ \ov -> sendOv ov s xs++-- | 'sendAll' which the caller can give up on.  Part of the data may+--   have been sent before it gives up, so a stream given up on is to be+--   closed.+--+--   @since 3.2.12.0+sendAllWith :: Socket -> ByteString -> STM a -> IO (Either a ())+sendAllWith _ "" _ = return $ Right ()+sendAllWith s bs giveUp = do+    r <- sendWith s bs giveUp+    case r of+        Left a -> return $ Left a+        Right sent -> sendAllWith s (B.drop sent bs) giveUp++-- | 'sendTo' which the caller can give up on.+--+--   @since 3.2.12.0+sendToWith+    :: SocketAddress sa+    => Socket -> ByteString -> sa -> STM a -> IO (Either a Int)+sendToWith s xs sa giveUp = withWritableOv s giveUp $ \ov -> sendToOv ov s xs sa+ -- | Send data to the socket.  The recipient can be specified -- explicitly, so the socket need not be in a connected state. -- Returns the number of bytes sent. Applications are responsible for@@ -111,9 +157,12 @@        -> ByteString  -- ^ Data to send        -> sa    -- ^ Recipient address        -> IO Int      -- ^ Number of bytes sent-sendTo s xs sa =-    unsafeUseAsCStringLen xs $ \(str, len) -> sendBufTo s str len sa+sendTo = sendToOv nullPtr +sendToOv :: SocketAddress sa => Ptr () -> Socket -> ByteString -> sa -> IO Int+sendToOv ov s xs sa =+    unsafeUseAsCStringLen xs $ \(str, len) -> sendBufToOv ov s str len sa+ -- | Send data to the socket. The recipient can be specified -- explicitly, so the socket need not be in a connected state.  Unlike -- 'sendTo', this function continues to send data until either all@@ -145,11 +194,16 @@          -> IO () sendMany _ [] = return () sendMany s cs = do-    sent <- sendManyInner+    sent <- sendManyOnce s cs     waitWhen0 sent s     when (sent >= 0) $ sendMany s $ remainingChunks sent cs-  where-    sendManyInner =++-- One gathering write, which may send only part of the data.+sendManyOnce :: Socket -> [ByteString] -> IO Int+sendManyOnce = sendManyOnceOv nullPtr++sendManyOnceOv :: Ptr () -> Socket -> [ByteString] -> IO Int+sendManyOnceOv _ov s cs = #if !defined(mingw32_HOST_OS)       fmap fromIntegral . withIOVecfromBS cs $ \(iovsPtr, iovsLen) ->           withFdSocket s $ \fd -> do@@ -160,12 +214,27 @@       fmap fromIntegral . withWSABuffromBS cs $ \(wsabsPtr, wsabsLen) ->           withFdSocket s $ \fd -> do               let len =  fromIntegral wsabsLen-              alloca $ \send_ptr -> do-                _ <- throwSocketErrorWaitWrite s "Network.Socket.ByteString.sendMany" $-                       c_wsasend fd wsabsPtr len send_ptr  0 nullPtr nullPtr-                peek send_ptr+              if _ov /= nullPtr+                then throwSocketErrorWaitWrite s "Network.Socket.ByteString.sendMany" $+                       c_ovl_sendv fd wsabsPtr len _ov+                else alloca $ \send_ptr -> do+                  _ <- throwSocketErrorWaitWrite s "Network.Socket.ByteString.sendMany" $+                         c_wsasend fd wsabsPtr len send_ptr  0 nullPtr nullPtr+                  fromIntegral <$> peek send_ptr #endif +-- | 'sendMany' which the caller can give up on.  Parts may have been+--   sent before it gives up, so a stream given up on is to be closed.+--+--   @since 3.2.12.0+sendManyWith :: Socket -> [ByteString] -> STM a -> IO (Either a ())+sendManyWith _ [] _ = return $ Right ()+sendManyWith s cs giveUp = do+    r <- withWritableOv s giveUp $ \ov -> sendManyOnceOv ov s cs+    case r of+        Left a -> return $ Left a+        Right sent -> sendManyWith s (remainingChunks sent cs) giveUp+ -- | Send data to the socket.  The recipient can be specified -- explicitly, so the socket need not be in a connected state.  The -- data is sent as if the parts have been concatenated.  This function@@ -218,6 +287,21 @@                   peek send_ptr #endif +-- | Send data and file descriptors over a UNIX-domain socket in+--   a single system call. This function does not work on Windows.+sendManyWithFds :: Socket       -- ^ Socket+                -> [ByteString] -- ^ Data to send+                -> [Fd]         -- ^ File descriptors+                -> IO ()+sendManyWithFds s bss fds =+    void $+        withBufSizs bss $ \bufsizs ->+            sendBufMsg s addr bufsizs cmsgs flags+  where+    addr = NullSockAddr+    cmsgs = encodeCmsg . (:[]) <$> fds+    flags = mempty+ -- ---------------------------------------------------------------------------- -- Receiving @@ -242,8 +326,11 @@      -> IO ByteString  -- ^ Data received recv s nbytes     | nbytes < 0 = ioError (mkInvalidRecvArgError "Network.Socket.ByteString.recv")-    | otherwise  = createAndTrim nbytes $ \ptr -> recvBuf s ptr nbytes+    | otherwise  = recvOv nullPtr s nbytes +recvOv :: Ptr () -> Socket -> Int -> IO ByteString+recvOv ov s nbytes = createAndTrim nbytes $ \ptr -> recvBufOv ov s ptr nbytes+ -- | Receive data from the socket.  The socket need not be in a -- connected state.  Returns @(bytes, address)@ where @bytes@ is a -- 'ByteString' representing the data received and @address@ is a@@ -254,12 +341,57 @@             Socket                     -- ^ Socket          -> Int                        -- ^ Maximum number of bytes to receive          -> IO (ByteString, sa)  -- ^ Data received and sender address-recvFrom sock nbytes =+recvFrom = recvFromOv nullPtr++recvFromOv :: SocketAddress sa => Ptr () -> Socket -> Int -> IO (ByteString, sa)+recvFromOv ov sock nbytes =     allocaBytes nbytes $ \ptr -> do-        (len, sockaddr) <- recvBufFrom sock ptr nbytes+        (len, sockaddr) <- recvBufFromOv ov sock ptr nbytes         str <- B.packCStringLen (ptr, len)         return (str, sockaddr) +-- | 'recv' which the caller can give up on.  Whichever settles first+--   decides: 'Left' when the 'STM' action fires, 'Right' when data+--   arrives.  Data already waiting is taken without blocking at all and+--   so wins over a caller which has given up, as a completed operation+--   does in 'Network.Socket.withReadable'; the give-up is read there+--   and nowhere else.+--+--   @since 3.2.10.0+recvWith :: Socket -> Int -> STM a -> IO (Either a ByteString)+recvWith s nbytes giveUp+    | nbytes < 0 =+        ioError $ mkInvalidRecvArgError "Network.Socket.ByteString.recvWith"+    | otherwise = do+        bs <- createAndTrim' nbytes $ \ptr ->+            recvBufNoWaitOr (throwSocketError "Network.Socket.ByteString.recvWith") s ptr nbytes+        case bs of+            Just b -> return $ Right b+            Nothing -> withReadableOv s giveUp $ \ov -> recvOv ov s nbytes++-- | 'recvFrom' which the caller can give up on.+--+--   @since 3.2.10.0+recvFromWith+    :: SocketAddress sa+    => Socket+    -> Int+    -> STM a+    -> IO (Either a (ByteString, sa))+recvFromWith s nbytes giveUp = withReadableOv s giveUp $ \ov -> recvFromOv ov s nbytes++-- A read which never waits: 'Nothing' when nothing is there yet.+createAndTrim' :: Int -> (Ptr Word8 -> IO Int) -> IO (Maybe ByteString)+createAndTrim' nbytes f = do+    (len, bs) <- allocaBytes nbytes $ \ptr -> do+        len <- f ptr+        if len > 0+            then do+                b <- B.packCStringLen (castPtr ptr, len)+                return (len, b)+            else return (len, B.empty)+    return $ if len >= 0 then Just bs else Nothing+ -- ---------------------------------------------------------------------------- -- Not exported @@ -294,9 +426,9 @@ withBufSizs :: [ByteString] -> ([(Ptr Word8, Int)] -> IO a) -> IO a withBufSizs bss0 f = loop bss0 id   where-    loop []                    !build = f $ build []-    loop (PS fptr off len:bss) !build = withForeignPtr fptr $ \ptr -> do-        let !ptr' = ptr `plusPtr` off+    loop []                    build = f $ build []+    loop (PS fptr off len:bss) build = withForeignPtr fptr $ \ptr -> do+        let ptr' = ptr `plusPtr` off         loop bss (build . ((ptr',len) :))  -- | Send data to the socket using sendmsg(2).@@ -306,10 +438,27 @@         -> [Cmsg]       -- ^ Control messages         -> MsgFlag      -- ^ Message flags         -> IO Int       -- ^ The length actually sent-sendMsg _ _    []  _ _ = return 0-sendMsg s addr bss cmsgs flags = withBufSizs bss $ \bufsizs ->-    sendBufMsg s addr bufsizs cmsgs flags+sendMsg = sendMsgOv nullPtr +sendMsgOv :: Ptr () -> Socket -> SockAddr -> [ByteString] -> [Cmsg] -> MsgFlag -> IO Int+sendMsgOv _ _ _    []  _ _ = return 0+sendMsgOv ov s addr bss cmsgs flags = withBufSizs bss $ \bufsizs ->+    sendBufMsgOv ov s addr bufsizs cmsgs flags++-- | 'sendMsg' which the caller can give up on.+--+--   @since 3.2.12.0+sendMsgWith+    :: Socket+    -> SockAddr+    -> [ByteString]+    -> [Cmsg]+    -> MsgFlag+    -> STM a+    -> IO (Either a Int)+sendMsgWith s addr bss cmsgs flags giveUp =+    withWritableOv s giveUp $ \ov -> sendMsgOv ov s addr bss cmsgs flags+ -- | Receive data from the socket using recvmsg(2). recvMsg :: Socket  -- ^ Socket         -> Int     -- ^ The maximum length of data to be received@@ -320,10 +469,27 @@                    --   'MSG_CTRUNC' is returned         -> MsgFlag -- ^ Message flags         -> IO (SockAddr, ByteString, [Cmsg], MsgFlag) -- ^ Source address, received data, control messages and message flags-recvMsg s siz clen flags = do+recvMsg = recvMsgOv nullPtr++recvMsgOv :: Ptr () -> Socket -> Int -> Int -> MsgFlag -> IO (SockAddr, ByteString, [Cmsg], MsgFlag)+recvMsgOv ov s siz clen flags = do     bs@(PS fptr _ _) <- create siz $ \ptr -> zeroMemory ptr (fromIntegral siz)     withForeignPtr fptr $ \ptr -> do-        (addr,len,cmsgs,flags') <- recvBufMsg s [(ptr,siz)] clen flags+        (addr,len,cmsgs,flags') <- recvBufMsgOv ov s [(ptr,siz)] clen flags         let bs' | len < siz = PS fptr 0 len                 | otherwise = bs         return (addr, bs', cmsgs, flags')++-- | 'recvMsg' which the caller can give up on.+--+--   @since 3.2.12.0+recvMsgWith+    :: Socket+    -> Int+    -> Int+    -> MsgFlag+    -> STM a+    -> IO (Either a (SockAddr, ByteString, [Cmsg], MsgFlag))+recvMsgWith s siz clen flags giveUp =+    withReadableOv s giveUp $ \ov -> recvMsgOv ov s siz clen flags+
Network/Socket/ByteString/Internal.hs view
@@ -16,6 +16,7 @@     , c_writev #else     , c_wsasend+    , c_ovl_sendv #endif     , c_sendmsg     , c_recvmsg@@ -64,6 +65,9 @@   -- fixme Handle for SOCKET, see #426 foreign import CALLCONV SAFE_ON_WIN "WSASend"   c_wsasend :: CInt -> Ptr WSABuf -> DWORD -> LPDWORD -> DWORD -> Ptr () -> Ptr () -> IO CInt+-- WSASend with an OVERLAPPED of the caller's, waited for in the call.+foreign import ccall safe "hsnet_ovl_sendv"+  c_ovl_sendv :: CInt -> Ptr WSABuf -> DWORD -> Ptr () -> IO CInt foreign import CALLCONV SAFE_ON_WIN "WSASendMsg"   c_sendmsg :: CInt -> Ptr (MsgHdr SockAddr) -> DWORD -> LPDWORD -> Ptr () -> Ptr ()  -> IO CInt foreign import CALLCONV SAFE_ON_WIN "WSARecvMsg"
Network/Socket/ByteString/Lazy.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+ -- | -- Module      : Network.Socket.ByteString.Lazy -- Copyright   : (c) Bryan O'Sullivan 2009@@ -18,21 +19,30 @@ -- > import Network.Socket -- > import Network.Socket.ByteString.Lazy -- > import Prelude hiding (getContents)--- module Network.Socket.ByteString.Lazy (     -- * Send data to a socket-    send-  , sendAll+    send,+    sendAll,+    sendWithFds,+    sendWith,+    sendAllWith,+     -- * Receive data from a socket-  , getContents-  , recv-  ) where+    getContents,+    recv,+    recvWith,+) where -import           Data.ByteString.Lazy.Internal (ByteString(..), defaultChunkSize)-import           Network.Socket                (ShutdownCmd (..), shutdown)-import           Prelude                       hiding (getContents)-import           System.IO.Unsafe              (unsafeInterleaveIO)-import           System.IO.Error               (catchIOError)+import Control.Concurrent.STM (STM)+import Data.ByteString.Lazy.Internal (+    ByteString (..),+    defaultChunkSize,+ )+import Network.Socket (ShutdownCmd (..), shutdown)+import System.IO.Error (catchIOError)+import System.IO.Unsafe (unsafeInterleaveIO)+import System.Posix.Types (Fd (..))+import Prelude hiding (getContents)  #if defined(mingw32_HOST_OS) import Network.Socket.ByteString.Lazy.Windows  (send, sendAll)@@ -40,13 +50,56 @@ import Network.Socket.ByteString.Lazy.Posix    (send, sendAll) #endif -import qualified Data.ByteString               as S-import qualified Network.Socket.ByteString     as N-import           Network.Socket.Imports-import           Network.Socket.Types+import qualified Data.ByteString as S+import qualified Data.ByteString.Lazy as L+import qualified Network.Socket.ByteString as N+import Network.Socket.Imports+import Network.Socket.Types+#if !defined(mingw32_HOST_OS)+import Network.Socket.Wait (withWritable)+#endif +-- | Send data and file descriptors over a UNIX-domain socket in+--   a single system call. This function does not work on Windows.+sendWithFds+    :: Socket+    -- ^ Socket+    -> ByteString+    -- ^ Data to send+    -> [Fd]+    -- ^ File descriptors+    -> IO ()+sendWithFds s lbs fds = N.sendManyWithFds s (L.toChunks lbs) fds++-- | 'send' which the caller can give up on.  See+--   'Network.Socket.withWritable' for what is left of the stream after+--   giving up.+--+--   @since 3.2.12.0+sendWith :: Socket -> ByteString -> STM a -> IO (Either a Int64)+#if defined(mingw32_HOST_OS)+-- 'send' sends the first chunk here, and so does this, through the+-- strict one, whose give-up cancels its own operation alone.+sendWith s lbs giveUp = fmap fromIntegral <$> N.sendWith s chunk giveUp+  where+    chunk = case L.toChunks lbs of+        [] -> S.empty+        x : _ -> x+#else+sendWith s lbs giveUp = withWritable s giveUp $ send s lbs+#endif++-- | 'sendAll' which the caller can give up on.  Part of the data may+--   have been sent before it gives up, so a stream given up on is to be+--   closed.+--+--   @since 3.2.12.0+sendAllWith :: Socket -> ByteString -> STM a -> IO (Either a ())+sendAllWith s lbs = N.sendManyWith s (L.toChunks lbs)+ -- ----------------------------------------------------------------------------- -- Receiving+ -- | Receive data from the socket.  The socket must be in a connected -- state.  Data is received on demand, in chunks; each chunk will be -- sized to reflect the amount of data received by individual 'recv'@@ -57,16 +110,18 @@ -- down.  If there is an error and an exception is thrown, the socket -- is not shut down. getContents-    :: Socket -- ^ Connected socket-    -> IO ByteString -- ^ Data received+    :: Socket+    -- ^ Connected socket+    -> IO ByteString+    -- ^ Data received getContents s = loop   where     loop = unsafeInterleaveIO $ do         sbs <- N.recv s defaultChunkSize         if S.null sbs             then do-              shutdown s ShutdownReceive `catchIOError` const (return ())-              return Empty+                shutdown s ShutdownReceive `catchIOError` const (return ())+                return Empty             else Chunk sbs <$> loop  -- | Receive data from the socket.  The socket must be in a connected@@ -77,10 +132,24 @@ -- -- If there is no more data to be received, returns an empty 'ByteString'. recv-    :: Socket -- ^ Connected socket-    -> Int64 -- ^ Maximum number of bytes to receive-    -> IO ByteString -- ^ Data received+    :: Socket+    -- ^ Connected socket+    -> Int64+    -- ^ Maximum number of bytes to receive+    -> IO ByteString+    -- ^ Data received recv s nbytes = chunk <$> N.recv s (fromIntegral nbytes)   where-    chunk k | S.null k  = Empty-            | otherwise = Chunk k Empty+    chunk k+        | S.null k = Empty+        | otherwise = Chunk k Empty++-- | 'recv' which the caller can give up on.+--+--   @since 3.2.12.0+recvWith :: Socket -> Int64 -> STM a -> IO (Either a ByteString)+recvWith s nbytes giveUp = fmap chunk <$> N.recvWith s (fromIntegral nbytes) giveUp+  where+    chunk k+        | S.null k = Empty+        | otherwise = Chunk k Empty
Network/Socket/ByteString/Lazy/Posix.hs view
@@ -1,54 +1,59 @@-{-# LANGUAGE BangPatterns #-} {-# LANGUAGE OverloadedStrings #-}  module Network.Socket.ByteString.Lazy.Posix (     -- * Send data to a socket-    send-  , sendAll-  ) where+    send,+    sendAll,+) where -import qualified Data.ByteString.Lazy               as L-import           Data.ByteString.Unsafe             (unsafeUseAsCStringLen)-import           Foreign.Marshal.Array              (allocaArray)+import qualified Data.ByteString.Lazy as L+import Data.ByteString.Unsafe (unsafeUseAsCStringLen)+import Foreign.Marshal.Array (allocaArray) -import           Network.Socket.ByteString.IO       (waitWhen0)-import           Network.Socket.ByteString.Internal (c_writev)-import           Network.Socket.Imports-import           Network.Socket.Internal-import           Network.Socket.Posix.IOVec    (IOVec (IOVec))-import           Network.Socket.Types+import Network.Socket.ByteString.IO (waitWhen0)+import Network.Socket.ByteString.Internal (c_writev)+import Network.Socket.Imports+import Network.Socket.Internal+import Network.Socket.Posix.IOVec (IOVec (IOVec))+import Network.Socket.Types  -- ----------------------------------------------------------------------------- -- Sending send-    :: Socket -- ^ Connected socket-    -> L.ByteString -- ^ Data to send-    -> IO Int64 -- ^ Number of bytes sent+    :: Socket+    -- ^ Connected socket+    -> L.ByteString+    -- ^ Data to send+    -> IO Int64+    -- ^ Number of bytes sent send s lbs = do-    let cs  = take maxNumChunks (L.toChunks lbs)+    let cs = take maxNumChunks (L.toChunks lbs)         len = length cs     siz <- withFdSocket s $ \fd -> allocaArray len $ \ptr ->-             withPokes cs ptr $ \niovs ->-               throwSocketErrorWaitWrite s "writev" $ c_writev fd ptr niovs+        withPokes cs ptr $ \niovs ->+            throwSocketErrorWaitWrite s "writev" $ c_writev fd ptr niovs     return $ fromIntegral siz   where     withPokes ss p f = loop ss p 0 0       where-        loop (c:cs) q k !niovs+        loop (c : cs) q k niovs             | k < maxNumBytes = unsafeUseAsCStringLen c $ \(ptr, len) -> do                 poke q $ IOVec (castPtr ptr) (fromIntegral len)-                loop cs-                     (q `plusPtr` sizeOf (IOVec nullPtr 0))-                     (k + fromIntegral len)-                     (niovs + 1)+                loop+                    cs+                    (q `plusPtr` sizeOf (IOVec nullPtr 0))+                    (k + fromIntegral len)+                    (niovs + 1)             | otherwise = f niovs         loop _ _ _ niovs = f niovs-    maxNumBytes  = 4194304 :: Int -- maximum number of bytes to transmit in one system call+    maxNumBytes = 4194304 :: Int -- maximum number of bytes to transmit in one system call     maxNumChunks = 1024 :: Int -- maximum number of chunks to transmit in one system call  sendAll-    :: Socket -- ^ Connected socket-    -> L.ByteString -- ^ Data to send+    :: Socket+    -- ^ Connected socket+    -> L.ByteString+    -- ^ Data to send     -> IO () sendAll _ "" = return () sendAll s bs0 = loop bs0
Network/Socket/ByteString/Lazy/Windows.hs view
@@ -2,31 +2,36 @@  module Network.Socket.ByteString.Lazy.Windows (     -- * Send data to a socket-    send-  , sendAll-  ) where+    send,+    sendAll,+) where -import qualified Data.ByteString           as S-import qualified Data.ByteString.Lazy      as L+import qualified Data.ByteString as S+import qualified Data.ByteString.Lazy as L import qualified Network.Socket.ByteString as Socket-import           Network.Socket.Imports-import           Network.Socket.ByteString.IO       (waitWhen0)-import           Network.Socket.Types+import Network.Socket.ByteString.IO (waitWhen0)+import Network.Socket.Imports+import Network.Socket.Types  -- ----------------------------------------------------------------------------- -- Sending send-    :: Socket -- ^ Connected socket-    -> L.ByteString -- ^ Data to send-    -> IO Int64 -- ^ Number of bytes sent+    :: Socket+    -- ^ Connected socket+    -> L.ByteString+    -- ^ Data to send+    -> IO Int64+    -- ^ Number of bytes sent send s lbs = case L.toChunks lbs of     -- TODO: Consider doing nothing if the string is empty.-    []    -> fromIntegral <$> Socket.send s S.empty-    (x:_) -> fromIntegral <$> Socket.send s x+    [] -> fromIntegral <$> Socket.send s S.empty+    (x : _) -> fromIntegral <$> Socket.send s x  sendAll-    :: Socket -- ^ Connected socket-    -> L.ByteString -- ^ Data to send+    :: Socket+    -- ^ Connected socket+    -> L.ByteString+    -- ^ Data to send     -> IO () sendAll _ "" = return () sendAll s bs0 = loop bs0
Network/Socket/Cbits.hsc view
@@ -13,6 +13,34 @@ #if defined(mingw32_HOST_OS) wsaNotInitialized :: CInt wsaNotInitialized = #const WSANOTINITIALISED+-- | Whether a datagram socket reports an ICMP unreachable which came+--   back from an earlier send.  Winsock turns it on by default.+sioUDPConnReset :: Word32+sioUDPConnReset = #const SIO_UDP_CONNRESET+-- | What closesocket gives a call already blocked on the socket.+wsaEINTR :: CInt+wsaEINTR = #const WSAEINTR+-- | What a socket operation gives once the socket has been closed.+wsaENOTSOCK :: CInt+wsaENOTSOCK = #const WSAENOTSOCK+-- | What accept() gives for a connection the peer gave up on.  Winsock+--   names WSAECONNRESET where accept(2) names ECONNABORTED.+wsaECONNABORTED :: CInt+wsaECONNABORTED = #const WSAECONNABORTED+wsaECONNRESET :: CInt+wsaECONNRESET = #const WSAECONNRESET+wsaENETDOWN :: CInt+wsaENETDOWN = #const WSAENETDOWN+wsaENETRESET :: CInt+wsaENETRESET = #const WSAENETRESET+wsaENETUNREACH :: CInt+wsaENETUNREACH = #const WSAENETUNREACH+wsaEHOSTDOWN :: CInt+wsaEHOSTDOWN = #const WSAEHOSTDOWN+wsaEHOSTUNREACH :: CInt+wsaEHOSTUNREACH = #const WSAEHOSTUNREACH+wsaENOPROTOOPT :: CInt+wsaENOPROTOOPT = #const WSAENOPROTOOPT #else fGetFd :: CInt fGetFd = #const F_GETFD
Network/Socket/Handle.hs view
@@ -1,8 +1,8 @@ module Network.Socket.Handle where -import qualified GHC.IO.Device (IODeviceType(Stream))+import qualified GHC.IO.Device (IODeviceType (Stream)) import GHC.IO.Handle.FD (fdToHandle')-import System.IO (IOMode(..), Handle, BufferMode(..), hSetBuffering)+import System.IO (BufferMode (..), Handle, IOMode (..), hSetBuffering)  import Network.Socket.Types @@ -15,14 +15,13 @@ -- close the 'Socket' after 'socketToHandle', call 'System.IO.hClose' -- on the 'Handle'. ----- Caveat 'Handle' is not recommended for network programming in +-- Caveat 'Handle' is not recommended for network programming in -- Haskell, e.g. merely performing 'hClose' on a TCP socket won't -- cooperate with peer's 'gracefulClose', i.e. proper shutdown -- sequence with appropriate handshakes specified by the protocol.- socketToHandle :: Socket -> IOMode -> IO Handle socketToHandle s mode = invalidateSocket s err $ \oldfd -> do-    h <- fdToHandle' oldfd (Just GHC.IO.Device.Stream) True (show s) mode True{-bin-}+    h <- fdToHandle' oldfd (Just GHC.IO.Device.Stream) True (show s) mode True {-bin-}     hSetBuffering h NoBuffering     return h   where
Network/Socket/Imports.hs view
@@ -1,19 +1,19 @@ module Network.Socket.Imports (-    module Control.Applicative-  , module Control.Monad-  , module Data.Bits-  , module Data.Int-  , module Data.List-  , module Data.Maybe-  , module Data.Monoid-  , module Data.Ord-  , module Data.Word-  , module Foreign.C.String-  , module Foreign.C.Types-  , module Foreign.Ptr-  , module Foreign.Storable-  , module Numeric-  ) where+    module Control.Applicative,+    module Control.Monad,+    module Data.Bits,+    module Data.Int,+    module Data.List,+    module Data.Maybe,+    module Data.Monoid,+    module Data.Ord,+    module Data.Word,+    module Foreign.C.String,+    module Foreign.C.Types,+    module Foreign.Ptr,+    module Foreign.Storable,+    module Numeric,+) where  import Control.Applicative import Control.Monad
Network/Socket/Info.hsc view
@@ -1,12 +1,14 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE RecordWildCards #-}-{-# OPTIONS_GHC -fno-warn-orphans #-}  #include "HsNet.h" ##include "HsNetDef.h"  module Network.Socket.Info where +import Control.Exception (mask, onException)+import Data.List.NonEmpty (NonEmpty(..))+import qualified Data.List.NonEmpty as NE import Foreign.Marshal.Alloc (alloca, allocaBytes) import Foreign.Marshal.Utils (maybeWith, with) import GHC.IO.Exception (IOErrorType(NoSuchThing))@@ -108,8 +110,8 @@   } deriving (Eq, Show)  instance Storable AddrInfo where-    sizeOf    _ = #const sizeof(struct addrinfo)-    alignment _ = alignment (0 :: CInt)+    sizeOf    ~_ = #const sizeof(struct addrinfo)+    alignment ~_ = alignment (0 :: CInt)      peek p = do         ai_flags <- (#peek struct addrinfo, ai_flags) p@@ -200,70 +202,85 @@   , addrCanonName  = Nothing   } --------------------------------------------------------------------------------- | Resolve a host or service name to one or more addresses.--- The 'AddrInfo' values that this function returns contain 'SockAddr'--- values that you can pass directly to 'connect' or--- 'bind'.------ This function is protocol independent.  It can return both IPv4 and--- IPv6 address information.------ The 'AddrInfo' argument specifies the preferred query behaviour,--- socket options, or protocol.  You can override these conveniently--- using Haskell's record update syntax on 'defaultHints', for example--- as follows:------ >>> let hints = defaultHints { addrFlags = [AI_NUMERICHOST], addrSocketType = Stream }------ You must provide a 'Just' value for at least one of the 'HostName'--- or 'ServiceName' arguments.  'HostName' can be either a numeric--- network address (dotted quad for IPv4, colon-separated hex for--- IPv6) or a hostname.  In the latter case, its addresses will be--- looked up unless 'AI_NUMERICHOST' is specified as a hint.  If you--- do not provide a 'HostName' value /and/ do not set 'AI_PASSIVE' as--- a hint, network addresses in the result will contain the address of--- the loopback interface.------ If the query fails, this function throws an IO exception instead of--- returning an empty list.  Otherwise, it returns a non-empty list--- of 'AddrInfo' values.------ There are several reasons why a query might result in several--- values.  For example, the queried-for host could be multihomed, or--- the service might be available via several protocols.------ Note: the order of arguments is slightly different to that defined--- for @getaddrinfo@ in RFC 2553.  The 'AddrInfo' parameter comes first--- to make partial application easier.------ >>> addr:_ <- getAddrInfo (Just hints) (Just "127.0.0.1") (Just "http")--- >>> addrAddress addr--- 127.0.0.1:80+class GetAddrInfo t where+    -----------------------------------------------------------------------------+    -- | Resolve a host or service name to one or more addresses.+    -- The 'AddrInfo' values that this function returns contain 'SockAddr'+    -- values that you can pass directly to 'connect' or+    -- 'bind'.+    --+    -- This function calls @getaddrinfo(3)@, which never successfully returns+    -- with an empty list. If the query fails, 'getAddrInfo' throws an IO+    -- exception.+    --+    -- For backwards-compatibility reasons, a hidden 'GetAddrInfo' class is used+    -- to make the result polymorphic. It only has instances for @[]@ (lists)+    -- and 'NonEmpty'. Use of 'NonEmpty' is recommended.+    --+    -- This function is protocol independent.  It can return both IPv4 and+    -- IPv6 address information.+    --+    -- The 'AddrInfo' argument specifies the preferred query behaviour,+    -- socket options, or protocol.  You can override these conveniently+    -- using Haskell's record update syntax on 'defaultHints', for example+    -- as follows:+    --+    -- >>> let hints = defaultHints { addrFlags = [AI_NUMERICHOST], addrSocketType = Stream }+    --+    -- You must provide a 'Just' value for at least one of the 'HostName'+    -- or 'ServiceName' arguments.  'HostName' can be either a numeric+    -- network address (dotted quad for IPv4, colon-separated hex for+    -- IPv6) or a hostname.  In the latter case, its addresses will be+    -- looked up unless 'AI_NUMERICHOST' is specified as a hint.  If you+    -- do not provide a 'HostName' value /and/ do not set 'AI_PASSIVE' as+    -- a hint, network addresses in the result will contain the address of+    -- the loopback interface.+    --+    -- There are several reasons why a query might result in several+    -- values.  For example, the queried-for host could be multihomed, or+    -- the service might be available via several protocols.+    --+    -- Note: the order of arguments is slightly different to that defined+    -- for @getaddrinfo@ in RFC 2553.  The 'AddrInfo' parameter comes first+    -- to make partial application easier.+    --+    -- >>> import qualified Data.List.NonEmpty as NE+    -- >>> addr <- NE.head <$> getAddrInfo (Just hints) (Just "127.0.0.1") (Just "http")+    -- >>> addrAddress addr+    -- 127.0.0.1:80+    --+    -- Polymorphic version: @since 3.2.3.0+    getAddrInfo+        :: Maybe AddrInfo -- ^ preferred socket type or protocol+        -> Maybe HostName -- ^ host name to look up+        -> Maybe ServiceName -- ^ service name to look up+        -> IO (t AddrInfo) -- ^ resolved addresses, with "best" first -getAddrInfo+instance GetAddrInfo [] where+    getAddrInfo = getAddrInfoList++instance GetAddrInfo NE.NonEmpty where+    getAddrInfo = getAddrInfoNE++getAddrInfoNE     :: Maybe AddrInfo -- ^ preferred socket type or protocol     -> Maybe HostName -- ^ host name to look up     -> Maybe ServiceName -- ^ service name to look up-    -> IO [AddrInfo] -- ^ resolved addresses, with "best" first-getAddrInfo hints node service = alloc getaddrinfo+    -> IO (NonEmpty AddrInfo) -- ^ resolved addresses, with "best" first+getAddrInfoNE hints node service = alloc getaddrinfo   where     alloc body = withSocketsDo $ maybeWith withCString node $ \c_node ->         maybeWith withCString service                       $ \c_service ->             maybeWith with filteredHints                    $ \c_hints ->                   alloca                                    $ \ptr_ptr_addrs ->                       body c_node c_service c_hints ptr_ptr_addrs-    getaddrinfo c_node c_service c_hints ptr_ptr_addrs = do+    getaddrinfo c_node c_service c_hints ptr_ptr_addrs = mask $ \release -> do         ret <- c_getaddrinfo c_node c_service c_hints ptr_ptr_addrs         if ret == 0 then do             ptr_addrs <- peek ptr_ptr_addrs-            ais       <- followAddrInfo ptr_addrs+            ais       <- release (followAddrInfo ptr_addrs) `onException` c_freeaddrinfo ptr_addrs             c_freeaddrinfo ptr_addrs-            -- POSIX requires that getaddrinfo(3) returns at least one addrinfo.-            -- See: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html-            case ais of-              [] -> ioError $ mkIOError NoSuchThing message Nothing Nothing-              _ -> return ais+            return ais           else do             err <- gai_strerror ret             ioError $ ioeSetErrorString@@ -273,9 +290,9 @@         "Network.Socket.getAddrInfo (called with preferred socket type/protocol: "       , maybe "Nothing" show hints       , ", host name: "-      , show node+      , maybe "Nothing" show node       , ", service name: "-      , show service+      , maybe "Nothing" show service       , ")"       ] #if defined(darwin_HOST_OS)@@ -290,13 +307,33 @@     filteredHints = hints #endif -followAddrInfo :: Ptr AddrInfo -> IO [AddrInfo]+getAddrInfoList+    :: Maybe AddrInfo+    -> Maybe HostName+    -> Maybe ServiceName+    -> IO [AddrInfo]+getAddrInfoList hints node service =+    -- getAddrInfo never returns an empty list.+    NE.toList <$> getAddrInfoNE hints node service++followAddrInfo :: Ptr AddrInfo -> IO (NonEmpty AddrInfo) followAddrInfo ptr_ai-    | ptr_ai == nullPtr = return []+    -- POSIX requires that getaddrinfo(3) returns at least one addrinfo.+    -- See: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html+    | ptr_ai == nullPtr = ioError $ mkIOError NoSuchThing "getaddrinfo must return at least one addrinfo" Nothing Nothing     | otherwise = do-        a  <- peek ptr_ai-        as <- (# peek struct addrinfo, ai_next) ptr_ai >>= followAddrInfo-        return (a : as)+        a <- peek ptr_ai+        ptr <- (# peek struct addrinfo, ai_next) ptr_ai+        (a :|) <$> go ptr+  where+    go :: Ptr AddrInfo -> IO [AddrInfo]+    go ptr+      | ptr == nullPtr = return []+      | otherwise = do+            a' <- peek ptr+            ptr' <- (# peek struct addrinfo, ai_next) ptr+            as' <- go ptr'+            return (a':as')  foreign import ccall safe "hsnet_getaddrinfo"     c_getaddrinfo :: CString -> CString -> Ptr AddrInfo -> Ptr (Ptr AddrInfo)@@ -408,59 +445,6 @@ unpackBits ((k,v):xs) r     | r .&. v /= 0 = k : unpackBits xs (r .&. complement v)     | otherwise    = unpackBits xs r---------------------------------------------------------------------------------- SockAddr--instance Show SockAddr where-  showsPrec _ (SockAddrUnix str) = showString str-  showsPrec _ (SockAddrInet port ha)-   = showHostAddress ha-   . showString ":"-   . shows port-  showsPrec _ (SockAddrInet6 port _ ha6 _)-   = showChar '['-   . showHostAddress6 ha6-   . showString "]:"-   . shows port----- Taken from on the implementation of showIPv4 in Data.IP.Addr-showHostAddress :: HostAddress -> ShowS-showHostAddress ip =-  let (u3, u2, u1, u0) = hostAddressToTuple ip in-  foldr1 (.) . intersperse (showChar '.') $ map showInt [u3, u2, u1, u0]---- Taken from showIPv6 in Data.IP.Addr.---- | Show an IPv6 address in the most appropriate notation, based on recommended--- representation proposed by <http://tools.ietf.org/html/rfc5952 RFC 5952>.------ /The implementation is completely compatible with the current implementation--- of the `inet_ntop` function in glibc./-showHostAddress6 :: HostAddress6 -> ShowS-showHostAddress6 ha6@(a1, a2, a3, a4)-    -- IPv4-Mapped IPv6 Address-    | a1 == 0 && a2 == 0 && a3 == 0xffff =-      showString "::ffff:" . showHostAddress a4-    -- IPv4-Compatible IPv6 Address (exclude IPRange ::/112)-    | a1 == 0 && a2 == 0 && a3 == 0 && a4 >= 0x10000 =-        showString "::" . showHostAddress a4-    -- length of longest run > 1, replace it with "::"-    | end - begin > 1 =-        showFields prefix . showString "::" . showFields suffix-    | otherwise =-        showFields fields-  where-    fields =-        let (u7, u6, u5, u4, u3, u2, u1, u0) = hostAddress6ToTuple ha6 in-        [u7, u6, u5, u4, u3, u2, u1, u0]-    showFields = foldr (.) id . intersperse (showChar ':') . map showHex-    prefix = take begin fields  -- fields before "::"-    suffix = drop end fields    -- fields after "::"-    begin = end + diff          -- the longest run of zeros-    (diff, end) = minimum $-        scanl (\c i -> if i == 0 then c - 1 else 0) 0 fields `zip` [0..]  ----------------------------------------------------------------------------- 
Network/Socket/Internal.hs view
@@ -48,6 +48,9 @@     -- * Initialization     , withSocketsDo +    -- * Null socket address type+    , NullSockAddr (..)+     -- * Low-level helpers     , zeroMemory     ) where@@ -58,9 +61,9 @@ import Control.Exception (evaluate) import System.IO.Unsafe (unsafePerformIO) # if __GLASGOW_HASKELL__ >= 707-import GHC.IO.Exception (IOErrorType(..))+import GHC.IO.Exception (IOErrorType(..), IOException(..)) # else-import GHC.IOBase (IOErrorType(..))+import GHC.IOBase (IOErrorType(..), IOException(..)) # endif import System.IO.Error (ioeSetErrorString, mkIOError) #else@@ -81,11 +84,29 @@ -- | Throw an 'IOError' corresponding to the current socket error. throwSocketError :: String  -- ^ textual description of the error location                  -> IO a+#if defined(mingw32_HOST_OS)+throwSocketError name =+    c_getLastError >>= throwSocketErrorCode name+#else+throwSocketError = throwErrno+#endif  -- | Like 'throwSocketError', but the error code is supplied as an argument. ----- On Windows, do not use errno.  Use a system error code instead.+-- On Windows the code is a Winsock error code rather than an errno.  It+-- is kept in 'ioe_errno' all the same: Winsock reports every error as+-- 'OtherError', so the code is the only thing which tells them apart. throwSocketErrorCode :: String -> CInt -> IO a+#if defined(mingw32_HOST_OS)+throwSocketErrorCode name rc = do+    pstr <- c_getWSError rc+    str  <- peekCString pstr+    let ioe = (mkIOError OtherError name Nothing Nothing){ioe_errno = Just rc}+    ioError (ioeSetErrorString ioe str)+#else+throwSocketErrorCode loc errno =+    ioError (errnoToIOError loc (Errno errno) Nothing Nothing)+#endif  -- | Throw an 'IOError' corresponding to the current socket error if -- the IO action returns a result of @-1@.  Discards the result of the@@ -95,6 +116,13 @@     => String  -- ^ textual description of the location     -> IO a    -- ^ the 'IO' operation to be executed     -> IO ()+#if defined(mingw32_HOST_OS)+throwSocketErrorIfMinus1_ name act = do+  _ <- throwSocketErrorIfMinus1Retry name act+  return ()+#else+throwSocketErrorIfMinus1Retry = throwErrnoIfMinus1Retry+#endif  {-# SPECIALIZE throwSocketErrorIfMinus1_ :: String -> IO CInt -> IO () #-} @@ -106,6 +134,12 @@     => String  -- ^ textual description of the location     -> IO a    -- ^ the 'IO' operation to be executed     -> IO a+#if defined(mingw32_HOST_OS)+throwSocketErrorIfMinus1Retry+  = throwSocketErrorIfMinus1ButRetry (const False)+#else+throwSocketErrorIfMinus1_ = throwErrnoIfMinus1_+#endif  {-# SPECIALIZE throwSocketErrorIfMinus1Retry :: String -> IO CInt -> IO CInt #-} @@ -133,6 +167,13 @@                --   immediate retry would block     -> IO a    -- ^ the 'IO' operation to be executed     -> IO a+#if defined(mingw32_HOST_OS)+throwSocketErrorIfMinus1RetryMayBlock name _ act+  = throwSocketErrorIfMinus1Retry name act+#else+throwSocketErrorIfMinus1RetryMayBlock name on_block act =+    throwErrnoIfMinus1RetryMayBlock name act on_block+#endif  {-# SPECIALIZE throwSocketErrorIfMinus1RetryMayBlock         :: String -> IO b -> IO CInt -> IO CInt #-}@@ -151,22 +192,20 @@                       --   immediate retry would block     -> IO a           -- ^ the 'IO' operation to be executed     -> IO a--{-# SPECIALIZE throwSocketErrorIfMinus1RetryMayBlock-        :: String -> IO b -> IO CInt -> IO CInt #-}- #if defined(mingw32_HOST_OS)--throwSocketErrorIfMinus1RetryMayBlock name _ act-  = throwSocketErrorIfMinus1Retry name act- throwSocketErrorIfMinus1RetryMayBlockBut exempt name _ act   = throwSocketErrorIfMinus1ButRetry exempt name act+#else+throwSocketErrorIfMinus1RetryMayBlockBut _exempt name on_block act =+    throwErrnoIfMinus1RetryMayBlock name act on_block+#endif -throwSocketErrorIfMinus1_ name act = do-  _ <- throwSocketErrorIfMinus1Retry name act-  return ()+{-# SPECIALIZE throwSocketErrorIfMinus1RetryMayBlock+        :: String -> IO b -> IO CInt -> IO CInt #-} +-- ---------------------------------------------------------------------++#if defined(mingw32_HOST_OS) throwSocketErrorIfMinus1ButRetry :: (Eq a, Num a) =>                                     (CInt -> Bool) -> String -> IO a -> IO a throwSocketErrorIfMinus1ButRetry exempt name act = do@@ -186,41 +225,14 @@           else throwSocketError name    else return r -throwSocketErrorIfMinus1Retry-  = throwSocketErrorIfMinus1ButRetry (const False)--throwSocketErrorCode name rc = do-    pstr <- c_getWSError rc-    str  <- peekCString pstr-    ioError (ioeSetErrorString (mkIOError OtherError name Nothing Nothing) str)--throwSocketError name =-    c_getLastError >>= throwSocketErrorCode name- foreign import CALLCONV unsafe "WSAGetLastError"   c_getLastError :: IO CInt  foreign import ccall unsafe "getWSErrorDescr"   c_getWSError :: CInt -> IO (Ptr CChar)--#else--throwSocketErrorIfMinus1RetryMayBlock name on_block act =-    throwErrnoIfMinus1RetryMayBlock name act on_block--throwSocketErrorIfMinus1RetryMayBlockBut _exempt name on_block act =-    throwErrnoIfMinus1RetryMayBlock name act on_block--throwSocketErrorIfMinus1Retry = throwErrnoIfMinus1Retry--throwSocketErrorIfMinus1_ = throwErrnoIfMinus1_--throwSocketError = throwErrno--throwSocketErrorCode loc errno =-    ioError (errnoToIOError loc (Errno errno) Nothing Nothing)- #endif++-- ---------------------------------------------------------------------  -- | Like 'throwSocketErrorIfMinus1Retry', but if the action fails with -- @EWOULDBLOCK@ or similar, wait for the socket to be read-ready,
Network/Socket/Options.hsc view
@@ -3,6 +3,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE GADTs #-}  #include "HsNet.h" ##include "HsNetDef.h"@@ -11,12 +12,13 @@     SocketOption(SockOpt                 ,UnsupportedSocketOption                 ,AcceptConn,Debug,ReuseAddr,SoDomain,Type,SoProtocol,SoError-                ,DontRoute,Broadcast,SendBuffer,RecvBuffer,KeepAlive,OOBInline-                ,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort+                ,DontRoute,Broadcast,SendBuffer,RecvBuffer,KeepAlive,KeepInit+                ,OOBInline,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort                 ,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut                 ,UseLoopBack,UserTimeout,IPv6Only-                ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo+                ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo,DontFragment                 ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo+                ,MulticastIF,MulticastTTL,MulticastLoop,AddMembership,DropMembership                 ,CustomSockOpt)   , isSupportedSocketOption   , whenSupported@@ -25,6 +27,8 @@   , setSocketOption   , getSockOpt   , setSockOpt+  , SockOptValue (..)+  , setSockOptValue   , StructLinger (..)   , SocketTimeout (..)   ) where@@ -50,11 +54,11 @@ -- is supported on your system: see 'isSupportedSocketOption' data SocketOption = SockOpt #if __GLASGOW_HASKELL__ >= 806-    !CInt -- ^ Option Level-    !CInt -- ^ Option Name+    CInt -- ^ Option Level+    CInt -- ^ Option Name #else-    !CInt -- Option Level-    !CInt -- Option Name+    CInt -- Option Level+    CInt -- Option Name #endif   deriving (Eq) @@ -74,6 +78,7 @@     , (SendBuffer, "SendBuffer")     , (RecvBuffer, "RecvBuffer")     , (KeepAlive, "KeepAlive")+    , (KeepInit, "KeepInit")     , (OOBInline, "OOBInline")     , (Linger, "Linger")     , (ReusePort, "ReusePort")@@ -90,6 +95,7 @@     , (RecvIPv4TTL, "RecvIPv4TTL")     , (RecvIPv4TOS, "RecvIPv4TOS")     , (RecvIPv4PktInfo, "RecvIPv4PktInfo")+    , (DontFragment, "DontFragment")     , (IPv6Only, "IPv6Only")     , (RecvIPv6HopLimit, "RecvIPv6HopLimit")     , (RecvIPv6TClass, "RecvIPv6TClass")@@ -217,6 +223,15 @@ #else pattern KeepAlive      = SockOpt (-1) (-1) #endif+-- | TCP_KEEPINIT+pattern KeepInit :: SocketOption+#ifdef TCP_KEEPINIT+pattern KeepInit       = SockOpt (#const IPPROTO_TCP) (#const TCP_KEEPINIT)+#elif defined(TCP_CONNECTIONTIMEOUT)+pattern KeepInit       = SockOpt (#const IPPROTO_TCP) (#const TCP_CONNECTIONTIMEOUT)+#else+pattern KeepInit       = SockOpt (-1) (-1)+#endif -- | SO_OOBINLINE pattern OOBInline :: SocketOption #ifdef SO_OOBINLINE@@ -252,14 +267,16 @@ #else pattern SendLowWater   = SockOpt (-1) (-1) #endif--- | SO_RCVTIMEO: timeout in microseconds+-- | SO_RCVTIMEO: timeout in microseconds. This option is not useful+-- in the normal case where sockets are non-blocking. pattern RecvTimeOut :: SocketOption #ifdef SO_RCVTIMEO pattern RecvTimeOut    = SockOpt (#const SOL_SOCKET) (#const SO_RCVTIMEO) #else pattern RecvTimeOut    = SockOpt (-1) (-1) #endif--- | SO_SNDTIMEO: timeout in microseconds+-- | SO_SNDTIMEO: timeout in microseconds. This option is not useful+-- in the normal case where sockets are non-blocking. pattern SendTimeOut :: SocketOption #ifdef SO_SNDTIMEO pattern SendTimeOut    = SockOpt (#const SOL_SOCKET) (#const SO_SNDTIMEO)@@ -337,6 +354,15 @@ #else pattern RecvIPv4PktInfo  = SockOpt (-1) (-1) #endif+-- | IP_DONTFRAG+pattern DontFragment :: SocketOption+#if HAVE_DECL_IP_DONTFRAG+pattern DontFragment   = SockOpt (#const IPPROTO_IP) (#const IP_DONTFRAG)+#elif HAVE_DECL_IP_MTU_DISCOVER+pattern DontFragment   = SockOpt (#const IPPROTO_IP) (#const IP_MTU_DISCOVER)+#else+pattern DontFragment   = SockOpt (-1) (-1)+#endif #endif // HAVE_DECL_IPPROTO_IP  #if HAVE_DECL_IPPROTO_IPV6@@ -372,6 +398,48 @@ #endif #endif // HAVE_DECL_IPPROTO_IPV6 +-- | Multicast interface.+#ifdef IP_MULTICAST_IF+pattern MulticastIF :: SocketOption+pattern MulticastIF = SockOpt (#const IPPROTO_IP) (#const IP_MULTICAST_IF)+#else+pattern MulticastIF :: SocketOption+pattern MulticastIF = SockOpt (-1) (-1)+#endif+-- | Multicast TTL.+#ifdef IP_MULTICAST_TTL+pattern MulticastTTL :: SocketOption+pattern MulticastTTL = SockOpt (#const IPPROTO_IP) (#const IP_MULTICAST_TTL)+#else+pattern MulticastTTL :: SocketOption+pattern MulticastTTL = SockOpt (-1) (-1)+#endif+-- | Multicast loopback.+#ifdef IP_MULTICAST_LOOP+pattern MulticastLoop :: SocketOption+pattern MulticastLoop = SockOpt (#const IPPROTO_IP) (#const IP_MULTICAST_LOOP)+#else+pattern MulticastLoop :: SocketOption+pattern MulticastLoop = SockOpt (-1) (-1)+#endif+-- | Add membership.+#ifdef IP_ADD_MEMBERSHIP+pattern AddMembership :: SocketOption+pattern AddMembership = SockOpt (#const IPPROTO_IP) (#const IP_ADD_MEMBERSHIP)+#else+pattern AddMembership :: SocketOption+pattern AddMembership = SockOpt (-1) (-1)+#endif+-- | Drop membership.+#ifdef IP_DROP_MEMBERSHIP+pattern DropMembership :: SocketOption+pattern DropMembership = SockOpt (#const IPPROTO_IP) (#const IP_DROP_MEMBERSHIP)+#else+pattern DropMembership :: SocketOption+pattern DropMembership = SockOpt (-1) (-1)+#endif++ pattern CustomSockOpt :: (CInt, CInt) -> SocketOption pattern CustomSockOpt xy <- ((\(SockOpt x y) -> (x, y)) -> xy)   where@@ -406,6 +474,22 @@           throwSocketErrorIfMinus1_ "Network.Socket.setSockOpt" $           c_setsockopt fd level opt ptr sz +-- | Set a socket option value+--+-- The existential 'SockOptValue' enables things like:+--+-- @+-- mapM_ (uncurry $ 'setSockOptValue' sock) [+--       ('NoDelay', 'SockOptValue' @Int 1)+--     , ('Linger', 'SockOptValue' ('StructLinger' 1 0))+--     ]+-- @+setSockOptValue :: Socket+                     -> SocketOption+                     -> SockOptValue+                     -> IO ()+setSockOptValue s opt (SockOptValue v) = setSockOpt s opt v+ ----------------------------------------------------------------  -- | Get a socket option that gives an 'Int' value.@@ -454,8 +538,8 @@ {-# COMPLETE CustomSockOpt #-} #endif #ifdef SO_LINGER--- | Low level 'SO_LINBER' option value, which can be used with 'setSockOpt'.---+-- | Low level @SO_LINGER@ option value, which can be used with 'setSockOpt' or+-- @'setSockOptValue' . 'SockOptValue'@. data StructLinger = StructLinger {     -- | Set the linger option on.     sl_onoff  :: CInt,@@ -466,8 +550,8 @@   deriving (Eq, Ord, Show)  instance Storable StructLinger where-    sizeOf    _ = (#const sizeof(struct linger))-    alignment _ = alignment (0 :: CInt)+    sizeOf    ~_ = (#const sizeof(struct linger))+    alignment ~_ = alignment (0 :: CInt)      peek p = do         onoff  <- (#peek struct linger, l_onoff) p@@ -479,6 +563,13 @@         (#poke struct linger, l_linger) p linger #endif +-- | A type that can hold any 'Storable' socket option value (e.g.+-- 'StructLinger' and 'CInt')+--+-- See 'setSocOptValue'+data SockOptValue where+  SockOptValue :: Storable a => a -> SockOptValue+ ----------------------------------------------------------------  -- | Timeout in microseconds.@@ -488,16 +579,16 @@  #if defined(mingw32_HOST_OS) instance Storable SocketTimeout where-    sizeOf (SocketTimeout to) = sizeOf to -- DWORD as milliseconds-    alignment _ = 0+    sizeOf ~(SocketTimeout to) = sizeOf to -- DWORD as milliseconds+    alignment ~_ = 0     peek ptr    = do         to <- peek (castPtr ptr)         return $ SocketTimeout (to * 1000)     poke ptr (SocketTimeout to) = poke (castPtr ptr) (to `div` 1000) #else instance Storable SocketTimeout where-    sizeOf _    = (#size struct timeval)-    alignment _ = (#const offsetof(struct {char x__; struct timeval (y__); }, y__))+    sizeOf    ~_ = (#size struct timeval)+    alignment ~_ = (#const offsetof(struct {char x__; struct timeval (y__); }, y__))     peek ptr    = do             sec  <- (#peek struct timeval, tv_sec)  ptr             usec <- (#peek struct timeval, tv_usec) ptr
Network/Socket/Posix/Cmsg.hsc view
@@ -1,5 +1,6 @@ {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RecordWildCards #-}@@ -15,6 +16,7 @@  import Data.ByteString.Internal import Foreign.ForeignPtr+import Foreign.Marshal.Array (peekArray, pokeArray) import System.IO.Unsafe (unsafeDupablePerformIO) import System.Posix.Types (Fd(..)) @@ -26,16 +28,16 @@  -- | Control message (ancillary data) including a pair of level and type. data Cmsg = Cmsg {-    cmsgId   :: !CmsgId-  , cmsgData :: !ByteString+    cmsgId   :: CmsgId+  , cmsgData :: ByteString   } deriving (Eq, Show)  ----------------------------------------------------------------  -- | Identifier of control message (ancillary data). data CmsgId = CmsgId {-    cmsgLevel :: !CInt-  , cmsgType  :: !CInt+    cmsgLevel :: CInt+  , cmsgType  :: CInt   } deriving (Eq)  -- | Unsupported identifier@@ -82,9 +84,9 @@ pattern CmsgIdIPv6PktInfo = CmsgId (-1) (-1) #endif --- | The identifier for 'Fd'.-pattern CmsgIdFd :: CmsgId-pattern CmsgIdFd = CmsgId (#const SOL_SOCKET) (#const SCM_RIGHTS)+-- | The identifier for 'Fds'.+pattern CmsgIdFds :: CmsgId+pattern CmsgIdFds = CmsgId (#const SOL_SOCKET) (#const SCM_RIGHTS)  ---------------------------------------------------------------- @@ -102,13 +104,15 @@ ----------------------------------------------------------------  -- | Control message type class.---   Each control message type has a numeric 'CmsgId' and a 'Storable'---   data representation.-class Storable a => ControlMessage a where+--   Each control message type has a numeric 'CmsgId' and encode+--   and decode functions.+class ControlMessage a where     controlMessageId :: CmsgId+    encodeCmsg :: a -> Cmsg+    decodeCmsg :: Cmsg -> Maybe a -encodeCmsg :: forall a . ControlMessage a => a -> Cmsg-encodeCmsg x = unsafeDupablePerformIO $ do+encodeStorableCmsg :: forall a . (ControlMessage a, Storable a) => a -> Cmsg+encodeStorableCmsg x = unsafeDupablePerformIO $ do     bs <- create siz $ \p0 -> do         let p = castPtr p0         poke p x@@ -117,8 +121,8 @@   where     siz = sizeOf x -decodeCmsg :: forall a . (ControlMessage a, Storable a) => Cmsg -> Maybe a-decodeCmsg (Cmsg cmsid (PS fptr off len))+decodeStorableCmsg :: forall a . (ControlMessage a, Storable a) => Cmsg -> Maybe a+decodeStorableCmsg (Cmsg cmsid (PS fptr off len))   | cid /= cmsid = Nothing   | len < siz    = Nothing   | otherwise    = unsafeDupablePerformIO $ withForeignPtr fptr $ \p0 -> do@@ -139,6 +143,8 @@  instance ControlMessage IPv4TTL where     controlMessageId = CmsgIdIPv4TTL+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  ---------------------------------------------------------------- @@ -147,6 +153,8 @@  instance ControlMessage IPv6HopLimit where     controlMessageId = CmsgIdIPv6HopLimit+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  ---------------------------------------------------------------- @@ -155,6 +163,8 @@  instance ControlMessage IPv4TOS where     controlMessageId = CmsgIdIPv4TOS+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  ---------------------------------------------------------------- @@ -163,6 +173,8 @@  instance ControlMessage IPv6TClass where     controlMessageId = CmsgIdIPv6TClass+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  ---------------------------------------------------------------- @@ -174,11 +186,13 @@  instance ControlMessage IPv4PktInfo where     controlMessageId = CmsgIdIPv4PktInfo+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  instance Storable IPv4PktInfo where #if defined (IP_PKTINFO)-    sizeOf    _ = (#size struct in_pktinfo)-    alignment _ = alignment (0 :: CInt)+    sizeOf    ~_ = (#size struct in_pktinfo)+    alignment ~_ = alignment (0 :: CInt)     poke p (IPv4PktInfo n sa ha) = do         (#poke struct in_pktinfo, ipi_ifindex)  p (fromIntegral n :: CInt)         (#poke struct in_pktinfo, ipi_spec_dst) p sa@@ -189,8 +203,8 @@         ha <- (#peek struct in_pktinfo, ipi_addr)     p         return $ IPv4PktInfo n sa ha #else-    sizeOf    _ = 0-    alignment _ = 1+    sizeOf    ~_ = 0+    alignment ~_ = 1     poke _ _ = error "Unsupported control message type"     peek _   = error "Unsupported control message type" #endif@@ -205,11 +219,13 @@  instance ControlMessage IPv6PktInfo where     controlMessageId = CmsgIdIPv6PktInfo+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  instance Storable IPv6PktInfo where #if defined (IPV6_PKTINFO)-    sizeOf    _ = (#size struct in6_pktinfo)-    alignment _ = alignment (0 :: CInt)+    sizeOf    ~_ = (#size struct in6_pktinfo)+    alignment ~_ = alignment (0 :: CInt)     poke p (IPv6PktInfo n ha6) = do         (#poke struct in6_pktinfo, ipi6_ifindex) p (fromIntegral n :: CInt)         (#poke struct in6_pktinfo, ipi6_addr)    p (In6Addr ha6)@@ -218,17 +234,35 @@         n :: CInt   <- (#peek struct in6_pktinfo, ipi6_ifindex) p         return $ IPv6PktInfo (fromIntegral n) ha6 #else-    sizeOf    _ = 0-    alignment _ = 1+    sizeOf    ~_ = 0+    alignment ~_ = 1     poke _ _ = error "Unsupported control message type"     peek _   = error "Unsupported control message type" #endif  ---------------------------------------------------------------- -instance ControlMessage Fd where-    controlMessageId = CmsgIdFd+instance ControlMessage [Fd] where+    controlMessageId = CmsgIdFds +    encodeCmsg fds = unsafeDupablePerformIO $ do+        bs <- create siz $ \p0 -> do+            let p = castPtr p0+            pokeArray p fds+        return $ Cmsg CmsgIdFds bs+        where+            siz = sizeOf (undefined :: Fd) * length fds++    decodeCmsg (Cmsg cmsid (PS fptr off len))+        | cmsid /= CmsgIdFds = Nothing+        | otherwise          =+            unsafeDupablePerformIO $ withForeignPtr fptr $ \p0 -> do+                let p = castPtr (p0 `plusPtr` off)+                    numFds = len `div` sizeOfFd+                Just <$> peekArray numFds p+        where+            sizeOfFd = sizeOf (undefined :: Fd)+ cmsgIdBijection :: Bijection CmsgId String cmsgIdBijection =     [ (UnsupportedCmsgId, "UnsupportedCmsgId")@@ -238,7 +272,7 @@     , (CmsgIdIPv6TClass, "CmsgIdIPv6TClass")     , (CmsgIdIPv4PktInfo, "CmsgIdIPv4PktInfo")     , (CmsgIdIPv6PktInfo, "CmsgIdIPv6PktInfo")-    , (CmsgIdFd, "CmsgIdFd")+    , (CmsgIdFds, "CmsgIdFds")     ]  instance Show CmsgId where
Network/Socket/Posix/CmsgHdr.hsc view
@@ -11,8 +11,9 @@ #include <sys/types.h> #include <sys/socket.h> -import Foreign.Marshal.Alloc (allocaBytes) import Foreign.ForeignPtr+import Foreign.Marshal.Alloc (allocaBytes)+import Foreign.Marshal.Utils (copyBytes) import qualified Data.ByteString as B import Data.ByteString.Internal @@ -23,17 +24,17 @@  data CmsgHdr = CmsgHdr { #ifdef __linux__-    cmsgHdrLen   :: !CSize+    cmsgHdrLen   :: CSize #else-    cmsgHdrLen   :: !(#type socklen_t)+    cmsgHdrLen   :: #type socklen_t #endif-  , cmsgHdrLevel :: !CInt-  , cmsgHdrType  :: !CInt+  , cmsgHdrLevel :: CInt+  , cmsgHdrType  :: CInt   } deriving (Eq, Show)  instance Storable CmsgHdr where-  sizeOf    _ = (#size struct cmsghdr)-  alignment _ = alignment (0 :: CInt)+  sizeOf    ~_ = (#size struct cmsghdr)+  alignment ~_ = alignment (0 :: CInt)    peek p = do     len <- (#peek struct cmsghdr, cmsg_len)   p@@ -69,7 +70,7 @@     withForeignPtr fptr $ \src0 -> do         let src = src0 `plusPtr` off         dst <- c_cmsg_data ctrlPtr-        memcpy dst src len+        copyBytes dst src len  parseCmsgs :: SocketAddress sa => Ptr (MsgHdr sa) -> IO [Cmsg] parseCmsgs msgptr = do@@ -88,7 +89,7 @@     CmsgHdr len lvl typ <- peek ptr     src <- c_cmsg_data ptr     let siz = fromIntegral len - (src `minusPtr` ptr)-    Cmsg (CmsgId lvl typ) <$> create (fromIntegral siz) (\dst -> memcpy dst src siz)+    Cmsg (CmsgId lvl typ) <$> create (fromIntegral siz) (\dst -> copyBytes dst src siz)  foreign import ccall unsafe "cmsg_firsthdr"   c_cmsg_firsthdr :: Ptr (MsgHdr sa) -> IO (Ptr CmsgHdr)
+ Network/Socket/Posix/HostName.hsc view
@@ -0,0 +1,25 @@+module Network.Socket.Posix.HostName (+    getHostName,+)+where++#include "HsNet.h"++import Foreign.C.Error+import Foreign.C.String+import Foreign.C.Types+import Foreign.Marshal.Array+import Network.Socket.Info (HostName)++foreign import ccall unsafe "gethostname"+    gethostname :: CString -> CSize -> IO CInt++-- | Get name of current host+--+--   Since: 3.3.0.0+getHostName :: IO HostName+getHostName = allocaArray0 size $ \cstr -> do+    throwErrnoIfMinus1_ "getHostName" $ gethostname cstr (fromIntegral size)+    peekCString cstr+  where+    size = 256
Network/Socket/Posix/IOVec.hsc view
@@ -14,13 +14,13 @@ #include <sys/uio.h>  data IOVec = IOVec-    { iovBase :: !(Ptr Word8)-    , iovLen  :: !CSize+    { iovBase :: Ptr Word8+    , iovLen  :: CSize     }  instance Storable IOVec where-  sizeOf    _ = (#const sizeof(struct iovec))-  alignment _ = alignment (0 :: CInt)+  sizeOf    ~_ = (#const sizeof(struct iovec))+  alignment ~_ = alignment (0 :: CInt)    peek p = do     base <- (#peek struct iovec, iov_base) p
Network/Socket/Posix/MsgHdr.hsc view
@@ -14,26 +14,26 @@ import Network.Socket.Posix.IOVec (IOVec)  data MsgHdr sa = MsgHdr-    { msgName    :: !(Ptr sa)-    , msgNameLen :: !(#type socklen_t)-    , msgIov     :: !(Ptr IOVec)+    { msgName    :: Ptr sa+    , msgNameLen :: #type socklen_t+    , msgIov     :: Ptr IOVec #ifdef __linux__-    , msgIovLen  :: !CSize+    , msgIovLen  :: CSize #else-    , msgIovLen  :: !CInt+    , msgIovLen  :: CInt #endif-    , msgCtrl    :: !(Ptr Word8)+    , msgCtrl    :: Ptr Word8 #ifdef __linux__-    , msgCtrlLen :: !CSize+    , msgCtrlLen :: CSize #else-    , msgCtrlLen :: !(#type socklen_t)+    , msgCtrlLen :: #type socklen_t #endif-    , msgFlags   :: !CInt+    , msgFlags   :: CInt     }  instance Storable (MsgHdr sa) where-  sizeOf    _ = (#const sizeof(struct msghdr))-  alignment _ = alignment (0 :: CInt)+  sizeOf    ~_ = (#const sizeof(struct msghdr))+  alignment ~_ = alignment (0 :: CInt)    peek p = do     name       <- (#peek struct msghdr, msg_name)       p
Network/Socket/ReadShow.hs view
@@ -1,16 +1,15 @@-{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE PatternGuards #-}-{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE RankNTypes #-}-+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}  module Network.Socket.ReadShow where +import Control.Monad (mzero) import Text.Read ((<++)) import qualified Text.Read as P import qualified Text.Read.Lex as P-import Control.Monad (mzero)  -- type alias for individual correspondences of a (possibly partial) bijection type Pair a b = (a, b)@@ -18,13 +17,12 @@ -- | helper function for equality on first tuple element {-# INLINE eqFst #-} eqFst :: Eq a => a -> (a, b) -> Bool-eqFst x = \(x',_) -> x' == x+eqFst x = \(x', _) -> x' == x  -- | helper function for equality on snd tuple element {-# INLINE eqSnd #-} eqSnd :: Eq b => b -> (a, b) -> Bool-eqSnd y = \(_,y') -> y' == y-+eqSnd y = \(_, y') -> y' == y  -- | Unified automorphic involution over @Either a b@ that converts between --   LHS and RHS elements of a list of @Pair a b@ mappings and is the identity@@ -33,9 +31,9 @@ --   If list contains duplicate matches, short-circuits to the first matching @Pair@ lookBetween :: (Eq a, Eq b) => [Pair a b] -> Either a b -> Either a b lookBetween ps = \case-  Left  x | (_,y):_ <- filter (eqFst x) ps -> Right y-  Right y | (x,_):_ <- filter (eqSnd y) ps -> Left  x-  z -> z+    Left x | (_, y) : _ <- filter (eqFst x) ps -> Right y+    Right y | (x, _) : _ <- filter (eqSnd y) ps -> Left x+    z -> z  -- Type alias for partial bijections between two types, consisting of a list -- of individual correspondences that are checked in order and short-circuit@@ -53,13 +51,15 @@ namePrefix :: Int -> String -> (Int -> b -> ShowS) -> b -> ShowS namePrefix i name f x     | null name = f i x-    | otherwise = showParen (i > app_prec) $ showString name . showChar ' ' . f (app_prec+1) x+    | otherwise =+        showParen (i > app_prec) $ showString name . showChar ' ' . f (app_prec + 1) x {-# INLINE namePrefix #-}  -- | Helper function for defining bijective Show instances that represents -- a common use-case where a constructor (or constructor-like pattern) name -- (optionally) precedes an internal value with a separate show function-defShow :: Eq a => String -> (a -> b) -> (Int -> b -> ShowS) -> (Int -> a -> ShowS)+defShow+    :: Eq a => String -> (a -> b) -> (Int -> b -> ShowS) -> (Int -> a -> ShowS) defShow name unwrap shoPrec = \i x -> namePrefix i name shoPrec (unwrap x) {-# INLINE defShow #-} @@ -82,7 +82,7 @@ {-# INLINE defRead #-}  -- | Alias for showsPrec that pairs well with `_readInt`-_showInt :: (Show a) => Int -> a -> ShowS+_showInt :: Show a => Int -> a -> ShowS _showInt = showsPrec {-# INLINE _showInt #-} @@ -98,27 +98,29 @@ {-# INLINE showIntInt #-}  -- | consume and return two integer-like values from two consecutive lexical tokens-readIntInt :: (Bounded a, Integral a, Bounded b, Integral b) => P.ReadPrec (a, b)+readIntInt+    :: (Bounded a, Integral a, Bounded b, Integral b) => P.ReadPrec (a, b) readIntInt = do-  x <- _readInt-  y <- _readInt-  return (x, y)+    x <- _readInt+    y <- _readInt+    return (x, y) {-# INLINE readIntInt #-} -bijectiveShow :: (Eq a) => Bijection a String -> (Int -> a -> ShowS) -> (Int -> a -> ShowS)+bijectiveShow+    :: Eq a => Bijection a String -> (Int -> a -> ShowS) -> (Int -> a -> ShowS) bijectiveShow bi def = \i x ->     case lookBetween bi (Left x) of         Right y -> showString y         _ -> def i x -bijectiveRead :: (Eq a) => Bijection a String -> P.ReadPrec a -> P.ReadPrec a+bijectiveRead :: Eq a => Bijection a String -> P.ReadPrec a -> P.ReadPrec a bijectiveRead bi def = P.parens $ bijective <++ def   where     bijective = do-      (P.Ident y) <- P.lexP-      case lookBetween bi (Right y) of-          Left x -> return x-          _ -> mzero+        (P.Ident y) <- P.lexP+        case lookBetween bi (Right y) of+            Left x -> return x+            _ -> mzero  app_prec :: Int app_prec = 10@@ -129,8 +131,8 @@ safeInt = do     i <- signed     if (i >= fromIntegral (minBound :: a) && i <= fromIntegral (maxBound :: a))-    then return $ fromIntegral i-    else mzero+        then return $ fromIntegral i+        else mzero   where     signed :: P.ReadPrec Integer     signed = P.readPrec
+ Network/Socket/STM.hs view
@@ -0,0 +1,72 @@+{-# LANGUAGE CPP #-}++-- | Waiting for a socket to become ready, through STM.+--+-- This mirrors @select@\/@epoll@ and is __POSIX only__: Windows+-- completion ports report that an operation has finished, not that one+-- could be started, so there is no readiness to wait for.  All four+-- throw there.  What runs on Windows instead is+-- "Network.Socket.Win32.Cancel", through 'Network.Socket.withReadable'.+--+module Network.Socket.STM (+    -- * Waiting for readiness (POSIX only)+    waitReadSocketSTM,+    waitAndCancelReadSocketSTM,+    waitWriteSocketSTM,+    waitAndCancelWriteSocketSTM,+) where++import Control.Concurrent.STM (STM)+import Network.Socket.Types+#if !defined(mingw32_HOST_OS)+import Control.Concurrent (threadWaitReadSTM, threadWaitWriteSTM)+import System.Posix.Types (Fd (..))+#endif++-- | STM action to wait until the socket is ready for reading.+--+--   __POSIX only.__  On Windows this throws: completion ports have no+--   notion of readiness.  Use 'Network.Socket.recvBufWith', or one of+--   the other operations which give up, instead.+waitReadSocketSTM :: Socket -> IO (STM ())+waitReadSocketSTM s = fst <$> waitAndCancelReadSocketSTM s++-- | STM action to wait until the socket is ready for reading and STM+--   action to cancel the waiting.+--+--   __POSIX only.__  See 'waitReadSocketSTM'.+waitAndCancelReadSocketSTM :: Socket -> IO (STM (), IO ())+#if defined(mingw32_HOST_OS)+waitAndCancelReadSocketSTM _ =+    ioError $+        userError $+            "waitAndCancelReadSocketSTM: Windows completion ports do not "+                ++ "provide readiness notification; use recvBufWith or "+                ++ "Network.Socket.ByteString.recvWith instead"+#else+waitAndCancelReadSocketSTM s = withFdSocket s $ threadWaitReadSTM . Fd+#endif++-- | STM action to wait until the socket is ready for writing.+--+--   __POSIX only.__  On Windows this throws.  Completion ports give no+--   way to ask whether a send would block, and none is needed: issue+--   the send and let it complete asynchronously.+waitWriteSocketSTM :: Socket -> IO (STM ())+waitWriteSocketSTM s = fst <$> waitAndCancelWriteSocketSTM s++-- | STM action to wait until the socket is ready for writing and STM+--   action to cancel the waiting.+--+--   __POSIX only.__  See 'waitWriteSocketSTM'.+waitAndCancelWriteSocketSTM :: Socket -> IO (STM (), IO ())+#if defined(mingw32_HOST_OS)+waitAndCancelWriteSocketSTM _ =+    ioError $+        userError $+            "waitAndCancelWriteSocketSTM: Windows completion ports do not "+                ++ "provide readiness notification, and none is needed for "+                ++ "sending: issue the send instead"+#else+waitAndCancelWriteSocketSTM s = withFdSocket s $ threadWaitWriteSTM . Fd+#endif
Network/Socket/Shutdown.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE ScopedTypeVariables #-}  #include "HsNetDef.h" @@ -6,17 +7,20 @@     ShutdownCmd(..)   , shutdown   , gracefulClose+  , unsafeGracefulClose   ) where +import Control.Concurrent (rtsSupportsBoundThreads, yield)+import Control.Concurrent.STM import qualified Control.Exception as E import Foreign.Marshal.Alloc (mallocBytes, free)--import Control.Concurrent (threadDelay)+import System.Timeout  import Network.Socket.Buffer import Network.Socket.Imports import Network.Socket.Internal import Network.Socket.Types+import Network.Socket.Wait  data ShutdownCmd = ShutdownReceive                  | ShutdownSend@@ -47,32 +51,66 @@ -- --   Since: 3.1.1.0 gracefulClose :: Socket -> Int -> IO ()-gracefulClose s tmout = sendRecvFIN `E.finally` close s+gracefulClose = gracefulCloseWith close++-- | 'gracefulClose' which ends with 'unsafeClose' rather than 'close',+--   for a caller which knows that no other thread is waiting on the+--   socket.  The wait for the peer's FIN is this thread's own.+--+--   @since 3.2.12.0+unsafeGracefulClose :: Socket -> Int -> IO ()+unsafeGracefulClose = gracefulCloseWith unsafeClose++gracefulCloseWith :: (Socket -> IO ()) -> Socket -> Int -> IO ()+gracefulCloseWith closer s tmout0 = sendRecvFIN `E.finally` closer s   where     sendRecvFIN = do         -- Sending TCP FIN.         ex <- E.try $ shutdown s ShutdownSend         case ex of-          Left (E.SomeException _) -> return ()+          -- Don't catch asynchronous exceptions+          Left (_ :: E.IOException) -> return ()           Right () -> do+              -- Giving CPU time to other threads hoping that+              -- FIN arrives meanwhile.+              yield               -- Waiting TCP FIN.-              E.bracket (mallocBytes bufSize) free $ \buf -> do-                  {-# SCC "" #-} recvEOFloop buf-    -- milliseconds. Taken from BSD fast clock value.-    clock = 200-    recvEOFloop buf = loop 0-      where-        loop delay = do-            -- We don't check the (positive) length.-            -- In normal case, it's 0. That is, only FIN is received.-            -- In error cases, data is available. But there is no-            -- application which can read it. So, let's stop receiving-            -- to prevent attacks.-            r <- recvBufNoWait s buf bufSize-            let delay' = delay + clock-            when (r == -1 && delay' < tmout) $ do-                threadDelay (clock * 1000)-                loop delay'-    -- Don't use 4092 here. The GHC runtime takes the global lock-    -- if the length is over 3276 bytes in 32bit or 3272 bytes in 64bit.-    bufSize = 1024+              E.bracket (mallocBytes bufSize) free (recvEOF s tmout0)++-- Waiting for the peer's FIN, draining what arrives before it.  The+-- receive is given up on rather than interrupted: an asynchronous+-- exception does not reach a thread blocked in one on Windows.+recvEOF :: Socket -> Int -> Ptr Word8 -> IO ()+recvEOF s tmout0 buf+    | not rtsSupportsBoundThreads = recvEOFtimeout s tmout0 buf+    | otherwise = do+        -- millisecond to microsecond+        late <- registerDelay $ tmout0 * 1000+        loop late 0+  where+    loop late n0 = do+        r <- E.try $ recvBufWith s buf bufSize $ check =<< readTVar late+        case r of+            Left (_ :: E.IOException) -> return ()+            -- The deadline.+            Right (Left ()) -> return ()+            Right (Right n1) -> when (n1 > 0) $ do+                let n = n0 + n1+                when (n < drainLimit) $ loop late n++-- registerDelay needs -threaded, and so does the give-up on Windows --+-- where this cannot cut a receive short either, but nothing else works+-- there without it.+recvEOFtimeout :: Socket -> Int -> Ptr Word8 -> IO ()+-- millisecond to microsecond+recvEOFtimeout s tmout0 buf = void $ timeout (tmout0 * 1000) $ recvBuf s buf bufSize++-- Don't use 4092 here. The GHC runtime takes the global lock+-- if the length is over 3276 bytes in 32bit or 3272 bytes in 64bit.+bufSize :: Int+bufSize = 1024++-- Data left unread makes close send RST rather than FIN, so what has+-- arrived is drained -- but only this far: nothing is going to read it.+drainLimit :: Int+drainLimit = 128 * 1024
Network/Socket/SockAddr.hs view
@@ -1,25 +1,33 @@ {-# LANGUAGE CPP #-}+ module Network.Socket.SockAddr (-      getPeerName-    , getSocketName-    , connect-    , bind-    , accept-    , sendBufTo-    , recvBufFrom-    , sendBufMsg-    , recvBufMsg-    ) where+    getPeerName,+    getSocketName,+    connect,+    connectWith,+    bind,+    accept,+    acceptWith,+    sendBufTo,+    sendBufToWith,+    recvBufFrom,+    sendBufMsg,+    recvBufMsg,+    sendBufMsgWith,+    recvBufMsgWith,+) where -import Control.Exception (try, throwIO, IOException)+import Control.Concurrent.STM (STM)+import Control.Exception (IOException, throwIO, try) import System.Directory (removeFile) import System.IO.Error (isAlreadyInUseError, isDoesNotExistError)  import qualified Network.Socket.Buffer as G-import qualified Network.Socket.Name as G-import qualified Network.Socket.Syscall as G import Network.Socket.Flag import Network.Socket.Imports+import qualified Network.Socket.Name as G+import qualified Network.Socket.Syscall as G+import qualified Network.Socket.Wait as G #if !defined(mingw32_HOST_OS) import Network.Socket.Posix.Cmsg #else@@ -39,31 +47,39 @@ connect :: Socket -> SockAddr -> IO () connect = G.connect +-- | 'connect' which the caller can give up on.  Whichever settles+-- first decides: 'Left' when the 'STM' action fires, 'Right' when the+-- connection is made.  A socket given up on is to be closed.+--+-- @since 3.2.12.0+connectWith :: Socket -> SockAddr -> STM a -> IO (Either a ())+connectWith = G.connectWith+ -- | Bind the socket to an address. The socket must not already be -- bound.  The 'Family' passed to @bind@ must be the -- same as that passed to 'socket'.  If the special port number -- 'defaultPort' is passed then the system assigns the next available -- use port. bind :: Socket -> SockAddr -> IO ()-bind s a = case a of-  SockAddrUnix p -> do-    -- gracefully handle the fact that UNIX systems don't clean up closed UNIX-    -- domain sockets, inspired by https://stackoverflow.com/a/13719866-    res <- try (G.bind s a)-    case res of-      Right () -> return ()-      Left e | not (isAlreadyInUseError e) -> throwIO (e :: IOException)-      Left e | otherwise -> do-        -- socket might be in use, try to connect-        res2 <- try (G.connect s a)-        case res2 of-          Right () -> close s >> throwIO e-          Left e2 | not (isDoesNotExistError e2) -> throwIO (e2 :: IOException)-          _ -> do-            -- socket not actually in use, remove it and retry bind-            void (try $ removeFile p :: IO (Either IOError ()))-            G.bind s a-  _ -> G.bind s a+bind s sa = case sa of+    SockAddrUnix p -> do+        -- gracefully handle the fact that UNIX systems don't clean up closed UNIX+        -- domain sockets, inspired by https://stackoverflow.com/a/13719866+        res <- try (G.bind s sa)+        case res of+            Right () -> return ()+            Left e | not (isAlreadyInUseError e) -> throwIO (e :: IOException)+            Left e | otherwise -> do+                -- socket might be in use, try to connect+                res2 <- try (G.connect s sa)+                case res2 of+                    Right () -> close s >> throwIO e+                    Left e2 | not (isDoesNotExistError e2) -> throwIO (e2 :: IOException)+                    _ -> do+                        -- socket not actually in use, remove it and retry bind+                        void (try $ removeFile p :: IO (Either IOError ()))+                        G.bind s sa+    _ -> G.bind s sa  -- | Accept a connection.  The socket must be bound to an address and -- listening for connections.  The return value is a pair @(conn,@@ -74,6 +90,14 @@ accept :: Socket -> IO (Socket, SockAddr) accept = G.accept +-- | 'accept' which the caller can give up on.  Whichever settles+-- first decides: 'Left' when the 'STM' action fires, 'Right' when a+-- connection arrives.+--+-- @since 3.2.10.0+acceptWith :: Socket -> STM a -> IO (Either a (Socket, SockAddr))+acceptWith = G.acceptWith+ -- | Send data to the socket.  The recipient can be specified -- explicitly, so the socket need not be in a connected state. -- Returns the number of bytes sent.  Applications are responsible for@@ -81,6 +105,12 @@ sendBufTo :: Socket -> Ptr a -> Int -> SockAddr -> IO Int sendBufTo = G.sendBufTo +-- | 'sendBufTo' which the caller can give up on.+--+-- @since 3.2.12.0+sendBufToWith :: Socket -> Ptr a -> Int -> SockAddr -> STM b -> IO (Either b Int)+sendBufToWith = G.sendBufToWith+ -- | Receive data from the socket, writing it into buffer instead of -- creating a new string.  The socket need not be in a connected -- state. Returns @(nbytes, address)@ where @nbytes@ is the number of@@ -97,22 +127,51 @@ recvBufFrom = G.recvBufFrom  -- | Send data to the socket using sendmsg(2).-sendBufMsg :: Socket            -- ^ Socket-           -> SockAddr          -- ^ Destination address-           -> [(Ptr Word8,Int)] -- ^ Data to be sent-           -> [Cmsg]            -- ^ Control messages-           -> MsgFlag           -- ^ Message flags-           -> IO Int            -- ^ The length actually sent+sendBufMsg+    :: Socket+    -- ^ Socket+    -> SockAddr+    -- ^ Destination address+    -> [(Ptr Word8, Int)]+    -- ^ Data to be sent+    -> [Cmsg]+    -- ^ Control messages+    -> MsgFlag+    -- ^ Message flags+    -> IO Int+    -- ^ The length actually sent sendBufMsg = G.sendBufMsg  -- | Receive data from the socket using recvmsg(2).-recvBufMsg :: Socket            -- ^ Socket-        -> [(Ptr Word8,Int)] -- ^ A list of a pair of buffer and its size.-                             --   If the total length is not large enough,-                             --   'MSG_TRUNC' is returned-        -> Int               -- ^ The buffer size for control messages.-                             --   If the length is not large enough,-                             --   'MSG_CTRUNC' is returned-        -> MsgFlag           -- ^ Message flags-        -> IO (SockAddr,Int,[Cmsg],MsgFlag) -- ^ Source address, received data, control messages and message flags+recvBufMsg+    :: Socket+    -- ^ Socket+    -> [(Ptr Word8, Int)]+    -- ^ A list of a pair of buffer and its size.+    --   If the total length is not large enough,+    --   'MSG_TRUNC' is returned+    -> Int+    -- ^ The buffer size for control messages.+    --   If the length is not large enough,+    --   'MSG_CTRUNC' is returned+    -> MsgFlag+    -- ^ Message flags+    -> IO (SockAddr, Int, [Cmsg], MsgFlag)+    -- ^ Source address, received data, control messages and message flags recvBufMsg = G.recvBufMsg++-- | 'sendBufMsg' which the caller can give up on.+--+-- @since 3.2.12.0+sendBufMsgWith+    :: Socket -> SockAddr -> [(Ptr Word8, Int)] -> [Cmsg] -> MsgFlag -> STM a+    -> IO (Either a Int)+sendBufMsgWith = G.sendBufMsgWith++-- | 'recvBufMsg' which the caller can give up on.+--+-- @since 3.2.12.0+recvBufMsgWith+    :: Socket -> [(Ptr Word8, Int)] -> Int -> MsgFlag -> STM a+    -> IO (Either a (SockAddr, Int, [Cmsg], MsgFlag))+recvBufMsgWith = G.recvBufMsgWith
Network/Socket/Syscall.hs view
@@ -4,6 +4,7 @@  module Network.Socket.Syscall where +import Data.Either (isRight) import Foreign.Marshal.Utils (with) import qualified Control.Exception as E # if defined(mingw32_HOST_OS)@@ -11,8 +12,11 @@ #endif  #if defined(mingw32_HOST_OS)+import Control.Exception (bracket) import Foreign (FunPtr)+import Foreign.Marshal.Alloc (alloca) import GHC.Conc (asyncDoProc)+import Network.Socket.Cbits #else import Foreign.C.Error (getErrno, eINTR, eINPROGRESS) import GHC.Conc (threadWaitWrite)@@ -63,8 +67,9 @@ -- can be handled with one socket. -- -- >>> import Network.Socket+-- >>> import qualified Data.List.NonEmpty as NE -- >>> let hints = defaultHints { addrFlags = [AI_NUMERICHOST, AI_NUMERICSERV], addrSocketType = Stream }--- >>> addr:_ <- getAddrInfo (Just hints) (Just "127.0.0.1") (Just "5000")+-- >>> addr <- NE.head <$> getAddrInfo (Just hints) (Just "127.0.0.1") (Just "5000") -- >>> sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) -- >>> Network.Socket.bind sock (addrAddress addr) -- >>> getSocketName sock@@ -81,6 +86,8 @@     -- This socket is not managed by the IO manager yet.     -- So, we don't have to call "close" which uses "closeFdWith".     unsetIPv6Only s+    setDontFragment s+    unsetConnReset s     return s   where     create = do@@ -118,6 +125,36 @@     unsetIPv6Only _ = return () #endif +    setDontFragment s = when (family == AF_INET) $+#if HAVE_DECL_IP_DONTFRAG || HAVE_DECL_IP_MTU_DISCOVER+      setSocketOption s DontFragment 1+#else+      -- do nothing+      return ()+#endif++    unsetConnReset s = when (stype == Datagram) $ reportConnReset s False++-- Whether the socket reports the ICMP unreachable an earlier send of its+-- own caused.  Winsock reports it to the next receive even on a socket+-- which was never connected, where POSIX says nothing of it at all: one+-- reply bouncing off a client which has gone ends a server's receive+-- loop.  'socket' therefore turns it off and 'connect' turns it back on,+-- which is the ECONNREFUSED POSIX gives a connected datagram socket.+--+-- It is advice for datagrams alone and does nothing to any other socket,+-- so the result is not worth looking at.+reportConnReset :: Socket -> Bool -> IO ()+#if defined(mingw32_HOST_OS)+reportConnReset s report =+    with (if report then 1 else 0 :: Word32) $ \val ->+    alloca $ \ret ->+      void $ withFdSocket s $ \fd ->+        c_WSAIoctl fd sioUDPConnReset val 4 nullPtr 0 ret nullPtr nullPtr+#else+reportConnReset _ _ = return ()+#endif+ ----------------------------------------------------------------------------- -- Binding a socket @@ -136,28 +173,51 @@  -- | Connect to a remote socket at address. connect :: SocketAddress sa => Socket -> sa -> IO ()-connect s sa = withSocketsDo $ withSocketAddress sa $ \p_sa sz ->-    connectLoop s p_sa (fromIntegral sz)+connect s sa = void (connectWhenWritable s sa waitWrite :: IO (Either () ()))+  where+#if defined(mingw32_HOST_OS)+    waitWrite act = Right <$> act+#else+    waitWrite act = do+        withFdSocket s $ threadWaitWrite . fromIntegral+        Right <$> act+#endif -connectLoop :: SocketAddress sa => Socket -> Ptr sa -> CInt -> IO ()-connectLoop s p_sa sz = withFdSocket s $ \fd -> loop fd+-- | 'connect' which leaves the wait for a connection in progress to+--   the caller: the argument runs the action once the socket is writable.+connectWhenWritable+    :: SocketAddress sa+    => Socket -> sa -> (IO () -> IO (Either a ())) -> IO (Either a ())+connectWhenWritable s sa whenWritable =+    withSocketsDo $ withSocketAddress sa $ \p_sa sz -> do+        r <- connectLoop s p_sa (fromIntegral sz) whenWritable+        when (isRight r) $ reportConnReset s True+        return r++connectLoop+    :: SocketAddress sa+    => Socket -> Ptr sa -> CInt -> (IO () -> IO (Either a ())) -> IO (Either a ())+#if defined(mingw32_HOST_OS)+connectLoop s p_sa sz _ = withFdSocket s $ \fd -> loop fd+#else+connectLoop s p_sa sz whenWritable = withFdSocket s $ \fd -> loop fd+#endif   where     errLoc = "Network.Socket.connect: " ++ show s     loop fd = do        r <- c_connect fd p_sa sz-       when (r == -1) $ do+       if r /= -1 then return (Right ()) else do #if defined(mingw32_HOST_OS)            throwSocketError errLoc #else            err <- getErrno            case () of              _ | err == eINTR       -> loop fd-             _ | err == eINPROGRESS -> connectBlocked---           _ | err == eAGAIN      -> connectBlocked+             _ | err == eINPROGRESS -> whenWritable connected+--           _ | err == eAGAIN      -> whenWritable connected              _otherwise             -> throwSocketError errLoc -    connectBlocked = do-       withFdSocket s $ threadWaitWrite . fromIntegral+    connected = do        err <- getSocketOption s SoError        when (err /= 0) $ throwSocketErrorCode errLoc (fromIntegral err) #endif@@ -191,7 +251,7 @@ accept :: SocketAddress sa => Socket -> IO (Socket, sa) accept listing_sock = withNewSocketAddress $ \new_sa sz ->     withFdSocket listing_sock $ \listing_fd -> do- new_sock <- callAccept listing_fd new_sa sz >>= mkSocket+ new_sock <- E.bracketOnError (callAccept listing_fd new_sa sz) c_close mkSocket  new_addr <- peekSocketAddress new_sa  return (new_sock, new_addr)   where@@ -201,13 +261,12 @@                        throwSocketErrorIfMinus1Retry "Network.Socket.accept" $                          c_accept_safe fd sa ptr_len        | otherwise = do-             paramData <- c_newAcceptParams fd (fromIntegral sz) sa-             rc        <- asyncDoProc c_acceptDoProc paramData-             new_fd    <- c_acceptNewSock paramData-             c_free paramData-             when (rc /= 0) $-               throwSocketErrorCode "Network.Socket.accept" (fromIntegral rc)-             return new_fd+             bracket (c_newAcceptParams fd (fromIntegral sz) sa) c_free $ \paramData -> do+                 rc     <- asyncDoProc c_acceptDoProc paramData+                 new_fd <- c_acceptNewSock paramData+                 when (rc /= 0) $+                     throwSocketErrorCode "Network.Socket.accept" (fromIntegral rc)+                 return new_fd #else      callAccept fd sa sz = with (fromIntegral sz) $ \ ptr_len -> do # ifdef HAVE_ADVANCED_SOCKET_FLAGS@@ -240,6 +299,11 @@ #endif  #if defined(mingw32_HOST_OS)+-- int WSAIoctl(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD,+--              LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE)+foreign import CALLCONV unsafe "WSAIoctl"+  c_WSAIoctl :: CInt -> Word32 -> Ptr Word32 -> Word32 -> Ptr () -> Word32+             -> Ptr Word32 -> Ptr () -> Ptr () -> IO CInt foreign import CALLCONV safe "accept"   c_accept_safe :: CInt -> Ptr sa -> Ptr CInt{-CSockLen???-} -> IO CInt foreign import ccall unsafe "rtsSupportsBoundThreads"
Network/Socket/Types.hsc view
@@ -23,6 +23,7 @@     , invalidateSocket     , close     , close'+    , unsafeClose     , c_close     -- * Types of socket     , SocketType(GeneralSocketType, UnsupportedSocketType, NoSocketType@@ -57,6 +58,7 @@     , isSupportedSockAddr     , HostAddress     , hostAddressToTuple+    , hostAddressToTuple'     , tupleToHostAddress     , HostAddress6     , hostAddress6ToTuple@@ -67,6 +69,9 @@     , pokeSockAddr     , withSockAddr +    -- * Null socket address type+    , NullSockAddr(..)+     -- * Unsorted     , ProtocolNumber     , defaultProtocol@@ -78,6 +83,9 @@     , htonl     , ntohl     , In6Addr(..)++    -- * Multicast Group+    , MulticastGroup(..)     ) where  import Data.IORef (IORef, newIORef, readIORef, atomicModifyIORef', mkWeakIORef)@@ -104,7 +112,7 @@ -----------------------------------------------------------------------------  -- | Basic type for a socket.-data Socket = Socket !(IORef CInt) !CInt {- for Show -}+data Socket = Socket (IORef CInt) CInt {- for Show -}  instance Show Socket where     show (Socket _ ofd) = "<socket: " ++ show ofd ++ ">"@@ -267,6 +275,23 @@         ret <- c_close $ fromIntegral fd         when (ret == -1) $ throwErrno "Network.Socket.close'" +-- | Closing a socket which no thread is waiting on, with @close(2)@+--   itself.  Exceptions are not thrown, as in 'close'.+--+--   'close' goes through the IO manager so that a thread waiting on the+--   socket is told.  On a threaded POSIX RTS that takes a lock on every+--   capability, and does nothing at all when there is no such thread.+--   This skips it, and is for a caller which knows there is none.  Where+--   one might be, the warning on 'unsafeFdSocket' applies in full.+--+--   There is nothing to skip on Windows, where the IO manager is not in+--   the way of a close, and this is 'close'.+--+--   @since 3.2.11.0+unsafeClose :: Socket -> IO ()+unsafeClose s = invalidateSocket s (\_ -> return ()) $ \oldfd ->+    void $ c_close oldfd+ #if defined(mingw32_HOST_OS) foreign import CALLCONV unsafe "closesocket"   c_close :: CInt -> IO CInt@@ -345,35 +370,35 @@ #ifdef SOCK_STREAM pattern Stream               = SocketType (#const SOCK_STREAM) #else-pattern Stream               = (-1)+pattern Stream               = UnsupportedSocketType #endif  pattern Datagram            :: SocketType #ifdef SOCK_DGRAM pattern Datagram             = SocketType (#const SOCK_DGRAM) #else-pattern Datagram             = (-1)+pattern Datagram             = UnsupportedSocketType #endif  pattern Raw                 :: SocketType #ifdef SOCK_RAW pattern Raw                  = SocketType (#const SOCK_RAW) #else-pattern Raw                  = (-1)+pattern Raw                  = UnsupportedSocketType #endif  pattern RDM                 :: SocketType #ifdef SOCK_RDM pattern RDM                  = SocketType (#const SOCK_RDM) #else-pattern RDM                  = (-1)+pattern RDM                  = UnsupportedSocketType #endif  pattern SeqPacket           :: SocketType #ifdef SOCK_SEQPACKET pattern SeqPacket            = SocketType (#const SOCK_SEQPACKET) #else-pattern SeqPacket            = (-1)+pattern SeqPacket            = UnsupportedSocketType #endif  ------------------------------------------------------------------------@@ -982,8 +1007,8 @@ {-# DEPRECATED ntohl "Use getAddrInfo instead" #-}  instance Storable PortNumber where-   sizeOf    _ = sizeOf    (0 :: Word16)-   alignment _ = alignment (0 :: Word16)+   sizeOf    ~_ = sizeOf    (0 :: Word16)+   alignment ~_ = alignment (0 :: Word16)    poke p (PortNum po) = poke (castPtr p) (htons po)    peek p = PortNum . ntohs <$> peek (castPtr p) @@ -1007,6 +1032,7 @@ sockaddrStorageLen :: Int sockaddrStorageLen = 128 +{-# NOINLINE withSocketAddress #-} withSocketAddress :: SocketAddress sa => sa -> (Ptr sa -> Int -> IO a) -> IO a withSocketAddress addr f = do     let sz = sizeOfSocketAddress addr@@ -1021,6 +1047,17 @@     f ptr sockaddrStorageLen  ------------------------------------------------------------------------++-- | A null 'SocketAddress' for situations where a socket address+--   parameter is optional.+data NullSockAddr = NullSockAddr++instance SocketAddress NullSockAddr where+    sizeOfSocketAddress _ = 0+    peekSocketAddress _   = return NullSockAddr+    pokeSocketAddress _ _ = return ()++------------------------------------------------------------------------ -- Socket addresses  -- The scheme used for addressing sockets is somewhat quirky. The@@ -1051,13 +1088,13 @@ -- 'isSupportedSockAddr'. data SockAddr   = SockAddrInet-        !PortNumber      -- sin_port-        !HostAddress     -- sin_addr  (ditto)+        PortNumber      -- sin_port+        HostAddress     -- sin_addr  (ditto)   | SockAddrInet6-        !PortNumber      -- sin6_port-        !FlowInfo        -- sin6_flowinfo (ditto)-        !HostAddress6    -- sin6_addr (ditto)-        !ScopeID         -- sin6_scope_id (ditto)+        PortNumber      -- sin6_port+        FlowInfo        -- sin6_flowinfo (ditto)+        HostAddress6    -- sin6_addr (ditto)+        ScopeID         -- sin6_scope_id (ditto)   -- | The path must have fewer than 104 characters. All of these characters must have code points less than 256.   | SockAddrUnix         String           -- sun_path@@ -1068,6 +1105,65 @@   rnf (SockAddrInet6 _ _ _ _) = ()   rnf (SockAddrUnix str) = rnf str +-- |+--+-- >>> SockAddrInet6 80 0 (0,0,0xffff,0x01020304) 0+-- [::ffff:1.2.3.4]:80+instance Show SockAddr where+  showsPrec _ (SockAddrUnix str) = showString str+  showsPrec _ (SockAddrInet port ha)+   = showHostAddress ha+   . showString ":"+   . shows port+  showsPrec _ (SockAddrInet6 port _ ha6 _)+   = showChar '['+   . showHostAddress6 ha6+   . showString "]:"+   . shows port+++-- Taken from on the implementation of showIPv4 in Data.IP.Addr+showHostAddress :: HostAddress -> ShowS+showHostAddress ip =+  let (u3, u2, u1, u0) = hostAddressToTuple ip in+  foldr1 (.) . intersperse (showChar '.') $ map showInt [u3, u2, u1, u0]++showHostAddress' :: HostAddress -> ShowS+showHostAddress' ip =+  let (u3, u2, u1, u0) = hostAddressToTuple' ip in+  foldr1 (.) . intersperse (showChar '.') $ map showInt [u3, u2, u1, u0]++-- Taken from showIPv6 in Data.IP.Addr.++-- | Show an IPv6 address in the most appropriate notation, based on recommended+-- representation proposed by <http://tools.ietf.org/html/rfc5952 RFC 5952>.+--+-- /The implementation is completely compatible with the current implementation+-- of the `inet_ntop` function in glibc./+showHostAddress6 :: HostAddress6 -> ShowS+showHostAddress6 ha6@(a1, a2, a3, a4)+    -- IPv4-Mapped IPv6 Address+    | a1 == 0 && a2 == 0 && a3 == 0xffff =+      showString "::ffff:" . showHostAddress' a4+    -- IPv4-Compatible IPv6 Address (exclude IPRange ::/112)+    | a1 == 0 && a2 == 0 && a3 == 0 && a4 >= 0x10000 =+        showString "::" . showHostAddress' a4+    -- length of longest run > 1, replace it with "::"+    | end - begin > 1 =+        showFields prefix . showString "::" . showFields suffix+    | otherwise =+        showFields fields+  where+    fields =+        let (u7, u6, u5, u4, u3, u2, u1, u0) = hostAddress6ToTuple ha6 in+        [u7, u6, u5, u4, u3, u2, u1, u0]+    showFields = foldr (.) id . intersperse (showChar ':') . map showHex+    prefix = take begin fields  -- fields before "::"+    suffix = drop end fields    -- fields after "::"+    begin = end + diff          -- the longest run of zeros+    (diff, end) = minimum $+        scanl (\c i -> if i == 0 then c - 1 else 0) 0 fields `zip` [0..]+ -- | Is the socket address type supported on this system? isSupportedSockAddr :: SockAddr -> Bool isSupportedSockAddr addr = case addr of@@ -1114,6 +1210,9 @@ sizeOfSockAddr SockAddrInet{}  = #const sizeof(struct sockaddr_in) sizeOfSockAddr SockAddrInet6{} = #const sizeof(struct sockaddr_in6) +-- The combination of "-XString" and inlining results in a bug where+-- "sz" is always 0.+{-# NOINLINE withSockAddr #-} -- | Use a 'SockAddr' with a function requiring a pointer to a -- 'SockAddr' and the length of that 'SockAddr'. withSockAddr :: SockAddr -> (Ptr SockAddr -> Int -> IO a) -> IO a@@ -1138,15 +1237,16 @@ -- | Write the given 'SockAddr' to the given memory location. pokeSockAddr :: Ptr a -> SockAddr -> IO () pokeSockAddr p sa@(SockAddrUnix path) = do-    when (length path > unixPathMax) $ error+    let pathC = map castCharToCChar path+        len = length pathC+    when (len >= unixPathMax) $ error       $ "pokeSockAddr: path is too long in SockAddrUnix " <> show path-      <> ", length " <> show (length path) <> ", unixPathMax " <> show unixPathMax+      <> ", length " <> show len <> ", unixPathMax " <> show unixPathMax     zeroMemory p $ fromIntegral $ sizeOfSockAddr sa # if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)     (#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     -- the buffer is already filled with nulls.     pokeArray ((#ptr struct sockaddr_un, sun_path) p) pathC pokeSockAddr p (SockAddrInet port addr) = do@@ -1212,6 +1312,11 @@         byte i = fromIntegral (ha `shiftR` i) :: Word8     in (byte 24, byte 16, byte 8, byte 0) +hostAddressToTuple' :: HostAddress -> (Word8, Word8, Word8, Word8)+hostAddressToTuple' ha =+    let byte i = fromIntegral (ha `shiftR` i) :: Word8+    in (byte 24, byte 16, byte 8, byte 0)+ -- | Converts IPv4 quadruple to 'HostAddress'. tupleToHostAddress :: (Word8, Word8, Word8, Word8) -> HostAddress tupleToHostAddress (b3, b2, b1, b0) =@@ -1279,8 +1384,8 @@ #endif  instance Storable In6Addr where-    sizeOf    _ = #const sizeof(struct in6_addr)-    alignment _ = #alignment struct in6_addr+    sizeOf    ~_ = #const sizeof(struct in6_addr)+    alignment ~_ = #alignment struct in6_addr      peek p = do         a <- peek32 p 0@@ -1420,3 +1525,27 @@ -- | Zero a structure. zeroMemory :: Ptr a -> CSize -> IO () zeroMemory dest nbytes = memset dest 0 (fromIntegral nbytes)+++------------------------------------------------------------------------+-- Multicast Group++data MulticastGroup = MulticastGroup+    { groupAddress :: HostAddress+    , localAddress :: Maybe HostAddress+    } deriving (Show, Eq)++instance Storable MulticastGroup where+    sizeOf ~_ = #size struct ip_mreq+    alignment ~_ = #alignment struct ip_mreq+    peek p = do+        g <- (#peek struct ip_mreq, imr_multiaddr) p+        l <- (#peek struct ip_mreq, imr_interface) p+        pure . MulticastGroup g $ case l of+            0 -> Nothing+            loc -> Just loc+    poke p (MulticastGroup g l) = do+        (#poke struct ip_mreq, imr_multiaddr) p g+        (#poke struct ip_mreq, imr_interface) p (case l of+            Nothing -> 0+            Just loc -> loc)
Network/Socket/Unix.hsc view
@@ -22,11 +22,11 @@ import System.Posix.Types (Fd(..))  #if defined(mingw32_HOST_OS)+import qualified Control.Exception as E+import Network.Socket.Name (getSocketName)+import Network.Socket.Options import Network.Socket.Syscall import Network.Socket.Win32.Cmsg-import System.Directory-import System.IO-import System.IO.Temp #else import Foreign.Marshal.Array (peekArray) import Network.Socket.Internal@@ -88,8 +88,8 @@  newtype PeerCred = PeerCred (CUInt, CUInt, CUInt) instance Storable PeerCred where-    sizeOf    _ = (#const sizeof(struct ucred))-    alignment _ = alignment (0 :: CInt)+    sizeOf    ~_ = (#const sizeof(struct ucred))+    alignment ~_ = alignment (0 :: CInt)     poke _ _ = return ()     peek p = do         pid <- (#peek struct ucred, pid) p@@ -133,18 +133,11 @@ isUnixDomainSocketAvailable :: Bool isUnixDomainSocketAvailable = True -data NullSockAddr = NullSockAddr--instance SocketAddress NullSockAddr where-    sizeOfSocketAddress _ = 0-    peekSocketAddress _   = return NullSockAddr-    pokeSocketAddress _ _ = return ()- -- | Send a file descriptor over a UNIX-domain socket. --   This function does not work on Windows. sendFd :: Socket -> CInt -> IO () sendFd s outfd = void $ allocaBytes dummyBufSize $ \buf -> do-    let cmsg = encodeCmsg $ Fd outfd+    let cmsg = encodeCmsg [Fd outfd]     sendBufMsg s NullSockAddr [(buf,dummyBufSize)] [cmsg] mempty   where     dummyBufSize = 1@@ -156,33 +149,42 @@ recvFd :: Socket -> IO CInt recvFd s = allocaBytes dummyBufSize $ \buf -> do     (NullSockAddr, _, cmsgs, _) <- recvBufMsg s [(buf,dummyBufSize)] 32 mempty-    case (lookupCmsg CmsgIdFd cmsgs >>= decodeCmsg) :: Maybe Fd of-      Nothing      -> return (-1)-      Just (Fd fd) -> return fd+    case (lookupCmsg CmsgIdFds cmsgs >>= decodeCmsg) :: Maybe [Fd] of+      Just (Fd fd : _) -> return fd+      _                -> return (-1)   where     dummyBufSize = 16  -- | Build a pair of connected socket objects.---   On Windows, this function emulates socketpair() using---   'AF_UNIX' and a temporary file will remain.+--   On Windows, this function emulates socketpair() with a TCP connection+--   over the loopback interface, whatever the arguments are: there an+--   'AF_UNIX' recv may miss the peer's close and wait for ever. socketPair :: Family              -- Family Name (usually AF_UNIX)            -> SocketType          -- Socket Type (usually Stream)            -> ProtocolNumber      -- Protocol Number            -> IO (Socket, Socket) -- unnamed and connected. #if defined(mingw32_HOST_OS)-socketPair _ _ _ = withSystemTempFile "temp-for-pair" $ \file hdl -> do-    hClose hdl-    removeFile file-    listenSock <- socket AF_UNIX Stream defaultProtocol-    bind listenSock $ SockAddrUnix file-    listen listenSock 10-    clientSock <- socket AF_UNIX Stream defaultProtocol-    connect clientSock $ SockAddrUnix file-    (serverSock, _ :: SockAddr) <- accept listenSock-    close listenSock-    withFdSocket clientSock setNonBlockIfNeeded-    withFdSocket serverSock setNonBlockIfNeeded-    return (clientSock, serverSock)+socketPair _ _ _ =+    E.bracket (socket AF_INET Stream defaultProtocol) close $ \listenSock -> do+        bind listenSock $ SockAddrInet 0 $ tupleToHostAddress (127, 0, 0, 1)+        listen listenSock 10+        addr :: SockAddr <- getSocketName listenSock+        E.bracketOnError (socket AF_INET Stream defaultProtocol) close $ \clientSock -> do+            connect clientSock addr+            me :: SockAddr <- getSocketName clientSock+            serverSock <- acceptFrom listenSock me+            mapM_ prepare [clientSock, serverSock]+            return (clientSock, serverSock)+  where+    -- Another process may connect to the port first; it is not our peer.+    acceptFrom listenSock me = do+        (sock, peer) <- accept listenSock+        if peer == me+            then return sock+            else close sock >> acceptFrom listenSock me+    prepare sock = do+        setSocketOption sock NoDelay 1+        withFdSocket sock setNonBlockIfNeeded #else socketPair family stype protocol =     allocaBytes (2 * sizeOf (1 :: CInt)) $ \ fdArr -> do
+ Network/Socket/Wait.hs view
@@ -0,0 +1,377 @@+{-# LANGUAGE CPP #-}++#include "HsNetDef.h"++-- | Blocking socket operations which a caller can give up on.+--+--   Each takes an 'STM' action beside the operation.  Whichever+--   settles first decides the result: 'Left' when the caller gave up,+--   'Right' when the operation completed.  Nothing has to be closed or+--   interrupted to make the thread return, so neither the delivery of+--   @evtClose@ by @closeFdWith@ nor an asynchronous exception reaching+--   a blocking call is relied upon.+--+--   __On Windows these need the threaded runtime.__  There is no+--   readiness to wait for there, so the operation is started and then+--   cancelled, and the thread it runs in blocks in a foreign call.+--   Without @-threaded@ that blocks every other thread too, including+--   the one which would have given up, and nothing returns at all.+module Network.Socket.Wait (+    withReadable,+    withWritable,+    withReadableOv,+    withWritableOv,+    acceptWith,+    recvBufWith,+    recvBufFromWith,+    sendBufWith,+    sendBufToWith,+    recvBufMsgWith,+    sendBufMsgWith,+    connectWith,+    isClosedSocketError,+    isTransientAcceptError,+    isPortUnreachableError,+) where++import Control.Concurrent.STM+import qualified Control.Exception as E+import Foreign.C.Error (+    Errno (..),+    eCONNABORTED,+#if !defined(mingw32_HOST_OS)+    eCONNREFUSED,+#endif+    eHOSTDOWN,+    eHOSTUNREACH,+    eNETDOWN,+    eNETUNREACH,+    eNONET,+    eNOPROTOOPT,+    ePROTO,+ )+import GHC.IO.Exception (IOErrorType (..), ioe_errno)+import System.IO.Error (ioeGetErrorType)++import Network.Socket.Buffer+#if defined(mingw32_HOST_OS)+import Network.Socket.Cbits+import Network.Socket.Win32.Cancel+#else+import Network.Socket.STM+#endif+import Network.Socket.Flag+import Network.Socket.Imports+import Network.Socket.Syscall+import Network.Socket.Types+#if !defined(mingw32_HOST_OS)+import Network.Socket.Posix.Cmsg+#else+import Network.Socket.Win32.Cmsg+#endif++-- | Running an action once the socket is readable, unless the 'STM'+--   action fires first.  The 'STM' action is also looked at before+--   anything else, so a caller which has already given up never waits.+--   An operation which has completed wins a tie, so nothing it has+--   already received is thrown away.+--+--   __The action must be an operation on this socket which returns+--   without blocking once the socket is readable.__  The type does not+--   say so and nothing checks it.  On POSIX the action runs on the+--   calling thread after readiness and nothing interrupts it there: the+--   give-up ends the wait, not the action.  On Windows there is no+--   readiness to wait for, so the action is started at once on a thread+--   of its own and the give-up cancels it with @CancelIoEx@ on this+--   socket, which reaches nothing else -- an action blocked on anything+--   else would never end.  The cancel cannot tell the action from other+--   operations pending on the socket, so it ends those too, whichever+--   thread issued them.  The give-ups for particular operations, such as+--   'recvBufWith' and 'Network.Socket.ByteString.sendAllWith', cancel+--   their own and leave the rest alone.+--+--   __One reader at a time__ is what keeps that condition.  A second+--   thread taking the data between the readiness and the action leaves+--   the action blocking on the socket, with the give-up no longer in+--   play.+--+--   __The 'STM' action is run more than once__, so it has to be a test+--   and not something which takes what it reads: it is looked at before+--   the wait and again as part of it, and 'Network.Socket.ByteString.recvWith'+--   looks at it once more before a read which would not block.  Reading+--   a 'TVar' is what it is for.+withReadable :: Socket -> STM a -> IO b -> IO (Either a b)+withReadable s giveUp act = withReady Read False s giveUp $ const act++-- | 'withReadable' for writing: running an action once the socket is+--   writable, unless the 'STM' action fires first.  The same conditions+--   hold, with one writer at a time in place of one reader.+--+--   A send which is given up on may have sent part of its data on+--   Windows, where it is cancelled rather than never started, and the+--   socket cannot be sent on after that.  So a stream given up on in+--   the middle of a send is to be closed.+--+--   @since 3.2.12.0+withWritable :: Socket -> STM a -> IO b -> IO (Either a b)+withWritable s giveUp act = withReady Write False s giveUp $ const act++-- | 'withReadable' for an operation which takes an OVERLAPPED: on+--   Windows it is issued with one of its own and the give-up cancels it+--   alone.  'nullPtr' is passed elsewhere.+withReadableOv :: Socket -> STM a -> (Ptr () -> IO b) -> IO (Either a b)+withReadableOv = withReady Read True++-- | 'withWritable' for an operation which takes an OVERLAPPED.+withWritableOv :: Socket -> STM a -> (Ptr () -> IO b) -> IO (Either a b)+withWritableOv = withReady Write True++data Ready = Read | Write++withReady :: Ready -> Bool -> Socket -> STM a -> (Ptr () -> IO b) -> IO (Either a b)+withReady _ready _own s giveUp act = do+    -- Looking at the give-up first: on Windows 'wait' starts the+    -- operation before it looks at any STM, and on POSIX this keeps a+    -- caller which has given up off a descriptor close may have freed.+    gaveUp <- atomically $ (Just <$> giveUp) `orElse` return Nothing+    case gaveUp of+        Just a -> return $ Left a+        Nothing -> wait+  where+#if !defined(mingw32_HOST_OS)+    -- A socket which is ready already skips the IO manager, whose round+    -- trip costs several times the operation: a send usually finds room.+    wait = do+        now <- withFdSocket s $ \fd ->+            c_ready_now fd $ case _ready of+                Read -> 0+                Write -> 1+        if now /= 0 then Right <$> act nullPtr else waitIO++    waitIO = do+        (ready, cancelWait) <- case _ready of+            Read -> waitAndCancelReadSocketSTM s+            Write -> waitAndCancelWriteSocketSTM s+        ev <-+            atomically ((Left <$> giveUp) `orElse` (Right <$> ready))+                `E.finally` (cancelWait `E.catch` gone)+        either (return . Left) (const $ Right <$> act nullPtr) ev++    -- The cancel can throw, and from a finally that would replace the+    -- exception which ended the wait -- the timeout the caller is waiting+    -- to see, say.  What it reports is a registration which has already+    -- gone, and there is nothing to do about that.+    gone :: E.IOException -> IO ()+    gone _ = return ()+#else+    -- Only an operation issued with an OVERLAPPED of its own can be+    -- cancelled alone; any other cancel reaches the whole socket.+    wait+        | _own = withOverlapped waitOn+        | otherwise = waitOn nullPtr+    waitOn ov = do+        (completed, cancelAct) <- windowsViaSTM s ov (act ov)+        -- The operation wins a tie.  It has already read into the+        -- caller's buffer by then, and answering Left would throw those+        -- bytes away -- which for a stream loses them for good.+        --+        -- onException because the call runs in a thread of its own here:+        -- an asynchronous exception arriving during the wait would+        -- otherwise leave it blocked in a foreign call, holding the+        -- socket and writing into a buffer the caller has let go of.+        ev <-+            atomically ((Right <$> completed) `orElse` (Left <$> giveUp))+                `E.onException` cancelAct+        case ev of+            Right b -> return $ Right b+            Left a -> do+                cancelAct+                return $ Left a+#endif++#if !defined(mingw32_HOST_OS)+foreign import ccall unsafe "hsnet_ready_now"+    c_ready_now :: CInt -> CInt -> IO CInt+#endif++-- | 'accept' which the caller can give up on.+--+--   @since 3.2.10.0+acceptWith :: SocketAddress sa => Socket -> STM a -> IO (Either a (Socket, sa))+acceptWith s giveUp = withReadable s giveUp $ accept s++-- | 'recvBuf' which the caller can give up on.+--+--   @since 3.2.10.0+recvBufWith :: Socket -> Ptr Word8 -> Int -> STM a -> IO (Either a Int)+recvBufWith s ptr nbytes giveUp =+    withReadableOv s giveUp $ \ov -> recvBufOv ov s ptr nbytes++-- | 'recvBufFrom' which the caller can give up on.+--+--   @since 3.2.10.0+recvBufFromWith+    :: SocketAddress sa+    => Socket -> Ptr a -> Int -> STM b -> IO (Either b (Int, sa))+recvBufFromWith s ptr nbytes giveUp =+    withReadableOv s giveUp $ \ov -> recvBufFromOv ov s ptr nbytes++-- | 'sendBuf' which the caller can give up on.  See 'withWritable' for+--   what is left of the stream after giving up.+--+--   @since 3.2.12.0+sendBufWith :: Socket -> Ptr Word8 -> Int -> STM a -> IO (Either a Int)+sendBufWith s ptr nbytes giveUp =+    withWritableOv s giveUp $ \ov -> sendBufOv ov s ptr nbytes++-- | 'sendBufTo' which the caller can give up on.+--+--   @since 3.2.12.0+sendBufToWith+    :: SocketAddress sa+    => Socket -> Ptr a -> Int -> sa -> STM b -> IO (Either b Int)+sendBufToWith s ptr nbytes sa giveUp =+    withWritableOv s giveUp $ \ov -> sendBufToOv ov s ptr nbytes sa++-- | 'recvBufMsg' which the caller can give up on.+--+--   @since 3.2.12.0+recvBufMsgWith+    :: SocketAddress sa+    => Socket+    -> [(Ptr Word8, Int)]+    -> Int+    -> MsgFlag+    -> STM a+    -> IO (Either a (sa, Int, [Cmsg], MsgFlag))+recvBufMsgWith s bufsizs clen flags giveUp =+    withReadableOv s giveUp $ \ov -> recvBufMsgOv ov s bufsizs clen flags++-- | 'sendBufMsg' which the caller can give up on.+--+--   @since 3.2.12.0+sendBufMsgWith+    :: SocketAddress sa+    => Socket+    -> sa+    -> [(Ptr Word8, Int)]+    -> [Cmsg]+    -> MsgFlag+    -> STM a+    -> IO (Either a Int)+sendBufMsgWith s sa bufsizs cmsgs flags giveUp =+    withWritableOv s giveUp $ \ov -> sendBufMsgOv ov s sa bufsizs cmsgs flags++-- | 'connect' which the caller can give up on.  A socket given up on+--   may still be connecting, so it is to be closed.+--+--   @since 3.2.12.0+connectWith :: SocketAddress sa => Socket -> sa -> STM a -> IO (Either a ())+#if !defined(mingw32_HOST_OS)+connectWith s sa giveUp = do+    gaveUp <- atomically $ (Just <$> giveUp) `orElse` return Nothing+    case gaveUp of+        Just a -> return $ Left a+        Nothing -> connectWhenWritable s sa $ withWritable s giveUp+#else+connectWith s sa giveUp = withWritable s giveUp $ connect s sa+#endif++-- | Whether this is the error a socket operation gives once the socket has+--   been closed under it.+--+--   A caller which stops when it is told also stops when the socket it was+--   waiting on goes away, and this is how that arrives.  It is not an+--   error to report: closing the socket is how a server was stopped+--   before there was anything to tell it, and callers which do that are+--   still out there.+--+--   @since 3.2.10.0+isClosedSocketError :: E.IOException -> Bool+isClosedSocketError e = ioeGetErrorType e == InvalidArgument || isWinsock e+  where+#if defined(mingw32_HOST_OS)+    -- closesocket gives WSAEINTR to a call already blocked on the socket+    -- and WSAENOTSOCK to one which starts afterwards.+    isWinsock x = ioe_errno x `elem` map Just [wsaEINTR, wsaENOTSOCK]+#else+    isWinsock _ = False+#endif++-- | Whether an exception from 'accept' is about the connection it was+--   accepting rather than about the listening socket.+--+--   The peer may reset the connection before it is accepted+--   (@ECONNABORTED@), and Linux reports a new socket's already-pending+--   network errors through @accept()@ as well; accept(2) asks for all of+--   these to be retried, like @EAGAIN@.  The connection has left the queue+--   by then, so a retry blocks for a new one rather than spinning on the+--   same failure.+--+--   Two which are not here:+--+--   * Running out of descriptors (@EMFILE@, @ENFILE@) is about the process,+--     not about one connection, and retrying at once spins: the listening+--     socket stays readable.  'System.IO.Error.isFullError' names it, and a+--     caller which retries it should wait first.+--+--   * @EOPNOTSUPP@ is on accept(2)'s list and is left off this one on+--     purpose: it is also what a listening socket which is not+--     'Network.Socket.Stream' answers, which is permanent, and a retry+--     would spin on it forever.+--+--   Winsock numbers its errors apart from @errno@, so on Windows a list+--   of its own is read as well.  @WSAEINTR@ is not on it: there it is+--   what @closesocket@ gives a blocked call, which 'isClosedSocketError'+--   takes.  @WSAENOBUFS@ is left off for the reason @EMFILE@ is.+--+--   @since 3.2.10.0+isTransientAcceptError :: E.IOException -> Bool+isTransientAcceptError e =+    ioeGetErrorType e == Interrupted || any is errnos || isWinsock e+  where+    -- An errno the platform does not have is Errno (-1), which would+    -- otherwise match every error carrying that.+    is (Errno n) = n /= -1 && ioe_errno e == Just n+    errnos =+        [ eCONNABORTED+        , eHOSTDOWN+        , eHOSTUNREACH+        , eNETDOWN+        , eNETUNREACH+        , eNONET+        , eNOPROTOOPT+        , ePROTO+        ]+#if defined(mingw32_HOST_OS)+    isWinsock x = ioe_errno x `elem` map Just codes+    codes =+        [ wsaECONNABORTED+        , wsaECONNRESET+        , wsaEHOSTDOWN+        , wsaEHOSTUNREACH+        , wsaENETDOWN+        , wsaENETRESET+        , wsaENETUNREACH+        , wsaENOPROTOOPT+        ]+#else+    isWinsock _ = False+#endif++-- | Whether a receive on a connected datagram socket failed because an+--   earlier send of its own came back as an ICMP port unreachable.+--+--   POSIX gives it as @ECONNREFUSED@ and Winsock as @WSAECONNRESET@, so+--   the error type differs (@NoSuchThing@ and @OtherError@); this reads+--   the code instead.  Only a connected socket hears it on any platform.+--+--   @since 3.2.12.0+isPortUnreachableError :: E.IOException -> Bool+isPortUnreachableError e = ioe_errno e == Just code+  where+#if defined(mingw32_HOST_OS)+    code = wsaECONNRESET+#else+    Errno code = eCONNREFUSED+#endif
+ Network/Socket/Win32/Cancel.hs view
@@ -0,0 +1,128 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE LambdaCase #-}++#include "HsNetDef.h"++-- | Giving up on an operation on a socket, on Windows.+--+--   There is no readiness to wait for here -- completion ports report+--   that an operation has finished, not that one could be started -- so+--   the operation is run on a thread of its own and ended with+--   @CancelIoEx@.  Nothing else would end it: an asynchronous exception+--   does not reach a thread blocked in a socket call on Windows.+--+--   __These need the threaded runtime.__  The operation blocks in a+--   foreign call, which without @-threaded@ stops every other thread,+--   including the one which would cancel it.+module Network.Socket.Win32.Cancel (+    windowsViaSTM,+    windowsCancelPendingIo,+    withOverlapped,+) where++import Control.Concurrent (forkIO)+import Control.Concurrent.STM+import qualified Control.Exception as E+import Foreign.Marshal.Alloc (allocaBytes)+import System.IO.Unsafe (unsafePerformIO)+import System.IO (hPutStrLn, stderr)++import Network.Socket.Imports+import Network.Socket.Types++-- | Running a blocking operation on the socket in a thread of its own+--   and handing its result over through STM, together with an action+--   cancelling it.  If the operation fails, the 'STM' action rethrows+--   the exception.+--+--   Cancelling waits for the operation to end, so a buffer it reads+--   into has to stay alive until either the 'STM' action completes or+--   the cancel returns.+--+--   The cancel reaches the operation issued with the given OVERLAPPED+--   (see 'withOverlapped') and nothing else.  With 'nullPtr' it reaches+--   every operation pending on the socket, whichever thread issued it.+windowsViaSTM :: Socket -> Ptr () -> IO a -> IO (STM a, IO ())+windowsViaSTM s ov act = do+    var <- newTVarIO Nothing+    -- Masked so that the var is written whatever happens: a thread+    -- which died between the call returning and the write would leave+    -- the waiter retrying and the cancel below looping for ever.  The+    -- call itself is a foreign one, which no exception reaches anyway.+    tid <- forkIO $ E.mask_ $ E.try act >>= atomically . writeTVar var . Just+    let wait =+            readTVar var >>= \case+                Nothing -> retry+                Just (Left e) -> throwSTM (e :: E.SomeException)+                Just (Right x) -> return x+        ended = isJust <$> readTVar var+    return (wait, cancel s ended tid)+  where+    -- An asynchronous exception does not reach a thread blocked in a+    -- socket call here, so the call itself is cancelled.  CancelIoEx+    -- reaches an operation which is already in the kernel, and a call+    -- which has not got there yet is caught by trying again.  The+    -- socket is never shut down to end the call: the caller is entitled+    -- to keep using it, and a shutdown would take that away.+    --+    -- Uninterruptible because this must not be abandoned: the operation+    -- is still writing into the caller's buffer until it ends, and+    -- nothing but the end of it stops the loop.+    cancel sock ended _tid = E.uninterruptibleMask_ $ loop sayAfter+      where+        loop n = do+            void $ withFdSocket sock $ \fd -> c_CancelIoEx fd ov+            over <- endedWithin 1000+            unless over $ do+                when (n == 1) say+                loop (n - 1)+        -- Wait for the call to end rather than sleep through it:+        -- CancelIoEx usually works at once, and a sleep here costs a+        -- whole timer tick, which Windows measures in tens of ms.+        endedWithin us = do+            late <- registerDelay us+            atomically $+                (True <$ (check =<< ended))+                    `orElse` (False <$ (check =<< readTVar late))+    -- Rounds before saying something and carrying on.  A round which+    -- cancels nothing costs a timer tick, which Windows measures in tens+    -- of milliseconds, so this is seconds rather than the hundredth of a+    -- second it reads as.  Two rounds is the most ever measured.+    sayAfter :: Int+    sayAfter = 100+    -- Said from a thread of its own, and its failure ignored.  This is+    -- the path which has to finish before the caller's buffer can go,+    -- and writing to stderr can block on the handle's lock or on a pipe+    -- nobody is draining -- for ever, inside the mask above.+    say = void $ forkIO $ void (E.try warn :: IO (Either E.SomeException ()))+    warn =+        hPutStrLn stderr $+            "network: a socket operation given up on is not cancelling; "+                ++ "still trying.  Please report this."++-- | Cancelling whatever operation is pending on the socket, while+--   leaving the socket itself usable: unlike 'Network.Socket.shutdown'+--   this does not shut it down.  An operation which has not reached the+--   kernel yet is not cancelled, so the caller has to be ready to try+--   again.+windowsCancelPendingIo :: Socket -> IO ()+windowsCancelPendingIo s = void $ withFdSocket s $ \fd -> c_CancelIoEx fd nullPtr++-- | Running an action with an OVERLAPPED of its own, to issue an+--   operation which 'windowsViaSTM' can then cancel alone.  It stays+--   alive until the action returns, so the operation must end first.+withOverlapped :: (Ptr () -> IO a) -> IO a+withOverlapped = allocaBytes overlappedSize++overlappedSize :: Int+overlappedSize = fromIntegral $ unsafePerformIO c_ovl_size+{-# NOINLINE overlappedSize #-}++foreign import ccall unsafe "hsnet_ovl_size"+  c_ovl_size :: IO CInt++-- BOOL CancelIoEx(HANDLE hFile, LPOVERLAPPED lpOverlapped)+-- A SOCKET is a kernel HANDLE.  A NULL lpOverlapped cancels all+-- pending I/O on the handle, whichever thread issued it.+foreign import CALLCONV unsafe "CancelIoEx"+  c_CancelIoEx :: CInt -> Ptr () -> IO CInt
Network/Socket/Win32/Cmsg.hsc view
@@ -1,7 +1,8 @@- {-# LANGUAGE AllowAmbiguousTypes #-} {-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -27,16 +28,16 @@  -- | Control message (ancillary data) including a pair of level and type. data Cmsg = Cmsg {-    cmsgId   :: !CmsgId-  , cmsgData :: !ByteString+    cmsgId   :: CmsgId+  , cmsgData :: ByteString   } deriving (Eq, Show)  ----------------------------------------------------------------  -- | Identifier of control message (ancillary data). data CmsgId = CmsgId {-    cmsgLevel :: !CInt-  , cmsgType  :: !CInt+    cmsgLevel :: CInt+  , cmsgType  :: CInt   } deriving (Eq)  -- | Unsupported identifier@@ -70,8 +71,8 @@ -- | Control message ID for POSIX file-descriptor passing. -- --  Not supported on Windows; use WSADuplicateSocket instead-pattern CmsgIdFd :: CmsgId-pattern CmsgIdFd = CmsgId (-1) (-1)+pattern CmsgIdFds :: CmsgId+pattern CmsgIdFds = CmsgId (-1) (-1)  ---------------------------------------------------------------- @@ -91,11 +92,13 @@ ----------------------------------------------------------------  -- | A class to encode and decode control message.-class Storable a => ControlMessage a where+class ControlMessage a where     controlMessageId :: CmsgId+    encodeCmsg :: a -> Cmsg+    decodeCmsg :: Cmsg -> Maybe a -encodeCmsg :: forall a. ControlMessage a => a -> Cmsg-encodeCmsg x = unsafeDupablePerformIO $ do+encodeStorableCmsg :: forall a. (ControlMessage a, Storable a) => a -> Cmsg+encodeStorableCmsg x = unsafeDupablePerformIO $ do     bs <- create siz $ \p0 -> do         let p = castPtr p0         poke p x@@ -104,8 +107,8 @@   where     siz = sizeOf x -decodeCmsg :: forall a . (ControlMessage a, Storable a) => Cmsg -> Maybe a-decodeCmsg (Cmsg cmsid (PS fptr off len))+decodeStorableCmsg :: forall a . (ControlMessage a, Storable a) => Cmsg -> Maybe a+decodeStorableCmsg (Cmsg cmsid (PS fptr off len))   | cid /= cmsid = Nothing   | len < siz    = Nothing   | otherwise = unsafeDupablePerformIO $ withForeignPtr fptr $ \p0 -> do@@ -122,6 +125,8 @@  instance ControlMessage IPv4TTL where     controlMessageId = CmsgIdIPv4TTL+    decodeCmsg = decodeStorableCmsg+    encodeCmsg = encodeStorableCmsg  ---------------------------------------------------------------- @@ -130,6 +135,8 @@  instance ControlMessage IPv6HopLimit where     controlMessageId = CmsgIdIPv6HopLimit+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  ---------------------------------------------------------------- @@ -138,6 +145,8 @@  instance ControlMessage IPv4TOS where     controlMessageId = CmsgIdIPv4TOS+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  ---------------------------------------------------------------- @@ -146,6 +155,8 @@  instance ControlMessage IPv6TClass where     controlMessageId = CmsgIdIPv6TClass+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  ---------------------------------------------------------------- @@ -158,10 +169,12 @@  instance ControlMessage IPv4PktInfo where     controlMessageId = CmsgIdIPv4PktInfo+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg  instance Storable IPv4PktInfo where-    sizeOf    _ = #{size IN_PKTINFO}-    alignment _ = #alignment IN_PKTINFO+    sizeOf    ~_ = #{size IN_PKTINFO}+    alignment ~_ = #alignment IN_PKTINFO     poke p (IPv4PktInfo n _ ha) = do         (#poke IN_PKTINFO, ipi_ifindex)  p (fromIntegral n :: CInt)         (#poke IN_PKTINFO, ipi_addr)     p ha@@ -180,10 +193,12 @@  instance ControlMessage IPv6PktInfo where     controlMessageId = CmsgIdIPv6PktInfo+    decodeCmsg = decodeStorableCmsg+    encodeCmsg = encodeStorableCmsg  instance Storable IPv6PktInfo where-    sizeOf    _ = #{size IN6_PKTINFO}-    alignment _ = #alignment IN6_PKTINFO+    sizeOf    ~_ = #{size IN6_PKTINFO}+    alignment ~_ = #alignment IN6_PKTINFO     poke p (IPv6PktInfo n ha6) = do         (#poke IN6_PKTINFO, ipi6_ifindex) p (fromIntegral n :: CInt)         (#poke IN6_PKTINFO, ipi6_addr)    p (In6Addr ha6)@@ -192,9 +207,15 @@         n :: ULONG  <- (#peek IN6_PKTINFO, ipi6_ifindex) p         return $ IPv6PktInfo (fromIntegral n) ha6 -instance ControlMessage Fd where-    controlMessageId = CmsgIdFd+---------------------------------------------------------------- +instance ControlMessage [Fd] where+    controlMessageId = CmsgIdFds+    encodeCmsg = \_ -> Cmsg CmsgIdFds ""+    decodeCmsg = \_ -> Just []++----------------------------------------------------------------+ cmsgIdBijection :: Bijection CmsgId String cmsgIdBijection =     [ (UnsupportedCmsgId, "UnsupportedCmsgId")@@ -204,7 +225,7 @@     , (CmsgIdIPv6TClass, "CmsgIdIPv6TClass")     , (CmsgIdIPv4PktInfo, "CmsgIdIPv4PktInfo")     , (CmsgIdIPv6PktInfo, "CmsgIdIPv6PktInfo")-    , (CmsgIdFd, "CmsgIdFd")+    , (CmsgIdFds, "CmsgIdFds")     ]  instance Show CmsgId where
Network/Socket/Win32/CmsgHdr.hsc view
@@ -19,14 +19,14 @@ import Network.Socket.Types  data CmsgHdr = CmsgHdr {-    cmsgHdrLen   :: !CUInt-  , cmsgHdrLevel :: !CInt-  , cmsgHdrType  :: !CInt+    cmsgHdrLen   :: CUInt+  , cmsgHdrLevel :: CInt+  , cmsgHdrType  :: CInt   } deriving (Eq, Show)  instance Storable CmsgHdr where-  sizeOf    _ = #{size WSACMSGHDR}-  alignment _ = #alignment WSACMSGHDR+  sizeOf    ~_ = #{size WSACMSGHDR}+  alignment ~_ = #alignment WSACMSGHDR    peek p = do     len <- (#peek WSACMSGHDR, cmsg_len)   p
+ Network/Socket/Win32/HostName.hsc view
@@ -0,0 +1,39 @@+{-# LANGUAGE CPP #-}++#include "HsNet.h"+##include "HsNetDef.h"++module Network.Socket.Win32.HostName (+    getHostName,+)+where++import Foreign.C.Types+import Foreign.Marshal.Utils+import Foreign.Ptr+import Foreign.Storable+import Network.Socket.Info (HostName)+import System.Win32.Types++foreign import CALLCONV unsafe "windows.h GetComputerNameExW"+    getComputerNameEx :: COMPUTER_NAME_FORMAT -> LPTSTR -> LPDWORD -> IO BOOL++type COMPUTER_NAME_FORMAT = CInt++computerNamePhysicalDnsHostname :: COMPUTER_NAME_FORMAT+computerNamePhysicalDnsHostname = 5++-- | Get name of current host+--+--   Since: 3.3.0.0+getHostName :: IO HostName+getHostName = with 0 $ \p_charcount -> do+    -- On the first run, determine the character count and ignore any error we get+    _ <- getComputerNameEx computerNamePhysicalDnsHostname nullPtr p_charcount+    charcount <- peek p_charcount++    -- The second time around, use the correct character count to retrieve the data+    withTString (replicate (fromIntegral charcount) ' ') $ \name -> do+        failIfFalse_ "GetComputerNameExW" $+            getComputerNameEx computerNamePhysicalDnsHostname name p_charcount+        peekTString name
Network/Socket/Win32/MsgHdr.hsc view
@@ -18,18 +18,18 @@ -- The size of BufferLen is different on pre-vista compilers. -- But since those platforms are out of support anyway we ignore that. data MsgHdr sa = MsgHdr-    { msgName      :: !(Ptr sa)-    , msgNameLen   :: !CInt-    , msgBuffer    :: !(Ptr WSABuf)-    , msgBufferLen :: !DWORD-    , msgCtrl      :: !(Ptr Word8)-    , msgCtrlLen   :: !ULONG-    , msgFlags     :: !DWORD+    { msgName      :: Ptr sa+    , msgNameLen   :: CInt+    , msgBuffer    :: Ptr WSABuf+    , msgBufferLen :: DWORD+    , msgCtrl      :: Ptr Word8+    , msgCtrlLen   :: ULONG+    , msgFlags     :: DWORD     } deriving Show  instance Storable (MsgHdr sa) where-  sizeOf    _ = #{size WSAMSG}-  alignment _ = #alignment WSAMSG+  sizeOf    ~_ = #{size WSAMSG}+  alignment ~_ = #alignment WSAMSG    peek p = do     name       <- (#peek WSAMSG, name)          p
Network/Socket/Win32/WSABuf.hsc view
@@ -15,13 +15,13 @@ type ULONG = Word32  data WSABuf = WSABuf-    { wsaBufPtr :: !(Ptr Word8)-    , wsaBufLen :: !ULONG+    { wsaBufPtr :: Ptr Word8+    , wsaBufLen :: ULONG     }  instance Storable WSABuf where-  sizeOf    _ = #{size WSABUF}-  alignment _ = #alignment WSABUF+  sizeOf    ~_ = #{size WSABUF}+  alignment ~_ = #alignment WSABUF    peek p = do     base <- (#peek WSABUF, buf) p
README.md view
@@ -10,7 +10,6 @@  The `network` package support [3 major versions of GHC](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/intro.html#ghc-version-numbering-policy) only. This means that the current stable version and two previous stable versions are supported.-However, all GHC 8.x are supported currently.  ### Windows @@ -44,31 +43,3 @@ ``` ##include "HsNetDef.h" ```--## Milestones--### 2.6--- [x] Making `SockAddrCan` deprecated--### 2.7--See https://github.com/haskell/network/issues/296--- [x] Making `Network` deprecated-- [x] Making `Network.BSD` deprecated-- [x] Making `MkSocket` deprecated-- [x] Making many APIs deprecated--### 2.8--- [x] Stop exporting the `PortNum` Constructor in `PortNumber`--### 3.0--- [x] Removing `Network`-- [x] Removing `Network.BSD`-- [x] Removing `SockAddrCan`-- [x] Changing the internal structure of `Socket`.-- [x] Make address extensible.-- [x] Remove EOF errors
+ cbits/overlapped.c view
@@ -0,0 +1,164 @@+/* Socket operations with an OVERLAPPED of the caller's, waited for here, so+   that CancelIoEx(s, ov) cancels this one alone.  Each answers like the+   call it wraps, leaving the error for WSAGetLastError. */++#include <string.h>+#include "HsNet.h"++int+hsnet_ovl_size(void)+{+    return sizeof(OVERLAPPED);+}++/* The low bit of hEvent keeps the completion off a completion port the+   socket may be associated with. */+static int+ovl_begin(LPOVERLAPPED ov, HANDLE *ev)+{+    memset(ov, 0, sizeof(*ov));+    *ev = CreateEventW(NULL, TRUE, FALSE, NULL);+    if (*ev == NULL) {+        WSASetLastError(GetLastError());+        return SOCKET_ERROR;+    }+    ov->hEvent = (HANDLE)((ULONG_PTR)*ev | 1);+    return 0;+}++/* r is what the call answered.  A pending operation is waited for, and+   then *n and *flags are what it completed with. */+static int+ovl_end(SOCKET s, LPOVERLAPPED ov, HANDLE ev, int r,+        DWORD *n, DWORD *flags, int *waited)+{+    int err = 0;+    *waited = 0;+    if (r == SOCKET_ERROR) {+        err = WSAGetLastError();+        if (err == WSA_IO_PENDING) {+            err = 0;+            *waited = 1;+            if (!WSAGetOverlappedResult(s, ov, n, TRUE, flags))+                err = WSAGetLastError();+        }+    }+    CloseHandle(ev);+    if (err != 0) {+        WSASetLastError(err);+        return SOCKET_ERROR;+    }+    return 0;+}++int+hsnet_ovl_recv(SOCKET s, char *buf, int len, LPOVERLAPPED ov)+{+    WSABUF b;+    DWORD n = 0, flags = 0;+    HANDLE ev;+    int r, waited;+    if (ovl_begin(ov, &ev) != 0) return SOCKET_ERROR;+    b.buf = buf;+    b.len = len;+    r = WSARecv(s, &b, 1, &n, &flags, ov, NULL);+    if (ovl_end(s, ov, ev, r, &n, &flags, &waited) != 0) return SOCKET_ERROR;+    return (int)n;+}++int+hsnet_ovl_recvfrom(SOCKET s, char *buf, int len,+                   struct sockaddr *from, int *fromlen, LPOVERLAPPED ov)+{+    WSABUF b;+    DWORD n = 0, flags = 0;+    HANDLE ev;+    int r, waited;+    if (ovl_begin(ov, &ev) != 0) return SOCKET_ERROR;+    b.buf = buf;+    b.len = len;+    r = WSARecvFrom(s, &b, 1, &n, &flags, from, fromlen, ov, NULL);+    if (ovl_end(s, ov, ev, r, &n, &flags, &waited) != 0) return SOCKET_ERROR;+    return (int)n;+}++int+hsnet_ovl_send(SOCKET s, char *buf, int len, LPOVERLAPPED ov)+{+    WSABUF b;+    DWORD n = 0, flags = 0;+    HANDLE ev;+    int r, waited;+    if (ovl_begin(ov, &ev) != 0) return SOCKET_ERROR;+    b.buf = buf;+    b.len = len;+    r = WSASend(s, &b, 1, &n, 0, ov, NULL);+    if (ovl_end(s, ov, ev, r, &n, &flags, &waited) != 0) return SOCKET_ERROR;+    return (int)n;+}++int+hsnet_ovl_sendv(SOCKET s, LPWSABUF bufs, DWORD count, LPOVERLAPPED ov)+{+    DWORD n = 0, flags = 0;+    HANDLE ev;+    int r, waited;+    if (ovl_begin(ov, &ev) != 0) return SOCKET_ERROR;+    r = WSASend(s, bufs, count, &n, 0, ov, NULL);+    if (ovl_end(s, ov, ev, r, &n, &flags, &waited) != 0) return SOCKET_ERROR;+    return (int)n;+}++int+hsnet_ovl_sendto(SOCKET s, char *buf, int len,+                 const struct sockaddr *to, int tolen, LPOVERLAPPED ov)+{+    WSABUF b;+    DWORD n = 0, flags = 0;+    HANDLE ev;+    int r, waited;+    if (ovl_begin(ov, &ev) != 0) return SOCKET_ERROR;+    b.buf = buf;+    b.len = len;+    r = WSASendTo(s, &b, 1, &n, 0, to, tolen, ov, NULL);+    if (ovl_end(s, ov, ev, r, &n, &flags, &waited) != 0) return SOCKET_ERROR;+    return (int)n;+}++/* Answers 0 and puts the bytes sent in *sent, as WSASendMsg does. */+int+hsnet_ovl_sendmsg(SOCKET s, LPWSAMSG msg, DWORD flags, LPDWORD sent,+                  LPOVERLAPPED ov)+{+    DWORD oflags = 0;+    HANDLE ev;+    int r, waited;+    *sent = 0;+    if (ovl_begin(ov, &ev) != 0) return SOCKET_ERROR;+    r = WSASendMsg(s, msg, flags, sent, ov, NULL);+    return ovl_end(s, ov, ev, r, sent, &oflags, &waited);+}++/* Answers 0 and puts the bytes received in *got, as WSARecvMsg does,+   and SOCKET_ERROR with WSAEMSGSIZE for a message cut short. */+int+hsnet_ovl_recvmsg(SOCKET s, LPWSAMSG msg, LPDWORD got, LPOVERLAPPED ov)+{+    DWORD flags = 0;+    HANDLE ev;+    int r, waited;+    *got = 0;+    if (ovl_begin(ov, &ev) != 0) return SOCKET_ERROR;+    r = WSARecvMsg(s, msg, got, ov, NULL);+    r = ovl_end(s, ov, ev, r, got, &flags, &waited);+    if (waited) {+        /* Completed later: the flags come from here, not from msg. */+        msg->dwFlags = flags;+        if (r == SOCKET_ERROR && WSAGetLastError() == WSAEMSGSIZE) {+            msg->dwFlags |= MSG_TRUNC;+            msg->Control.len = 0;+            msg->Control.buf = NULL;+        }+    }+    return r;+}
config.guess view
@@ -1,14 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name.-#   Copyright 1992-2021 Free Software Foundation, Inc.+#   Copyright 1992-2024 Free Software Foundation, Inc.  # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2021-06-03'+timestamp='2024-01-01'  # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by-# the Free Software Foundation; either version 3 of the License, or+# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but@@ -47,7 +47,7 @@ usage="\ Usage: $0 [OPTION] -Output the configuration name of the system \`$me' is run on.+Output the configuration name of the system '$me' is run on.  Options:   -h, --help         print this help, then exit@@ -60,13 +60,13 @@ GNU config.guess ($timestamp)  Originally written by Per Bothner.-Copyright 1992-2021 Free Software Foundation, Inc.+Copyright 1992-2024 Free Software Foundation, Inc.  This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."  help="-Try \`$me --help' for more information."+Try '$me --help' for more information."  # Parse command line while test $# -gt 0 ; do@@ -102,8 +102,8 @@ # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. -# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still-# use `HOST_CC' if defined, but it is deprecated.+# Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still+# use 'HOST_CC' if defined, but it is deprecated.  # Portable tmp directory creation inspired by the Autoconf team. @@ -155,6 +155,9 @@  	set_cc_for_build 	cat <<-EOF > "$dummy.c"+	#if defined(__ANDROID__)+	LIBC=android+	#else 	#include <features.h> 	#if defined(__UCLIBC__) 	LIBC=uclibc@@ -162,6 +165,8 @@ 	LIBC=dietlibc 	#elif defined(__GLIBC__) 	LIBC=gnu+	#elif defined(__LLVM_LIBC__)+	LIBC=llvm 	#else 	#include <stdarg.h> 	/* First heuristic to detect musl libc.  */@@ -169,6 +174,7 @@ 	LIBC=musl 	#endif 	#endif+	#endif 	EOF 	cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` 	eval "$cc_set_libc"@@ -437,7 +443,7 @@ 	# This test works for both compilers. 	if test "$CC_FOR_BUILD" != no_compiler_found; then 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \-		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \+		(CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ 		grep IS_64BIT_ARCH >/dev/null 	    then 		SUN_ARCH=x86_64@@ -459,7 +465,7 @@ 		UNAME_RELEASE=`uname -v` 		;; 	esac-	# Japanese Language versions have a version number like `4.1.3-JL'.+	# Japanese Language versions have a version number like '4.1.3-JL'. 	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` 	GUESS=sparc-sun-sunos$SUN_REL 	;;@@ -904,7 +910,7 @@ 	fi 	;;     *:FreeBSD:*:*)-	UNAME_PROCESSOR=`/usr/bin/uname -p`+	UNAME_PROCESSOR=`uname -p` 	case $UNAME_PROCESSOR in 	    amd64) 		UNAME_PROCESSOR=x86_64 ;;@@ -929,6 +935,9 @@     i*:PW*:*) 	GUESS=$UNAME_MACHINE-pc-pw32 	;;+    *:SerenityOS:*:*)+        GUESS=$UNAME_MACHINE-pc-serenity+        ;;     *:Interix*:*) 	case $UNAME_MACHINE in 	    x86)@@ -963,11 +972,37 @@ 	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` 	GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC 	;;+    x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*)+	GUESS="$UNAME_MACHINE-pc-managarm-mlibc"+	;;+    *:[Mm]anagarm:*:*)+	GUESS="$UNAME_MACHINE-unknown-managarm-mlibc"+	;;     *:Minix:*:*) 	GUESS=$UNAME_MACHINE-unknown-minix 	;;     aarch64:Linux:*:*)-	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	set_cc_for_build+	CPU=$UNAME_MACHINE+	LIBCABI=$LIBC+	if test "$CC_FOR_BUILD" != no_compiler_found; then+	    ABI=64+	    sed 's/^	    //' << EOF > "$dummy.c"+	    #ifdef __ARM_EABI__+	    #ifdef __ARM_PCS_VFP+	    ABI=eabihf+	    #else+	    ABI=eabi+	    #endif+	    #endif+EOF+	    cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`+	    eval "$cc_set_abi"+	    case $ABI in+		eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;;+	    esac+	fi+	GUESS=$CPU-unknown-linux-$LIBCABI 	;;     aarch64_be:Linux:*:*) 	UNAME_MACHINE=aarch64_be@@ -1033,9 +1068,18 @@     k1om:Linux:*:*) 	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC 	;;-    loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)+    kvx:Linux:*:*) 	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC 	;;+    kvx:cos:*:*)+	GUESS=$UNAME_MACHINE-unknown-cos+	;;+    kvx:mbr:*:*)+	GUESS=$UNAME_MACHINE-unknown-mbr+	;;+    loongarch32:Linux:*:* | loongarch64:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;     m32r*:Linux:*:*) 	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC 	;;@@ -1148,16 +1192,27 @@ 	;;     x86_64:Linux:*:*) 	set_cc_for_build+	CPU=$UNAME_MACHINE 	LIBCABI=$LIBC 	if test "$CC_FOR_BUILD" != no_compiler_found; then-	    if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \-		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \-		grep IS_X32 >/dev/null-	    then-		LIBCABI=${LIBC}x32-	    fi+	    ABI=64+	    sed 's/^	    //' << EOF > "$dummy.c"+	    #ifdef __i386__+	    ABI=x86+	    #else+	    #ifdef __ILP32__+	    ABI=x32+	    #endif+	    #endif+EOF+	    cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'`+	    eval "$cc_set_abi"+	    case $ABI in+		x86) CPU=i686 ;;+		x32) LIBCABI=${LIBC}x32 ;;+	    esac 	fi-	GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI+	GUESS=$CPU-pc-linux-$LIBCABI 	;;     xtensa*:Linux:*:*) 	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC@@ -1177,7 +1232,7 @@ 	GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION 	;;     i*86:OS/2:*:*)-	# If we were able to find `uname', then EMX Unix compatibility+	# If we were able to find 'uname', then EMX Unix compatibility 	# is probably installed. 	GUESS=$UNAME_MACHINE-pc-os2-emx 	;;@@ -1318,7 +1373,7 @@ 		GUESS=ns32k-sni-sysv 	fi 	;;-    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort+    PENTIUM:*:4.0*:*)	# Unisys 'ClearPath HMP IX 4000' SVR4/MP effort 			# says <Richard.M.Bartel@ccMail.Census.GOV> 	GUESS=i586-unisys-sysv4 	;;@@ -1364,9 +1419,12 @@     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible. 	GUESS=i586-pc-haiku 	;;-    x86_64:Haiku:*:*)-	GUESS=x86_64-unknown-haiku+    ppc:Haiku:*:*)	# Haiku running on Apple PowerPC+	GUESS=powerpc-apple-haiku 	;;+    *:Haiku:*:*)	# Haiku modern gcc (not bound by BeOS compat)+	GUESS=$UNAME_MACHINE-unknown-haiku+	;;     SX-4:SUPER-UX:*:*) 	GUESS=sx4-nec-superux$UNAME_RELEASE 	;;@@ -1522,6 +1580,9 @@     i*86:rdos:*:*) 	GUESS=$UNAME_MACHINE-pc-rdos 	;;+    i*86:Fiwix:*:*)+	GUESS=$UNAME_MACHINE-pc-fiwix+	;;     *:AROS:*:*) 	GUESS=$UNAME_MACHINE-unknown-aros 	;;@@ -1533,6 +1594,9 @@ 	;;     *:Unleashed:*:*) 	GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE+	;;+    *:Ironclad:*:*)+	GUESS=$UNAME_MACHINE-unknown-ironclad 	;; esac 
config.sub view
@@ -1,14 +1,14 @@ #! /bin/sh # Configuration validation subroutine script.-#   Copyright 1992-2021 Free Software Foundation, Inc.+#   Copyright 1992-2024 Free Software Foundation, Inc.  # shellcheck disable=SC2006,SC2268 # see below for rationale -timestamp='2021-08-14'+timestamp='2024-01-01'  # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by-# the Free Software Foundation; either version 3 of the License, or+# the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but@@ -76,13 +76,13 @@ version="\ GNU config.sub ($timestamp) -Copyright 1992-2021 Free Software Foundation, Inc.+Copyright 1992-2024 Free Software Foundation, Inc.  This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."  help="-Try \`$me --help' for more information."+Try '$me --help' for more information."  # Parse command line while test $# -gt 0 ; do@@ -130,7 +130,7 @@ # Separate into logical components for further validation case $1 in 	*-*-*-*-*)-		echo Invalid configuration \`"$1"\': more than four components >&2+		echo "Invalid configuration '$1': more than four components" >&2 		exit 1 		;; 	*-*-*-*)@@ -145,7 +145,8 @@ 			nto-qnx* | linux-* | uclinux-uclibc* \ 			| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ 			| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \-			| storm-chaos* | os2-emx* | rtmk-nova*)+			| storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \+			| windows-* ) 				basic_machine=$field1 				basic_os=$maybe_os 				;;@@ -943,7 +944,7 @@ EOF 		IFS=$saved_IFS 		;;-	# We use `pc' rather than `unknown'+	# We use 'pc' rather than 'unknown' 	# because (1) that's what they normally are, and 	# (2) the word "unknown" tends to confuse beginning users. 	i*86 | x86_64)@@ -1020,6 +1021,11 @@ 		;;  	# Here we normalize CPU types with a missing or matching vendor+	armh-unknown | armh-alt)+		cpu=armv7l+		vendor=alt+		basic_os=${basic_os:-linux-gnueabihf}+		;; 	dpx20-unknown | dpx20-bull) 		cpu=rs6000 		vendor=bull@@ -1070,7 +1076,7 @@ 	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) 		cpu=i586 		;;-	pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)+	pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*) 		cpu=i686 		;; 	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)@@ -1121,7 +1127,7 @@ 	xscale-* | xscalee[bl]-*) 		cpu=`echo "$cpu" | sed 's/^xscale/arm/'` 		;;-	arm64-*)+	arm64-* | aarch64le-*) 		cpu=aarch64 		;; @@ -1175,7 +1181,7 @@ 		case $cpu in 			1750a | 580 \ 			| a29k \-			| aarch64 | aarch64_be \+			| aarch64 | aarch64_be | aarch64c | arm64ec \ 			| abacus \ 			| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ 			| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \@@ -1194,51 +1200,29 @@ 			| d10v | d30v | dlx | dsp16xx \ 			| e2k | elxsi | epiphany \ 			| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \+			| javascript \ 			| h8300 | h8500 \ 			| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ 			| hexagon \ 			| i370 | i*86 | i860 | i960 | ia16 | ia64 \ 			| ip2k | iq2000 \-            | js \ 			| k1om \+			| kvx \ 			| le32 | le64 \ 			| lm32 \-			| loongarch32 | loongarch64 | loongarchx32 \+			| loongarch32 | loongarch64 \ 			| m32c | m32r | m32rle \ 			| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ 			| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ 			| m88110 | m88k | maxq | mb | mcore | mep | metag \ 			| microblaze | microblazeel \-			| mips | mipsbe | mipseb | mipsel | mipsle \-			| mips16 \-			| mips64 | mips64eb | mips64el \-			| mips64octeon | mips64octeonel \-			| mips64orion | mips64orionel \-			| mips64r5900 | mips64r5900el \-			| mips64vr | mips64vrel \-			| mips64vr4100 | mips64vr4100el \-			| mips64vr4300 | mips64vr4300el \-			| mips64vr5000 | mips64vr5000el \-			| mips64vr5900 | mips64vr5900el \-			| mipsisa32 | mipsisa32el \-			| mipsisa32r2 | mipsisa32r2el \-			| mipsisa32r3 | mipsisa32r3el \-			| mipsisa32r5 | mipsisa32r5el \-			| mipsisa32r6 | mipsisa32r6el \-			| mipsisa64 | mipsisa64el \-			| mipsisa64r2 | mipsisa64r2el \-			| mipsisa64r3 | mipsisa64r3el \-			| mipsisa64r5 | mipsisa64r5el \-			| mipsisa64r6 | mipsisa64r6el \-			| mipsisa64sb1 | mipsisa64sb1el \-			| mipsisa64sr71k | mipsisa64sr71kel \-			| mipsr5900 | mipsr5900el \-			| mipstx39 | mipstx39el \+			| mips* \ 			| mmix \ 			| mn10200 | mn10300 \ 			| moxie \ 			| mt \ 			| msp430 \+			| nanomips* \ 			| nds32 | nds32le | nds32be \ 			| nfp \ 			| nios | nios2 | nios2eb | nios2el \@@ -1270,6 +1254,7 @@ 			| ubicom32 \ 			| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ 			| vax \+			| vc4 \ 			| visium \ 			| w65 \ 			| wasm32 | wasm64 \@@ -1281,7 +1266,7 @@ 				;;  			*)-				echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2+				echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2 				exit 1 				;; 		esac@@ -1302,11 +1287,12 @@  # Decode manufacturer-specific aliases for certain operating systems. -if test x$basic_os != x+if test x"$basic_os" != x then -# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just+# First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os.+obj= case $basic_os in 	gnu/linux*) 		kernel=linux@@ -1337,6 +1323,10 @@ 		kernel=linux 		os=`echo "$basic_os" | sed -e 's|linux|gnu|'` 		;;+	managarm*)+		kernel=managarm+		os=`echo "$basic_os" | sed -e 's|managarm|mlibc|'`+		;; 	*) 		kernel= 		os=$basic_os@@ -1502,10 +1492,16 @@ 			os=eabi 			;; 		    *)-			os=elf+			os=+			obj=elf 			;; 		esac 		;;+	aout* | coff* | elf* | pe*)+		# These are machine code file formats, not OSes+		obj=$os+		os=+		;; 	*) 		# No normalization, but not necessarily accepted, that comes below. 		;;@@ -1524,12 +1520,15 @@ # system, and we'll never get to this point.  kernel=+obj= case $cpu-$vendor in 	score-*)-		os=elf+		os=+		obj=elf 		;; 	spu-*)-		os=elf+		os=+		obj=elf 		;; 	*-acorn) 		os=riscix1.2@@ -1539,28 +1538,35 @@ 		os=gnu 		;; 	arm*-semi)-		os=aout+		os=+		obj=aout 		;; 	c4x-* | tic4x-*)-		os=coff+		os=+		obj=coff 		;; 	c8051-*)-		os=elf+		os=+		obj=elf 		;; 	clipper-intergraph) 		os=clix 		;; 	hexagon-*)-		os=elf+		os=+		obj=elf 		;; 	tic54x-*)-		os=coff+		os=+		obj=coff 		;; 	tic55x-*)-		os=coff+		os=+		obj=coff 		;; 	tic6x-*)-		os=coff+		os=+		obj=coff 		;; 	# This must come before the *-dec entry. 	pdp10-*)@@ -1582,19 +1588,24 @@ 		os=sunos3 		;; 	m68*-cisco)-		os=aout+		os=+		obj=aout 		;; 	mep-*)-		os=elf+		os=+		obj=elf 		;; 	mips*-cisco)-		os=elf+		os=+		obj=elf 		;;-	mips*-*)-		os=elf+	mips*-*|nanomips*-*)+		os=+		obj=elf 		;; 	or32-*)-		os=coff+		os=+		obj=coff 		;; 	*-tti)	# must be before sparc entry or we get the wrong os. 		os=sysv3@@ -1603,7 +1614,8 @@ 		os=sunos4.1.1 		;; 	pru-*)-		os=elf+		os=+		obj=elf 		;; 	*-be) 		os=beos@@ -1684,10 +1696,12 @@ 		os=uxpv 		;; 	*-rom68k)-		os=coff+		os=+		obj=coff 		;; 	*-*bug)-		os=coff+		os=+		obj=coff 		;; 	*-apple) 		os=macos@@ -1705,10 +1719,11 @@  fi -# Now, validate our (potentially fixed-up) OS.+# Now, validate our (potentially fixed-up) individual pieces (OS, OBJ).+ case $os in 	# Sometimes we do "kernel-libc", so those need to count as OSes.-	musl* | newlib* | relibc* | uclibc*)+	llvm* | musl* | newlib* | relibc* | uclibc*) 		;; 	# Likewise for "kernel-abi" 	eabi* | gnueabi*)@@ -1716,6 +1731,9 @@ 	# VxWorks passes extra cpu info in the 4th filed. 	simlinux | simwindows | spe) 		;;+	# See `case $cpu-$os` validation below+	ghcjs)+		;; 	# Now accept the basic system types. 	# The portable systems comes first. 	# Each alternative MUST end in a * to match a version number.@@ -1724,7 +1742,7 @@ 	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ 	     | sym* |  plan9* | psp* | sim* | xray* | os68k* | v88r* \ 	     | hiux* | abug | nacl* | netware* | windows* \-	     | os9* | macos* | osx* | ios* \+	     | os9* | macos* | osx* | ios* | tvos* | watchos* \ 	     | mpw* | magic* | mmixware* | mon960* | lnews* \ 	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ 	     | aos* | aros* | cloudabi* | sortix* | twizzler* \@@ -1733,11 +1751,11 @@ 	     | mirbsd* | netbsd* | dicos* | openedition* | ose* \ 	     | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \ 	     | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \-	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \-	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \+	     | bosx* | nextstep* | cxux* | oabi* \+	     | ptx* | ecoff* | winnt* | domain* | vsta* \ 	     | udi* | lites* | ieee* | go32* | aux* | hcos* \ 	     | chorusrdb* | cegcc* | glidix* | serenity* \-	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \+	     | cygwin* | msys* | moss* | proelf* | rtems* \ 	     | midipix* | mingw32* | mingw64* | mint* \ 	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \ 	     | interix* | uwin* | mks* | rhapsody* | darwin* \@@ -1750,49 +1768,116 @@ 	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ 	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ 	     | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \-         | ghcjs)+	     | fiwix* | mlibc* | cos* | mbr* | ironclad* ) 		;; 	# This one is extra strict with allowed versions 	sco3.2v2 | sco3.2v[4-9]* | sco5v6*) 		# Don't forget version if it is 3.2v4 or newer. 		;;+	# This refers to builds using the UEFI calling convention+	# (which depends on the architecture) and PE file format.+	# Note that this is both a different calling convention and+	# different file format than that of GNU-EFI+	# (x86_64-w64-mingw32).+	uefi)+		;; 	none) 		;;+	kernel* | msvc* )+		# Restricted further below+		;;+	'')+		if test x"$obj" = x+		then+			echo "Invalid configuration '$1': Blank OS only allowed with explicit machine code file format" 1>&2+		fi+		;; 	*)-		echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2+		echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 		exit 1 		;; esac +case $obj in+	aout* | coff* | elf* | pe*)+		;;+	'')+		# empty is fine+		;;+	*)+		echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2+		exit 1+		;;+esac++# Here we handle the constraint that a (synthetic) cpu and os are+# valid only in combination with each other and nowhere else.+case $cpu-$os in+	# The "javascript-unknown-ghcjs" triple is used by GHC; we+	# accept it here in order to tolerate that, but reject any+	# variations.+	javascript-ghcjs)+		;;+	javascript-* | *-ghcjs)+		echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2+		exit 1+		;;+esac+ # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel.-case $kernel-$os in-	linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \-		   | linux-musl* | linux-relibc* | linux-uclibc* )+case $kernel-$os-$obj in+	linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \+		    | linux-mlibc*- | linux-musl*- | linux-newlib*- \+		    | linux-relibc*- | linux-uclibc*- ) 		;;-	uclinux-uclibc* )+	uclinux-uclibc*- ) 		;;-	-dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )+	managarm-mlibc*- | managarm-kernel*- )+		;;+	windows*-msvc*-)+		;;+	-dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \+		    | -uclibc*- ) 		# These are just libc implementations, not actual OSes, and thus 		# require a kernel.-		echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2+		echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 		exit 1 		;;-	kfreebsd*-gnu* | kopensolaris*-gnu*)+	-kernel*- )+		echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2+		exit 1 		;;-	vxworks-simlinux | vxworks-simwindows | vxworks-spe)+	*-kernel*- )+		echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2+		exit 1 		;;-	nto-qnx*)+	*-msvc*- )+		echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2+		exit 1 		;;-	os2-emx)+	kfreebsd*-gnu*- | kopensolaris*-gnu*-) 		;;-	*-eabi* | *-gnueabi*)+	vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) 		;;-	-*)+	nto-qnx*-)+		;;+	os2-emx-)+		;;+	*-eabi*- | *-gnueabi*-)+		;;+	none--*)+		# None (no kernel, i.e. freestanding / bare metal),+		# can be paired with an machine code file format+		;;+	-*-) 		# Blank kernel with real OS is always fine. 		;;-	*-*)-		echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2+	--*)+		# Blank kernel and OS with real machine code file format is always fine.+		;;+	*-*-*)+		echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 		exit 1 		;; esac@@ -1875,7 +1960,7 @@ 		;; esac -echo "$cpu-$vendor-${kernel:+$kernel-}$os"+echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit  # Local variables:
configure view
@@ -1,4932 +1,5470 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles.-# Generated by GNU Autoconf 2.69 for Haskell network package 3.1.4.0.-#-# Report bugs to <libraries@haskell.org>.-#-#-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.-#-#-# This configure script is free software; the Free Software Foundation-# gives unlimited permission to copy, distribute and modify it.-## -------------------- ##-## M4sh Initialization. ##-## -------------------- ##--# Be more Bourne compatible-DUALCASE=1; export DUALCASE # for MKS sh-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :-  emulate sh-  NULLCMD=:-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which-  # is contrary to our usage.  Disable this feature.-  alias -g '${1+"$@"}'='"$@"'-  setopt NO_GLOB_SUBST-else-  case `(set -o) 2>/dev/null` in #(-  *posix*) :-    set -o posix ;; #(-  *) :-     ;;-esac-fi---as_nl='-'-export as_nl-# Printing a long string crashes Solaris 7 /usr/bin/printf.-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo-# Prefer a ksh shell builtin over an external printf program on Solaris,-# but without wasting forks for bash or zsh.-if test -z "$BASH_VERSION$ZSH_VERSION" \-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then-  as_echo='print -r --'-  as_echo_n='print -rn --'-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then-  as_echo='printf %s\n'-  as_echo_n='printf %s'-else-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'-    as_echo_n='/usr/ucb/echo -n'-  else-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'-    as_echo_n_body='eval-      arg=$1;-      case $arg in #(-      *"$as_nl"*)-	expr "X$arg" : "X\\(.*\\)$as_nl";-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;-      esac;-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"-    '-    export as_echo_n_body-    as_echo_n='sh -c $as_echo_n_body as_echo'-  fi-  export as_echo_body-  as_echo='sh -c $as_echo_body as_echo'-fi--# The user is always right.-if test "${PATH_SEPARATOR+set}" != set; then-  PATH_SEPARATOR=:-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||-      PATH_SEPARATOR=';'-  }-fi---# IFS-# We need space, tab and new line, in precisely that order.  Quoting is-# there to prevent editors from complaining about space-tab.-# (If _AS_PATH_WALK were called with IFS unset, it would disable word-# splitting by setting IFS to empty value.)-IFS=" ""	$as_nl"--# Find who we are.  Look in the path if we contain no directory separator.-as_myself=-case $0 in #((-  *[\\/]* ) as_myself=$0 ;;-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break-  done-IFS=$as_save_IFS--     ;;-esac-# We did not find ourselves, most probably we were run as `sh COMMAND'-# in which case we are not to be found in the path.-if test "x$as_myself" = x; then-  as_myself=$0-fi-if test ! -f "$as_myself"; then-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2-  exit 1-fi--# Unset variables that we do not need and which cause bugs (e.g. in-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"-# suppresses any "Segmentation fault" message there.  '((' could-# trigger a bug in pdksh 5.2.14.-for as_var in BASH_ENV ENV MAIL MAILPATH-do eval test x\${$as_var+set} = xset \-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :-done-PS1='$ '-PS2='> '-PS4='+ '--# NLS nuisances.-LC_ALL=C-export LC_ALL-LANGUAGE=C-export LANGUAGE--# CDPATH.-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH--# Use a proper internal environment variable to ensure we don't fall-  # into an infinite loop, continuously re-executing ourselves.-  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then-    _as_can_reexec=no; export _as_can_reexec;-    # We cannot yet assume a decent shell, so we have to provide a-# neutralization value for shells without unset; and this also-# works around shells that cannot unset nonexistent variables.-# Preserve -v and -x to the replacement shell.-BASH_ENV=/dev/null-ENV=/dev/null-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV-case $- in # ((((-  *v*x* | *x*v* ) as_opts=-vx ;;-  *v* ) as_opts=-v ;;-  *x* ) as_opts=-x ;;-  * ) as_opts= ;;-esac-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}-# Admittedly, this is quite paranoid, since all the known shells bail-# out after a failed `exec'.-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2-as_fn_exit 255-  fi-  # We don't want this to propagate to other subprocesses.-          { _as_can_reexec=; unset _as_can_reexec;}-if test "x$CONFIG_SHELL" = x; then-  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :-  emulate sh-  NULLCMD=:-  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which-  # is contrary to our usage.  Disable this feature.-  alias -g '\${1+\"\$@\"}'='\"\$@\"'-  setopt NO_GLOB_SUBST-else-  case \`(set -o) 2>/dev/null\` in #(-  *posix*) :-    set -o posix ;; #(-  *) :-     ;;-esac-fi-"-  as_required="as_fn_return () { (exit \$1); }-as_fn_success () { as_fn_return 0; }-as_fn_failure () { as_fn_return 1; }-as_fn_ret_success () { return 0; }-as_fn_ret_failure () { return 1; }--exitcode=0-as_fn_success || { exitcode=1; echo as_fn_success failed.; }-as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }-as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }-as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :--else-  exitcode=1; echo positional parameters were not saved.-fi-test x\$exitcode = x0 || exit 1-test -x / || exit 1"-  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO-  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO-  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&-  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1-test \$(( 1 + 1 )) = 2 || exit 1"-  if (eval "$as_required") 2>/dev/null; then :-  as_have_required=yes-else-  as_have_required=no-fi-  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :--else-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-as_found=false-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  as_found=:-  case $as_dir in #(-	 /*)-	   for as_base in sh bash ksh sh5; do-	     # Try only shells that exist, to save several forks.-	     as_shell=$as_dir/$as_base-	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&-		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :-  CONFIG_SHELL=$as_shell as_have_required=yes-		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :-  break 2-fi-fi-	   done;;-       esac-  as_found=false-done-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&-	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :-  CONFIG_SHELL=$SHELL as_have_required=yes-fi; }-IFS=$as_save_IFS---      if test "x$CONFIG_SHELL" != x; then :-  export CONFIG_SHELL-             # We cannot yet assume a decent shell, so we have to provide a-# neutralization value for shells without unset; and this also-# works around shells that cannot unset nonexistent variables.-# Preserve -v and -x to the replacement shell.-BASH_ENV=/dev/null-ENV=/dev/null-(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV-case $- in # ((((-  *v*x* | *x*v* ) as_opts=-vx ;;-  *v* ) as_opts=-v ;;-  *x* ) as_opts=-x ;;-  * ) as_opts= ;;-esac-exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}-# Admittedly, this is quite paranoid, since all the known shells bail-# out after a failed `exec'.-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2-exit 255-fi--    if test x$as_have_required = xno; then :-  $as_echo "$0: This script requires a shell more modern than all"-  $as_echo "$0: the shells that I found on your system."-  if test x${ZSH_VERSION+set} = xset ; then-    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"-    $as_echo "$0: be upgraded to zsh 4.3.4 or later."-  else-    $as_echo "$0: Please tell bug-autoconf@gnu.org and-$0: libraries@haskell.org about your system, including any-$0: error possibly output before this message. Then install-$0: a modern shell, or manually run the script under such a-$0: shell if you do have one."-  fi-  exit 1-fi-fi-fi-SHELL=${CONFIG_SHELL-/bin/sh}-export SHELL-# Unset more variables known to interfere with behavior of common tools.-CLICOLOR_FORCE= GREP_OPTIONS=-unset CLICOLOR_FORCE GREP_OPTIONS--## --------------------- ##-## M4sh Shell Functions. ##-## --------------------- ##-# as_fn_unset VAR-# ----------------# Portably unset VAR.-as_fn_unset ()-{-  { eval $1=; unset $1;}-}-as_unset=as_fn_unset--# as_fn_set_status STATUS-# ------------------------# Set $? to STATUS, without forking.-as_fn_set_status ()-{-  return $1-} # as_fn_set_status--# as_fn_exit STATUS-# ------------------# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.-as_fn_exit ()-{-  set +e-  as_fn_set_status $1-  exit $1-} # as_fn_exit--# as_fn_mkdir_p-# --------------# Create "$as_dir" as a directory, including parents if necessary.-as_fn_mkdir_p ()-{--  case $as_dir in #(-  -*) as_dir=./$as_dir;;-  esac-  test -d "$as_dir" || eval $as_mkdir_p || {-    as_dirs=-    while :; do-      case $as_dir in #(-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(-      *) as_qdir=$as_dir;;-      esac-      as_dirs="'$as_qdir' $as_dirs"-      as_dir=`$as_dirname -- "$as_dir" ||-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$as_dir" : 'X\(//\)[^/]' \| \-	 X"$as_dir" : 'X\(//\)$' \| \-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||-$as_echo X"$as_dir" |-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{-	    s//\1/-	    q-	  }-	  /^X\(\/\/\)[^/].*/{-	    s//\1/-	    q-	  }-	  /^X\(\/\/\)$/{-	    s//\1/-	    q-	  }-	  /^X\(\/\).*/{-	    s//\1/-	    q-	  }-	  s/.*/./; q'`-      test -d "$as_dir" && break-    done-    test -z "$as_dirs" || eval "mkdir $as_dirs"-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"---} # as_fn_mkdir_p--# as_fn_executable_p FILE-# ------------------------# Test if FILE is an executable regular file.-as_fn_executable_p ()-{-  test -f "$1" && test -x "$1"-} # as_fn_executable_p-# as_fn_append VAR VALUE-# -----------------------# Append the text in VALUE to the end of the definition contained in VAR. Take-# advantage of any shell optimizations that allow amortized linear growth over-# repeated appends, instead of the typical quadratic growth present in naive-# implementations.-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :-  eval 'as_fn_append ()-  {-    eval $1+=\$2-  }'-else-  as_fn_append ()-  {-    eval $1=\$$1\$2-  }-fi # as_fn_append--# as_fn_arith ARG...-# -------------------# Perform arithmetic evaluation on the ARGs, and store the result in the-# global $as_val. Take advantage of shells that can avoid forks. The arguments-# must be portable across $(()) and expr.-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :-  eval 'as_fn_arith ()-  {-    as_val=$(( $* ))-  }'-else-  as_fn_arith ()-  {-    as_val=`expr "$@" || test $? -eq 1`-  }-fi # as_fn_arith---# as_fn_error STATUS ERROR [LINENO LOG_FD]-# -----------------------------------------# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the-# script with STATUS, using 1 if that was 0.-as_fn_error ()-{-  as_status=$1; test $as_status -eq 0 && as_status=1-  if test "$4"; then-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4-  fi-  $as_echo "$as_me: error: $2" >&2-  as_fn_exit $as_status-} # as_fn_error--if expr a : '\(a\)' >/dev/null 2>&1 &&-   test "X`expr 00001 : '.*\(...\)'`" = X001; then-  as_expr=expr-else-  as_expr=false-fi--if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then-  as_basename=basename-else-  as_basename=false-fi--if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then-  as_dirname=dirname-else-  as_dirname=false-fi--as_me=`$as_basename -- "$0" ||-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \-	 X"$0" : 'X\(//\)$' \| \-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||-$as_echo X/"$0" |-    sed '/^.*\/\([^/][^/]*\)\/*$/{-	    s//\1/-	    q-	  }-	  /^X\/\(\/\/\)$/{-	    s//\1/-	    q-	  }-	  /^X\/\(\/\).*/{-	    s//\1/-	    q-	  }-	  s/.*/./; q'`--# Avoid depending upon Character Ranges.-as_cr_letters='abcdefghijklmnopqrstuvwxyz'-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'-as_cr_Letters=$as_cr_letters$as_cr_LETTERS-as_cr_digits='0123456789'-as_cr_alnum=$as_cr_Letters$as_cr_digits---  as_lineno_1=$LINENO as_lineno_1a=$LINENO-  as_lineno_2=$LINENO as_lineno_2a=$LINENO-  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&-  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {-  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)-  sed -n '-    p-    /[$]LINENO/=-  ' <$as_myself |-    sed '-      s/[$]LINENO.*/&-/-      t lineno-      b-      :lineno-      N-      :loop-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/-      t loop-      s/-\n.*//-    ' >$as_me.lineno &&-  chmod +x "$as_me.lineno" ||-    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }--  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have-  # already done that, so ensure we don't try to do so again and fall-  # in an infinite loop.  This has already happened in practice.-  _as_can_reexec=no; export _as_can_reexec-  # Don't try to exec as it changes $[0], causing all sort of problems-  # (the dirname of $[0] is not the place where we might find the-  # original and so on.  Autoconf is especially sensitive to this).-  . "./$as_me.lineno"-  # Exit status is that of the last command.-  exit-}--ECHO_C= ECHO_N= ECHO_T=-case `echo -n x` in #(((((--n*)-  case `echo 'xy\c'` in-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.-  xy)  ECHO_C='\c';;-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null-       ECHO_T='	';;-  esac;;-*)-  ECHO_N='-n';;-esac--rm -f conf$$ conf$$.exe conf$$.file-if test -d conf$$.dir; then-  rm -f conf$$.dir/conf$$.file-else-  rm -f conf$$.dir-  mkdir conf$$.dir 2>/dev/null-fi-if (echo >conf$$.file) 2>/dev/null; then-  if ln -s conf$$.file conf$$ 2>/dev/null; then-    as_ln_s='ln -s'-    # ... but there are two gotchas:-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.-    # In both cases, we have to default to `cp -pR'.-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||-      as_ln_s='cp -pR'-  elif ln conf$$.file conf$$ 2>/dev/null; then-    as_ln_s=ln-  else-    as_ln_s='cp -pR'-  fi-else-  as_ln_s='cp -pR'-fi-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file-rmdir conf$$.dir 2>/dev/null--if mkdir -p . 2>/dev/null; then-  as_mkdir_p='mkdir -p "$as_dir"'-else-  test -d ./-p && rmdir ./-p-  as_mkdir_p=false-fi--as_test_x='test -x'-as_executable_p=as_fn_executable_p--# Sed expression to map a string onto a valid CPP name.-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"--# Sed expression to map a string onto a valid variable name.-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"---test -n "$DJDIR" || exec 7<&0 </dev/null-exec 6>&1--# Name of the host.-# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,-# so uname gets run too.-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`--#-# Initializations.-#-ac_default_prefix=/usr/local-ac_clean_files=-ac_config_libobj_dir=.-LIBOBJS=-cross_compiling=no-subdirs=-MFLAGS=-MAKEFLAGS=--# Identity of this package.-PACKAGE_NAME='Haskell network package'-PACKAGE_TARNAME='network'-PACKAGE_VERSION='3.1.4.0'-PACKAGE_STRING='Haskell network package 3.1.4.0'-PACKAGE_BUGREPORT='libraries@haskell.org'-PACKAGE_URL=''--ac_unique_file="include/HsNet.h"-# Factoring default headers for most tests.-ac_includes_default="\-#include <stdio.h>-#ifdef HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#ifdef HAVE_SYS_STAT_H-# include <sys/stat.h>-#endif-#ifdef STDC_HEADERS-# include <stdlib.h>-# include <stddef.h>-#else-# ifdef HAVE_STDLIB_H-#  include <stdlib.h>-# endif-#endif-#ifdef HAVE_STRING_H-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H-#  include <memory.h>-# endif-# include <string.h>-#endif-#ifdef HAVE_STRINGS_H-# include <strings.h>-#endif-#ifdef HAVE_INTTYPES_H-# include <inttypes.h>-#endif-#ifdef HAVE_STDINT_H-# include <stdint.h>-#endif-#ifdef HAVE_UNISTD_H-# include <unistd.h>-#endif"--ac_subst_vars='LTLIBOBJS-LIBOBJS-EGREP-GREP-CPP-OBJEXT-EXEEXT-ac_ct_CC-CPPFLAGS-LDFLAGS-CFLAGS-CC-host_os-host_vendor-host_cpu-host-build_os-build_vendor-build_cpu-build-target_alias-host_alias-build_alias-LIBS-ECHO_T-ECHO_N-ECHO_C-DEFS-mandir-localedir-libdir-psdir-pdfdir-dvidir-htmldir-infodir-docdir-oldincludedir-includedir-localstatedir-sharedstatedir-sysconfdir-datadir-datarootdir-libexecdir-sbindir-bindir-program_transform_name-prefix-exec_prefix-PACKAGE_URL-PACKAGE_BUGREPORT-PACKAGE_STRING-PACKAGE_VERSION-PACKAGE_TARNAME-PACKAGE_NAME-PATH_SEPARATOR-SHELL'-ac_subst_files=''-ac_user_opts='-enable_option_checking-with_cc-'-      ac_precious_vars='build_alias-host_alias-target_alias-CC-CFLAGS-LDFLAGS-LIBS-CPPFLAGS-CPP'---# Initialize some variables set by options.-ac_init_help=-ac_init_version=false-ac_unrecognized_opts=-ac_unrecognized_sep=-# The variables have the same names as the options, with-# dashes changed to underlines.-cache_file=/dev/null-exec_prefix=NONE-no_create=-no_recursion=-prefix=NONE-program_prefix=NONE-program_suffix=NONE-program_transform_name=s,x,x,-silent=-site=-srcdir=-verbose=-x_includes=NONE-x_libraries=NONE--# Installation directory options.-# These are left unexpanded so users can "make install exec_prefix=/foo"-# and all the variables that are supposed to be based on exec_prefix-# by default will actually change.-# Use braces instead of parens because sh, perl, etc. also accept them.-# (The list follows the same order as the GNU Coding Standards.)-bindir='${exec_prefix}/bin'-sbindir='${exec_prefix}/sbin'-libexecdir='${exec_prefix}/libexec'-datarootdir='${prefix}/share'-datadir='${datarootdir}'-sysconfdir='${prefix}/etc'-sharedstatedir='${prefix}/com'-localstatedir='${prefix}/var'-includedir='${prefix}/include'-oldincludedir='/usr/include'-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'-infodir='${datarootdir}/info'-htmldir='${docdir}'-dvidir='${docdir}'-pdfdir='${docdir}'-psdir='${docdir}'-libdir='${exec_prefix}/lib'-localedir='${datarootdir}/locale'-mandir='${datarootdir}/man'--ac_prev=-ac_dashdash=-for ac_option-do-  # If the previous option needs an argument, assign it.-  if test -n "$ac_prev"; then-    eval $ac_prev=\$ac_option-    ac_prev=-    continue-  fi--  case $ac_option in-  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;-  *=)   ac_optarg= ;;-  *)    ac_optarg=yes ;;-  esac--  # Accept the important Cygnus configure options, so we can diagnose typos.--  case $ac_dashdash$ac_option in-  --)-    ac_dashdash=yes ;;--  -bindir | --bindir | --bindi | --bind | --bin | --bi)-    ac_prev=bindir ;;-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)-    bindir=$ac_optarg ;;--  -build | --build | --buil | --bui | --bu)-    ac_prev=build_alias ;;-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)-    build_alias=$ac_optarg ;;--  -cache-file | --cache-file | --cache-fil | --cache-fi \-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)-    ac_prev=cache_file ;;-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)-    cache_file=$ac_optarg ;;--  --config-cache | -C)-    cache_file=config.cache ;;--  -datadir | --datadir | --datadi | --datad)-    ac_prev=datadir ;;-  -datadir=* | --datadir=* | --datadi=* | --datad=*)-    datadir=$ac_optarg ;;--  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \-  | --dataroo | --dataro | --datar)-    ac_prev=datarootdir ;;-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)-    datarootdir=$ac_optarg ;;--  -disable-* | --disable-*)-    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&-      as_fn_error $? "invalid feature name: $ac_useropt"-    ac_useropt_orig=$ac_useropt-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`-    case $ac_user_opts in-      *"-"enable_$ac_useropt"-"*) ;;-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"-	 ac_unrecognized_sep=', ';;-    esac-    eval enable_$ac_useropt=no ;;--  -docdir | --docdir | --docdi | --doc | --do)-    ac_prev=docdir ;;-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)-    docdir=$ac_optarg ;;--  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)-    ac_prev=dvidir ;;-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)-    dvidir=$ac_optarg ;;--  -enable-* | --enable-*)-    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&-      as_fn_error $? "invalid feature name: $ac_useropt"-    ac_useropt_orig=$ac_useropt-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`-    case $ac_user_opts in-      *"-"enable_$ac_useropt"-"*) ;;-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"-	 ac_unrecognized_sep=', ';;-    esac-    eval enable_$ac_useropt=\$ac_optarg ;;--  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \-  | --exec | --exe | --ex)-    ac_prev=exec_prefix ;;-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \-  | --exec=* | --exe=* | --ex=*)-    exec_prefix=$ac_optarg ;;--  -gas | --gas | --ga | --g)-    # Obsolete; use --with-gas.-    with_gas=yes ;;--  -help | --help | --hel | --he | -h)-    ac_init_help=long ;;-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)-    ac_init_help=recursive ;;-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)-    ac_init_help=short ;;--  -host | --host | --hos | --ho)-    ac_prev=host_alias ;;-  -host=* | --host=* | --hos=* | --ho=*)-    host_alias=$ac_optarg ;;--  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)-    ac_prev=htmldir ;;-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \-  | --ht=*)-    htmldir=$ac_optarg ;;--  -includedir | --includedir | --includedi | --included | --include \-  | --includ | --inclu | --incl | --inc)-    ac_prev=includedir ;;-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \-  | --includ=* | --inclu=* | --incl=* | --inc=*)-    includedir=$ac_optarg ;;--  -infodir | --infodir | --infodi | --infod | --info | --inf)-    ac_prev=infodir ;;-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)-    infodir=$ac_optarg ;;--  -libdir | --libdir | --libdi | --libd)-    ac_prev=libdir ;;-  -libdir=* | --libdir=* | --libdi=* | --libd=*)-    libdir=$ac_optarg ;;--  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \-  | --libexe | --libex | --libe)-    ac_prev=libexecdir ;;-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \-  | --libexe=* | --libex=* | --libe=*)-    libexecdir=$ac_optarg ;;--  -localedir | --localedir | --localedi | --localed | --locale)-    ac_prev=localedir ;;-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)-    localedir=$ac_optarg ;;--  -localstatedir | --localstatedir | --localstatedi | --localstated \-  | --localstate | --localstat | --localsta | --localst | --locals)-    ac_prev=localstatedir ;;-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)-    localstatedir=$ac_optarg ;;--  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)-    ac_prev=mandir ;;-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)-    mandir=$ac_optarg ;;--  -nfp | --nfp | --nf)-    # Obsolete; use --without-fp.-    with_fp=no ;;--  -no-create | --no-create | --no-creat | --no-crea | --no-cre \-  | --no-cr | --no-c | -n)-    no_create=yes ;;--  -no-recursion | --no-recursion | --no-recursio | --no-recursi \-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)-    no_recursion=yes ;;--  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \-  | --oldin | --oldi | --old | --ol | --o)-    ac_prev=oldincludedir ;;-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)-    oldincludedir=$ac_optarg ;;--  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)-    ac_prev=prefix ;;-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)-    prefix=$ac_optarg ;;--  -program-prefix | --program-prefix | --program-prefi | --program-pref \-  | --program-pre | --program-pr | --program-p)-    ac_prev=program_prefix ;;-  -program-prefix=* | --program-prefix=* | --program-prefi=* \-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)-    program_prefix=$ac_optarg ;;--  -program-suffix | --program-suffix | --program-suffi | --program-suff \-  | --program-suf | --program-su | --program-s)-    ac_prev=program_suffix ;;-  -program-suffix=* | --program-suffix=* | --program-suffi=* \-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)-    program_suffix=$ac_optarg ;;--  -program-transform-name | --program-transform-name \-  | --program-transform-nam | --program-transform-na \-  | --program-transform-n | --program-transform- \-  | --program-transform | --program-transfor \-  | --program-transfo | --program-transf \-  | --program-trans | --program-tran \-  | --progr-tra | --program-tr | --program-t)-    ac_prev=program_transform_name ;;-  -program-transform-name=* | --program-transform-name=* \-  | --program-transform-nam=* | --program-transform-na=* \-  | --program-transform-n=* | --program-transform-=* \-  | --program-transform=* | --program-transfor=* \-  | --program-transfo=* | --program-transf=* \-  | --program-trans=* | --program-tran=* \-  | --progr-tra=* | --program-tr=* | --program-t=*)-    program_transform_name=$ac_optarg ;;--  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)-    ac_prev=pdfdir ;;-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)-    pdfdir=$ac_optarg ;;--  -psdir | --psdir | --psdi | --psd | --ps)-    ac_prev=psdir ;;-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)-    psdir=$ac_optarg ;;--  -q | -quiet | --quiet | --quie | --qui | --qu | --q \-  | -silent | --silent | --silen | --sile | --sil)-    silent=yes ;;--  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)-    ac_prev=sbindir ;;-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \-  | --sbi=* | --sb=*)-    sbindir=$ac_optarg ;;--  -sharedstatedir | --sharedstatedir | --sharedstatedi \-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \-  | --sharedst | --shareds | --shared | --share | --shar \-  | --sha | --sh)-    ac_prev=sharedstatedir ;;-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \-  | --sha=* | --sh=*)-    sharedstatedir=$ac_optarg ;;--  -site | --site | --sit)-    ac_prev=site ;;-  -site=* | --site=* | --sit=*)-    site=$ac_optarg ;;--  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)-    ac_prev=srcdir ;;-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)-    srcdir=$ac_optarg ;;--  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \-  | --syscon | --sysco | --sysc | --sys | --sy)-    ac_prev=sysconfdir ;;-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)-    sysconfdir=$ac_optarg ;;--  -target | --target | --targe | --targ | --tar | --ta | --t)-    ac_prev=target_alias ;;-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)-    target_alias=$ac_optarg ;;--  -v | -verbose | --verbose | --verbos | --verbo | --verb)-    verbose=yes ;;--  -version | --version | --versio | --versi | --vers | -V)-    ac_init_version=: ;;--  -with-* | --with-*)-    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&-      as_fn_error $? "invalid package name: $ac_useropt"-    ac_useropt_orig=$ac_useropt-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`-    case $ac_user_opts in-      *"-"with_$ac_useropt"-"*) ;;-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"-	 ac_unrecognized_sep=', ';;-    esac-    eval with_$ac_useropt=\$ac_optarg ;;--  -without-* | --without-*)-    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&-      as_fn_error $? "invalid package name: $ac_useropt"-    ac_useropt_orig=$ac_useropt-    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`-    case $ac_user_opts in-      *"-"with_$ac_useropt"-"*) ;;-      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"-	 ac_unrecognized_sep=', ';;-    esac-    eval with_$ac_useropt=no ;;--  --x)-    # Obsolete; use --with-x.-    with_x=yes ;;--  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \-  | --x-incl | --x-inc | --x-in | --x-i)-    ac_prev=x_includes ;;-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)-    x_includes=$ac_optarg ;;--  -x-libraries | --x-libraries | --x-librarie | --x-librari \-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)-    ac_prev=x_libraries ;;-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)-    x_libraries=$ac_optarg ;;--  -*) as_fn_error $? "unrecognized option: \`$ac_option'-Try \`$0 --help' for more information"-    ;;--  *=*)-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`-    # Reject names that are not valid shell variable names.-    case $ac_envvar in #(-      '' | [0-9]* | *[!_$as_cr_alnum]* )-      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;-    esac-    eval $ac_envvar=\$ac_optarg-    export $ac_envvar ;;--  *)-    # FIXME: should be removed in autoconf 3.0.-    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&-      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2-    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"-    ;;--  esac-done--if test -n "$ac_prev"; then-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`-  as_fn_error $? "missing argument to $ac_option"-fi--if test -n "$ac_unrecognized_opts"; then-  case $enable_option_checking in-    no) ;;-    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;-    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;-  esac-fi--# Check all directory arguments for consistency.-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \-		datadir sysconfdir sharedstatedir localstatedir includedir \-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \-		libdir localedir mandir-do-  eval ac_val=\$$ac_var-  # Remove trailing slashes.-  case $ac_val in-    */ )-      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`-      eval $ac_var=\$ac_val;;-  esac-  # Be sure to have absolute directory names.-  case $ac_val in-    [\\/$]* | ?:[\\/]* )  continue;;-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;-  esac-  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"-done--# There might be people who depend on the old broken behavior: `$host'-# used to hold the argument of --host etc.-# FIXME: To remove some day.-build=$build_alias-host=$host_alias-target=$target_alias--# FIXME: To remove some day.-if test "x$host_alias" != x; then-  if test "x$build_alias" = x; then-    cross_compiling=maybe-  elif test "x$build_alias" != "x$host_alias"; then-    cross_compiling=yes-  fi-fi--ac_tool_prefix=-test -n "$host_alias" && ac_tool_prefix=$host_alias---test "$silent" = yes && exec 6>/dev/null---ac_pwd=`pwd` && test -n "$ac_pwd" &&-ac_ls_di=`ls -di .` &&-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||-  as_fn_error $? "working directory cannot be determined"-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||-  as_fn_error $? "pwd does not report name of working directory"---# Find the source files, if location was not specified.-if test -z "$srcdir"; then-  ac_srcdir_defaulted=yes-  # Try the directory containing this script, then the parent directory.-  ac_confdir=`$as_dirname -- "$as_myself" ||-$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$as_myself" : 'X\(//\)[^/]' \| \-	 X"$as_myself" : 'X\(//\)$' \| \-	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||-$as_echo X"$as_myself" |-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{-	    s//\1/-	    q-	  }-	  /^X\(\/\/\)[^/].*/{-	    s//\1/-	    q-	  }-	  /^X\(\/\/\)$/{-	    s//\1/-	    q-	  }-	  /^X\(\/\).*/{-	    s//\1/-	    q-	  }-	  s/.*/./; q'`-  srcdir=$ac_confdir-  if test ! -r "$srcdir/$ac_unique_file"; then-    srcdir=..-  fi-else-  ac_srcdir_defaulted=no-fi-if test ! -r "$srcdir/$ac_unique_file"; then-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."-  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"-fi-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"-ac_abs_confdir=`(-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"-	pwd)`-# When building in place, set srcdir=.-if test "$ac_abs_confdir" = "$ac_pwd"; then-  srcdir=.-fi-# Remove unnecessary trailing slashes from srcdir.-# Double slashes in file names in object file debugging info-# mess up M-x gdb in Emacs.-case $srcdir in-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;-esac-for ac_var in $ac_precious_vars; do-  eval ac_env_${ac_var}_set=\${${ac_var}+set}-  eval ac_env_${ac_var}_value=\$${ac_var}-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}-  eval ac_cv_env_${ac_var}_value=\$${ac_var}-done--#-# Report the --help message.-#-if test "$ac_init_help" = "long"; then-  # Omit some internal or obsolete options to make the list less imposing.-  # This message is too long to be a string in the A/UX 3.1 sh.-  cat <<_ACEOF-\`configure' configures Haskell network package 3.1.4.0 to adapt to many kinds of systems.--Usage: $0 [OPTION]... [VAR=VALUE]...--To assign environment variables (e.g., CC, CFLAGS...), specify them as-VAR=VALUE.  See below for descriptions of some of the useful variables.--Defaults for the options are specified in brackets.--Configuration:-  -h, --help              display this help and exit-      --help=short        display options specific to this package-      --help=recursive    display the short help of all the included packages-  -V, --version           display version information and exit-  -q, --quiet, --silent   do not print \`checking ...' messages-      --cache-file=FILE   cache test results in FILE [disabled]-  -C, --config-cache      alias for \`--cache-file=config.cache'-  -n, --no-create         do not create output files-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']--Installation directories:-  --prefix=PREFIX         install architecture-independent files in PREFIX-                          [$ac_default_prefix]-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX-                          [PREFIX]--By default, \`make install' will install all the files in-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify-an installation prefix other than \`$ac_default_prefix' using \`--prefix',-for instance \`--prefix=\$HOME'.--For better control, use the options below.--Fine tuning of the installation directories:-  --bindir=DIR            user executables [EPREFIX/bin]-  --sbindir=DIR           system admin executables [EPREFIX/sbin]-  --libexecdir=DIR        program executables [EPREFIX/libexec]-  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]-  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]-  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]-  --libdir=DIR            object code libraries [EPREFIX/lib]-  --includedir=DIR        C header files [PREFIX/include]-  --oldincludedir=DIR     C header files for non-gcc [/usr/include]-  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]-  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]-  --infodir=DIR           info documentation [DATAROOTDIR/info]-  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]-  --mandir=DIR            man documentation [DATAROOTDIR/man]-  --docdir=DIR            documentation root [DATAROOTDIR/doc/network]-  --htmldir=DIR           html documentation [DOCDIR]-  --dvidir=DIR            dvi documentation [DOCDIR]-  --pdfdir=DIR            pdf documentation [DOCDIR]-  --psdir=DIR             ps documentation [DOCDIR]-_ACEOF--  cat <<\_ACEOF--System types:-  --build=BUILD     configure for building on BUILD [guessed]-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]-_ACEOF-fi--if test -n "$ac_init_help"; then-  case $ac_init_help in-     short | recursive ) echo "Configuration of Haskell network package 3.1.4.0:";;-   esac-  cat <<\_ACEOF--Optional Packages:-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)-C compiler--Some influential environment variables:-  CC          C compiler command-  CFLAGS      C compiler flags-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a-              nonstandard directory <lib dir>-  LIBS        libraries to pass to the linker, e.g. -l<library>-  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if-              you have headers in a nonstandard directory <include dir>-  CPP         C preprocessor--Use these variables to override the choices made by `configure' or to help-it to find libraries and programs with nonstandard names/locations.--Report bugs to <libraries@haskell.org>.-_ACEOF-ac_status=$?-fi--if test "$ac_init_help" = "recursive"; then-  # If there are subdirs, report their specific --help.-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue-    test -d "$ac_dir" ||-      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||-      continue-    ac_builddir=.--case "$ac_dir" in-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;-*)-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`-  # A ".." for each directory in $ac_dir_suffix.-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`-  case $ac_top_builddir_sub in-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;-  esac ;;-esac-ac_abs_top_builddir=$ac_pwd-ac_abs_builddir=$ac_pwd$ac_dir_suffix-# for backward compatibility:-ac_top_builddir=$ac_top_build_prefix--case $srcdir in-  .)  # We are building in place.-    ac_srcdir=.-    ac_top_srcdir=$ac_top_builddir_sub-    ac_abs_top_srcdir=$ac_pwd ;;-  [\\/]* | ?:[\\/]* )  # Absolute name.-    ac_srcdir=$srcdir$ac_dir_suffix;-    ac_top_srcdir=$srcdir-    ac_abs_top_srcdir=$srcdir ;;-  *) # Relative name.-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix-    ac_top_srcdir=$ac_top_build_prefix$srcdir-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;-esac-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix--    cd "$ac_dir" || { ac_status=$?; continue; }-    # Check for guested configure.-    if test -f "$ac_srcdir/configure.gnu"; then-      echo &&-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive-    elif test -f "$ac_srcdir/configure"; then-      echo &&-      $SHELL "$ac_srcdir/configure" --help=recursive-    else-      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2-    fi || ac_status=$?-    cd "$ac_pwd" || { ac_status=$?; break; }-  done-fi--test -n "$ac_init_help" && exit $ac_status-if $ac_init_version; then-  cat <<\_ACEOF-Haskell network package configure 3.1.4.0-generated by GNU Autoconf 2.69--Copyright (C) 2012 Free Software Foundation, Inc.-This configure script is free software; the Free Software Foundation-gives unlimited permission to copy, distribute and modify it.-_ACEOF-  exit-fi--## ------------------------ ##-## Autoconf initialization. ##-## ------------------------ ##--# ac_fn_c_try_compile LINENO-# ---------------------------# Try to compile conftest.$ac_ext, and return whether this succeeded.-ac_fn_c_try_compile ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_compile") 2>conftest.err-  ac_status=$?-  if test -s conftest.err; then-    grep -v '^ *+' conftest.err >conftest.er1-    cat conftest.er1 >&5-    mv -f conftest.er1 conftest.err-  fi-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then :-  ac_retval=0-else-  $as_echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_retval=1-fi-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno-  as_fn_set_status $ac_retval--} # ac_fn_c_try_compile--# ac_fn_c_try_cpp LINENO-# -----------------------# Try to preprocess conftest.$ac_ext, and return whether this succeeded.-ac_fn_c_try_cpp ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  if { { ac_try="$ac_cpp conftest.$ac_ext"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err-  ac_status=$?-  if test -s conftest.err; then-    grep -v '^ *+' conftest.err >conftest.er1-    cat conftest.er1 >&5-    mv -f conftest.er1 conftest.err-  fi-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; } > conftest.i && {-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||-	 test ! -s conftest.err-       }; then :-  ac_retval=0-else-  $as_echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--    ac_retval=1-fi-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno-  as_fn_set_status $ac_retval--} # ac_fn_c_try_cpp--# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES-# --------------------------------------------------------# Tests whether HEADER exists, giving a warning if it cannot be compiled using-# the include files in INCLUDES and setting the cache variable VAR-# accordingly.-ac_fn_c_check_header_mongrel ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  if eval \${$3+:} false; then :-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5-$as_echo_n "checking for $2... " >&6; }-if eval \${$3+:} false; then :-  $as_echo_n "(cached) " >&6-fi-eval ac_res=\$$3-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5-$as_echo "$ac_res" >&6; }-else-  # Is the header compilable?-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5-$as_echo_n "checking $2 usability... " >&6; }-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-$4-#include <$2>-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  ac_header_compiler=yes-else-  ac_header_compiler=no-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5-$as_echo "$ac_header_compiler" >&6; }--# Is the header present?-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5-$as_echo_n "checking $2 presence... " >&6; }-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <$2>-_ACEOF-if ac_fn_c_try_cpp "$LINENO"; then :-  ac_header_preproc=yes-else-  ac_header_preproc=no-fi-rm -f conftest.err conftest.i conftest.$ac_ext-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5-$as_echo "$ac_header_preproc" >&6; }--# So?  What about this header?-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((-  yes:no: )-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}-    ;;-  no:yes:* )-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5-$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5-$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}-( $as_echo "## ------------------------------------ ##-## Report this to libraries@haskell.org ##-## ------------------------------------ ##"-     ) | sed "s/^/$as_me: WARNING:     /" >&2-    ;;-esac-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5-$as_echo_n "checking for $2... " >&6; }-if eval \${$3+:} false; then :-  $as_echo_n "(cached) " >&6-else-  eval "$3=\$ac_header_compiler"-fi-eval ac_res=\$$3-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5-$as_echo "$ac_res" >&6; }-fi-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno--} # ac_fn_c_check_header_mongrel--# ac_fn_c_try_run LINENO-# -----------------------# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes-# that executables *can* be run.-ac_fn_c_try_run ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  if { { ac_try="$ac_link"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_link") 2>&5-  ac_status=$?-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'-  { { case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_try") 2>&5-  ac_status=$?-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; }; }; then :-  ac_retval=0-else-  $as_echo "$as_me: program exited with status $ac_status" >&5-       $as_echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--       ac_retval=$ac_status-fi-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno-  as_fn_set_status $ac_retval--} # ac_fn_c_try_run--# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES-# --------------------------------------------------------# Tests whether HEADER exists and can be compiled using the include files in-# INCLUDES, setting the cache variable VAR accordingly.-ac_fn_c_check_header_compile ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5-$as_echo_n "checking for $2... " >&6; }-if eval \${$3+:} false; then :-  $as_echo_n "(cached) " >&6-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-$4-#include <$2>-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  eval "$3=yes"-else-  eval "$3=no"-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-eval ac_res=\$$3-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5-$as_echo "$ac_res" >&6; }-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno--} # ac_fn_c_check_header_compile--# ac_fn_c_check_type LINENO TYPE VAR INCLUDES-# --------------------------------------------# Tests whether TYPE exists after having included INCLUDES, setting cache-# variable VAR accordingly.-ac_fn_c_check_type ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5-$as_echo_n "checking for $2... " >&6; }-if eval \${$3+:} false; then :-  $as_echo_n "(cached) " >&6-else-  eval "$3=no"-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-$4-int-main ()-{-if (sizeof ($2))-	 return 0;-  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-$4-int-main ()-{-if (sizeof (($2)))-	    return 0;-  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :--else-  eval "$3=yes"-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-eval ac_res=\$$3-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5-$as_echo "$ac_res" >&6; }-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno--} # ac_fn_c_check_type--# ac_fn_c_try_link LINENO-# ------------------------# Try to link conftest.$ac_ext, and return whether this succeeded.-ac_fn_c_try_link ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  rm -f conftest.$ac_objext conftest$ac_exeext-  if { { ac_try="$ac_link"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_link") 2>conftest.err-  ac_status=$?-  if test -s conftest.err; then-    grep -v '^ *+' conftest.err >conftest.er1-    cat conftest.er1 >&5-    mv -f conftest.er1 conftest.err-  fi-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest$ac_exeext && {-	 test "$cross_compiling" = yes ||-	 test -x conftest$ac_exeext-       }; then :-  ac_retval=0-else-  $as_echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_retval=1-fi-  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information-  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would-  # interfere with the next link command; also delete a directory that is-  # left behind by Apple's compiler.  We do this before executing the actions.-  rm -rf conftest.dSYM conftest_ipa8_conftest.oo-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno-  as_fn_set_status $ac_retval--} # ac_fn_c_try_link--# ac_fn_c_check_func LINENO FUNC VAR-# -----------------------------------# Tests whether FUNC exists, setting the cache variable VAR accordingly-ac_fn_c_check_func ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5-$as_echo_n "checking for $2... " >&6; }-if eval \${$3+:} false; then :-  $as_echo_n "(cached) " >&6-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-/* Define $2 to an innocuous variant, in case <limits.h> declares $2.-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */-#define $2 innocuous_$2--/* System header to define __stub macros and hopefully few prototypes,-    which can conflict with char $2 (); below.-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since-    <limits.h> exists even on freestanding compilers.  */--#ifdef __STDC__-# include <limits.h>-#else-# include <assert.h>-#endif--#undef $2--/* Override any GCC internal prototype to avoid an error.-   Use char because int might match the return type of a GCC-   builtin and then its argument prototype would still apply.  */-#ifdef __cplusplus-extern "C"-#endif-char $2 ();-/* The GNU C library defines this for functions which it implements-    to always fail with ENOSYS.  Some functions are actually named-    something starting with __ and the normal name is an alias.  */-#if defined __stub_$2 || defined __stub___$2-choke me-#endif--int-main ()-{-return $2 ();-  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_link "$LINENO"; then :-  eval "$3=yes"-else-  eval "$3=no"-fi-rm -f core conftest.err conftest.$ac_objext \-    conftest$ac_exeext conftest.$ac_ext-fi-eval ac_res=\$$3-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5-$as_echo "$ac_res" >&6; }-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno--} # ac_fn_c_check_func--# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES-# ----------------------------------------------# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR-# accordingly.-ac_fn_c_check_decl ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  as_decl_name=`echo $2|sed 's/ *(.*//'`-  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }-if eval \${$3+:} false; then :-  $as_echo_n "(cached) " >&6-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-$4-int-main ()-{-#ifndef $as_decl_name-#ifdef __cplusplus-  (void) $as_decl_use;-#else-  (void) $as_decl_name;-#endif-#endif--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  eval "$3=yes"-else-  eval "$3=no"-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-eval ac_res=\$$3-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5-$as_echo "$ac_res" >&6; }-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno--} # ac_fn_c_check_decl--# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES-# -----------------------------------------------------# Tries to find if the field MEMBER exists in type AGGR, after including-# INCLUDES, setting cache variable VAR accordingly.-ac_fn_c_check_member ()-{-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5-$as_echo_n "checking for $2.$3... " >&6; }-if eval \${$4+:} false; then :-  $as_echo_n "(cached) " >&6-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-$5-int-main ()-{-static $2 ac_aggr;-if (ac_aggr.$3)-return 0;-  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  eval "$4=yes"-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-$5-int-main ()-{-static $2 ac_aggr;-if (sizeof ac_aggr.$3)-return 0;-  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  eval "$4=yes"-else-  eval "$4=no"-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-eval ac_res=\$$4-	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5-$as_echo "$ac_res" >&6; }-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno--} # ac_fn_c_check_member-cat >config.log <<_ACEOF-This file contains any messages produced by compilers while-running configure, to aid debugging if configure makes a mistake.--It was created by Haskell network package $as_me 3.1.4.0, which was-generated by GNU Autoconf 2.69.  Invocation command line was--  $ $0 $@--_ACEOF-exec 5>>config.log-{-cat <<_ASUNAME-## --------- ##-## Platform. ##-## --------- ##--hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`-uname -m = `(uname -m) 2>/dev/null || echo unknown`-uname -r = `(uname -r) 2>/dev/null || echo unknown`-uname -s = `(uname -s) 2>/dev/null || echo unknown`-uname -v = `(uname -v) 2>/dev/null || echo unknown`--/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`--/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`--_ASUNAME--as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    $as_echo "PATH: $as_dir"-  done-IFS=$as_save_IFS--} >&5--cat >&5 <<_ACEOF---## ----------- ##-## Core tests. ##-## ----------- ##--_ACEOF---# Keep a trace of the command line.-# Strip out --no-create and --no-recursion so they do not pile up.-# Strip out --silent because we don't want to record it for future runs.-# Also quote any args containing shell meta-characters.-# Make two passes to allow for proper duplicate-argument suppression.-ac_configure_args=-ac_configure_args0=-ac_configure_args1=-ac_must_keep_next=false-for ac_pass in 1 2-do-  for ac_arg-  do-    case $ac_arg in-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \-    | -silent | --silent | --silen | --sile | --sil)-      continue ;;-    *\'*)-      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;-    esac-    case $ac_pass in-    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;-    2)-      as_fn_append ac_configure_args1 " '$ac_arg'"-      if test $ac_must_keep_next = true; then-	ac_must_keep_next=false # Got value, back to normal.-      else-	case $ac_arg in-	  *=* | --config-cache | -C | -disable-* | --disable-* \-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \-	  | -with-* | --with-* | -without-* | --without-* | --x)-	    case "$ac_configure_args0 " in-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;-	    esac-	    ;;-	  -* ) ac_must_keep_next=true ;;-	esac-      fi-      as_fn_append ac_configure_args " '$ac_arg'"-      ;;-    esac-  done-done-{ ac_configure_args0=; unset ac_configure_args0;}-{ ac_configure_args1=; unset ac_configure_args1;}--# When interrupted or exit'd, cleanup temporary files, and complete-# config.log.  We remove comments because anyway the quotes in there-# would cause problems or look ugly.-# WARNING: Use '\'' to represent an apostrophe within the trap.-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.-trap 'exit_status=$?-  # Save into config.log some information that might help in debugging.-  {-    echo--    $as_echo "## ---------------- ##-## Cache variables. ##-## ---------------- ##"-    echo-    # The following way of writing the cache mishandles newlines in values,-(-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do-    eval ac_val=\$$ac_var-    case $ac_val in #(-    *${as_nl}*)-      case $ac_var in #(-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;-      esac-      case $ac_var in #(-      _ | IFS | as_nl) ;; #(-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(-      *) { eval $ac_var=; unset $ac_var;} ;;-      esac ;;-    esac-  done-  (set) 2>&1 |-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(-    *${as_nl}ac_space=\ *)-      sed -n \-	"s/'\''/'\''\\\\'\'''\''/g;-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"-      ;; #(-    *)-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"-      ;;-    esac |-    sort-)-    echo--    $as_echo "## ----------------- ##-## Output variables. ##-## ----------------- ##"-    echo-    for ac_var in $ac_subst_vars-    do-      eval ac_val=\$$ac_var-      case $ac_val in-      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;-      esac-      $as_echo "$ac_var='\''$ac_val'\''"-    done | sort-    echo--    if test -n "$ac_subst_files"; then-      $as_echo "## ------------------- ##-## File substitutions. ##-## ------------------- ##"-      echo-      for ac_var in $ac_subst_files-      do-	eval ac_val=\$$ac_var-	case $ac_val in-	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;-	esac-	$as_echo "$ac_var='\''$ac_val'\''"-      done | sort-      echo-    fi--    if test -s confdefs.h; then-      $as_echo "## ----------- ##-## confdefs.h. ##-## ----------- ##"-      echo-      cat confdefs.h-      echo-    fi-    test "$ac_signal" != 0 &&-      $as_echo "$as_me: caught signal $ac_signal"-    $as_echo "$as_me: exit $exit_status"-  } >&5-  rm -f core *.core core.conftest.* &&-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&-    exit $exit_status-' 0-for ac_signal in 1 2 13 15; do-  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal-done-ac_signal=0--# confdefs.h avoids OS command line length limits that DEFS can exceed.-rm -f -r conftest* confdefs.h--$as_echo "/* confdefs.h */" > confdefs.h--# Predefined preprocessor variables.--cat >>confdefs.h <<_ACEOF-#define PACKAGE_NAME "$PACKAGE_NAME"-_ACEOF--cat >>confdefs.h <<_ACEOF-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"-_ACEOF--cat >>confdefs.h <<_ACEOF-#define PACKAGE_VERSION "$PACKAGE_VERSION"-_ACEOF--cat >>confdefs.h <<_ACEOF-#define PACKAGE_STRING "$PACKAGE_STRING"-_ACEOF--cat >>confdefs.h <<_ACEOF-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"-_ACEOF--cat >>confdefs.h <<_ACEOF-#define PACKAGE_URL "$PACKAGE_URL"-_ACEOF---# Let the site file select an alternate cache file if it wants to.-# Prefer an explicitly selected file to automatically selected ones.-ac_site_file1=NONE-ac_site_file2=NONE-if test -n "$CONFIG_SITE"; then-  # We do not want a PATH search for config.site.-  case $CONFIG_SITE in #((-    -*)  ac_site_file1=./$CONFIG_SITE;;-    */*) ac_site_file1=$CONFIG_SITE;;-    *)   ac_site_file1=./$CONFIG_SITE;;-  esac-elif test "x$prefix" != xNONE; then-  ac_site_file1=$prefix/share/config.site-  ac_site_file2=$prefix/etc/config.site-else-  ac_site_file1=$ac_default_prefix/share/config.site-  ac_site_file2=$ac_default_prefix/etc/config.site-fi-for ac_site_file in "$ac_site_file1" "$ac_site_file2"-do-  test "x$ac_site_file" = xNONE && continue-  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5-$as_echo "$as_me: loading site script $ac_site_file" >&6;}-    sed 's/^/| /' "$ac_site_file" >&5-    . "$ac_site_file" \-      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}-as_fn_error $? "failed to load site script $ac_site_file-See \`config.log' for more details" "$LINENO" 5; }-  fi-done--if test -r "$cache_file"; then-  # Some versions of bash will fail to source /dev/null (special files-  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.-  if test /dev/null != "$cache_file" && test -f "$cache_file"; then-    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5-$as_echo "$as_me: loading cache $cache_file" >&6;}-    case $cache_file in-      [\\/]* | ?:[\\/]* ) . "$cache_file";;-      *)                      . "./$cache_file";;-    esac-  fi-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5-$as_echo "$as_me: creating cache $cache_file" >&6;}-  >$cache_file-fi--# Check that the precious variables saved in the cache have kept the same-# value.-ac_cache_corrupted=false-for ac_var in $ac_precious_vars; do-  eval ac_old_set=\$ac_cv_env_${ac_var}_set-  eval ac_new_set=\$ac_env_${ac_var}_set-  eval ac_old_val=\$ac_cv_env_${ac_var}_value-  eval ac_new_val=\$ac_env_${ac_var}_value-  case $ac_old_set,$ac_new_set in-    set,)-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}-      ac_cache_corrupted=: ;;-    ,set)-      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}-      ac_cache_corrupted=: ;;-    ,);;-    *)-      if test "x$ac_old_val" != "x$ac_new_val"; then-	# differences in whitespace do not lead to failure.-	ac_old_val_w=`echo x $ac_old_val`-	ac_new_val_w=`echo x $ac_new_val`-	if test "$ac_old_val_w" != "$ac_new_val_w"; then-	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}-	  ac_cache_corrupted=:-	else-	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}-	  eval $ac_var=\$ac_old_val-	fi-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5-$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}-	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5-$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}-      fi;;-  esac-  # Pass precious variables to config.status.-  if test "$ac_new_set" = set; then-    case $ac_new_val in-    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;-    *) ac_arg=$ac_var=$ac_new_val ;;-    esac-    case " $ac_configure_args " in-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.-      *) as_fn_append ac_configure_args " '$ac_arg'" ;;-    esac-  fi-done-if $ac_cache_corrupted; then-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}-  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}-  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5-fi-## -------------------- ##-## Main body of script. ##-## -------------------- ##--ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu----ac_includes_default="#ifndef _WIN32-# define _GNU_SOURCE 1  /* for struct ucred on Linux */-#endif-$ac_includes_default--#ifdef _WIN32-# include <winsock2.h>-# include <ws2tcpip.h>-# define IPV6_V6ONLY 27-#endif--#ifdef HAVE_LIMITS_H-# include <limits.h>-#endif-#ifdef HAVE_STDLIB_H-# include <stdlib.h>-#endif-#ifdef HAVE_UNISTD_H-#include <unistd.h>-#endif-#ifdef HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#ifdef HAVE_FCNTL_H-# include <fcntl.h>-#endif-#ifdef HAVE_SYS_UIO_H-# include <sys/uio.h>-#endif-#ifdef HAVE_SYS_SOCKET_H-# include <sys/socket.h>-#endif-#ifdef HAVE_NETINET_IN_H-# include <netinet/in.h>-#endif-#ifdef HAVE_NETINET_TCP_H-# include <netinet/tcp.h>-#endif-#ifdef HAVE_SYS_UN_H-# include <sys/un.h>-#endif-#ifdef HAVE_ARPA_INET_H-# include <arpa/inet.h>-#endif-#ifdef HAVE_NETDB_H-#include <netdb.h>-#endif-#ifdef HAVE_NET_IF_H-# include <net/if.h>-#endif-#ifdef HAVE_NETIOAPI_H-# include <netioapi.h>-#endif-"----ac_config_headers="$ac_config_headers include/HsNetworkConfig.h"---ac_aux_dir=-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do-  if test -f "$ac_dir/install-sh"; then-    ac_aux_dir=$ac_dir-    ac_install_sh="$ac_aux_dir/install-sh -c"-    break-  elif test -f "$ac_dir/install.sh"; then-    ac_aux_dir=$ac_dir-    ac_install_sh="$ac_aux_dir/install.sh -c"-    break-  elif test -f "$ac_dir/shtool"; then-    ac_aux_dir=$ac_dir-    ac_install_sh="$ac_aux_dir/shtool install -c"-    break-  fi-done-if test -z "$ac_aux_dir"; then-  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5-fi--# These three variables are undocumented and unsupported,-# and are intended to be withdrawn in a future Autoconf release.-# They can cause serious problems if a builder's source tree is in a directory-# whose full name contains unusual characters.-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.---# Make sure we can run config.sub.-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||-  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5--{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5-$as_echo_n "checking build system type... " >&6; }-if ${ac_cv_build+:} false; then :-  $as_echo_n "(cached) " >&6-else-  ac_build_alias=$build_alias-test "x$ac_build_alias" = x &&-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`-test "x$ac_build_alias" = x &&-  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||-  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5--fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5-$as_echo "$ac_cv_build" >&6; }-case $ac_cv_build in-*-*-*) ;;-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;-esac-build=$ac_cv_build-ac_save_IFS=$IFS; IFS='-'-set x $ac_cv_build-shift-build_cpu=$1-build_vendor=$2-shift; shift-# Remember, the first character of IFS is used to create $*,-# except with old shells:-build_os=$*-IFS=$ac_save_IFS-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac---{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5-$as_echo_n "checking host system type... " >&6; }-if ${ac_cv_host+:} false; then :-  $as_echo_n "(cached) " >&6-else-  if test "x$host_alias" = x; then-  ac_cv_host=$ac_cv_build-else-  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||-    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5-fi--fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5-$as_echo "$ac_cv_host" >&6; }-case $ac_cv_host in-*-*-*) ;;-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;-esac-host=$ac_cv_host-ac_save_IFS=$IFS; IFS='-'-set x $ac_cv_host-shift-host_cpu=$1-host_vendor=$2-shift; shift-# Remember, the first character of IFS is used to create $*,-# except with old shells:-host_os=$*-IFS=$ac_save_IFS-case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac-----# Check whether --with-cc was given.-if test "${with_cc+set}" = set; then :-  withval=$with_cc; CC=$withval-fi--ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu-if test -n "$ac_tool_prefix"; then-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.-set dummy ${ac_tool_prefix}gcc; ac_word=$2-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5-$as_echo_n "checking for $ac_word... " >&6; }-if ${ac_cv_prog_CC+:} false; then :-  $as_echo_n "(cached) " >&6-else-  if test -n "$CC"; then-  ac_cv_prog_CC="$CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    for ac_exec_ext in '' $ac_executable_extensions; do-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_CC="${ac_tool_prefix}gcc"-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-  done-IFS=$as_save_IFS--fi-fi-CC=$ac_cv_prog_CC-if test -n "$CC"; then-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5-$as_echo "$CC" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi---fi-if test -z "$ac_cv_prog_CC"; then-  ac_ct_CC=$CC-  # Extract the first word of "gcc", so it can be a program name with args.-set dummy gcc; ac_word=$2-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5-$as_echo_n "checking for $ac_word... " >&6; }-if ${ac_cv_prog_ac_ct_CC+:} false; then :-  $as_echo_n "(cached) " >&6-else-  if test -n "$ac_ct_CC"; then-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    for ac_exec_ext in '' $ac_executable_extensions; do-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_ac_ct_CC="gcc"-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-  done-IFS=$as_save_IFS--fi-fi-ac_ct_CC=$ac_cv_prog_ac_ct_CC-if test -n "$ac_ct_CC"; then-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5-$as_echo "$ac_ct_CC" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi--  if test "x$ac_ct_CC" = x; then-    CC=""-  else-    case $cross_compiling:$ac_tool_warned in-yes:)-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}-ac_tool_warned=yes ;;-esac-    CC=$ac_ct_CC-  fi-else-  CC="$ac_cv_prog_CC"-fi--if test -z "$CC"; then-          if test -n "$ac_tool_prefix"; then-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.-set dummy ${ac_tool_prefix}cc; ac_word=$2-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5-$as_echo_n "checking for $ac_word... " >&6; }-if ${ac_cv_prog_CC+:} false; then :-  $as_echo_n "(cached) " >&6-else-  if test -n "$CC"; then-  ac_cv_prog_CC="$CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    for ac_exec_ext in '' $ac_executable_extensions; do-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_CC="${ac_tool_prefix}cc"-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-  done-IFS=$as_save_IFS--fi-fi-CC=$ac_cv_prog_CC-if test -n "$CC"; then-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5-$as_echo "$CC" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi---  fi-fi-if test -z "$CC"; then-  # Extract the first word of "cc", so it can be a program name with args.-set dummy cc; ac_word=$2-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5-$as_echo_n "checking for $ac_word... " >&6; }-if ${ac_cv_prog_CC+:} false; then :-  $as_echo_n "(cached) " >&6-else-  if test -n "$CC"; then-  ac_cv_prog_CC="$CC" # Let the user override the test.-else-  ac_prog_rejected=no-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    for ac_exec_ext in '' $ac_executable_extensions; do-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then-       ac_prog_rejected=yes-       continue-     fi-    ac_cv_prog_CC="cc"-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-  done-IFS=$as_save_IFS--if test $ac_prog_rejected = yes; then-  # We found a bogon in the path, so make sure we never use it.-  set dummy $ac_cv_prog_CC-  shift-  if test $# != 0; then-    # We chose a different compiler from the bogus one.-    # However, it has the same basename, so the bogon will be chosen-    # first if we set CC to just the basename; use the full file name.-    shift-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"-  fi-fi-fi-fi-CC=$ac_cv_prog_CC-if test -n "$CC"; then-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5-$as_echo "$CC" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi---fi-if test -z "$CC"; then-  if test -n "$ac_tool_prefix"; then-  for ac_prog in cl.exe-  do-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.-set dummy $ac_tool_prefix$ac_prog; ac_word=$2-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5-$as_echo_n "checking for $ac_word... " >&6; }-if ${ac_cv_prog_CC+:} false; then :-  $as_echo_n "(cached) " >&6-else-  if test -n "$CC"; then-  ac_cv_prog_CC="$CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    for ac_exec_ext in '' $ac_executable_extensions; do-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-  done-IFS=$as_save_IFS--fi-fi-CC=$ac_cv_prog_CC-if test -n "$CC"; then-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5-$as_echo "$CC" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi---    test -n "$CC" && break-  done-fi-if test -z "$CC"; then-  ac_ct_CC=$CC-  for ac_prog in cl.exe-do-  # Extract the first word of "$ac_prog", so it can be a program name with args.-set dummy $ac_prog; ac_word=$2-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5-$as_echo_n "checking for $ac_word... " >&6; }-if ${ac_cv_prog_ac_ct_CC+:} false; then :-  $as_echo_n "(cached) " >&6-else-  if test -n "$ac_ct_CC"; then-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.-else-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    for ac_exec_ext in '' $ac_executable_extensions; do-  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then-    ac_cv_prog_ac_ct_CC="$ac_prog"-    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5-    break 2-  fi-done-  done-IFS=$as_save_IFS--fi-fi-ac_ct_CC=$ac_cv_prog_ac_ct_CC-if test -n "$ac_ct_CC"; then-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5-$as_echo "$ac_ct_CC" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi---  test -n "$ac_ct_CC" && break-done--  if test "x$ac_ct_CC" = x; then-    CC=""-  else-    case $cross_compiling:$ac_tool_warned in-yes:)-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}-ac_tool_warned=yes ;;-esac-    CC=$ac_ct_CC-  fi-fi--fi---test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}-as_fn_error $? "no acceptable C compiler found in \$PATH-See \`config.log' for more details" "$LINENO" 5; }--# Provide some information about the compiler.-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5-set X $ac_compile-ac_compiler=$2-for ac_option in --version -v -V -qversion; do-  { { ac_try="$ac_compiler $ac_option >&5"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_compiler $ac_option >&5") 2>conftest.err-  ac_status=$?-  if test -s conftest.err; then-    sed '10a\-... rest of stderr output deleted ...-         10q' conftest.err >conftest.er1-    cat conftest.er1 >&5-  fi-  rm -f conftest.er1 conftest.err-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; }-done--cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-ac_clean_files_save=$ac_clean_files-ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"-# Try to create an executable without -o first, disregard a.out.-# It will help us diagnose broken compilers, and finding out an intuition-# of exeext.-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5-$as_echo_n "checking whether the C compiler works... " >&6; }-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`--# The possible output files:-ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"--ac_rmfiles=-for ac_file in $ac_files-do-  case $ac_file in-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;-  esac-done-rm -f $ac_rmfiles--if { { ac_try="$ac_link_default"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_link_default") 2>&5-  ac_status=$?-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; }; then :-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'-# in a Makefile.  We should not override ac_cv_exeext if it was cached,-# so that the user can short-circuit this test for compilers unknown to-# Autoconf.-for ac_file in $ac_files ''-do-  test -f "$ac_file" || continue-  case $ac_file in-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )-	;;-    [ab].out )-	# We found the default executable, but exeext='' is most-	# certainly right.-	break;;-    *.* )-	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;-	then :; else-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`-	fi-	# We set ac_cv_exeext here because the later test for it is not-	# safe: cross compilers may not add the suffix if given an `-o'-	# argument, so we may need to know it at that point already.-	# Even if this section looks crufty: it has the advantage of-	# actually working.-	break;;-    * )-	break;;-  esac-done-test "$ac_cv_exeext" = no && ac_cv_exeext=--else-  ac_file=''-fi-if test -z "$ac_file"; then :-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-$as_echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}-as_fn_error 77 "C compiler cannot create executables-See \`config.log' for more details" "$LINENO" 5; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5-$as_echo "yes" >&6; }-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5-$as_echo_n "checking for C compiler default output file name... " >&6; }-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5-$as_echo "$ac_file" >&6; }-ac_exeext=$ac_cv_exeext--rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out-ac_clean_files=$ac_clean_files_save-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5-$as_echo_n "checking for suffix of executables... " >&6; }-if { { ac_try="$ac_link"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_link") 2>&5-  ac_status=$?-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; }; then :-  # If both `conftest.exe' and `conftest' are `present' (well, observable)-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will-# work properly (i.e., refer to `conftest.exe'), while it won't with-# `rm'.-for ac_file in conftest.exe conftest conftest.*; do-  test -f "$ac_file" || continue-  case $ac_file in-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`-	  break;;-    * ) break;;-  esac-done-else-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}-as_fn_error $? "cannot compute suffix of executables: cannot compile and link-See \`config.log' for more details" "$LINENO" 5; }-fi-rm -f conftest conftest$ac_cv_exeext-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5-$as_echo "$ac_cv_exeext" >&6; }--rm -f conftest.$ac_ext-EXEEXT=$ac_cv_exeext-ac_exeext=$EXEEXT-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <stdio.h>-int-main ()-{-FILE *f = fopen ("conftest.out", "w");- return ferror (f) || fclose (f) != 0;--  ;-  return 0;-}-_ACEOF-ac_clean_files="$ac_clean_files conftest.out"-# Check that the compiler produces executables we can run.  If not, either-# the compiler is broken, or we cross compile.-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5-$as_echo_n "checking whether we are cross compiling... " >&6; }-if test "$cross_compiling" != yes; then-  { { ac_try="$ac_link"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_link") 2>&5-  ac_status=$?-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; }-  if { ac_try='./conftest$ac_cv_exeext'-  { { case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_try") 2>&5-  ac_status=$?-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; }; }; then-    cross_compiling=no-  else-    if test "$cross_compiling" = maybe; then-	cross_compiling=yes-    else-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}-as_fn_error $? "cannot run C compiled programs.-If you meant to cross compile, use \`--host'.-See \`config.log' for more details" "$LINENO" 5; }-    fi-  fi-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5-$as_echo "$cross_compiling" >&6; }--rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out-ac_clean_files=$ac_clean_files_save-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5-$as_echo_n "checking for suffix of object files... " >&6; }-if ${ac_cv_objext+:} false; then :-  $as_echo_n "(cached) " >&6-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.o conftest.obj-if { { ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""-$as_echo "$ac_try_echo"; } >&5-  (eval "$ac_compile") 2>&5-  ac_status=$?-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5-  test $ac_status = 0; }; then :-  for ac_file in conftest.o conftest.obj conftest.*; do-  test -f "$ac_file" || continue;-  case $ac_file in-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`-       break;;-  esac-done-else-  $as_echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}-as_fn_error $? "cannot compute suffix of object files: cannot compile-See \`config.log' for more details" "$LINENO" 5; }-fi-rm -f conftest.$ac_cv_objext conftest.$ac_ext-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5-$as_echo "$ac_cv_objext" >&6; }-OBJEXT=$ac_cv_objext-ac_objext=$OBJEXT-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }-if ${ac_cv_c_compiler_gnu+:} false; then :-  $as_echo_n "(cached) " >&6-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */--int-main ()-{-#ifndef __GNUC__-       choke me-#endif--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  ac_compiler_gnu=yes-else-  ac_compiler_gnu=no-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-ac_cv_c_compiler_gnu=$ac_compiler_gnu--fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5-$as_echo "$ac_cv_c_compiler_gnu" >&6; }-if test $ac_compiler_gnu = yes; then-  GCC=yes-else-  GCC=-fi-ac_test_CFLAGS=${CFLAGS+set}-ac_save_CFLAGS=$CFLAGS-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5-$as_echo_n "checking whether $CC accepts -g... " >&6; }-if ${ac_cv_prog_cc_g+:} false; then :-  $as_echo_n "(cached) " >&6-else-  ac_save_c_werror_flag=$ac_c_werror_flag-   ac_c_werror_flag=yes-   ac_cv_prog_cc_g=no-   CFLAGS="-g"-   cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  ac_cv_prog_cc_g=yes-else-  CFLAGS=""-      cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :--else-  ac_c_werror_flag=$ac_save_c_werror_flag-	 CFLAGS="-g"-	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  ac_cv_prog_cc_g=yes-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-   ac_c_werror_flag=$ac_save_c_werror_flag-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5-$as_echo "$ac_cv_prog_cc_g" >&6; }-if test "$ac_test_CFLAGS" = set; then-  CFLAGS=$ac_save_CFLAGS-elif test $ac_cv_prog_cc_g = yes; then-  if test "$GCC" = yes; then-    CFLAGS="-g -O2"-  else-    CFLAGS="-g"-  fi-else-  if test "$GCC" = yes; then-    CFLAGS="-O2"-  else-    CFLAGS=-  fi-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }-if ${ac_cv_prog_cc_c89+:} false; then :-  $as_echo_n "(cached) " >&6-else-  ac_cv_prog_cc_c89=no-ac_save_CC=$CC-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <stdarg.h>-#include <stdio.h>-struct stat;-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */-struct buf { int x; };-FILE * (*rcsopen) (struct buf *, struct stat *, int);-static char *e (p, i)-     char **p;-     int i;-{-  return p[i];-}-static char *f (char * (*g) (char **, int), char **p, ...)-{-  char *s;-  va_list v;-  va_start (v,p);-  s = g (p, va_arg (v,int));-  va_end (v);-  return s;-}--/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has-   function prototypes and stuff, but not '\xHH' hex character constants.-   These don't provoke an error unfortunately, instead are silently treated-   as 'x'.  The following induces an error, until -std is added to get-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an-   array size at least.  It's necessary to write '\x00'==0 to get something-   that's true only with -std.  */-int osf4_cc_array ['\x00' == 0 ? 1 : -1];--/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters-   inside strings and character constants.  */-#define FOO(x) 'x'-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];--int test (int i, double x);-struct s1 {int (*f) (int a);};-struct s2 {int (*f) (double a);};-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);-int argc;-char **argv;-int-main ()-{-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];-  ;-  return 0;-}-_ACEOF-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"-do-  CC="$ac_save_CC $ac_arg"-  if ac_fn_c_try_compile "$LINENO"; then :-  ac_cv_prog_cc_c89=$ac_arg-fi-rm -f core conftest.err conftest.$ac_objext-  test "x$ac_cv_prog_cc_c89" != "xno" && break-done-rm -f conftest.$ac_ext-CC=$ac_save_CC--fi-# AC_CACHE_VAL-case "x$ac_cv_prog_cc_c89" in-  x)-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5-$as_echo "none needed" >&6; } ;;-  xno)-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5-$as_echo "unsupported" >&6; } ;;-  *)-    CC="$CC $ac_cv_prog_cc_c89"-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;-esac-if test "x$ac_cv_prog_cc_c89" != xno; then :--fi--ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu----{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5-$as_echo_n "checking for an ANSI C-conforming const... " >&6; }-if ${ac_cv_c_const+:} false; then :-  $as_echo_n "(cached) " >&6-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */--int-main ()-{--#ifndef __cplusplus-  /* Ultrix mips cc rejects this sort of thing.  */-  typedef int charset[2];-  const charset cs = { 0, 0 };-  /* SunOS 4.1.1 cc rejects this.  */-  char const *const *pcpcc;-  char **ppc;-  /* NEC SVR4.0.2 mips cc rejects this.  */-  struct point {int x, y;};-  static struct point const zero = {0,0};-  /* AIX XL C 1.02.0.0 rejects this.-     It does not let you subtract one const X* pointer from another in-     an arm of an if-expression whose if-part is not a constant-     expression */-  const char *g = "string";-  pcpcc = &g + (g ? g-g : 0);-  /* HPUX 7.0 cc rejects these. */-  ++pcpcc;-  ppc = (char**) pcpcc;-  pcpcc = (char const *const *) ppc;-  { /* SCO 3.2v4 cc rejects this sort of thing.  */-    char tx;-    char *t = &tx;-    char const *s = 0 ? (char *) 0 : (char const *) 0;--    *t++ = 0;-    if (s) return 0;-  }-  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */-    int x[] = {25, 17};-    const int *foo = &x[0];-    ++foo;-  }-  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */-    typedef const int *iptr;-    iptr p = 0;-    ++p;-  }-  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying-       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */-    struct s { int j; const int *ap[3]; } bx;-    struct s *b = &bx; b->j = 5;-  }-  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */-    const int foo = 10;-    if (!foo) return 0;-  }-  return !cs[0] && !zero.x;-#endif--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  ac_cv_c_const=yes-else-  ac_cv_c_const=no-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5-$as_echo "$ac_cv_c_const" >&6; }-if test $ac_cv_c_const = no; then--$as_echo "#define const /**/" >>confdefs.h--fi---ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5-$as_echo_n "checking how to run the C preprocessor... " >&6; }-# On Suns, sometimes $CPP names a directory.-if test -n "$CPP" && test -d "$CPP"; then-  CPP=-fi-if test -z "$CPP"; then-  if ${ac_cv_prog_CPP+:} false; then :-  $as_echo_n "(cached) " >&6-else-      # Double quotes because CPP needs to be expanded-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"-    do-      ac_preproc_ok=false-for ac_c_preproc_warn_flag in '' yes-do-  # Use a header file that comes with gcc, so configuring glibc-  # with a fresh cross-compiler works.-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since-  # <limits.h> exists even on freestanding compilers.-  # On the NeXT, cc -E runs the code through the compiler's parser,-  # not just through cpp. "Syntax error" is here to catch this case.-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#ifdef __STDC__-# include <limits.h>-#else-# include <assert.h>-#endif-		     Syntax error-_ACEOF-if ac_fn_c_try_cpp "$LINENO"; then :--else-  # Broken: fails on valid input.-continue-fi-rm -f conftest.err conftest.i conftest.$ac_ext--  # OK, works on sane cases.  Now check whether nonexistent headers-  # can be detected and how.-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <ac_nonexistent.h>-_ACEOF-if ac_fn_c_try_cpp "$LINENO"; then :-  # Broken: success on invalid input.-continue-else-  # Passes both tests.-ac_preproc_ok=:-break-fi-rm -f conftest.err conftest.i conftest.$ac_ext--done-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.-rm -f conftest.i conftest.err conftest.$ac_ext-if $ac_preproc_ok; then :-  break-fi--    done-    ac_cv_prog_CPP=$CPP--fi-  CPP=$ac_cv_prog_CPP-else-  ac_cv_prog_CPP=$CPP-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5-$as_echo "$CPP" >&6; }-ac_preproc_ok=false-for ac_c_preproc_warn_flag in '' yes-do-  # Use a header file that comes with gcc, so configuring glibc-  # with a fresh cross-compiler works.-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since-  # <limits.h> exists even on freestanding compilers.-  # On the NeXT, cc -E runs the code through the compiler's parser,-  # not just through cpp. "Syntax error" is here to catch this case.-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#ifdef __STDC__-# include <limits.h>-#else-# include <assert.h>-#endif-		     Syntax error-_ACEOF-if ac_fn_c_try_cpp "$LINENO"; then :--else-  # Broken: fails on valid input.-continue-fi-rm -f conftest.err conftest.i conftest.$ac_ext--  # OK, works on sane cases.  Now check whether nonexistent headers-  # can be detected and how.-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <ac_nonexistent.h>-_ACEOF-if ac_fn_c_try_cpp "$LINENO"; then :-  # Broken: success on invalid input.-continue-else-  # Passes both tests.-ac_preproc_ok=:-break-fi-rm -f conftest.err conftest.i conftest.$ac_ext--done-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.-rm -f conftest.i conftest.err conftest.$ac_ext-if $ac_preproc_ok; then :--else-  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check-See \`config.log' for more details" "$LINENO" 5; }-fi--ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu---{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }-if ${ac_cv_path_GREP+:} false; then :-  $as_echo_n "(cached) " >&6-else-  if test -z "$GREP"; then-  ac_path_GREP_found=false-  # Loop through the user's path and test for each of PROGNAME-LIST-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    for ac_prog in grep ggrep; do-    for ac_exec_ext in '' $ac_executable_extensions; do-      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"-      as_fn_executable_p "$ac_path_GREP" || continue-# Check for GNU ac_path_GREP and select it if it is found.-  # Check for GNU $ac_path_GREP-case `"$ac_path_GREP" --version 2>&1` in-*GNU*)-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;-*)-  ac_count=0-  $as_echo_n 0123456789 >"conftest.in"-  while :-  do-    cat "conftest.in" "conftest.in" >"conftest.tmp"-    mv "conftest.tmp" "conftest.in"-    cp "conftest.in" "conftest.nl"-    $as_echo 'GREP' >> "conftest.nl"-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break-    as_fn_arith $ac_count + 1 && ac_count=$as_val-    if test $ac_count -gt ${ac_path_GREP_max-0}; then-      # Best one so far, save it but keep looking for a better one-      ac_cv_path_GREP="$ac_path_GREP"-      ac_path_GREP_max=$ac_count-    fi-    # 10*(2^10) chars as input seems more than enough-    test $ac_count -gt 10 && break-  done-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;-esac--      $ac_path_GREP_found && break 3-    done-  done-  done-IFS=$as_save_IFS-  if test -z "$ac_cv_path_GREP"; then-    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5-  fi-else-  ac_cv_path_GREP=$GREP-fi--fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5-$as_echo "$ac_cv_path_GREP" >&6; }- GREP="$ac_cv_path_GREP"---{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5-$as_echo_n "checking for egrep... " >&6; }-if ${ac_cv_path_EGREP+:} false; then :-  $as_echo_n "(cached) " >&6-else-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1-   then ac_cv_path_EGREP="$GREP -E"-   else-     if test -z "$EGREP"; then-  ac_path_EGREP_found=false-  # Loop through the user's path and test for each of PROGNAME-LIST-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    for ac_prog in egrep; do-    for ac_exec_ext in '' $ac_executable_extensions; do-      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"-      as_fn_executable_p "$ac_path_EGREP" || continue-# Check for GNU ac_path_EGREP and select it if it is found.-  # Check for GNU $ac_path_EGREP-case `"$ac_path_EGREP" --version 2>&1` in-*GNU*)-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;-*)-  ac_count=0-  $as_echo_n 0123456789 >"conftest.in"-  while :-  do-    cat "conftest.in" "conftest.in" >"conftest.tmp"-    mv "conftest.tmp" "conftest.in"-    cp "conftest.in" "conftest.nl"-    $as_echo 'EGREP' >> "conftest.nl"-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break-    as_fn_arith $ac_count + 1 && ac_count=$as_val-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then-      # Best one so far, save it but keep looking for a better one-      ac_cv_path_EGREP="$ac_path_EGREP"-      ac_path_EGREP_max=$ac_count-    fi-    # 10*(2^10) chars as input seems more than enough-    test $ac_count -gt 10 && break-  done-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;-esac--      $ac_path_EGREP_found && break 3-    done-  done-  done-IFS=$as_save_IFS-  if test -z "$ac_cv_path_EGREP"; then-    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5-  fi-else-  ac_cv_path_EGREP=$EGREP-fi--   fi-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5-$as_echo "$ac_cv_path_EGREP" >&6; }- EGREP="$ac_cv_path_EGREP"---{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5-$as_echo_n "checking for ANSI C header files... " >&6; }-if ${ac_cv_header_stdc+:} false; then :-  $as_echo_n "(cached) " >&6-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <stdlib.h>-#include <stdarg.h>-#include <string.h>-#include <float.h>--int-main ()-{--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  ac_cv_header_stdc=yes-else-  ac_cv_header_stdc=no-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext--if test $ac_cv_header_stdc = yes; then-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <string.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "memchr" >/dev/null 2>&1; then :--else-  ac_cv_header_stdc=no-fi-rm -f conftest*--fi--if test $ac_cv_header_stdc = yes; then-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <stdlib.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "free" >/dev/null 2>&1; then :--else-  ac_cv_header_stdc=no-fi-rm -f conftest*--fi--if test $ac_cv_header_stdc = yes; then-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.-  if test "$cross_compiling" = yes; then :-  :-else-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <ctype.h>-#include <stdlib.h>-#if ((' ' & 0x0FF) == 0x020)-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))-#else-# define ISLOWER(c) \-		   (('a' <= (c) && (c) <= 'i') \-		     || ('j' <= (c) && (c) <= 'r') \-		     || ('s' <= (c) && (c) <= 'z'))-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))-#endif--#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))-int-main ()-{-  int i;-  for (i = 0; i < 256; i++)-    if (XOR (islower (i), ISLOWER (i))-	|| toupper (i) != TOUPPER (i))-      return 2;-  return 0;-}-_ACEOF-if ac_fn_c_try_run "$LINENO"; then :--else-  ac_cv_header_stdc=no-fi-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \-  conftest.$ac_objext conftest.beam conftest.$ac_ext-fi--fi-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5-$as_echo "$ac_cv_header_stdc" >&6; }-if test $ac_cv_header_stdc = yes; then--$as_echo "#define STDC_HEADERS 1" >>confdefs.h--fi--# On IRIX 5.3, sys/types and inttypes.h are conflicting.-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \-		  inttypes.h stdint.h unistd.h-do :-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default-"-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :-  cat >>confdefs.h <<_ACEOF-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1-_ACEOF--fi--done---for ac_header in limits.h stdlib.h unistd.h sys/types.h fcntl.h-do :-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :-  cat >>confdefs.h <<_ACEOF-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1-_ACEOF--fi--done--for ac_header in sys/uio.h sys/socket.h netinet/in.h netinet/tcp.h-do :-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :-  cat >>confdefs.h <<_ACEOF-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1-_ACEOF--fi--done--for ac_header in sys/un.h arpa/inet.h netdb.h-do :-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :-  cat >>confdefs.h <<_ACEOF-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1-_ACEOF--fi--done--for ac_header in net/if.h netioapi.h-do :-  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :-  cat >>confdefs.h <<_ACEOF-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1-_ACEOF--fi--done---ac_fn_c_check_type "$LINENO" "struct ucred" "ac_cv_type_struct_ucred" "$ac_includes_default"-if test "x$ac_cv_type_struct_ucred" = xyes; then :--cat >>confdefs.h <<_ACEOF-#define HAVE_STRUCT_UCRED 1-_ACEOF---fi---for ac_func in gai_strerror gethostent accept4-do :-  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :-  cat >>confdefs.h <<_ACEOF-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1-_ACEOF--fi-done--for ac_func in getpeereid-do :-  ac_fn_c_check_func "$LINENO" "getpeereid" "ac_cv_func_getpeereid"-if test "x$ac_cv_func_getpeereid" = xyes; then :-  cat >>confdefs.h <<_ACEOF-#define HAVE_GETPEEREID 1-_ACEOF--fi-done---ac_fn_c_check_decl "$LINENO" "AI_ADDRCONFIG" "ac_cv_have_decl_AI_ADDRCONFIG" "$ac_includes_default"-if test "x$ac_cv_have_decl_AI_ADDRCONFIG" = xyes; then :-  ac_have_decl=1-else-  ac_have_decl=0-fi--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_ADDRCONFIG $ac_have_decl-_ACEOF-ac_fn_c_check_decl "$LINENO" "AI_ALL" "ac_cv_have_decl_AI_ALL" "$ac_includes_default"-if test "x$ac_cv_have_decl_AI_ALL" = xyes; then :-  ac_have_decl=1-else-  ac_have_decl=0-fi--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_ALL $ac_have_decl-_ACEOF-ac_fn_c_check_decl "$LINENO" "AI_NUMERICSERV" "ac_cv_have_decl_AI_NUMERICSERV" "$ac_includes_default"-if test "x$ac_cv_have_decl_AI_NUMERICSERV" = xyes; then :-  ac_have_decl=1-else-  ac_have_decl=0-fi--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_NUMERICSERV $ac_have_decl-_ACEOF-ac_fn_c_check_decl "$LINENO" "AI_V4MAPPED" "ac_cv_have_decl_AI_V4MAPPED" "$ac_includes_default"-if test "x$ac_cv_have_decl_AI_V4MAPPED" = xyes; then :-  ac_have_decl=1-else-  ac_have_decl=0-fi--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_V4MAPPED $ac_have_decl-_ACEOF--ac_fn_c_check_decl "$LINENO" "IPV6_V6ONLY" "ac_cv_have_decl_IPV6_V6ONLY" "$ac_includes_default"-if test "x$ac_cv_have_decl_IPV6_V6ONLY" = xyes; then :-  ac_have_decl=1-else-  ac_have_decl=0-fi--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_IPV6_V6ONLY $ac_have_decl-_ACEOF--ac_fn_c_check_decl "$LINENO" "IPPROTO_IP" "ac_cv_have_decl_IPPROTO_IP" "$ac_includes_default"-if test "x$ac_cv_have_decl_IPPROTO_IP" = xyes; then :-  ac_have_decl=1-else-  ac_have_decl=0-fi--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_IPPROTO_IP $ac_have_decl-_ACEOF-ac_fn_c_check_decl "$LINENO" "IPPROTO_TCP" "ac_cv_have_decl_IPPROTO_TCP" "$ac_includes_default"-if test "x$ac_cv_have_decl_IPPROTO_TCP" = xyes; then :-  ac_have_decl=1-else-  ac_have_decl=0-fi--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_IPPROTO_TCP $ac_have_decl-_ACEOF-ac_fn_c_check_decl "$LINENO" "IPPROTO_IPV6" "ac_cv_have_decl_IPPROTO_IPV6" "$ac_includes_default"-if test "x$ac_cv_have_decl_IPPROTO_IPV6" = xyes; then :-  ac_have_decl=1-else-  ac_have_decl=0-fi--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_IPPROTO_IPV6 $ac_have_decl-_ACEOF--ac_fn_c_check_decl "$LINENO" "SO_PEERCRED" "ac_cv_have_decl_SO_PEERCRED" "$ac_includes_default"-if test "x$ac_cv_have_decl_SO_PEERCRED" = xyes; then :-  ac_have_decl=1-else-  ac_have_decl=0-fi--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_SO_PEERCRED $ac_have_decl-_ACEOF---ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_control" "ac_cv_member_struct_msghdr_msg_control" "$ac_includes_default"-if test "x$ac_cv_member_struct_msghdr_msg_control" = xyes; then :--cat >>confdefs.h <<_ACEOF-#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1-_ACEOF---fi-ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_accrights" "ac_cv_member_struct_msghdr_msg_accrights" "$ac_includes_default"-if test "x$ac_cv_member_struct_msghdr_msg_accrights" = xyes; then :--cat >>confdefs.h <<_ACEOF-#define HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS 1-_ACEOF---fi--ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "$ac_includes_default"-if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then :--cat >>confdefs.h <<_ACEOF-#define HAVE_STRUCT_SOCKADDR_SA_LEN 1-_ACEOF---fi---{ $as_echo "$as_me:${as_lineno-$LINENO}: creating ./network.buildinfo" >&5-$as_echo "$as_me: creating ./network.buildinfo" >&6;}-echo "install-includes: HsNetworkConfig.h" > network.buildinfo--cat >confcache <<\_ACEOF-# This file is a shell script that caches the results of configure-# tests run on this system so they can be shared between configure-# scripts and configure runs, see configure's option --config-cache.-# It is not useful on other systems.  If it contains results you don't-# want to keep, you may remove or edit it.-#-# config.status only pays attention to the cache file if you give it-# the --recheck option to rerun configure.-#-# `ac_cv_env_foo' variables (set or unset) will be overridden when-# loading this file, other *unset* `ac_cv_foo' will be assigned the-# following values.--_ACEOF--# The following way of writing the cache mishandles newlines in values,-# but we know of no workaround that is simple, portable, and efficient.-# So, we kill variables containing newlines.-# Ultrix sh set writes to stderr and can't be redirected directly,-# and sets the high bit in the cache file unless we assign to the vars.-(-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do-    eval ac_val=\$$ac_var-    case $ac_val in #(-    *${as_nl}*)-      case $ac_var in #(-      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;-      esac-      case $ac_var in #(-      _ | IFS | as_nl) ;; #(-      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(-      *) { eval $ac_var=; unset $ac_var;} ;;-      esac ;;-    esac-  done--  (set) 2>&1 |-    case $as_nl`(ac_space=' '; set) 2>&1` in #(-    *${as_nl}ac_space=\ *)-      # `set' does not quote correctly, so add quotes: double-quote-      # substitution turns \\\\ into \\, and sed turns \\ into \.-      sed -n \-	"s/'/'\\\\''/g;-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"-      ;; #(-    *)-      # `set' quotes correctly as required by POSIX, so do not add quotes.-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"-      ;;-    esac |-    sort-) |-  sed '-     /^ac_cv_env_/b end-     t clear-     :clear-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/-     t end-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/-     :end' >>confcache-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else-  if test -w "$cache_file"; then-    if test "x$cache_file" != "x/dev/null"; then-      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5-$as_echo "$as_me: updating cache $cache_file" >&6;}-      if test ! -f "$cache_file" || test -h "$cache_file"; then-	cat confcache >"$cache_file"-      else-        case $cache_file in #(-        */* | ?:*)-	  mv -f confcache "$cache_file"$$ &&-	  mv -f "$cache_file"$$ "$cache_file" ;; #(-        *)-	  mv -f confcache "$cache_file" ;;-	esac-      fi-    fi-  else-    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}-  fi-fi-rm -f confcache--test "x$prefix" = xNONE && prefix=$ac_default_prefix-# Let make expand exec_prefix.-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'--DEFS=-DHAVE_CONFIG_H--ac_libobjs=-ac_ltlibobjs=-U=-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue-  # 1. Remove the extension, and $U if already installed.-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'-  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR-  #    will be set to the directory where LIBOBJS objects are built.-  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"-  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'-done-LIBOBJS=$ac_libobjs--LTLIBOBJS=$ac_ltlibobjs----: "${CONFIG_STATUS=./config.status}"-ac_write_fail=0-ac_clean_files_save=$ac_clean_files-ac_clean_files="$ac_clean_files $CONFIG_STATUS"-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}-as_write_fail=0-cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1-#! $SHELL-# Generated by $as_me.-# Run this file to recreate the current configuration.-# Compiler output produced by configure, useful for debugging-# configure, is in config.log if it exists.--debug=false-ac_cs_recheck=false-ac_cs_silent=false--SHELL=\${CONFIG_SHELL-$SHELL}-export SHELL-_ASEOF-cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1-## -------------------- ##-## M4sh Initialization. ##-## -------------------- ##--# Be more Bourne compatible-DUALCASE=1; export DUALCASE # for MKS sh-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :-  emulate sh-  NULLCMD=:-  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which-  # is contrary to our usage.  Disable this feature.-  alias -g '${1+"$@"}'='"$@"'-  setopt NO_GLOB_SUBST-else-  case `(set -o) 2>/dev/null` in #(-  *posix*) :-    set -o posix ;; #(-  *) :-     ;;-esac-fi---as_nl='-'-export as_nl-# Printing a long string crashes Solaris 7 /usr/bin/printf.-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo-# Prefer a ksh shell builtin over an external printf program on Solaris,-# but without wasting forks for bash or zsh.-if test -z "$BASH_VERSION$ZSH_VERSION" \-    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then-  as_echo='print -r --'-  as_echo_n='print -rn --'-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then-  as_echo='printf %s\n'-  as_echo_n='printf %s'-else-  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then-    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'-    as_echo_n='/usr/ucb/echo -n'-  else-    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'-    as_echo_n_body='eval-      arg=$1;-      case $arg in #(-      *"$as_nl"*)-	expr "X$arg" : "X\\(.*\\)$as_nl";-	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;-      esac;-      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"-    '-    export as_echo_n_body-    as_echo_n='sh -c $as_echo_n_body as_echo'-  fi-  export as_echo_body-  as_echo='sh -c $as_echo_body as_echo'-fi--# The user is always right.-if test "${PATH_SEPARATOR+set}" != set; then-  PATH_SEPARATOR=:-  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {-    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||-      PATH_SEPARATOR=';'-  }-fi---# IFS-# We need space, tab and new line, in precisely that order.  Quoting is-# there to prevent editors from complaining about space-tab.-# (If _AS_PATH_WALK were called with IFS unset, it would disable word-# splitting by setting IFS to empty value.)-IFS=" ""	$as_nl"--# Find who we are.  Look in the path if we contain no directory separator.-as_myself=-case $0 in #((-  *[\\/]* ) as_myself=$0 ;;-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in $PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break-  done-IFS=$as_save_IFS--     ;;-esac-# We did not find ourselves, most probably we were run as `sh COMMAND'-# in which case we are not to be found in the path.-if test "x$as_myself" = x; then-  as_myself=$0-fi-if test ! -f "$as_myself"; then-  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2-  exit 1-fi--# Unset variables that we do not need and which cause bugs (e.g. in-# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"-# suppresses any "Segmentation fault" message there.  '((' could-# trigger a bug in pdksh 5.2.14.-for as_var in BASH_ENV ENV MAIL MAILPATH-do eval test x\${$as_var+set} = xset \-  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :-done-PS1='$ '-PS2='> '-PS4='+ '--# NLS nuisances.-LC_ALL=C-export LC_ALL-LANGUAGE=C-export LANGUAGE--# CDPATH.-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH---# as_fn_error STATUS ERROR [LINENO LOG_FD]-# -----------------------------------------# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are-# provided, also output the error to LOG_FD, referencing LINENO. Then exit the-# script with STATUS, using 1 if that was 0.-as_fn_error ()-{-  as_status=$1; test $as_status -eq 0 && as_status=1-  if test "$4"; then-    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4-  fi-  $as_echo "$as_me: error: $2" >&2-  as_fn_exit $as_status-} # as_fn_error---# as_fn_set_status STATUS-# ------------------------# Set $? to STATUS, without forking.-as_fn_set_status ()-{-  return $1-} # as_fn_set_status--# as_fn_exit STATUS-# ------------------# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.-as_fn_exit ()-{-  set +e-  as_fn_set_status $1-  exit $1-} # as_fn_exit--# as_fn_unset VAR-# ----------------# Portably unset VAR.-as_fn_unset ()-{-  { eval $1=; unset $1;}-}-as_unset=as_fn_unset-# as_fn_append VAR VALUE-# -----------------------# Append the text in VALUE to the end of the definition contained in VAR. Take-# advantage of any shell optimizations that allow amortized linear growth over-# repeated appends, instead of the typical quadratic growth present in naive-# implementations.-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :-  eval 'as_fn_append ()-  {-    eval $1+=\$2-  }'-else-  as_fn_append ()-  {-    eval $1=\$$1\$2-  }-fi # as_fn_append--# as_fn_arith ARG...-# -------------------# Perform arithmetic evaluation on the ARGs, and store the result in the-# global $as_val. Take advantage of shells that can avoid forks. The arguments-# must be portable across $(()) and expr.-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :-  eval 'as_fn_arith ()-  {-    as_val=$(( $* ))-  }'-else-  as_fn_arith ()-  {-    as_val=`expr "$@" || test $? -eq 1`-  }-fi # as_fn_arith---if expr a : '\(a\)' >/dev/null 2>&1 &&-   test "X`expr 00001 : '.*\(...\)'`" = X001; then-  as_expr=expr-else-  as_expr=false-fi--if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then-  as_basename=basename-else-  as_basename=false-fi--if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then-  as_dirname=dirname-else-  as_dirname=false-fi--as_me=`$as_basename -- "$0" ||-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \-	 X"$0" : 'X\(//\)$' \| \-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||-$as_echo X/"$0" |-    sed '/^.*\/\([^/][^/]*\)\/*$/{-	    s//\1/-	    q-	  }-	  /^X\/\(\/\/\)$/{-	    s//\1/-	    q-	  }-	  /^X\/\(\/\).*/{-	    s//\1/-	    q-	  }-	  s/.*/./; q'`--# Avoid depending upon Character Ranges.-as_cr_letters='abcdefghijklmnopqrstuvwxyz'-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'-as_cr_Letters=$as_cr_letters$as_cr_LETTERS-as_cr_digits='0123456789'-as_cr_alnum=$as_cr_Letters$as_cr_digits--ECHO_C= ECHO_N= ECHO_T=-case `echo -n x` in #(((((--n*)-  case `echo 'xy\c'` in-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.-  xy)  ECHO_C='\c';;-  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null-       ECHO_T='	';;-  esac;;-*)-  ECHO_N='-n';;-esac--rm -f conf$$ conf$$.exe conf$$.file-if test -d conf$$.dir; then-  rm -f conf$$.dir/conf$$.file-else-  rm -f conf$$.dir-  mkdir conf$$.dir 2>/dev/null-fi-if (echo >conf$$.file) 2>/dev/null; then-  if ln -s conf$$.file conf$$ 2>/dev/null; then-    as_ln_s='ln -s'-    # ... but there are two gotchas:-    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.-    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.-    # In both cases, we have to default to `cp -pR'.-    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||-      as_ln_s='cp -pR'-  elif ln conf$$.file conf$$ 2>/dev/null; then-    as_ln_s=ln-  else-    as_ln_s='cp -pR'-  fi-else-  as_ln_s='cp -pR'-fi-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file-rmdir conf$$.dir 2>/dev/null---# as_fn_mkdir_p-# --------------# Create "$as_dir" as a directory, including parents if necessary.-as_fn_mkdir_p ()-{--  case $as_dir in #(-  -*) as_dir=./$as_dir;;-  esac-  test -d "$as_dir" || eval $as_mkdir_p || {-    as_dirs=-    while :; do-      case $as_dir in #(-      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(-      *) as_qdir=$as_dir;;-      esac-      as_dirs="'$as_qdir' $as_dirs"-      as_dir=`$as_dirname -- "$as_dir" ||-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$as_dir" : 'X\(//\)[^/]' \| \-	 X"$as_dir" : 'X\(//\)$' \| \-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||-$as_echo X"$as_dir" |-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{-	    s//\1/-	    q-	  }-	  /^X\(\/\/\)[^/].*/{-	    s//\1/-	    q-	  }-	  /^X\(\/\/\)$/{-	    s//\1/-	    q-	  }-	  /^X\(\/\).*/{-	    s//\1/-	    q-	  }-	  s/.*/./; q'`-      test -d "$as_dir" && break-    done-    test -z "$as_dirs" || eval "mkdir $as_dirs"-  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"---} # as_fn_mkdir_p-if mkdir -p . 2>/dev/null; then-  as_mkdir_p='mkdir -p "$as_dir"'-else-  test -d ./-p && rmdir ./-p-  as_mkdir_p=false-fi---# as_fn_executable_p FILE-# ------------------------# Test if FILE is an executable regular file.-as_fn_executable_p ()-{-  test -f "$1" && test -x "$1"-} # as_fn_executable_p-as_test_x='test -x'-as_executable_p=as_fn_executable_p--# Sed expression to map a string onto a valid CPP name.-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"--# Sed expression to map a string onto a valid variable name.-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"---exec 6>&1-## ----------------------------------- ##-## Main body of $CONFIG_STATUS script. ##-## ----------------------------------- ##-_ASEOF-test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1--cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1-# Save the log message, to keep $0 and so on meaningful, and to-# report actual input values of CONFIG_FILES etc. instead of their-# values after options handling.-ac_log="-This file was extended by Haskell network package $as_me 3.1.4.0, which was-generated by GNU Autoconf 2.69.  Invocation command line was--  CONFIG_FILES    = $CONFIG_FILES-  CONFIG_HEADERS  = $CONFIG_HEADERS-  CONFIG_LINKS    = $CONFIG_LINKS-  CONFIG_COMMANDS = $CONFIG_COMMANDS-  $ $0 $@--on `(hostname || uname -n) 2>/dev/null | sed 1q`-"--_ACEOF---case $ac_config_headers in *"-"*) set x $ac_config_headers; shift; ac_config_headers=$*;;-esac---cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1-# Files that config.status was made for.-config_headers="$ac_config_headers"--_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1-ac_cs_usage="\-\`$as_me' instantiates files and other configuration actions-from templates according to the current configuration.  Unless the files-and actions are specified as TAGs, all are instantiated by default.--Usage: $0 [OPTION]... [TAG]...--  -h, --help       print this help, then exit-  -V, --version    print version number and configuration settings, then exit-      --config     print configuration, then exit-  -q, --quiet, --silent-                   do not print progress messages-  -d, --debug      don't remove temporary files-      --recheck    update $as_me by reconfiguring in the same conditions-      --header=FILE[:TEMPLATE]-                   instantiate the configuration header FILE--Configuration headers:-$config_headers--Report bugs to <libraries@haskell.org>."--_ACEOF-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"-ac_cs_version="\\-Haskell network package config.status 3.1.4.0-configured by $0, generated by GNU Autoconf 2.69,-  with options \\"\$ac_cs_config\\"--Copyright (C) 2012 Free Software Foundation, Inc.-This config.status script is free software; the Free Software Foundation-gives unlimited permission to copy, distribute and modify it."--ac_pwd='$ac_pwd'-srcdir='$srcdir'-test -n "\$AWK" || AWK=awk-_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1-# The default lists apply if the user does not specify any file.-ac_need_defaults=:-while test $# != 0-do-  case $1 in-  --*=?*)-    ac_option=`expr "X$1" : 'X\([^=]*\)='`-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`-    ac_shift=:-    ;;-  --*=)-    ac_option=`expr "X$1" : 'X\([^=]*\)='`-    ac_optarg=-    ac_shift=:-    ;;-  *)-    ac_option=$1-    ac_optarg=$2-    ac_shift=shift-    ;;-  esac--  case $ac_option in-  # Handling of the options.-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)-    ac_cs_recheck=: ;;-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )-    $as_echo "$ac_cs_version"; exit ;;-  --config | --confi | --conf | --con | --co | --c )-    $as_echo "$ac_cs_config"; exit ;;-  --debug | --debu | --deb | --de | --d | -d )-    debug=: ;;-  --header | --heade | --head | --hea )-    $ac_shift-    case $ac_optarg in-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;-    esac-    as_fn_append CONFIG_HEADERS " '$ac_optarg'"-    ac_need_defaults=false;;-  --he | --h)-    # Conflict between --help and --header-    as_fn_error $? "ambiguous option: \`$1'-Try \`$0 --help' for more information.";;-  --help | --hel | -h )-    $as_echo "$ac_cs_usage"; exit ;;-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \-  | -silent | --silent | --silen | --sile | --sil | --si | --s)-    ac_cs_silent=: ;;--  # This is an error.-  -*) as_fn_error $? "unrecognized option: \`$1'-Try \`$0 --help' for more information." ;;--  *) as_fn_append ac_config_targets " $1"-     ac_need_defaults=false ;;--  esac-  shift-done--ac_configure_extra_args=--if $ac_cs_silent; then-  exec 6>/dev/null-  ac_configure_extra_args="$ac_configure_extra_args --silent"-fi--_ACEOF-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1-if \$ac_cs_recheck; then-  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion-  shift-  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6-  CONFIG_SHELL='$SHELL'-  export CONFIG_SHELL-  exec "\$@"-fi--_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1-exec 5>>config.log-{-  echo-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX-## Running $as_me. ##-_ASBOX-  $as_echo "$ac_log"-} >&5--_ACEOF-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1-_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1--# Handling of arguments.-for ac_config_target in $ac_config_targets-do-  case $ac_config_target in-    "include/HsNetworkConfig.h") CONFIG_HEADERS="$CONFIG_HEADERS include/HsNetworkConfig.h" ;;--  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;-  esac-done---# If the user did not use the arguments to specify the items to instantiate,-# then the envvar interface is used.  Set only those that are not.-# We use the long form for the default assignment because of an extremely-# bizarre bug on SunOS 4.1.3.-if $ac_need_defaults; then-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers-fi--# Have a temporary directory for convenience.  Make it in the build tree-# simply because there is no reason against having it here, and in addition,-# creating and moving files from /tmp can sometimes cause problems.-# Hook for its removal unless debugging.-# Note that there is a small window in which the directory will not be cleaned:-# after its creation but before its name has been assigned to `$tmp'.-$debug ||-{-  tmp= ac_tmp=-  trap 'exit_status=$?-  : "${ac_tmp:=$tmp}"-  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status-' 0-  trap 'as_fn_exit 1' 1 2 13 15-}-# Create a (secure) tmp directory for tmp files.--{-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&-  test -d "$tmp"-}  ||-{-  tmp=./conf$$-$RANDOM-  (umask 077 && mkdir "$tmp")-} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5-ac_tmp=$tmp--# Set up the scripts for CONFIG_HEADERS section.-# No need to generate them if there are no CONFIG_HEADERS.-# This happens for instance with `./config.status Makefile'.-if test -n "$CONFIG_HEADERS"; then-cat >"$ac_tmp/defines.awk" <<\_ACAWK ||-BEGIN {-_ACEOF--# Transform confdefs.h into an awk script `defines.awk', embedded as-# here-document in config.status, that substitutes the proper values into-# config.h.in to produce config.h.--# Create a delimiter string that does not exist in confdefs.h, to ease-# handling of long lines.-ac_delim='%!_!# '-for ac_last_try in false false :; do-  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`-  if test -z "$ac_tt"; then-    break-  elif $ac_last_try; then-    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5-  else-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "-  fi-done--# For the awk script, D is an array of macro values keyed by name,-# likewise P contains macro parameters if any.  Preserve backslash-# newline sequences.--ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*-sed -n '-s/.\{148\}/&'"$ac_delim"'/g-t rset-:rset-s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /-t def-d-:def-s/\\$//-t bsnl-s/["\\]/\\&/g-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\-D["\1"]=" \3"/p-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p-d-:bsnl-s/["\\]/\\&/g-s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\-D["\1"]=" \3\\\\\\n"\\/p-t cont-s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p-t cont-d-:cont-n-s/.\{148\}/&'"$ac_delim"'/g-t clear-:clear-s/\\$//-t bsnlc-s/["\\]/\\&/g; s/^/"/; s/$/"/p-d-:bsnlc-s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p-b cont-' <confdefs.h | sed '-s/'"$ac_delim"'/"\\\-"/g' >>$CONFIG_STATUS || ac_write_fail=1--cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1-  for (key in D) D_is_set[key] = 1-  FS = ""-}-/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {-  line = \$ 0-  split(line, arg, " ")-  if (arg[1] == "#") {-    defundef = arg[2]-    mac1 = arg[3]-  } else {-    defundef = substr(arg[1], 2)-    mac1 = arg[2]-  }-  split(mac1, mac2, "(") #)-  macro = mac2[1]-  prefix = substr(line, 1, index(line, defundef) - 1)-  if (D_is_set[macro]) {-    # Preserve the white space surrounding the "#".-    print prefix "define", macro P[macro] D[macro]-    next-  } else {-    # Replace #undef with comments.  This is necessary, for example,-    # in the case of _POSIX_SOURCE, which is predefined and required-    # on some systems where configure will not decide to define it.-    if (defundef == "undef") {-      print "/*", prefix defundef, macro, "*/"-      next-    }-  }-}-{ print }-_ACAWK-_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1-  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5-fi # test -n "$CONFIG_HEADERS"---eval set X "    :H $CONFIG_HEADERS    "-shift-for ac_tag-do-  case $ac_tag in-  :[FHLC]) ac_mode=$ac_tag; continue;;-  esac-  case $ac_mode$ac_tag in-  :[FHL]*:*);;-  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;-  :[FH]-) ac_tag=-:-;;-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;-  esac-  ac_save_IFS=$IFS-  IFS=:-  set x $ac_tag-  IFS=$ac_save_IFS-  shift-  ac_file=$1-  shift--  case $ac_mode in-  :L) ac_source=$1;;-  :[FH])-    ac_file_inputs=-    for ac_f-    do-      case $ac_f in-      -) ac_f="$ac_tmp/stdin";;-      *) # Look for the file first in the build tree, then in the source tree-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,-	 # because $ac_f cannot contain `:'.-	 test -f "$ac_f" ||-	   case $ac_f in-	   [\\/$]*) false;;-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;-	   esac ||-	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;-      esac-      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac-      as_fn_append ac_file_inputs " '$ac_f'"-    done--    # Let's still pretend it is `configure' which instantiates (i.e., don't-    # use $as_me), people would be surprised to read:-    #    /* config.h.  Generated by config.status.  */-    configure_input='Generated from '`-	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'-	`' by configure.'-    if test x"$ac_file" != x-; then-      configure_input="$ac_file.  $configure_input"-      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5-$as_echo "$as_me: creating $ac_file" >&6;}-    fi-    # Neutralize special characters interpreted by sed in replacement strings.-    case $configure_input in #(-    *\&* | *\|* | *\\* )-       ac_sed_conf_input=`$as_echo "$configure_input" |-       sed 's/[\\\\&|]/\\\\&/g'`;; #(-    *) ac_sed_conf_input=$configure_input;;-    esac--    case $ac_tag in-    *:-:* | *:-) cat >"$ac_tmp/stdin" \-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;-    esac-    ;;-  esac--  ac_dir=`$as_dirname -- "$ac_file" ||-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$ac_file" : 'X\(//\)[^/]' \| \-	 X"$ac_file" : 'X\(//\)$' \| \-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||-$as_echo X"$ac_file" |-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{-	    s//\1/-	    q-	  }-	  /^X\(\/\/\)[^/].*/{-	    s//\1/-	    q-	  }-	  /^X\(\/\/\)$/{-	    s//\1/-	    q-	  }-	  /^X\(\/\).*/{-	    s//\1/-	    q-	  }-	  s/.*/./; q'`-  as_dir="$ac_dir"; as_fn_mkdir_p-  ac_builddir=.--case "$ac_dir" in-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;-*)-  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`-  # A ".." for each directory in $ac_dir_suffix.-  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`-  case $ac_top_builddir_sub in-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;-  esac ;;-esac-ac_abs_top_builddir=$ac_pwd-ac_abs_builddir=$ac_pwd$ac_dir_suffix-# for backward compatibility:-ac_top_builddir=$ac_top_build_prefix--case $srcdir in-  .)  # We are building in place.-    ac_srcdir=.-    ac_top_srcdir=$ac_top_builddir_sub-    ac_abs_top_srcdir=$ac_pwd ;;-  [\\/]* | ?:[\\/]* )  # Absolute name.-    ac_srcdir=$srcdir$ac_dir_suffix;-    ac_top_srcdir=$srcdir-    ac_abs_top_srcdir=$srcdir ;;-  *) # Relative name.-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix-    ac_top_srcdir=$ac_top_build_prefix$srcdir-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;-esac-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix---  case $ac_mode in--  :H)-  #-  # CONFIG_HEADER-  #-  if test x"$ac_file" != x-; then-    {-      $as_echo "/* $configure_input  */" \-      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"-    } >"$ac_tmp/config.h" \-      || as_fn_error $? "could not create $ac_file" "$LINENO" 5-    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then-      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5-$as_echo "$as_me: $ac_file is unchanged" >&6;}-    else-      rm -f "$ac_file"-      mv "$ac_tmp/config.h" "$ac_file" \-	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5-    fi-  else-    $as_echo "/* $configure_input  */" \-      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \-      || as_fn_error $? "could not create -" "$LINENO" 5-  fi- ;;---  esac--done # for ac_tag---as_fn_exit 0-_ACEOF-ac_clean_files=$ac_clean_files_save--test $ac_write_fail = 0 ||-  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5---# configure is writing to config.log, and then calls config.status.-# config.status does its own redirection, appending to config.log.-# Unfortunately, on DOS this fails, as config.log is still kept open-# by configure, so config.status won't be able to write to it; its-# output is simply discarded.  So we exec the FD to /dev/null,-# effectively closing config.log, so it can be properly (re)opened and-# appended to by config.status.  When coming back to configure, we-# need to make the FD available again.-if test "$no_create" != yes; then-  ac_cs_success=:-  ac_config_status_args=-  test "$silent" = yes &&-    ac_config_status_args="$ac_config_status_args --quiet"-  exec 5>/dev/null-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false-  exec 5>>config.log-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which-  # would make configure fail if this is the last instruction.-  $ac_cs_success || as_fn_exit 1-fi-if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}-fi+# Generated by GNU Autoconf 2.73 for Haskell network package 3.2.7.0.+#+# Report bugs to <libraries@haskell.org>.+#+#+# Copyright (C) 1992-1996, 1998-2017, 2020-2026 Free Software Foundation,+# Inc.+#+#+# This configure script is free software; the Free Software Foundation+# gives unlimited permission to copy, distribute and modify it.+## -------------------- ##+## M4sh Initialization. ##+## -------------------- ##++# Be more Bourne compatible+DUALCASE=1; export DUALCASE # for MKS sh+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1+then :+  emulate sh+  NULLCMD=:+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which+  # contradicts POSIX and common usage.  Disable this.+  alias -g '${1+"$@"}'='"$@"'+  setopt NO_GLOB_SUBST+else case e in #(+  e) case `(set -o) 2>/dev/null` in #(+  *posix*) :+    set -o posix ;; #(+  *) :+     ;;+esac ;;+esac+fi++++# Reset variables that may have inherited troublesome values from+# the environment.++# IFS needs to be set, to space, tab, and newline, in precisely that order.+# (If _AS_PATH_WALK were called with IFS unset, it would have the+# side effect of setting IFS to empty, thus disabling word splitting.)+# Quoting is to prevent editors from complaining about space-tab.+as_nl='+'+export as_nl+IFS=" ""	$as_nl"++PS1='$ '+PS2='> '+PS4='+ '++# Ensure predictable behavior from utilities with locale-dependent output.+LC_ALL=C+export LC_ALL+LANGUAGE=C+export LANGUAGE++# We cannot yet rely on "unset" to work, but we need these variables+# to be unset--not just set to an empty or harmless value--now, to+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct+# also avoids known problems related to "unset" and subshell syntax+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH+do eval test \${$as_var+y} \+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :+done++# Ensure that fds 0, 1, and 2 are open.+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi+if (exec 3>&2)            ; then :; else exec 2>/dev/null; fi++# The user is always right.+if ${PATH_SEPARATOR+false} :; then+  PATH_SEPARATOR=:+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||+      PATH_SEPARATOR=';'+  }+fi+++# Find who we are.  Look in the path if we contain no directory separator.+as_myself=+case $0 in #((+  *[\\/]* ) as_myself=$0 ;;+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    test -r "$as_dir$0" && as_myself=$as_dir$0 && break+  done+IFS=$as_save_IFS++     ;;+esac+# We did not find ourselves, most probably we were run as 'sh COMMAND'+# in which case we are not to be found in the path.+if test "x$as_myself" = x; then+  as_myself=$0+fi+if test ! -f "$as_myself"; then+  printf '%s\n' "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2+  exit 1+fi+++# Use a proper internal environment variable to ensure we don't fall+  # into an infinite loop, continuously re-executing ourselves.+  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then+    _as_can_reexec=no; export _as_can_reexec;+    # We cannot yet assume a decent shell, so we have to provide a+# neutralization value for shells without unset; and this also+# works around shells that cannot unset nonexistent variables.+# Preserve -v and -x to the replacement shell.+BASH_ENV=/dev/null+ENV=/dev/null+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV+case $- in # ((((+  *v*x* | *x*v* ) as_opts=-vx ;;+  *v* ) as_opts=-v ;;+  *x* ) as_opts=-x ;;+  * ) as_opts= ;;+esac+case $# in # ((+  0) exec $CONFIG_SHELL $as_opts "$as_myself" ;;+  *) exec $CONFIG_SHELL $as_opts "$as_myself" "$@" ;;+esac+# Admittedly, this is quite paranoid, since all the known shells bail+# out after a failed 'exec'.+printf '%s\n' "$0: could not re-execute with $CONFIG_SHELL" >&2+exit 255+  fi+  # We don't want this to propagate to other subprocesses.+          { _as_can_reexec=; unset _as_can_reexec;}+if test "x$CONFIG_SHELL" = x; then+  as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1+then :+  emulate sh+  NULLCMD=:+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which+  # contradicts POSIX and common usage.  Disable this.+  alias -g '\${1+\"\$@\"}'='\"\$@\"'+  setopt NO_GLOB_SUBST+else case e in #(+  e) case \`(set -o) 2>/dev/null\` in #(+  *posix*) :+    set -o posix ;; #(+  *) :+     ;;+esac ;;+esac+fi+"+  as_required="as_fn_return () { (exit \$1); }+as_fn_success () { as_fn_return 0; }+as_fn_failure () { as_fn_return 1; }+as_fn_ret_success () { return 0; }+as_fn_ret_failure () { return 1; }++exitcode=0+as_fn_success || { exitcode=1; echo as_fn_success failed.; }+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }+if ( set x; as_fn_ret_success y && test x = \"\$1\" )+then :++else case e in #(+  e) exitcode=1; echo positional parameters were not saved. ;;+esac+fi+test x\$exitcode = x0 || exit 1+blah=\$(echo \$(echo blah))+test x\"\$blah\" = xblah || exit 1+test -x / || exit 1"+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"+  if (eval "$as_required") 2>/dev/null+then :+  as_have_required=yes+else case e in #(+  e) as_have_required=no ;;+esac+fi+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null+then :++else case e in #(+  e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+as_found=false+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+  as_found=:+  case $as_dir in #(+	 /*)+	   for as_base in sh bash ksh sh5; do+	     # Try only shells that exist, to save several forks.+	     as_shell=$as_dir$as_base+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&+		    as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null+then :+  CONFIG_SHELL=$as_shell as_have_required=yes+		   if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null+then :+  break 2+fi+fi+	   done;;+       esac+  as_found=false+done+IFS=$as_save_IFS+if $as_found+then :++else case e in #(+  e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&+	      as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null+then :+  CONFIG_SHELL=$SHELL as_have_required=yes+fi ;;+esac+fi+++      if test "x$CONFIG_SHELL" != x+then :+  export CONFIG_SHELL+             # We cannot yet assume a decent shell, so we have to provide a+# neutralization value for shells without unset; and this also+# works around shells that cannot unset nonexistent variables.+# Preserve -v and -x to the replacement shell.+BASH_ENV=/dev/null+ENV=/dev/null+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV+case $- in # ((((+  *v*x* | *x*v* ) as_opts=-vx ;;+  *v* ) as_opts=-v ;;+  *x* ) as_opts=-x ;;+  * ) as_opts= ;;+esac+case $# in # ((+  0) exec $CONFIG_SHELL $as_opts "$as_myself" ;;+  *) exec $CONFIG_SHELL $as_opts "$as_myself" "$@" ;;+esac+# Admittedly, this is quite paranoid, since all the known shells bail+# out after a failed 'exec'.+printf '%s\n' "$0: could not re-execute with $CONFIG_SHELL" >&2+exit 255+fi++    if test x$as_have_required = xno+then :+  printf '%s\n' "$0: This script requires a shell more modern than all"+  printf '%s\n' "$0: the shells that I found on your system."+  if test ${ZSH_VERSION+y} ; then+    printf '%s\n' "$0: In particular, zsh $ZSH_VERSION has bugs and should"+    printf '%s\n' "$0: be upgraded to zsh 4.3.4 or later."+  else+    printf '%s\n' "$0: Please tell bug-autoconf@gnu.org and+$0: libraries@haskell.org about your system, including any+$0: error possibly output before this message. Then install+$0: a modern shell, or manually run the script under such a+$0: shell if you do have one."+  fi+  exit 1+fi ;;+esac+fi+fi+SHELL=${CONFIG_SHELL-/bin/sh}+export SHELL+# Unset more variables known to interfere with behavior of common tools.+CLICOLOR_FORCE= GREP_OPTIONS=+unset CLICOLOR_FORCE GREP_OPTIONS++## --------------------- ##+## M4sh Shell Functions. ##+## --------------------- ##+# as_fn_unset VAR+# ---------------+# Portably unset VAR.+as_fn_unset ()+{+  { eval $1=; unset $1;}+}+as_unset=as_fn_unset+++# as_fn_set_status STATUS+# -----------------------+# Set $? to STATUS, without forking.+as_fn_set_status ()+{+  return $1+} # as_fn_set_status++# as_fn_exit STATUS+# -----------------+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.+as_fn_exit ()+{+  set +e+  as_fn_set_status $1+  exit $1+} # as_fn_exit++# as_fn_mkdir_p+# -------------+# Create "$as_dir" as a directory, including parents if necessary.+as_fn_mkdir_p ()+{++  case $as_dir in #(+  -*) as_dir=./$as_dir;;+  esac+  test -d "$as_dir" || eval $as_mkdir_p || {+    as_dirs=+    while :; do+      case $as_dir in #(+      *\'*) as_qdir=`printf '%s\n' "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(+      *) as_qdir=$as_dir;;+      esac+      as_dirs="'$as_qdir' $as_dirs"+      as_dir=`$as_dirname -- "$as_dir" ||+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \+	 X"$as_dir" : 'X\(//\)[^/]' \| \+	 X"$as_dir" : 'X\(//\)$' \| \+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||+printf '%s\n' X"$as_dir" |+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{+	    s//\1/+	    q+	  }+	  /^X\(\/\/\)[^/].*/{+	    s//\1/+	    q+	  }+	  /^X\(\/\/\)$/{+	    s//\1/+	    q+	  }+	  /^X\(\/\).*/{+	    s//\1/+	    q+	  }+	  s/.*/./; q'`+      test -d "$as_dir" && break+    done+    test -z "$as_dirs" || eval "mkdir $as_dirs"+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"+++} # as_fn_mkdir_p++# as_fn_executable_p FILE+# -----------------------+# Test if FILE is an executable regular file.+as_fn_executable_p ()+{+  test -f "$1" && test -x "$1"+} # as_fn_executable_p+# as_fn_append VAR VALUE+# ----------------------+# Append the text in VALUE to the end of the definition contained in VAR. Take+# advantage of any shell optimizations that allow amortized linear growth over+# repeated appends, instead of the typical quadratic growth present in naive+# implementations.+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null+then :+  eval 'as_fn_append ()+  {+    eval $1+=\$2+  }'+else case e in #(+  e) as_fn_append ()+  {+    eval $1=\$$1\$2+  } ;;+esac+fi # as_fn_append++# as_fn_arith ARG...+# ------------------+# Perform arithmetic evaluation on the ARGs, and store the result in the+# global $as_val. Take advantage of shells that can avoid forks. The arguments+# must be portable across $(()) and expr.+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null+then :+  eval 'as_fn_arith ()+  {+    as_val=$(( $* ))+  }'+else case e in #(+  e) as_fn_arith ()+  {+    as_val=`expr "$@" || test $? -eq 1`+  } ;;+esac+fi # as_fn_arith+++# as_fn_error STATUS ERROR [LINENO LOG_FD]+# ----------------------------------------+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the+# script with STATUS, using 1 if that was 0.+as_fn_error ()+{+  as_status=$1; test $as_status -eq 0 && as_status=1+  if test "$4"; then+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: $2" >&$4+  fi+  printf '%s\n' "$as_me: error: $2" >&2+  as_fn_exit $as_status+} # as_fn_error++if expr a : '\(a\)' >/dev/null 2>&1 &&+   test "X`expr 00001 : '.*\(...\)'`" = X001; then+  as_expr=expr+else+  as_expr=false+fi++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then+  as_basename=basename+else+  as_basename=false+fi++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then+  as_dirname=dirname+else+  as_dirname=false+fi++as_me=`$as_basename -- "$0" ||+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \+	 X"$0" : 'X\(//\)$' \| \+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||+printf '%s\n' X/"$0" |+    sed '/^.*\/\([^/][^/]*\)\/*$/{+	    s//\1/+	    q+	  }+	  /^X\/\(\/\/\)$/{+	    s//\1/+	    q+	  }+	  /^X\/\(\/\).*/{+	    s//\1/+	    q+	  }+	  s/.*/./; q'`++# Avoid depending upon Character Ranges.+as_cr_letters='abcdefghijklmnopqrstuvwxyz'+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'+as_cr_Letters=$as_cr_letters$as_cr_LETTERS+as_cr_digits='0123456789'+as_cr_alnum=$as_cr_Letters$as_cr_digits+++  as_lineno_1=$LINENO as_lineno_1a=$LINENO+  as_lineno_2=$LINENO as_lineno_2a=$LINENO+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)+  sed -n '+    p+    /[$]LINENO/=+  ' <$as_myself |+    sed '+      t clear+      :clear+      s/[$]LINENO.*/&-/+      t lineno+      b+      :lineno+      N+      :loop+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/+      t loop+      s/-\n.*//+    ' >$as_me.lineno &&+  chmod +x "$as_me.lineno" ||+    { printf '%s\n' "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }++  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have+  # already done that, so ensure we don't try to do so again and fall+  # in an infinite loop.  This has already happened in practice.+  _as_can_reexec=no; export _as_can_reexec+  # Don't try to exec as it changes $[0], causing all sort of problems+  # (the dirname of $[0] is not the place where we might find the+  # original and so on.  Autoconf is especially sensitive to this).+  . "./$as_me.lineno"+  # Exit status is that of the last command.+  exit+}++rm -f conf$$ conf$$.exe conf$$.file+if test -d conf$$.dir; then+  rm -f conf$$.dir/conf$$.file+else+  rm -f conf$$.dir+  mkdir conf$$.dir 2>/dev/null+fi+if (echo >conf$$.file) 2>/dev/null; then+  if ln -s conf$$.file conf$$ 2>/dev/null; then+    as_ln_s='ln -s'+    # ... but there are two gotchas:+    # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail.+    # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable.+    # In both cases, we have to default to 'cp -pR'.+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||+      as_ln_s='cp -pR'+  elif ln conf$$.file conf$$ 2>/dev/null; then+    as_ln_s=ln+  else+    as_ln_s='cp -pR'+  fi+else+  as_ln_s='cp -pR'+fi+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file+rmdir conf$$.dir 2>/dev/null++if mkdir -p . 2>/dev/null; then+  as_mkdir_p='mkdir -p "$as_dir"'+else+  test -d ./-p && rmdir ./-p+  as_mkdir_p=false+fi++as_test_x='test -x'+as_executable_p=as_fn_executable_p++# Sed expression to map a string onto a valid CPP name.+as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"+as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated++# Sed expression to map a string onto a valid variable name.+as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g"+as_tr_sh="eval sed '$as_sed_sh'" # deprecated+++test -n "$DJDIR" || exec 7<&0 </dev/null+exec 6>&1++# Name of the host.+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,+# so uname gets run too.+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`++#+# Initializations.+#+ac_default_prefix=/usr/local+ac_clean_CONFIG_STATUS=+ac_clean_files=+ac_config_libobj_dir=.+LIBOBJS=+cross_compiling=no+subdirs=+MFLAGS=+MAKEFLAGS=++# Identity of this package.+PACKAGE_NAME='Haskell network package'+PACKAGE_TARNAME='network'+PACKAGE_VERSION='3.2.7.0'+PACKAGE_STRING='Haskell network package 3.2.7.0'+PACKAGE_BUGREPORT='libraries@haskell.org'+PACKAGE_URL=''++ac_unique_file="include/HsNet.h"+# Factoring default headers for most tests.+ac_includes_default="\+#include <stddef.h>+#ifdef HAVE_STDIO_H+# include <stdio.h>+#endif+#ifdef HAVE_STDLIB_H+# include <stdlib.h>+#endif+#ifdef HAVE_STRING_H+# include <string.h>+#endif+#ifdef HAVE_INTTYPES_H+# include <inttypes.h>+#endif+#ifdef HAVE_STDINT_H+# include <stdint.h>+#endif+#ifdef HAVE_STRINGS_H+# include <strings.h>+#endif+#ifdef HAVE_SYS_TYPES_H+# include <sys/types.h>+#endif+#ifdef HAVE_SYS_STAT_H+# include <sys/stat.h>+#endif+#ifdef HAVE_UNISTD_H+# include <unistd.h>+#endif"++ac_header_c_list=+ac_subst_vars='LTLIBOBJS+LIBOBJS+OBJEXT+EXEEXT+ac_ct_CC+CPPFLAGS+LDFLAGS+CFLAGS+CC+host_os+host_vendor+host_cpu+host+build_os+build_vendor+build_cpu+build+ECHO_T+ECHO_N+ECHO_C+target_alias+host_alias+build_alias+LIBS+DEFS+mandir+localedir+libdir+psdir+pdfdir+dvidir+htmldir+infodir+docdir+oldincludedir+includedir+runstatedir+localstatedir+sharedstatedir+sysconfdir+datadir+datarootdir+libexecdir+sbindir+bindir+program_transform_name+prefix+exec_prefix+PACKAGE_URL+PACKAGE_BUGREPORT+PACKAGE_STRING+PACKAGE_VERSION+PACKAGE_TARNAME+PACKAGE_NAME+PATH_SEPARATOR+SHELL'+ac_subst_files=''+ac_user_opts='+enable_option_checking+with_cc+with_compiler+with_hc+'+      ac_precious_vars='build_alias+host_alias+target_alias+CC+CFLAGS+LDFLAGS+LIBS+CPPFLAGS'+++# Initialize some variables set by options.+ac_init_help=+ac_init_version=false+ac_unrecognized_opts=+ac_unrecognized_sep=+# The variables have the same names as the options, with+# dashes changed to underlines.+cache_file=/dev/null+exec_prefix=NONE+no_create=+no_recursion=+prefix=NONE+program_prefix=NONE+program_suffix=NONE+program_transform_name=s,x,x,+silent=+site=+srcdir=+verbose=+x_includes=NONE+x_libraries=NONE++# Installation directory options.+# These are left unexpanded so users can "make install exec_prefix=/foo"+# and all the variables that are supposed to be based on exec_prefix+# by default will actually change.+# Use braces instead of parens because sh, perl, etc. also accept them.+# (The list follows the same order as the GNU Coding Standards.)+bindir='${exec_prefix}/bin'+sbindir='${exec_prefix}/sbin'+libexecdir='${exec_prefix}/libexec'+datarootdir='${prefix}/share'+datadir='${datarootdir}'+sysconfdir='${prefix}/etc'+sharedstatedir='${prefix}/com'+localstatedir='${prefix}/var'+runstatedir='${localstatedir}/run'+includedir='${prefix}/include'+oldincludedir='/usr/include'+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'+infodir='${datarootdir}/info'+htmldir='${docdir}'+dvidir='${docdir}'+pdfdir='${docdir}'+psdir='${docdir}'+libdir='${exec_prefix}/lib'+localedir='${datarootdir}/locale'+mandir='${datarootdir}/man'++ac_prev=+ac_dashdash=+for ac_option+do+  # If the previous option needs an argument, assign it.+  if test -n "$ac_prev"; then+    eval $ac_prev=\$ac_option+    ac_prev=+    continue+  fi++  case $ac_option in+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;+  *=)   ac_optarg= ;;+  *)    ac_optarg=yes ;;+  esac++  case $ac_dashdash$ac_option in+  --)+    ac_dashdash=yes ;;++  -bindir | --bindir | --bindi | --bind | --bin | --bi)+    ac_prev=bindir ;;+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)+    bindir=$ac_optarg ;;++  -build | --build | --buil | --bui | --bu)+    ac_prev=build_alias ;;+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)+    build_alias=$ac_optarg ;;++  -cache-file | --cache-file | --cache-fil | --cache-fi \+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)+    ac_prev=cache_file ;;+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)+    cache_file=$ac_optarg ;;++  --config-cache | -C)+    cache_file=config.cache ;;++  -datadir | --datadir | --datadi | --datad)+    ac_prev=datadir ;;+  -datadir=* | --datadir=* | --datadi=* | --datad=*)+    datadir=$ac_optarg ;;++  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \+  | --dataroo | --dataro | --datar)+    ac_prev=datarootdir ;;+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)+    datarootdir=$ac_optarg ;;++  -disable-* | --disable-*)+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`+    # Reject names that are not valid shell variable names.+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&+      as_fn_error $? "invalid feature name: '$ac_useropt'"+    ac_useropt_orig=$ac_useropt+    ac_useropt=`printf '%s\n' "$ac_useropt" | sed 's/[-+.]/_/g'`+    case $ac_user_opts in+      *"+"enable_$ac_useropt"+"*) ;;+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"+	 ac_unrecognized_sep=', ';;+    esac+    eval enable_$ac_useropt=no ;;++  -docdir | --docdir | --docdi | --doc | --do)+    ac_prev=docdir ;;+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)+    docdir=$ac_optarg ;;++  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)+    ac_prev=dvidir ;;+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)+    dvidir=$ac_optarg ;;++  -enable-* | --enable-*)+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`+    # Reject names that are not valid shell variable names.+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&+      as_fn_error $? "invalid feature name: '$ac_useropt'"+    ac_useropt_orig=$ac_useropt+    ac_useropt=`printf '%s\n' "$ac_useropt" | sed 's/[-+.]/_/g'`+    case $ac_user_opts in+      *"+"enable_$ac_useropt"+"*) ;;+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"+	 ac_unrecognized_sep=', ';;+    esac+    eval enable_$ac_useropt=\$ac_optarg ;;++  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \+  | --exec | --exe | --ex)+    ac_prev=exec_prefix ;;+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \+  | --exec=* | --exe=* | --ex=*)+    exec_prefix=$ac_optarg ;;++  -gas | --gas | --ga | --g)+    # Obsolete; use --with-gas.+    with_gas=yes ;;++  -help | --help | --hel | --he | -h)+    ac_init_help=long ;;+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)+    ac_init_help=recursive ;;+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)+    ac_init_help=short ;;++  -host | --host | --hos | --ho)+    ac_prev=host_alias ;;+  -host=* | --host=* | --hos=* | --ho=*)+    host_alias=$ac_optarg ;;++  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)+    ac_prev=htmldir ;;+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \+  | --ht=*)+    htmldir=$ac_optarg ;;++  -includedir | --includedir | --includedi | --included | --include \+  | --includ | --inclu | --incl | --inc)+    ac_prev=includedir ;;+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \+  | --includ=* | --inclu=* | --incl=* | --inc=*)+    includedir=$ac_optarg ;;++  -infodir | --infodir | --infodi | --infod | --info | --inf)+    ac_prev=infodir ;;+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)+    infodir=$ac_optarg ;;++  -libdir | --libdir | --libdi | --libd)+    ac_prev=libdir ;;+  -libdir=* | --libdir=* | --libdi=* | --libd=*)+    libdir=$ac_optarg ;;++  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \+  | --libexe | --libex | --libe)+    ac_prev=libexecdir ;;+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \+  | --libexe=* | --libex=* | --libe=*)+    libexecdir=$ac_optarg ;;++  -localedir | --localedir | --localedi | --localed | --locale)+    ac_prev=localedir ;;+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)+    localedir=$ac_optarg ;;++  -localstatedir | --localstatedir | --localstatedi | --localstated \+  | --localstate | --localstat | --localsta | --localst | --locals)+    ac_prev=localstatedir ;;+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)+    localstatedir=$ac_optarg ;;++  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)+    ac_prev=mandir ;;+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)+    mandir=$ac_optarg ;;++  -nfp | --nfp | --nf)+    # Obsolete; use --without-fp.+    with_fp=no ;;++  -no-create | --no-create | --no-creat | --no-crea | --no-cre \+  | --no-cr | --no-c | -n)+    no_create=yes ;;++  -no-recursion | --no-recursion | --no-recursio | --no-recursi \+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)+    no_recursion=yes ;;++  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \+  | --oldin | --oldi | --old | --ol | --o)+    ac_prev=oldincludedir ;;+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)+    oldincludedir=$ac_optarg ;;++  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)+    ac_prev=prefix ;;+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)+    prefix=$ac_optarg ;;++  -program-prefix | --program-prefix | --program-prefi | --program-pref \+  | --program-pre | --program-pr | --program-p)+    ac_prev=program_prefix ;;+  -program-prefix=* | --program-prefix=* | --program-prefi=* \+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)+    program_prefix=$ac_optarg ;;++  -program-suffix | --program-suffix | --program-suffi | --program-suff \+  | --program-suf | --program-su | --program-s)+    ac_prev=program_suffix ;;+  -program-suffix=* | --program-suffix=* | --program-suffi=* \+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)+    program_suffix=$ac_optarg ;;++  -program-transform-name | --program-transform-name \+  | --program-transform-nam | --program-transform-na \+  | --program-transform-n | --program-transform- \+  | --program-transform | --program-transfor \+  | --program-transfo | --program-transf \+  | --program-trans | --program-tran \+  | --progr-tra | --program-tr | --program-t)+    ac_prev=program_transform_name ;;+  -program-transform-name=* | --program-transform-name=* \+  | --program-transform-nam=* | --program-transform-na=* \+  | --program-transform-n=* | --program-transform-=* \+  | --program-transform=* | --program-transfor=* \+  | --program-transfo=* | --program-transf=* \+  | --program-trans=* | --program-tran=* \+  | --progr-tra=* | --program-tr=* | --program-t=*)+    program_transform_name=$ac_optarg ;;++  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)+    ac_prev=pdfdir ;;+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)+    pdfdir=$ac_optarg ;;++  -psdir | --psdir | --psdi | --psd | --ps)+    ac_prev=psdir ;;+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)+    psdir=$ac_optarg ;;++  -q | -quiet | --quiet | --quie | --qui | --qu | --q \+  | -silent | --silent | --silen | --sile | --sil)+    silent=yes ;;++  -runstatedir | --runstatedir | --runstatedi | --runstated \+  | --runstate | --runstat | --runsta | --runst | --runs \+  | --run | --ru | --r)+    ac_prev=runstatedir ;;+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \+  | --run=* | --ru=* | --r=*)+    runstatedir=$ac_optarg ;;++  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)+    ac_prev=sbindir ;;+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \+  | --sbi=* | --sb=*)+    sbindir=$ac_optarg ;;++  -sharedstatedir | --sharedstatedir | --sharedstatedi \+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \+  | --sharedst | --shareds | --shared | --share | --shar \+  | --sha | --sh)+    ac_prev=sharedstatedir ;;+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \+  | --sha=* | --sh=*)+    sharedstatedir=$ac_optarg ;;++  -site | --site | --sit)+    ac_prev=site ;;+  -site=* | --site=* | --sit=*)+    site=$ac_optarg ;;++  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)+    ac_prev=srcdir ;;+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)+    srcdir=$ac_optarg ;;++  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \+  | --syscon | --sysco | --sysc | --sys | --sy)+    ac_prev=sysconfdir ;;+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)+    sysconfdir=$ac_optarg ;;++  -target | --target | --targe | --targ | --tar | --ta | --t)+    ac_prev=target_alias ;;+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)+    target_alias=$ac_optarg ;;++  -v | -verbose | --verbose | --verbos | --verbo | --verb)+    verbose=yes ;;++  -version | --version | --versio | --versi | --vers | -V)+    ac_init_version=: ;;++  -with-* | --with-*)+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`+    # Reject names that are not valid shell variable names.+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&+      as_fn_error $? "invalid package name: '$ac_useropt'"+    ac_useropt_orig=$ac_useropt+    ac_useropt=`printf '%s\n' "$ac_useropt" | sed 's/[-+.]/_/g'`+    case $ac_user_opts in+      *"+"with_$ac_useropt"+"*) ;;+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"+	 ac_unrecognized_sep=', ';;+    esac+    eval with_$ac_useropt=\$ac_optarg ;;++  -without-* | --without-*)+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`+    # Reject names that are not valid shell variable names.+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&+      as_fn_error $? "invalid package name: '$ac_useropt'"+    ac_useropt_orig=$ac_useropt+    ac_useropt=`printf '%s\n' "$ac_useropt" | sed 's/[-+.]/_/g'`+    case $ac_user_opts in+      *"+"with_$ac_useropt"+"*) ;;+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"+	 ac_unrecognized_sep=', ';;+    esac+    eval with_$ac_useropt=no ;;++  --x)+    # Obsolete; use --with-x.+    with_x=yes ;;++  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \+  | --x-incl | --x-inc | --x-in | --x-i)+    ac_prev=x_includes ;;+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)+    x_includes=$ac_optarg ;;++  -x-libraries | --x-libraries | --x-librarie | --x-librari \+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)+    ac_prev=x_libraries ;;+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)+    x_libraries=$ac_optarg ;;++  -*) as_fn_error $? "unrecognized option: '$ac_option'+Try '$0 --help' for more information"+    ;;++  *=*)+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`+    # Reject names that are not valid shell variable names.+    case $ac_envvar in #(+      '' | [0-9]* | *[!_$as_cr_alnum]* )+      as_fn_error $? "invalid variable name: '$ac_envvar'" ;;+    esac+    eval $ac_envvar=\$ac_optarg+    export $ac_envvar ;;++  *)+    # FIXME: should be removed in autoconf 3.0.+    printf '%s\n' "$as_me: WARNING: you should use --build, --host, --target" >&2+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&+      printf '%s\n' "$as_me: WARNING: invalid host type: $ac_option" >&2+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"+    ;;++  esac+done++if test -n "$ac_prev"; then+  ac_option=--`printf '%s\n' $ac_prev | sed 's/_/-/g'`+  as_fn_error $? "missing argument to $ac_option"+fi++if test -n "$ac_unrecognized_opts"; then+  case $enable_option_checking in+    no) ;;+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;+    *)     printf '%s\n' "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;+  esac+fi++# Check all directory arguments for consistency.+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \+		datadir sysconfdir sharedstatedir localstatedir includedir \+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \+		libdir localedir mandir runstatedir+do+  eval ac_val=\$$ac_var+  # Remove trailing slashes.+  case $ac_val in+    */ )+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`+      eval $ac_var=\$ac_val;;+  esac+  # Be sure to have absolute directory names.+  case $ac_val in+    [\\/$]* | ?:[\\/]* )  continue;;+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;+  esac+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"+done++# There might be people who depend on the old broken behavior: '$host'+# used to hold the argument of --host etc.+# FIXME: To remove some day.+build=$build_alias+host=$host_alias+target=$target_alias++# FIXME: To remove some day.+if test "x$host_alias" != x; then+  if test "x$build_alias" = x; then+    cross_compiling=maybe+  elif test "x$build_alias" != "x$host_alias"; then+    cross_compiling=yes+  fi+fi++ac_tool_prefix=+test -n "$host_alias" && ac_tool_prefix=$host_alias-++test "$silent" = yes && exec 6>/dev/null+++ac_pwd=`pwd` && test -n "$ac_pwd" &&+ac_ls_di=`ls -di .` &&+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||+  as_fn_error $? "working directory cannot be determined"+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||+  as_fn_error $? "pwd does not report name of working directory"+++# Find the source files, if location was not specified.+if test -z "$srcdir"; then+  ac_srcdir_defaulted=yes+  # Try the directory containing this script, then the parent directory.+  ac_confdir=`$as_dirname -- "$as_myself" ||+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \+	 X"$as_myself" : 'X\(//\)[^/]' \| \+	 X"$as_myself" : 'X\(//\)$' \| \+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||+printf '%s\n' X"$as_myself" |+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{+	    s//\1/+	    q+	  }+	  /^X\(\/\/\)[^/].*/{+	    s//\1/+	    q+	  }+	  /^X\(\/\/\)$/{+	    s//\1/+	    q+	  }+	  /^X\(\/\).*/{+	    s//\1/+	    q+	  }+	  s/.*/./; q'`+  srcdir=$ac_confdir+  if test ! -r "$srcdir/$ac_unique_file"; then+    srcdir=..+  fi+else+  ac_srcdir_defaulted=no+fi+if test ! -r "$srcdir/$ac_unique_file"; then+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"+fi+ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work"+ac_abs_confdir=`(+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"+	pwd)`+# When building in place, set srcdir=.+if test "$ac_abs_confdir" = "$ac_pwd"; then+  srcdir=.+fi+# Remove unnecessary trailing slashes from srcdir.+# Double slashes in file names in object file debugging info+# mess up M-x gdb in Emacs.+case $srcdir in+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;+esac+for ac_var in $ac_precious_vars; do+  eval ac_env_${ac_var}_set=\${${ac_var}+set}+  eval ac_env_${ac_var}_value=\$${ac_var}+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}+  eval ac_cv_env_${ac_var}_value=\$${ac_var}+done++#+# Report the --help message.+#+if test "$ac_init_help" = "long"; then+  # Omit some internal or obsolete options to make the list less imposing.+  # This message is too long to be a string in the A/UX 3.1 sh.+  cat <<_ACEOF+'configure' configures Haskell network package 3.2.7.0 to adapt to many kinds of systems.++Usage: $0 [OPTION]... [VAR=VALUE]...++To assign environment variables (e.g., CC, CFLAGS...), specify them as+VAR=VALUE.  See below for descriptions of some of the useful variables.++Defaults for the options are specified in brackets.++Configuration:+  -h, --help              display this help and exit+      --help=short        display options specific to this package+      --help=recursive    display the short help of all the included packages+  -V, --version           display version information and exit+  -q, --quiet, --silent   do not print 'checking ...' messages+      --cache-file=FILE   cache test results in FILE [disabled]+  -C, --config-cache      alias for '--cache-file=config.cache'+  -n, --no-create         do not create output files+      --srcdir=DIR        find the sources in DIR [configure dir or '..']++Installation directories:+  --prefix=PREFIX         install architecture-independent files in PREFIX+                          [$ac_default_prefix]+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX+                          [PREFIX]++By default, 'make install' will install all the files in+'$ac_default_prefix/bin', '$ac_default_prefix/lib' etc.  You can specify+an installation prefix other than '$ac_default_prefix' using '--prefix',+for instance '--prefix=\$HOME'.++For better control, use the options below.++Fine tuning of the installation directories:+  --bindir=DIR            user executables [EPREFIX/bin]+  --sbindir=DIR           system admin executables [EPREFIX/sbin]+  --libexecdir=DIR        program executables [EPREFIX/libexec]+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]+  --libdir=DIR            object code libraries [EPREFIX/lib]+  --includedir=DIR        C header files [PREFIX/include]+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]+  --infodir=DIR           info documentation [DATAROOTDIR/info]+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]+  --mandir=DIR            man documentation [DATAROOTDIR/man]+  --docdir=DIR            documentation root [DATAROOTDIR/doc/network]+  --htmldir=DIR           html documentation [DOCDIR]+  --dvidir=DIR            dvi documentation [DOCDIR]+  --pdfdir=DIR            pdf documentation [DOCDIR]+  --psdir=DIR             ps documentation [DOCDIR]+_ACEOF++  cat <<\_ACEOF++System types:+  --build=BUILD     configure for building on BUILD [guessed]+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]+_ACEOF+fi++if test -n "$ac_init_help"; then+  case $ac_init_help in+     short | recursive ) echo "Configuration of Haskell network package 3.2.7.0:";;+   esac+  cat <<\_ACEOF++Optional Packages:+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)+C compiler+Haskell compiler++Some influential environment variables:+  CC          C compiler command+  CFLAGS      C compiler flags+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a+              nonstandard directory <lib dir>+  LIBS        libraries to pass to the linker, e.g. -l<library>+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if+              you have headers in a nonstandard directory <include dir>++Use these variables to override the choices made by 'configure' or to help+it to find libraries and programs with nonstandard names/locations.++Report bugs to <libraries@haskell.org>.+_ACEOF+ac_status=$?+fi++if test "$ac_init_help" = "recursive"; then+  # If there are subdirs, report their specific --help.+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue+    test -d "$ac_dir" ||+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||+      continue+    ac_builddir=.++case "$ac_dir" in+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;+*)+  ac_dir_suffix=/`printf '%s\n' "$ac_dir" | sed 's|^\.[\\/]||'`+  # A ".." for each directory in $ac_dir_suffix.+  ac_top_builddir_sub=`printf '%s\n' "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`+  case $ac_top_builddir_sub in+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;+  esac ;;+esac+ac_abs_top_builddir=$ac_pwd+ac_abs_builddir=$ac_pwd$ac_dir_suffix+# for backward compatibility:+ac_top_builddir=$ac_top_build_prefix++case $srcdir in+  .)  # We are building in place.+    ac_srcdir=.+    ac_top_srcdir=$ac_top_builddir_sub+    ac_abs_top_srcdir=$ac_pwd ;;+  [\\/]* | ?:[\\/]* )  # Absolute name.+    ac_srcdir=$srcdir$ac_dir_suffix;+    ac_top_srcdir=$srcdir+    ac_abs_top_srcdir=$srcdir ;;+  *) # Relative name.+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix+    ac_top_srcdir=$ac_top_build_prefix$srcdir+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;+esac+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix++    cd "$ac_dir" || { ac_status=$?; continue; }+    # Check for configure.gnu first; this name is used for a wrapper for+    # Metaconfig's "Configure" on case-insensitive file systems.+    if test -f "$ac_srcdir/configure.gnu"; then+      echo &&+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive+    elif test -f "$ac_srcdir/configure"; then+      echo &&+      $SHELL "$ac_srcdir/configure" --help=recursive+    else+      printf '%s\n' "$as_me: WARNING: no configuration information is in $ac_dir" >&2+    fi || ac_status=$?+    cd "$ac_pwd" || { ac_status=$?; break; }+  done+fi++test -n "$ac_init_help" && exit $ac_status+if $ac_init_version; then+  cat <<\_ACEOF+Haskell network package configure 3.2.7.0+generated by GNU Autoconf 2.73++Copyright (C) 2026 Free Software Foundation, Inc.+This configure script is free software; the Free Software Foundation+gives unlimited permission to copy, distribute and modify it.+_ACEOF+  exit+fi++## ------------------------ ##+## Autoconf initialization. ##+## ------------------------ ##++# ac_fn_c_try_compile LINENO+# --------------------------+# Try to compile conftest.$ac_ext, and return whether this succeeded.+ac_fn_c_try_compile ()+{+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+  rm -f conftest.$ac_objext conftest.beam+  if { { ac_try="$ac_compile"+case "(($ac_try" in+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+  *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+printf '%s\n' "$ac_try_echo"; } >&5+  (eval "$ac_compile") 2>conftest.err+  ac_status=$?+  if test -s conftest.err; then+    grep -v '^ *+' conftest.err >conftest.er1+    cat conftest.er1 >&5+    mv -f conftest.er1 conftest.err+  fi+  printf '%s\n' "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+  test $ac_status = 0; } && {+	 test -z "$ac_c_werror_flag" ||+	 test ! -s conftest.err+       } && test -s conftest.$ac_objext+then :+  ac_retval=0+else case e in #(+  e) printf '%s\n' "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++	ac_retval=1 ;;+esac+fi+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno+  as_fn_set_status $ac_retval++} # ac_fn_c_try_compile++# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES+# -------------------------------------------------------+# Tests whether HEADER exists and can be compiled using the include files in+# INCLUDES, setting the cache variable VAR accordingly.+ac_fn_c_check_header_compile ()+{+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $2" >&5+printf %s "checking for $2... " >&6; }+if eval test \${$3+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$4+#include <$2>+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  eval "$3=yes"+else case e in #(+  e) eval "$3=no" ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;+esac+fi+eval ac_res=\$$3+	       { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+printf '%s\n' "$ac_res" >&6; }+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_c_check_header_compile++# ac_fn_c_check_type LINENO TYPE VAR INCLUDES+# -------------------------------------------+# Tests whether TYPE exists after having included INCLUDES, setting cache+# variable VAR accordingly.+ac_fn_c_check_type ()+{+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $2" >&5+printf %s "checking for $2... " >&6; }+if eval test \${$3+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) eval "$3=no"+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$4+int+main (void)+{+if (sizeof ($2))+	 return 0;+  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$4+int+main (void)+{+if (sizeof (($2)))+	    return 0;+  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :++else case e in #(+  e) eval "$3=yes" ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;+esac+fi+eval ac_res=\$$3+	       { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+printf '%s\n' "$ac_res" >&6; }+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_c_check_type++# ac_fn_c_try_link LINENO+# -----------------------+# Try to link conftest.$ac_ext, and return whether this succeeded.+ac_fn_c_try_link ()+{+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+  rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext+  if { { ac_try="$ac_link"+case "(($ac_try" in+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+  *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+printf '%s\n' "$ac_try_echo"; } >&5+  (eval "$ac_link") 2>conftest.err+  ac_status=$?+  if test -s conftest.err; then+    grep -v '^ *+' conftest.err >conftest.er1+    cat conftest.er1 >&5+    mv -f conftest.er1 conftest.err+  fi+  printf '%s\n' "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+  test $ac_status = 0; } && {+	 test -z "$ac_c_werror_flag" ||+	 test ! -s conftest.err+       } && test -s conftest$ac_exeext && {+	 test "$cross_compiling" = yes ||+	 test -x conftest$ac_exeext+       }+then :+  ac_retval=0+else case e in #(+  e) printf '%s\n' "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++	ac_retval=1 ;;+esac+fi+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would+  # interfere with the next link command; also delete a directory that is+  # left behind by Apple's compiler.  We do this before executing the actions.+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno+  as_fn_set_status $ac_retval++} # ac_fn_c_try_link++# ac_fn_c_check_func LINENO FUNC VAR+# ----------------------------------+# Tests whether FUNC exists, setting the cache variable VAR accordingly+ac_fn_c_check_func ()+{+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $2" >&5+printf %s "checking for $2... " >&6; }+if eval test \${$3+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */+#define $2 innocuous_$2++/* System header to define __stub macros and hopefully few prototypes,+   which can conflict with char $2 (void); below.  */++#include <limits.h>+#undef $2++/* Override any GCC internal prototype to avoid an error.+   Use char because int might match the return type of a GCC+   builtin and then its argument prototype would still apply.  */+#ifdef __cplusplus+extern "C"+#endif+char $2 (void);+/* The GNU C library defines this for functions which it implements+    to always fail with ENOSYS.  Some functions are actually named+    something starting with __ and the normal name is an alias.  */+#if defined __stub_$2 || defined __stub___$2+choke me+#endif++int+main (void)+{+return $2 ();+  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_link "$LINENO"+then :+  eval "$3=yes"+else case e in #(+  e) eval "$3=no" ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam \+    conftest$ac_exeext conftest.$ac_ext ;;+esac+fi+eval ac_res=\$$3+	       { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+printf '%s\n' "$ac_res" >&6; }+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_c_check_func++# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR+# ------------------------------------------------------------------+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR+# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR.+ac_fn_check_decl ()+{+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+  as_decl_name=`echo $2|sed 's/ *(.*//'`+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5+printf %s "checking whether $as_decl_name is declared... " >&6; }+if eval test \${$3+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`+  eval ac_save_FLAGS=\$$6+  as_fn_append $6 " $5"+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$4+int+main (void)+{+#ifndef $as_decl_name+#ifdef __cplusplus+  (void) $as_decl_use;+#else+  (void) $as_decl_name;+#endif+#endif++  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  eval "$3=yes"+else case e in #(+  e) eval "$3=no" ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext+  eval $6=\$ac_save_FLAGS+ ;;+esac+fi+eval ac_res=\$$3+	       { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+printf '%s\n' "$ac_res" >&6; }+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_check_decl++# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES+# ----------------------------------------------------+# Tries to find if the field MEMBER exists in type AGGR, after including+# INCLUDES, setting cache variable VAR accordingly.+ac_fn_c_check_member ()+{+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5+printf %s "checking for $2.$3... " >&6; }+if eval test \${$4+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$5+int+main (void)+{+static $2 ac_aggr;+if (ac_aggr.$3)+return 0;+  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  eval "$4=yes"+else case e in #(+  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$5+int+main (void)+{+static $2 ac_aggr;+if (sizeof ac_aggr.$3)+return 0;+  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  eval "$4=yes"+else case e in #(+  e) eval "$4=no" ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;+esac+fi+eval ac_res=\$$4+	       { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5+printf '%s\n' "$ac_res" >&6; }+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno++} # ac_fn_c_check_member+ac_configure_args_raw=+for ac_arg+do+  case $ac_arg in+  *\'*)+    ac_arg=`printf '%s\n' "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;+  esac+  as_fn_append ac_configure_args_raw " '$ac_arg'"+done++case $ac_configure_args_raw in+  *$as_nl*)+    ac_safe_unquote= ;;+  *)+    ac_unsafe_z='|&;<>()$`\\"*?[ ''	' # This string ends in space, tab.+    ac_unsafe_a="$ac_unsafe_z#~"+    ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"+    ac_configure_args_raw=`      printf '%s\n' "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;+esac++cat >config.log <<_ACEOF+This file contains any messages produced by compilers while+running configure, to aid debugging if configure makes a mistake.++It was created by Haskell network package $as_me 3.2.7.0, which was+generated by GNU Autoconf 2.73.  Invocation command line was++  $ $0$ac_configure_args_raw++_ACEOF+exec 5>>config.log+{+cat <<_ASUNAME+## --------- ##+## Platform. ##+## --------- ##++hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`+uname -m = `(uname -m) 2>/dev/null || echo unknown`+uname -r = `(uname -r) 2>/dev/null || echo unknown`+uname -s = `(uname -s) 2>/dev/null || echo unknown`+uname -v = `(uname -v) 2>/dev/null || echo unknown`++/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`++/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`++_ASUNAME++as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    printf '%s\n' "PATH: $as_dir"+  done+IFS=$as_save_IFS++} >&5++cat >&5 <<_ACEOF+++## ----------- ##+## Core tests. ##+## ----------- ##++_ACEOF+++# Keep a trace of the command line.+# Strip out --no-create and --no-recursion so they do not pile up.+# Strip out --silent because we don't want to record it for future runs.+# Also quote any args containing shell meta-characters.+# Make two passes to allow for proper duplicate-argument suppression.+ac_configure_args=+ac_configure_args0=+ac_configure_args1=+ac_must_keep_next=false+for ac_pass in 1 2+do+  for ac_arg+  do+    case $ac_arg in+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \+    | -silent | --silent | --silen | --sile | --sil)+      continue ;;+    *\'*)+      ac_arg=`printf '%s\n' "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;+    esac+    case $ac_pass in+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;+    2)+      as_fn_append ac_configure_args1 " '$ac_arg'"+      if test $ac_must_keep_next = true; then+	ac_must_keep_next=false # Got value, back to normal.+      else+	case $ac_arg in+	  *=* | --config-cache | -C | -disable-* | --disable-* \+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \+	  | -with-* | --with-* | -without-* | --without-* | --x)+	    case "$ac_configure_args0 " in+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;+	    esac+	    ;;+	  -* ) ac_must_keep_next=true ;;+	esac+      fi+      as_fn_append ac_configure_args " '$ac_arg'"+      ;;+    esac+  done+done+{ ac_configure_args0=; unset ac_configure_args0;}+{ ac_configure_args1=; unset ac_configure_args1;}++# Dump the cache to stdout.  It can be in a pipe (this is a requirement).+ac_cache_dump ()+{+  # The following way of writing the cache mishandles newlines in values,+# but we know of no workaround that is simple, portable, and efficient.+# So, we kill variables containing newlines.+# Ultrix sh set writes to stderr and can't be redirected directly,+# and sets the high bit in the cache file unless we assign to the vars.+(+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do+    eval ac_val=\$$ac_var+    case $ac_val in #(+    *${as_nl}*)+      case $ac_var in #(+      *_cv_*) { printf '%s\n' "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5+printf '%s\n' "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;+      esac+      case $ac_var in #(+      _ | IFS | as_nl) ;; #(+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(+      *) { eval $ac_var=; unset $ac_var;} ;;+      esac ;;+    esac+  done++  (set) 2>&1 |+    case $as_nl`(ac_space=' '; set) 2>&1` in #(+    *${as_nl}ac_space=\ *)+      # 'set' does not quote correctly, so add quotes: double-quote+      # substitution turns \\\\ into \\, and sed turns \\ into \.+      sed -n \+	"s/'/'\\\\''/g;+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"+      ;; #(+    *)+      # 'set' quotes correctly as required by POSIX, so do not add quotes.+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"+      ;;+    esac |+    sort+)+}++# Print debugging info to stdout.+ac_dump_debugging_info ()+{+  echo++  printf '%s\n' "## ---------------- ##+## Cache variables. ##+## ---------------- ##"+  echo+  ac_cache_dump+  echo++  printf '%s\n' "## ----------------- ##+## Output variables. ##+## ----------------- ##"+  echo+  for ac_var in $ac_subst_vars+  do+    eval ac_val=\$$ac_var+    case $ac_val in+    *\'*) ac_val=`printf '%s\n' "$ac_val" | sed "s/'/'\\\\\\\\''/g"`;;+    esac+    printf '%s\n' "$ac_var='$ac_val'"+  done | sort+  echo++  if test -n "$ac_subst_files"; then+    printf '%s\n' "## ------------------- ##+## File substitutions. ##+## ------------------- ##"+    echo+    for ac_var in $ac_subst_files+    do+      eval ac_val=\$$ac_var+      case $ac_val in+      *\'*) ac_val=`printf '%s\n' "$ac_val" | sed "s/'/'\\\\\\\\''/g"`;;+      esac+      printf '%s\n' "$ac_var='$ac_val'"+    done | sort+    echo+  fi++  if test -s confdefs.h; then+    printf '%s\n' "## ----------- ##+## confdefs.h. ##+## ----------- ##"+    echo+    cat confdefs.h+    echo+  fi+  test "$ac_signal" != 0 &&+    printf '%s\n' "$as_me: caught signal $ac_signal"+  printf '%s\n' "$as_me: exit $exit_status"+}++# When interrupted or exit'd, cleanup temporary files, and complete+# config.log.+ac_exit_trap ()+{+  exit_status=+  # Sanitize IFS.+  IFS=" ""	$as_nl"+  # Save into config.log some information that might help in debugging.+  ac_dump_debugging_info >&5+  eval "rm -f $ac_clean_CONFIG_STATUS core *.core core.conftest.*" &&+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&+    exit $exit_status+}++trap 'ac_exit_trap $?' 0+for ac_signal in 1 2 13 15; do+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal+done+ac_signal=0++# confdefs.h avoids OS command line length limits that DEFS can exceed.+rm -f -r conftest* confdefs.h++printf '%s\n' "/* confdefs.h */" > confdefs.h++# Predefined preprocessor variables.++printf '%s\n' "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h++printf '%s\n' "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h++printf '%s\n' "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h++printf '%s\n' "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h++printf '%s\n' "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h++printf '%s\n' "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h+++# Let the site file select an alternate cache file if it wants to.+# Prefer an explicitly selected file to automatically selected ones.+if test -n "$CONFIG_SITE"; then+  ac_site_files="$CONFIG_SITE"+elif test "x$prefix" != xNONE; then+  ac_site_files="$prefix/share/config.site $prefix/etc/config.site"+else+  ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"+fi++for ac_site_file in $ac_site_files+do+  case $ac_site_file in #(+  */*) :+     ;; #(+  *) :+    ac_site_file=./$ac_site_file ;;+esac+  if test -f "$ac_site_file" && test -r "$ac_site_file"; then+    { printf '%s\n' "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5+printf '%s\n' "$as_me: loading site script $ac_site_file" >&6;}+    sed 's/^/| /' "$ac_site_file" >&5+    . "$ac_site_file" \+      || { { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5+printf '%s\n' "$as_me: error: in '$ac_pwd':" >&2;}+as_fn_error $? "failed to load site script $ac_site_file+See 'config.log' for more details" "$LINENO" 5; }+  fi+done++if test -r "$cache_file"; then+  # Some versions of bash will fail to source /dev/null (special files+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then+    { printf '%s\n' "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5+printf '%s\n' "$as_me: loading cache $cache_file" >&6;}+    case $cache_file in+      [\\/]* | ?:[\\/]* ) . "$cache_file";;+      *)                      . "./$cache_file";;+    esac+  fi+else+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5+printf '%s\n' "$as_me: creating cache $cache_file" >&6;}+  >$cache_file+fi++# Test code for whether the C compiler supports C23 (global declarations)+ac_c_conftest_c23_globals='+/* Does the compiler advertise conformance to C17 or earlier?+   Although GCC 14 does not do that, even with -std=gnu23,+   it is close enough, and defines __STDC_VERSION == 202000L.  */+#if !defined __STDC_VERSION__ || __STDC_VERSION__ <= 201710L+# error "Compiler advertises conformance to C17 or earlier"+#endif++// Check alignas.+char alignas (double) c23_aligned_as_double;+char alignas (0) c23_no_special_alignment;+extern char c23_aligned_as_int;+char alignas (0) alignas (int) c23_aligned_as_int;++// Check alignof.+enum+{+  c23_int_alignment = alignof (int),+  c23_int_array_alignment = alignof (int[100]),+  c23_char_alignment = alignof (char)+};+static_assert (0 < -alignof (int), "alignof is signed");++int function_with_unnamed_parameter (int) { return 0; }++void c23_noreturn ();++/* Test parsing of string and char UTF-8 literals (including hex escapes).+   The parens pacify GCC 15.  */+bool use_u8 = (!sizeof u8"\xFF") == (!u8'\''x'\'');++bool check_that_bool_works = true | false | !nullptr;+#if !true+# error "true does not work in #if"+#endif+#if false+#elifdef __STDC_VERSION__+#else+# error "#elifdef does not work"+#endif++#ifndef __has_c_attribute+# error "__has_c_attribute not defined"+#endif++#ifndef __has_include+# error "__has_include not defined"+#endif++#define LPAREN() (+#define FORTY_TWO(x) 42+#define VA_OPT_TEST(r, x, ...) __VA_OPT__ (FORTY_TWO r x))+static_assert (VA_OPT_TEST (LPAREN (), 0, <:-) == 42);++static_assert (0b101010 == 42);+static_assert (0B101010 == 42);+static_assert (0xDEAD'\''BEEF == 3'\''735'\''928'\''559);+static_assert (0.500'\''000'\''000 == 0.5);++enum unsignedish : unsigned int { uione = 1 };+static_assert (0 < -uione);++#include <stddef.h>+constexpr nullptr_t null_pointer = nullptr;++static typeof (1 + 1L) two () { return 2; }+static long int three () { return 3; }+'++# Test code for whether the C compiler supports C23 (body of main).+ac_c_conftest_c23_main='+  {+    label_before_declaration:+      int arr[10] = {};+      if (arr[0])+        goto label_before_declaration;+      if (!arr[0])+        goto label_at_end_of_block;+    label_at_end_of_block:+  }+  ok |= !null_pointer;+  ok |= two != three;+'++# Test code for whether the C compiler supports C23 (complete).+ac_c_conftest_c23_program="${ac_c_conftest_c23_globals}++int+main (int, char **)+{+  int ok = 0;+  ${ac_c_conftest_c23_main}+  return ok;+}+"++# Test code for whether the C compiler supports C89 (global declarations)+ac_c_conftest_c89_globals='+/* Do not test the value of __STDC__, because some compilers define it to 0+   or do not define it, while otherwise adequately conforming.  */++#include <stddef.h>+#include <stdarg.h>+struct stat;+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh.  */+struct buf { int x; };+struct buf * (*rcsopen) (struct buf *, struct stat *, int);+static char *e (char **p, int i)+{+  return p[i];+}+static char *f (char * (*g) (char **, int), char **p, ...)+{+  char *s;+  va_list v;+  va_start (v,p);+  s = g (p, va_arg (v,int));+  va_end (v);+  return s;+}++/* C89 style stringification. */+#define noexpand_stringify(a) #a+const char *stringified = noexpand_stringify(arbitrary+token=sequence);++/* C89 style token pasting.  Exercises some of the corner cases that+   e.g. old MSVC gets wrong, but not very hard. */+#define noexpand_concat(a,b) a##b+#define expand_concat(a,b) noexpand_concat(a,b)+extern int vA;+extern int vbee;+#define aye A+#define bee B+int *pvA = &expand_concat(v,aye);+int *pvbee = &noexpand_concat(v,bee);++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has+   function prototypes and stuff, but not \xHH hex character constants.+   These do not provoke an error unfortunately, instead are silently treated+   as an "x".  The following induces an error, until -std is added to get+   proper ANSI mode.  Curiously \x00 != x always comes out true, for an+   array size at least.  It is necessary to write \x00 == 0 to get something+   that is true only with -std.  */+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];++/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters+   inside strings and character constants.  */+#define FOO(x) '\''x'\''+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];++int test (int i, double x);+struct s1 {int (*f) (int a);};+struct s2 {int (*f) (double a);};+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),+               int, int);'++# Test code for whether the C compiler supports C89 (body of main).+ac_c_conftest_c89_main='+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);+'++# Test code for whether the C compiler supports C99 (global declarations)+ac_c_conftest_c99_globals='+/* Does the compiler advertise C99 conformance? */+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L+# error "Compiler does not advertise C99 conformance"+#endif++// See if C++-style comments work.++#include <stdbool.h>+extern int puts (const char *);+extern int printf (const char *, ...);+extern int dprintf (int, const char *, ...);+extern void *malloc (size_t);+extern void free (void *);++// Check varargs macros.  These examples are taken from C99 6.10.3.5.+// dprintf is used instead of fprintf to avoid needing to declare+// FILE and stderr, and "aND" is used instead of "and" to work around+// GCC bug 40564 which is irrelevant here.+#define debug(...) dprintf (2, __VA_ARGS__)+#define showlist(...) puts (#__VA_ARGS__)+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))+static void+test_varargs_macros (void)+{+  int x = 1234;+  int y = 5678;+  debug ("Flag");+  debug ("X = %d\n", x);+  showlist (The first, second, aND third items.);+  report (x>y, "x is %d but y is %d", x, y);+}++// Check long long types.+#define BIG64 18446744073709551615ull+#define BIG32 4294967295ul+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)+#if !BIG_OK+  #error "your preprocessor is broken"+#endif+#if BIG_OK+#else+  #error "your preprocessor is broken"+#endif+static long long int bignum = -9223372036854775807LL;+static unsigned long long int ubignum = BIG64;++struct incomplete_array+{+  int datasize;+  double data[];+};++struct named_init {+  int number;+  const wchar_t *name;+  double average;+};++typedef const char *ccp;++static inline int+test_restrict (ccp restrict text)+{+  // Iterate through items via the restricted pointer.+  // Also check for declarations in for loops.+  for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)+    continue;+  return 0;+}++// Check varargs and va_copy.+static bool+test_varargs (const char *format, ...)+{+  va_list args;+  va_start (args, format);+  va_list args_copy;+  va_copy (args_copy, args);++  const char *str = "";+  int number = 0;+  float fnumber = 0;++  while (*format)+    {+      switch (*format++)+	{+	case '\''s'\'': // string+	  str = va_arg (args_copy, const char *);+	  break;+	case '\''d'\'': // int+	  number = va_arg (args_copy, int);+	  break;+	case '\''f'\'': // float+	  fnumber = va_arg (args_copy, double);+	  break;+	default:+	  break;+	}+    }+  va_end (args_copy);+  va_end (args);++  return *str && number && fnumber;+}+'++# Test code for whether the C compiler supports C99 (body of main).+ac_c_conftest_c99_main='+  // Check bool.+  _Bool success = false;+  success |= (argc != 0);++  // Check restrict.+  if (test_restrict ("String literal") == 0)+    success = true;+  const char *restrict newvar = "Another string";++  // Check varargs.+  success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);+  test_varargs_macros ();++  // Check flexible array members.+  static struct incomplete_array *volatile incomplete_array_pointer;+  struct incomplete_array *ia = incomplete_array_pointer;+  ia->datasize = 10;+  for (int i = 0; i < ia->datasize; ++i)+    ia->data[i] = i * 1.234;+  // Work around memory leak warnings.+  free (ia);++  // Check named initializers.+  struct named_init ni = {+    .number = 34,+    .name = L"Test wide string",+    .average = 543.34343,+  };++  ni.number = 58;++  // Do not test for VLAs, as some otherwise-conforming compilers lack them.+  // C code should instead use __STDC_NO_VLA__; see Autoconf manual.++  // work around unused variable warnings+  ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''+	 || ni.number != 58);+'++# Test code for whether the C compiler supports C11 (global declarations)+ac_c_conftest_c11_globals='+/* Does the compiler advertise C11 conformance? */+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L+# error "Compiler does not advertise C11 conformance"+#endif++// Check _Alignas.+char _Alignas (double) aligned_as_double;+char _Alignas (0) no_special_alignment;+extern char aligned_as_int;+char _Alignas (0) _Alignas (int) aligned_as_int;++// Check _Alignof.+enum+{+  int_alignment = _Alignof (int),+  int_array_alignment = _Alignof (int[100]),+  char_alignment = _Alignof (char)+};+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");++// Check _Noreturn.+int _Noreturn does_not_return (void) { for (;;) continue; }++// Check _Static_assert.+struct test_static_assert+{+  int x;+  _Static_assert (sizeof (int) <= sizeof (long int),+                  "_Static_assert does not work in struct");+  long int y;+};++// Check UTF-8 literals.+#define u8 syntax error!+char const utf8_literal[] = u8"happens to be ASCII" "another string";++// Check duplicate typedefs.+typedef long *long_ptr;+typedef long int *long_ptr;+typedef long_ptr long_ptr;++// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.+struct anonymous+{+  union {+    struct { int i; int j; };+    struct { int k; long int l; } w;+  };+  int m;+} v1;+'++# Test code for whether the C compiler supports C11 (body of main).+ac_c_conftest_c11_main='+  _Static_assert ((offsetof (struct anonymous, i)+		   == offsetof (struct anonymous, w.k)),+		  "Anonymous union alignment botch");+  v1.i = 2;+  v1.w.k = 5;+  ok |= v1.i != 5;+'++# Test code for whether the C compiler supports C11 (complete).+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}+${ac_c_conftest_c99_globals}+${ac_c_conftest_c11_globals}++int+main (int argc, char **argv)+{+  int ok = 0;+  ${ac_c_conftest_c89_main}+  ${ac_c_conftest_c99_main}+  ${ac_c_conftest_c11_main}+  return ok;+}+"++# Test code for whether the C compiler supports C99 (complete).+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}+${ac_c_conftest_c99_globals}++int+main (int argc, char **argv)+{+  int ok = 0;+  ${ac_c_conftest_c89_main}+  ${ac_c_conftest_c99_main}+  return ok;+}+"++# Test code for whether the C compiler supports C89 (complete).+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}++int+main (int argc, char **argv)+{+  int ok = 0;+  ${ac_c_conftest_c89_main}+  return ok;+}+"++as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"++# Auxiliary files required by this configure script.+ac_aux_files="config.guess config.sub"++# Locations in which to look for auxiliary files.+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."++# Search for a directory containing all of the required auxiliary files,+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.+# If we don't find one directory that contains all the files we need,+# we report the set of missing files from the *first* directory in+# $ac_aux_dir_candidates and give up.+ac_missing_aux_files=""+ac_first_candidate=:+printf '%s\n' "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+as_found=false+for as_dir in $ac_aux_dir_candidates+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+  as_found=:++  printf '%s\n' "$as_me:${as_lineno-$LINENO}:  trying $as_dir" >&5+  ac_aux_dir_found=yes+  ac_install_sh=+  for ac_aux in $ac_aux_files+  do+    # As a special case, if "install-sh" is required, that requirement+    # can be satisfied by any of "install-sh", "install.sh", or "shtool",+    # and $ac_install_sh is set appropriately for whichever one is found.+    if test x"$ac_aux" = x"install-sh"+    then+      if test -f "${as_dir}install-sh"; then+        printf '%s\n' "$as_me:${as_lineno-$LINENO}:   ${as_dir}install-sh found" >&5+        ac_install_sh="${as_dir}install-sh -c"+      elif test -f "${as_dir}install.sh"; then+        printf '%s\n' "$as_me:${as_lineno-$LINENO}:   ${as_dir}install.sh found" >&5+        ac_install_sh="${as_dir}install.sh -c"+      elif test -f "${as_dir}shtool"; then+        printf '%s\n' "$as_me:${as_lineno-$LINENO}:   ${as_dir}shtool found" >&5+        ac_install_sh="${as_dir}shtool install -c"+      else+        ac_aux_dir_found=no+        if $ac_first_candidate; then+          ac_missing_aux_files="${ac_missing_aux_files} install-sh"+        else+          break+        fi+      fi+    else+      if test -f "${as_dir}${ac_aux}"; then+        printf '%s\n' "$as_me:${as_lineno-$LINENO}:   ${as_dir}${ac_aux} found" >&5+      else+        ac_aux_dir_found=no+        if $ac_first_candidate; then+          ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"+        else+          break+        fi+      fi+    fi+  done+  if test "$ac_aux_dir_found" = yes; then+    ac_aux_dir="$as_dir"+    break+  fi+  ac_first_candidate=false++  as_found=false+done+IFS=$as_save_IFS+if $as_found+then :++else case e in #(+  e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;;+esac+fi+++# These three variables are undocumented and unsupported,+# and are intended to be withdrawn in a future Autoconf release.+# They can cause serious problems if a builder's source tree is in a directory+# whose full name contains unusual characters.+if test -f "${ac_aux_dir}config.guess"; then+  ac_config_guess="$SHELL ${ac_aux_dir}config.guess"+fi+if test -f "${ac_aux_dir}config.sub"; then+  ac_config_sub="$SHELL ${ac_aux_dir}config.sub"+fi+if test -f "$ac_aux_dir/configure"; then+  ac_configure="$SHELL ${ac_aux_dir}configure"+fi++# Check that the precious variables saved in the cache have kept the same+# value.+ac_cache_corrupted=false+for ac_var in $ac_precious_vars; do+  eval ac_old_set=\$ac_cv_env_${ac_var}_set+  eval ac_new_set=\$ac_env_${ac_var}_set+  eval ac_old_val=\$ac_cv_env_${ac_var}_value+  eval ac_new_val=\$ac_env_${ac_var}_value+  case $ac_old_set,$ac_new_set in+    set,)+      { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5+printf '%s\n' "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;}+      ac_cache_corrupted=: ;;+    ,set)+      { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5+printf '%s\n' "$as_me: error: '$ac_var' was not set in the previous run" >&2;}+      ac_cache_corrupted=: ;;+    ,);;+    *)+      if test "x$ac_old_val" != "x$ac_new_val"; then+	# differences in whitespace do not lead to failure.+	ac_old_val_w=+	for ac_val in x $ac_old_val; do+	  ac_old_val_w="$ac_old_val_w $ac_val"+	done+	ac_new_val_w=+	for ac_val in x $ac_new_val; do+	  ac_new_val_w="$ac_new_val_w $ac_val"+	done+	if test "$ac_old_val_w" != "$ac_new_val_w"; then+	  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5+printf '%s\n' "$as_me: error: '$ac_var' has changed since the previous run:" >&2;}+	  ac_cache_corrupted=:+	else+	  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5+printf '%s\n' "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;}+	  eval $ac_var=\$ac_old_val+	fi+	{ printf '%s\n' "$as_me:${as_lineno-$LINENO}:   former value:  '$ac_old_val'" >&5+printf '%s\n' "$as_me:   former value:  '$ac_old_val'" >&2;}+	{ printf '%s\n' "$as_me:${as_lineno-$LINENO}:   current value: '$ac_new_val'" >&5+printf '%s\n' "$as_me:   current value: '$ac_new_val'" >&2;}+      fi;;+  esac+  # Pass precious variables to config.status.+  if test "$ac_new_set" = set; then+    case $ac_new_val in+    *\'*) ac_arg=$ac_var=`printf '%s\n' "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;+    *) ac_arg=$ac_var=$ac_new_val ;;+    esac+    case " $ac_configure_args " in+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;+    esac+  fi+done+if $ac_cache_corrupted; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5+printf '%s\n' "$as_me: error: in '$ac_pwd':" >&2;}+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5+printf '%s\n' "$as_me: error: changes in the environment can compromise the build" >&2;}+  as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file'+	    and start over" "$LINENO" 5+fi+## -------------------- ##+## Main body of script. ##+## -------------------- ##+++# Determine whether it's possible to make 'echo' print without a newline.+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed+# for compatibility with existing Makefiles.+ECHO_C= ECHO_N= ECHO_T=+case `echo -n x` in #(((((+-n*)+  case `echo 'xy\c'` in+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.+  xy)  ECHO_C='\c';;+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null+       ECHO_T='	';;+  esac;;+*)+  ECHO_N='-n';;+esac++ac_ext=c+ac_cpp='$CPP $CPPFLAGS'+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'+ac_compiler_gnu=$ac_cv_c_compiler_gnu++++ac_includes_default="#ifndef _WIN32+# define _GNU_SOURCE 1  /* for struct ucred on Linux */+#endif+$ac_includes_default++#ifdef _WIN32+# include <winsock2.h>+# include <ws2tcpip.h>+# define IPV6_V6ONLY 27+#endif++#ifdef HAVE_LIMITS_H+# include <limits.h>+#endif+#ifdef HAVE_STDLIB_H+# include <stdlib.h>+#endif+#ifdef HAVE_UNISTD_H+#include <unistd.h>+#endif+#ifdef HAVE_SYS_TYPES_H+# include <sys/types.h>+#endif+#ifdef HAVE_FCNTL_H+# include <fcntl.h>+#endif+#ifdef HAVE_SYS_UIO_H+# include <sys/uio.h>+#endif+#ifdef HAVE_SYS_SOCKET_H+# include <sys/socket.h>+#endif+#ifdef HAVE_NETINET_IN_H+# include <netinet/in.h>+#endif+#ifdef HAVE_NETINET_TCP_H+# include <netinet/tcp.h>+#endif+#ifdef HAVE_SYS_UN_H+# include <sys/un.h>+#endif+#ifdef HAVE_ARPA_INET_H+# include <arpa/inet.h>+#endif+#ifdef HAVE_NETDB_H+#include <netdb.h>+#endif+#ifdef HAVE_NET_IF_H+# include <net/if.h>+#endif+#ifdef HAVE_NETIOAPI_H+# include <netioapi.h>+#endif+"++++ac_config_headers="$ac_config_headers include/HsNetworkConfig.h"++++++  # Make sure we can run config.sub.+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||+  as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5++{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking build system type" >&5+printf %s "checking build system type... " >&6; }+if test ${ac_cv_build+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) ac_build_alias=$build_alias+test "x$ac_build_alias" = x &&+  ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`+test "x$ac_build_alias" = x &&+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||+  as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5+ ;;+esac+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5+printf '%s\n' "$ac_cv_build" >&6; }+case $ac_cv_build in+*-*-*) ;;+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;+esac+build=$ac_cv_build+ac_save_IFS=$IFS; IFS='-'+set x $ac_cv_build+shift+build_cpu=$1+build_vendor=$2+shift; shift+# Remember, the first character of IFS is used to create $*,+# except with old shells:+build_os=$*+IFS=$ac_save_IFS+case $build_os in *\ *) build_os=`printf '%s\n' "$build_os" | sed 's/ /-/g'`;; esac+++{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking host system type" >&5+printf %s "checking host system type... " >&6; }+if test ${ac_cv_host+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) if test "x$host_alias" = x; then+  ac_cv_host=$ac_cv_build+else+  ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||+    as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5+fi+ ;;+esac+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5+printf '%s\n' "$ac_cv_host" >&6; }+case $ac_cv_host in+*-*-*) ;;+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;+esac+host=$ac_cv_host+ac_save_IFS=$IFS; IFS='-'+set x $ac_cv_host+shift+host_cpu=$1+host_vendor=$2+shift; shift+# Remember, the first character of IFS is used to create $*,+# except with old shells:+host_os=$*+IFS=$ac_save_IFS+case $host_os in *\ *) host_os=`printf '%s\n' "$host_os" | sed 's/ /-/g'`;; esac+++++# Check whether --with-cc was given.+if test ${with_cc+y}+then :+  withval=$with_cc; CC=$withval+fi++++++++++++++ac_ext=c+ac_cpp='$CPP $CPPFLAGS'+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'+ac_compiler_gnu=$ac_cv_c_compiler_gnu+if test -n "$ac_tool_prefix"; then+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.+set dummy ${ac_tool_prefix}gcc; ac_word=$2+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+printf %s "checking for $ac_word... " >&6; }+if test ${ac_cv_prog_CC+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) if test -n "$CC"; then+  ac_cv_prog_CC="$CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    for ac_exec_ext in '' $ac_executable_extensions; do+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then+    ac_cv_prog_CC="${ac_tool_prefix}gcc"+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5+    break 2+  fi+done+  done+IFS=$as_save_IFS++fi ;;+esac+fi+CC=$ac_cv_prog_CC+if test -n "$CC"; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $CC" >&5+printf '%s\n' "$CC" >&6; }+else+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no" >&5+printf '%s\n' "no" >&6; }+fi+++fi+if test -z "$ac_cv_prog_CC"; then+  ac_ct_CC=$CC+  # Extract the first word of "gcc", so it can be a program name with args.+set dummy gcc; ac_word=$2+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+printf %s "checking for $ac_word... " >&6; }+if test ${ac_cv_prog_ac_ct_CC+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) if test -n "$ac_ct_CC"; then+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    for ac_exec_ext in '' $ac_executable_extensions; do+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then+    ac_cv_prog_ac_ct_CC="gcc"+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5+    break 2+  fi+done+  done+IFS=$as_save_IFS++fi ;;+esac+fi+ac_ct_CC=$ac_cv_prog_ac_ct_CC+if test -n "$ac_ct_CC"; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5+printf '%s\n' "$ac_ct_CC" >&6; }+else+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no" >&5+printf '%s\n' "no" >&6; }+fi++  if test "x$ac_ct_CC" = x; then+    CC=""+  else+    case $cross_compiling:$ac_tool_warned in+yes:)+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5+printf '%s\n' "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}+ac_tool_warned=yes ;;+esac+    CC=$ac_ct_CC+  fi+else+  CC="$ac_cv_prog_CC"+fi++if test -z "$CC"; then+          if test -n "$ac_tool_prefix"; then+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.+set dummy ${ac_tool_prefix}cc; ac_word=$2+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+printf %s "checking for $ac_word... " >&6; }+if test ${ac_cv_prog_CC+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) if test -n "$CC"; then+  ac_cv_prog_CC="$CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    for ac_exec_ext in '' $ac_executable_extensions; do+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then+    ac_cv_prog_CC="${ac_tool_prefix}cc"+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5+    break 2+  fi+done+  done+IFS=$as_save_IFS++fi ;;+esac+fi+CC=$ac_cv_prog_CC+if test -n "$CC"; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $CC" >&5+printf '%s\n' "$CC" >&6; }+else+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no" >&5+printf '%s\n' "no" >&6; }+fi+++  fi+fi+if test -z "$CC"; then+  # Extract the first word of "cc", so it can be a program name with args.+set dummy cc; ac_word=$2+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+printf %s "checking for $ac_word... " >&6; }+if test ${ac_cv_prog_CC+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) if test -n "$CC"; then+  ac_cv_prog_CC="$CC" # Let the user override the test.+else+  ac_prog_rejected=no+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    for ac_exec_ext in '' $ac_executable_extensions; do+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then+    if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then+       ac_prog_rejected=yes+       continue+     fi+    ac_cv_prog_CC="cc"+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5+    break 2+  fi+done+  done+IFS=$as_save_IFS++if test $ac_prog_rejected = yes; then+  # We found a bogon in the path, so make sure we never use it.+  set dummy $ac_cv_prog_CC+  shift+  if test $# != 0; then+    # We chose a different compiler from the bogus one.+    # However, it has the same basename, so the bogon will be chosen+    # first if we set CC to just the basename; use the full file name.+    shift+    ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"+  fi+fi+fi ;;+esac+fi+CC=$ac_cv_prog_CC+if test -n "$CC"; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $CC" >&5+printf '%s\n' "$CC" >&6; }+else+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no" >&5+printf '%s\n' "no" >&6; }+fi+++fi+if test -z "$CC"; then+  if test -n "$ac_tool_prefix"; then+  for ac_prog in cl.exe+  do+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.+set dummy $ac_tool_prefix$ac_prog; ac_word=$2+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+printf %s "checking for $ac_word... " >&6; }+if test ${ac_cv_prog_CC+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) if test -n "$CC"; then+  ac_cv_prog_CC="$CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    for ac_exec_ext in '' $ac_executable_extensions; do+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5+    break 2+  fi+done+  done+IFS=$as_save_IFS++fi ;;+esac+fi+CC=$ac_cv_prog_CC+if test -n "$CC"; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $CC" >&5+printf '%s\n' "$CC" >&6; }+else+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no" >&5+printf '%s\n' "no" >&6; }+fi+++    test -n "$CC" && break+  done+fi+if test -z "$CC"; then+  ac_ct_CC=$CC+  for ac_prog in cl.exe+do+  # Extract the first word of "$ac_prog", so it can be a program name with args.+set dummy $ac_prog; ac_word=$2+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+printf %s "checking for $ac_word... " >&6; }+if test ${ac_cv_prog_ac_ct_CC+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) if test -n "$ac_ct_CC"; then+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    for ac_exec_ext in '' $ac_executable_extensions; do+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then+    ac_cv_prog_ac_ct_CC="$ac_prog"+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5+    break 2+  fi+done+  done+IFS=$as_save_IFS++fi ;;+esac+fi+ac_ct_CC=$ac_cv_prog_ac_ct_CC+if test -n "$ac_ct_CC"; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5+printf '%s\n' "$ac_ct_CC" >&6; }+else+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no" >&5+printf '%s\n' "no" >&6; }+fi+++  test -n "$ac_ct_CC" && break+done++  if test "x$ac_ct_CC" = x; then+    CC=""+  else+    case $cross_compiling:$ac_tool_warned in+yes:)+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5+printf '%s\n' "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}+ac_tool_warned=yes ;;+esac+    CC=$ac_ct_CC+  fi+fi++fi+if test -z "$CC"; then+  if test -n "$ac_tool_prefix"; then+  # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.+set dummy ${ac_tool_prefix}clang; ac_word=$2+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+printf %s "checking for $ac_word... " >&6; }+if test ${ac_cv_prog_CC+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) if test -n "$CC"; then+  ac_cv_prog_CC="$CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    for ac_exec_ext in '' $ac_executable_extensions; do+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then+    ac_cv_prog_CC="${ac_tool_prefix}clang"+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5+    break 2+  fi+done+  done+IFS=$as_save_IFS++fi ;;+esac+fi+CC=$ac_cv_prog_CC+if test -n "$CC"; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $CC" >&5+printf '%s\n' "$CC" >&6; }+else+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no" >&5+printf '%s\n' "no" >&6; }+fi+++fi+if test -z "$ac_cv_prog_CC"; then+  ac_ct_CC=$CC+  # Extract the first word of "clang", so it can be a program name with args.+set dummy clang; ac_word=$2+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5+printf %s "checking for $ac_word... " >&6; }+if test ${ac_cv_prog_ac_ct_CC+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) if test -n "$ac_ct_CC"; then+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.+else+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    for ac_exec_ext in '' $ac_executable_extensions; do+  if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then+    ac_cv_prog_ac_ct_CC="clang"+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5+    break 2+  fi+done+  done+IFS=$as_save_IFS++fi ;;+esac+fi+ac_ct_CC=$ac_cv_prog_ac_ct_CC+if test -n "$ac_ct_CC"; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5+printf '%s\n' "$ac_ct_CC" >&6; }+else+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no" >&5+printf '%s\n' "no" >&6; }+fi++  if test "x$ac_ct_CC" = x; then+    CC=""+  else+    case $cross_compiling:$ac_tool_warned in+yes:)+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5+printf '%s\n' "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}+ac_tool_warned=yes ;;+esac+    CC=$ac_ct_CC+  fi+else+  CC="$ac_cv_prog_CC"+fi++fi+++test -z "$CC" && { { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5+printf '%s\n' "$as_me: error: in '$ac_pwd':" >&2;}+as_fn_error $? "no acceptable C compiler found in \$PATH+See 'config.log' for more details" "$LINENO" 5; }++# Provide some information about the compiler.+printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5+set X $ac_compile+ac_compiler=$2+for ac_option in --version -v -V -qversion -version; do+  { { ac_try="$ac_compiler $ac_option >&5"+case "(($ac_try" in+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+  *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+printf '%s\n' "$ac_try_echo"; } >&5+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err+  ac_status=$?+  if test -s conftest.err; then+    sed '10a\+... rest of stderr output deleted ...+         10q' conftest.err >conftest.er1+    cat conftest.er1 >&5+  fi+  rm -f conftest.er1 conftest.err+  printf '%s\n' "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+  test $ac_status = 0; }+done++cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */++int+main (void)+{++  ;+  return 0;+}+_ACEOF+ac_clean_files_save=$ac_clean_files+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"+# Try to create an executable without -o first, disregard a.out.+# It will help us diagnose broken compilers, and finding out an intuition+# of exeext.+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5+printf %s "checking whether the C compiler works... " >&6; }+ac_link_default=`printf '%s\n' "$ac_link" | sed 's/ -o *conftest[^ ]*//'`++# The possible output files:+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"++ac_rmfiles=+for ac_file in $ac_files+do+  case $ac_file in+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;+  esac+done+rm -f $ac_rmfiles++if { { ac_try="$ac_link_default"+case "(($ac_try" in+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+  *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+printf '%s\n' "$ac_try_echo"; } >&5+  (eval "$ac_link_default") 2>&5+  ac_status=$?+  printf '%s\n' "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+  test $ac_status = 0; }+then :+  # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'.+# So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no'+# in a Makefile.  We should not override ac_cv_exeext if it was cached,+# so that the user can short-circuit this test for compilers unknown to+# Autoconf.+for ac_file in $ac_files ''+do+  test -f "$ac_file" || continue+  case $ac_file in+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )+	;;+    [ab].out )+	# We found the default executable, but exeext='' is most+	# certainly right.+	break;;+    *.* )+	if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;+	then :; else+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`+	fi+	# We set ac_cv_exeext here because the later test for it is not+	# safe: cross compilers may not add the suffix if given an '-o'+	# argument, so we may need to know it at that point already.+	# Even if this section looks crufty: it has the advantage of+	# actually working.+	break;;+    * )+	break;;+  esac+done+test "$ac_cv_exeext" = no && ac_cv_exeext=++else case e in #(+  e) ac_file='' ;;+esac+fi+if test -z "$ac_file"+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no" >&5+printf '%s\n' "no" >&6; }+printf '%s\n' "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++{ { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5+printf '%s\n' "$as_me: error: in '$ac_pwd':" >&2;}+as_fn_error 77 "C compiler cannot create executables+See 'config.log' for more details" "$LINENO" 5; }+else case e in #(+  e) { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: yes" >&5+printf '%s\n' "yes" >&6; } ;;+esac+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5+printf %s "checking for C compiler default output file name... " >&6; }+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5+printf '%s\n' "$ac_file" >&6; }+ac_exeext=$ac_cv_exeext++rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out+ac_clean_files=$ac_clean_files_save+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5+printf %s "checking for suffix of executables... " >&6; }+if { { ac_try="$ac_link"+case "(($ac_try" in+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+  *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+printf '%s\n' "$ac_try_echo"; } >&5+  (eval "$ac_link") 2>&5+  ac_status=$?+  printf '%s\n' "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+  test $ac_status = 0; }+then :+  # If both 'conftest.exe' and 'conftest' are 'present' (well, observable)+# catch 'conftest.exe'.  For instance with Cygwin, 'ls conftest' will+# work properly (i.e., refer to 'conftest.exe'), while it won't with+# 'rm'.+for ac_file in conftest.exe conftest conftest.*; do+  test -f "$ac_file" || continue+  case $ac_file in+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`+	  break;;+    * ) break;;+  esac+done+else case e in #(+  e) { { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5+printf '%s\n' "$as_me: error: in '$ac_pwd':" >&2;}+as_fn_error $? "cannot compute suffix of executables: cannot compile and link+See 'config.log' for more details" "$LINENO" 5; } ;;+esac+fi+rm -f conftest conftest$ac_cv_exeext+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5+printf '%s\n' "$ac_cv_exeext" >&6; }++rm -f conftest.$ac_ext+EXEEXT=$ac_cv_exeext+ac_exeext=$EXEEXT+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+#include <stdio.h>+int+main (void)+{+FILE *f = fopen ("conftest.out", "w");+ if (!f)+  return 1;+ return ferror (f) || fclose (f) != 0;++  ;+  return 0;+}+_ACEOF+ac_clean_files="$ac_clean_files conftest.out"+# Check that the compiler produces executables we can run.  If not, either+# the compiler is broken, or we cross compile.+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5+printf %s "checking whether we are cross compiling... " >&6; }+if test "$cross_compiling" != yes; then+  { { ac_try="$ac_link"+case "(($ac_try" in+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+  *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+printf '%s\n' "$ac_try_echo"; } >&5+  (eval "$ac_link") 2>&5+  ac_status=$?+  printf '%s\n' "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+  test $ac_status = 0; }+  if { ac_try='./conftest$ac_cv_exeext'+  { { case "(($ac_try" in+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+  *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+printf '%s\n' "$ac_try_echo"; } >&5+  (eval "$ac_try") 2>&5+  ac_status=$?+  printf '%s\n' "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+  test $ac_status = 0; }; }; then+    cross_compiling=no+  else+    if test "$cross_compiling" = maybe; then+	cross_compiling=yes+    else+	{ { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5+printf '%s\n' "$as_me: error: in '$ac_pwd':" >&2;}+as_fn_error 77 "cannot run C compiled programs.+If you meant to cross compile, use '--host'.+See 'config.log' for more details" "$LINENO" 5; }+    fi+  fi+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5+printf '%s\n' "$cross_compiling" >&6; }++rm -f conftest.$ac_ext conftest$ac_cv_exeext \+  conftest.o conftest.obj conftest.out+ac_clean_files=$ac_clean_files_save+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5+printf %s "checking for suffix of object files... " >&6; }+if test ${ac_cv_objext+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */++int+main (void)+{++  ;+  return 0;+}+_ACEOF+rm -f conftest.o conftest.obj+if { { ac_try="$ac_compile"+case "(($ac_try" in+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;+  *) ac_try_echo=$ac_try;;+esac+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""+printf '%s\n' "$ac_try_echo"; } >&5+  (eval "$ac_compile") 2>&5+  ac_status=$?+  printf '%s\n' "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5+  test $ac_status = 0; }+then :+  for ac_file in conftest.o conftest.obj conftest.*; do+  test -f "$ac_file" || continue;+  case $ac_file in+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`+       break;;+  esac+done+else case e in #(+  e) printf '%s\n' "$as_me: failed program was:" >&5+sed 's/^/| /' conftest.$ac_ext >&5++{ { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5+printf '%s\n' "$as_me: error: in '$ac_pwd':" >&2;}+as_fn_error $? "cannot compute suffix of object files: cannot compile+See 'config.log' for more details" "$LINENO" 5; } ;;+esac+fi+rm -f conftest.$ac_cv_objext conftest.$ac_ext ;;+esac+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5+printf '%s\n' "$ac_cv_objext" >&6; }+OBJEXT=$ac_cv_objext+ac_objext=$OBJEXT+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5+printf %s "checking whether the compiler supports GNU C... " >&6; }+if test ${ac_cv_c_compiler_gnu+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */++int+main (void)+{+#ifndef __GNUC__+       choke me+#endif++  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  ac_compiler_gnu=yes+else case e in #(+  e) ac_compiler_gnu=no ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext+ac_cv_c_compiler_gnu=$ac_compiler_gnu+ ;;+esac+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5+printf '%s\n' "$ac_cv_c_compiler_gnu" >&6; }+ac_compiler_gnu=$ac_cv_c_compiler_gnu++if test $ac_compiler_gnu = yes; then+  GCC=yes+else+  GCC=+fi+ac_test_CFLAGS=${CFLAGS+y}+ac_save_CFLAGS=$CFLAGS+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5+printf %s "checking whether $CC accepts -g... " >&6; }+if test ${ac_cv_prog_cc_g+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) ac_save_c_werror_flag=$ac_c_werror_flag+   ac_c_werror_flag=yes+   ac_cv_prog_cc_g=no+   CFLAGS="-g"+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */++int+main (void)+{++  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  ac_cv_prog_cc_g=yes+else case e in #(+  e) CFLAGS=""+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */++int+main (void)+{++  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :++else case e in #(+  e) ac_c_werror_flag=$ac_save_c_werror_flag+	 CFLAGS="-g"+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */++int+main (void)+{++  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  ac_cv_prog_cc_g=yes+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext+   ac_c_werror_flag=$ac_save_c_werror_flag ;;+esac+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5+printf '%s\n' "$ac_cv_prog_cc_g" >&6; }+if test $ac_test_CFLAGS; then+  CFLAGS=$ac_save_CFLAGS+elif test $ac_cv_prog_cc_g = yes; then+  if test "$GCC" = yes; then+    CFLAGS="-g -O2"+  else+    CFLAGS="-g"+  fi+else+  if test "$GCC" = yes; then+    CFLAGS="-O2"+  else+    CFLAGS=+  fi+fi+ac_prog_cc_stdc=no+if test x$ac_prog_cc_stdc = xno+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C23 features" >&5+printf %s "checking for $CC option to enable C23 features... " >&6; }+if test ${ac_cv_prog_cc_c23+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) ac_cv_prog_cc_c23=no+ac_save_CC=$CC+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$ac_c_conftest_c23_program+_ACEOF+for ac_arg in '' -std=gnu23+do+  CC="$ac_save_CC $ac_arg"+  if ac_fn_c_try_compile "$LINENO"+then :+  ac_cv_prog_cc_c23=$ac_arg+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam+  test "x$ac_cv_prog_cc_c23" != "xno" && break+done+rm -f conftest.$ac_ext+CC=$ac_save_CC ;;+esac+fi++if test "x$ac_cv_prog_cc_c23" = xno+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5+printf '%s\n' "unsupported" >&6; }+else case e in #(+  e) if test "x$ac_cv_prog_cc_c23" = x+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: none needed" >&5+printf '%s\n' "none needed" >&6; }+else case e in #(+  e) { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c23" >&5+printf '%s\n' "$ac_cv_prog_cc_c23" >&6; }+     CC="$CC $ac_cv_prog_cc_c23" ;;+esac+fi+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c23+  ac_prog_cc_stdc=c23 ;;+esac+fi+fi+if test x$ac_prog_cc_stdc = xno+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5+printf %s "checking for $CC option to enable C11 features... " >&6; }+if test ${ac_cv_prog_cc_c11+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) ac_cv_prog_cc_c11=no+ac_save_CC=$CC+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$ac_c_conftest_c11_program+_ACEOF+for ac_arg in '' -std=gnu11 -std:c11+do+  CC="$ac_save_CC $ac_arg"+  if ac_fn_c_try_compile "$LINENO"+then :+  ac_cv_prog_cc_c11=$ac_arg+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam+  test "x$ac_cv_prog_cc_c11" != "xno" && break+done+rm -f conftest.$ac_ext+CC=$ac_save_CC ;;+esac+fi++if test "x$ac_cv_prog_cc_c11" = xno+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5+printf '%s\n' "unsupported" >&6; }+else case e in #(+  e) if test "x$ac_cv_prog_cc_c11" = x+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: none needed" >&5+printf '%s\n' "none needed" >&6; }+else case e in #(+  e) { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5+printf '%s\n' "$ac_cv_prog_cc_c11" >&6; }+     CC="$CC $ac_cv_prog_cc_c11" ;;+esac+fi+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11+  ac_prog_cc_stdc=c11 ;;+esac+fi+fi+if test x$ac_prog_cc_stdc = xno+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5+printf %s "checking for $CC option to enable C99 features... " >&6; }+if test ${ac_cv_prog_cc_c99+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) ac_cv_prog_cc_c99=no+ac_save_CC=$CC+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$ac_c_conftest_c99_program+_ACEOF+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=+do+  CC="$ac_save_CC $ac_arg"+  if ac_fn_c_try_compile "$LINENO"+then :+  ac_cv_prog_cc_c99=$ac_arg+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam+  test "x$ac_cv_prog_cc_c99" != "xno" && break+done+rm -f conftest.$ac_ext+CC=$ac_save_CC ;;+esac+fi++if test "x$ac_cv_prog_cc_c99" = xno+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5+printf '%s\n' "unsupported" >&6; }+else case e in #(+  e) if test "x$ac_cv_prog_cc_c99" = x+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: none needed" >&5+printf '%s\n' "none needed" >&6; }+else case e in #(+  e) { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5+printf '%s\n' "$ac_cv_prog_cc_c99" >&6; }+     CC="$CC $ac_cv_prog_cc_c99" ;;+esac+fi+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99+  ac_prog_cc_stdc=c99 ;;+esac+fi+fi+if test x$ac_prog_cc_stdc = xno+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5+printf %s "checking for $CC option to enable C89 features... " >&6; }+if test ${ac_cv_prog_cc_c89+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) ac_cv_prog_cc_c89=no+ac_save_CC=$CC+cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+$ac_c_conftest_c89_program+_ACEOF+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"+do+  CC="$ac_save_CC $ac_arg"+  if ac_fn_c_try_compile "$LINENO"+then :+  ac_cv_prog_cc_c89=$ac_arg+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam+  test "x$ac_cv_prog_cc_c89" != "xno" && break+done+rm -f conftest.$ac_ext+CC=$ac_save_CC ;;+esac+fi++if test "x$ac_cv_prog_cc_c89" = xno+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5+printf '%s\n' "unsupported" >&6; }+else case e in #(+  e) if test "x$ac_cv_prog_cc_c89" = x+then :+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: none needed" >&5+printf '%s\n' "none needed" >&6; }+else case e in #(+  e) { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5+printf '%s\n' "$ac_cv_prog_cc_c89" >&6; }+     CC="$CC $ac_cv_prog_cc_c89" ;;+esac+fi+  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89+  ac_prog_cc_stdc=c89 ;;+esac+fi+fi++ac_ext=c+ac_cpp='$CPP $CPPFLAGS'+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'+ac_compiler_gnu=$ac_cv_c_compiler_gnu++++# Check whether --with-compiler was given.+if test ${with_compiler+y}+then :+  withval=$with_compiler; HC=$withval+fi+++# Check whether --with-hc was given.+if test ${with_hc+y}+then :+  withval=$with_hc; HC=$withval+fi++if test -z "$HC"+then :+  HC=ghc+fi+++{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5+printf %s "checking for an ANSI C-conforming const... " >&6; }+if test ${ac_cv_c_const+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */++int+main (void)+{++#ifndef __cplusplus+  /* Ultrix mips cc rejects this sort of thing.  */+  typedef int charset[2];+  const charset cs = { 0, 0 };+  /* SunOS 4.1.1 cc rejects this.  */+  char const *const *pcpcc;+  char **ppc;+  /* NEC SVR4.0.2 mips cc rejects this.  */+  struct point {int x, y;};+  static struct point const zero = {0,0};+  /* IBM XL C 1.02.0.0 rejects this.+     It does not let you subtract one const X* pointer from another in+     an arm of an if-expression whose if-part is not a constant+     expression */+  const char *g = "string";+  pcpcc = &g + (g ? g-g : 0);+  /* HPUX 7.0 cc rejects these. */+  ++pcpcc;+  ppc = (char**) pcpcc;+  pcpcc = (char const *const *) ppc;+  { /* SCO 3.2v4 cc rejects this sort of thing.  */+    char tx;+    char *t = &tx;+    char const *s = 0 ? (char *) 0 : (char const *) 0;++    *t++ = 0;+    if (s) return 0;+  }+  { /* Derived from code rejected by Sun C 1.0 and similar vintage.  */+    int x[] = {25, 17};+    typedef int const *iptr;+    iptr foo = &x[0];+    ++foo;+    if (!*foo) return 0;+  }+  { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying+       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */+    struct s { int j; const int *ap[3]; } bx;+    struct s *b = &bx; b->j = 5;+  }+  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */+    const int foo = 10;+    if (!foo) return 0;+  }+  return !cs[0] && !zero.x;+#endif++  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  ac_cv_c_const=yes+else case e in #(+  e) ac_cv_c_const=no ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;+esac+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5+printf '%s\n' "$ac_cv_c_const" >&6; }+if test $ac_cv_c_const = no; then++printf '%s\n' "#define const /**/" >>confdefs.h++fi+++ac_header= ac_cache=+for ac_item in $ac_header_c_list+do+  if test $ac_cache; then+    ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"+    if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then+      printf '%s\n' "#define $ac_item 1" >> confdefs.h+    fi+    ac_header= ac_cache=+  elif test $ac_header; then+    ac_cache=$ac_item+  else+    ac_header=$ac_item+  fi+done+++++++++if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes+then :++printf '%s\n' "#define STDC_HEADERS 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default"+if test "x$ac_cv_header_limits_h" = xyes+then :+  printf '%s\n' "#define HAVE_LIMITS_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"+if test "x$ac_cv_header_stdlib_h" = xyes+then :+  printf '%s\n' "#define HAVE_STDLIB_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"+if test "x$ac_cv_header_unistd_h" = xyes+then :+  printf '%s\n' "#define HAVE_UNISTD_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default"+if test "x$ac_cv_header_sys_types_h" = xyes+then :+  printf '%s\n' "#define HAVE_SYS_TYPES_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default"+if test "x$ac_cv_header_fcntl_h" = xyes+then :+  printf '%s\n' "#define HAVE_FCNTL_H 1" >>confdefs.h++fi++ac_fn_c_check_header_compile "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default"+if test "x$ac_cv_header_sys_uio_h" = xyes+then :+  printf '%s\n' "#define HAVE_SYS_UIO_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default"+if test "x$ac_cv_header_sys_socket_h" = xyes+then :+  printf '%s\n' "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default"+if test "x$ac_cv_header_netinet_in_h" = xyes+then :+  printf '%s\n' "#define HAVE_NETINET_IN_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "netinet/tcp.h" "ac_cv_header_netinet_tcp_h" "$ac_includes_default"+if test "x$ac_cv_header_netinet_tcp_h" = xyes+then :+  printf '%s\n' "#define HAVE_NETINET_TCP_H 1" >>confdefs.h++fi++ac_fn_c_check_header_compile "$LINENO" "sys/un.h" "ac_cv_header_sys_un_h" "$ac_includes_default"+if test "x$ac_cv_header_sys_un_h" = xyes+then :+  printf '%s\n' "#define HAVE_SYS_UN_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default"+if test "x$ac_cv_header_arpa_inet_h" = xyes+then :+  printf '%s\n' "#define HAVE_ARPA_INET_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default"+if test "x$ac_cv_header_netdb_h" = xyes+then :+  printf '%s\n' "#define HAVE_NETDB_H 1" >>confdefs.h++fi++ac_fn_c_check_header_compile "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "$ac_includes_default"+if test "x$ac_cv_header_net_if_h" = xyes+then :+  printf '%s\n' "#define HAVE_NET_IF_H 1" >>confdefs.h++fi+ac_fn_c_check_header_compile "$LINENO" "netioapi.h" "ac_cv_header_netioapi_h" "$ac_includes_default"+if test "x$ac_cv_header_netioapi_h" = xyes+then :+  printf '%s\n' "#define HAVE_NETIOAPI_H 1" >>confdefs.h++fi+++ac_fn_c_check_type "$LINENO" "struct ucred" "ac_cv_type_struct_ucred" "$ac_includes_default"+if test "x$ac_cv_type_struct_ucred" = xyes+then :++printf '%s\n' "#define HAVE_STRUCT_UCRED 1" >>confdefs.h+++fi+++ac_fn_c_check_func "$LINENO" "gai_strerror" "ac_cv_func_gai_strerror"+if test "x$ac_cv_func_gai_strerror" = xyes+then :+  printf '%s\n' "#define HAVE_GAI_STRERROR 1" >>confdefs.h++fi+ac_fn_c_check_func "$LINENO" "gethostent" "ac_cv_func_gethostent"+if test "x$ac_cv_func_gethostent" = xyes+then :+  printf '%s\n' "#define HAVE_GETHOSTENT 1" >>confdefs.h++fi+ac_fn_c_check_func "$LINENO" "accept4" "ac_cv_func_accept4"+if test "x$ac_cv_func_accept4" = xyes+then :+  printf '%s\n' "#define HAVE_ACCEPT4 1" >>confdefs.h++fi++ac_fn_c_check_func "$LINENO" "getpeereid" "ac_cv_func_getpeereid"+if test "x$ac_cv_func_getpeereid" = xyes+then :+  printf '%s\n' "#define HAVE_GETPEEREID 1" >>confdefs.h++fi+++{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $CC options to detect undeclared functions" >&5+printf %s "checking for $CC options to detect undeclared functions... " >&6; }+if test ${ac_cv_c_undeclared_builtin_options+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e) ac_save_CFLAGS=$CFLAGS+   ac_cv_c_undeclared_builtin_options='cannot detect'+   for ac_arg in '' -fno-builtin; do+     CFLAGS="$ac_save_CFLAGS $ac_arg"+     # This test program should *not* compile successfully.+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */++int+main (void)+{+(void) strchr;+  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :++else case e in #(+  e) # This test program should compile successfully.+        # No library function is consistently available on+        # freestanding implementations, so test against a dummy+        # declaration.  Include always-available headers on the+        # off chance that they somehow elicit warnings.+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+#include <float.h>+#include <limits.h>+#include <stdarg.h>+#include <stddef.h>+extern void ac_decl (int, char *);++int+main (void)+{+(void) ac_decl (0, (char *) 0);+  (void) ac_decl;++  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  if test x"$ac_arg" = x+then :+  ac_cv_c_undeclared_builtin_options='none needed'+else case e in #(+  e) ac_cv_c_undeclared_builtin_options=$ac_arg ;;+esac+fi+          break+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext+    done+    CFLAGS=$ac_save_CFLAGS+   ;;+esac+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5+printf '%s\n' "$ac_cv_c_undeclared_builtin_options" >&6; }+  case $ac_cv_c_undeclared_builtin_options in #(+  'cannot detect') :+    { { printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5+printf '%s\n' "$as_me: error: in '$ac_pwd':" >&2;}+as_fn_error $? "cannot make $CC report undeclared builtins+See 'config.log' for more details" "$LINENO" 5; } ;; #(+  'none needed') :+    ac_c_undeclared_builtin_options='' ;; #(+  *) :+    ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;;+esac++{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking for $CC options to ignore future-version functions" >&5+printf %s "checking for $CC options to ignore future-version functions... " >&6; }+if test ${ac_cv_c_future_darwin_options+y}+then :+  printf %s "(cached) " >&6+else case e in #(+  e)       ac_compile_saved="$ac_compile"+   ac_compile="$ac_compile -Werror=unguarded-availability-new"+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext+/* end confdefs.h.  */+#if ! (defined __APPLE__ && defined __MACH__)+	   #error "-Werror=unguarded-availability-new not needed here"+	  #endif++int+main (void)+{++  ;+  return 0;+}+_ACEOF+if ac_fn_c_try_compile "$LINENO"+then :+  ac_cv_c_future_darwin_options='-Werror=unguarded-availability-new'+else case e in #(+  e) ac_cv_c_future_darwin_options='none needed' ;;+esac+fi+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext+   ac_compile="$ac_compile_saved"+   ;;+esac+fi+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_future_darwin_options" >&5+printf '%s\n' "$ac_cv_c_future_darwin_options" >&6; }+ case $ac_cv_c_future_darwin_options in #(+  'none needed') :+    ac_c_future_darwin_options='' ;; #(+  *) :+    ac_c_future_darwin_options=$ac_cv_c_future_darwin_options ;;+esac++ac_fn_check_decl "$LINENO" "AI_ADDRCONFIG" "ac_cv_have_decl_AI_ADDRCONFIG" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_AI_ADDRCONFIG" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_AI_ADDRCONFIG $ac_have_decl" >>confdefs.h+ac_fn_check_decl "$LINENO" "AI_ALL" "ac_cv_have_decl_AI_ALL" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_AI_ALL" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_AI_ALL $ac_have_decl" >>confdefs.h+ac_fn_check_decl "$LINENO" "AI_NUMERICSERV" "ac_cv_have_decl_AI_NUMERICSERV" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_AI_NUMERICSERV" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_AI_NUMERICSERV $ac_have_decl" >>confdefs.h+ac_fn_check_decl "$LINENO" "AI_V4MAPPED" "ac_cv_have_decl_AI_V4MAPPED" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_AI_V4MAPPED" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_AI_V4MAPPED $ac_have_decl" >>confdefs.h++ac_fn_check_decl "$LINENO" "IPV6_V6ONLY" "ac_cv_have_decl_IPV6_V6ONLY" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_IPV6_V6ONLY" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_IPV6_V6ONLY $ac_have_decl" >>confdefs.h++ac_fn_check_decl "$LINENO" "IPPROTO_IP" "ac_cv_have_decl_IPPROTO_IP" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_IPPROTO_IP" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_IPPROTO_IP $ac_have_decl" >>confdefs.h+ac_fn_check_decl "$LINENO" "IPPROTO_TCP" "ac_cv_have_decl_IPPROTO_TCP" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_IPPROTO_TCP" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_IPPROTO_TCP $ac_have_decl" >>confdefs.h+ac_fn_check_decl "$LINENO" "IPPROTO_IPV6" "ac_cv_have_decl_IPPROTO_IPV6" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_IPPROTO_IPV6" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_IPPROTO_IPV6 $ac_have_decl" >>confdefs.h++ac_fn_check_decl "$LINENO" "SO_PEERCRED" "ac_cv_have_decl_SO_PEERCRED" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_SO_PEERCRED" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_SO_PEERCRED $ac_have_decl" >>confdefs.h++ac_fn_check_decl "$LINENO" "IP_DONTFRAG" "ac_cv_have_decl_IP_DONTFRAG" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_IP_DONTFRAG" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_IP_DONTFRAG $ac_have_decl" >>confdefs.h++ac_fn_check_decl "$LINENO" "IP_MTU_DISCOVER" "ac_cv_have_decl_IP_MTU_DISCOVER" "$ac_includes_default" "$ac_c_undeclared_builtin_options$ac_c_future_darwin_options" "CFLAGS"+if test "x$ac_cv_have_decl_IP_MTU_DISCOVER" = xyes+then :+  ac_have_decl=1+else case e in #(+  e) ac_have_decl=0 ;;+esac+fi+printf '%s\n' "#define HAVE_DECL_IP_MTU_DISCOVER $ac_have_decl" >>confdefs.h+++ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_control" "ac_cv_member_struct_msghdr_msg_control" "$ac_includes_default"+if test "x$ac_cv_member_struct_msghdr_msg_control" = xyes+then :++printf '%s\n' "#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1" >>confdefs.h+++fi+ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_accrights" "ac_cv_member_struct_msghdr_msg_accrights" "$ac_includes_default"+if test "x$ac_cv_member_struct_msghdr_msg_accrights" = xyes+then :++printf '%s\n' "#define HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS 1" >>confdefs.h+++fi++ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "$ac_includes_default"+if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes+then :++printf '%s\n' "#define HAVE_STRUCT_SOCKADDR_SA_LEN 1" >>confdefs.h+++fi+++{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: creating ./network.buildinfo" >&5+printf '%s\n' "$as_me: creating ./network.buildinfo" >&6;}+echo "install-includes: HsNetworkConfig.h" > network.buildinfo++WINIO_GHC_OPTIONS=+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: checking whether to use native Windows I/O manager RTS option" >&5+printf %s "checking whether to use native Windows I/O manager RTS option... " >&6; }+case "$host_os" in+mingw*)+    cat > conftest_ghc_cpp.hs <<EOF+#if !defined(__IO_MANAGER_WINIO__) || __IO_MANAGER_WINIO__ < 2+#error __IO_MANAGER_WINIO__ < 2+#endif+module Main where+main :: IO ()+main = return ()+EOF+    if "$HC" -c -cpp -fforce-recomp conftest_ghc_cpp.hs >/dev/null 2>&1; then+        { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: yes" >&5+printf '%s\n' "yes" >&6; }+        WINIO_GHC_OPTIONS="-with-rtsopts=--io-manager=native"+    else+        { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no, $HC does not define __IO_MANAGER_WINIO__ >= 2" >&5+printf '%s\n' "no, $HC does not define __IO_MANAGER_WINIO__ >= 2" >&6; }+    fi+    rm -f conftest_ghc_cpp.hi conftest_ghc_cpp.hs conftest_ghc_cpp.o+    ;;+*)+    { printf '%s\n' "$as_me:${as_lineno-$LINENO}: result: no, not Windows" >&5+printf '%s\n' "no, not Windows" >&6; }+    ;;+esac++if test -n "$WINIO_GHC_OPTIONS"+then :+  cat >> network.buildinfo <<EOF++test-suite spec+  ghc-options: $WINIO_GHC_OPTIONS+EOF++fi++cat >confcache <<\_ACEOF+# This file is a shell script that caches the results of configure+# tests run on this system so they can be shared between configure+# scripts and configure runs, see configure's option --config-cache.+# It is not useful on other systems.  If it contains results you don't+# want to keep, you may remove or edit it.+#+# config.status only pays attention to the cache file if you give it+# the --recheck option to rerun configure.+#+# 'ac_cv_env_foo' variables (set or unset) will be overridden when+# loading this file, other *unset* 'ac_cv_foo' will be assigned the+# following values.++_ACEOF++ac_cache_dump |+  sed '+     /^ac_cv_env_/b end+     t clear+     :clear+     s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/+     t end+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/+     :end' >>confcache+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else+  if test -w "$cache_file"; then+    if test "x$cache_file" != "x/dev/null"; then+      { printf '%s\n' "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5+printf '%s\n' "$as_me: updating cache $cache_file" >&6;}+      if test ! -f "$cache_file" || test -h "$cache_file"; then+	cat confcache >"$cache_file"+      else+        case $cache_file in #(+        */* | ?:*)+	  mv -f confcache "$cache_file"$$ &&+	  mv -f "$cache_file"$$ "$cache_file" ;; #(+        *)+	  mv -f confcache "$cache_file" ;;+	esac+      fi+    fi+  else+    { printf '%s\n' "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5+printf '%s\n' "$as_me: not updating unwritable cache $cache_file" >&6;}+  fi+fi+rm -f confcache++test "x$prefix" = xNONE && prefix=$ac_default_prefix+# Let make expand exec_prefix.+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'++DEFS=-DHAVE_CONFIG_H++ac_libobjs=+ac_ltlibobjs=+U=+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue+  # 1. Remove the extension, and $U if already installed.+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'+  ac_i=`printf '%s\n' "$ac_i" | sed "$ac_script"`+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR+  #    will be set to the directory where LIBOBJS objects are built.+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'+done+LIBOBJS=$ac_libobjs++LTLIBOBJS=$ac_ltlibobjs++++: "${CONFIG_STATUS=./config.status}"+case $CONFIG_STATUS in #(+  -*) :+    CONFIG_STATUS=./$CONFIG_STATUS ;; #(+  */*) :+     ;; #(+  *) :+    CONFIG_STATUS=./$CONFIG_STATUS ;;+esac++ac_write_fail=0+ac_clean_CONFIG_STATUS='"$CONFIG_STATUS"'+{ printf '%s\n' "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5+printf '%s\n' "$as_me: creating $CONFIG_STATUS" >&6;}+as_write_fail=0+cat >"$CONFIG_STATUS" <<_ASEOF || as_write_fail=1+#! $SHELL+# Generated by $as_me.+# Run this file to recreate the current configuration.+# Compiler output produced by configure, useful for debugging+# configure, is in config.log if it exists.++debug=false+ac_cs_recheck=false+ac_cs_silent=false++SHELL=\${CONFIG_SHELL-$SHELL}+export SHELL+_ASEOF+cat >>"$CONFIG_STATUS" <<\_ASEOF || as_write_fail=1+## -------------------- ##+## M4sh Initialization. ##+## -------------------- ##++# Be more Bourne compatible+DUALCASE=1; export DUALCASE # for MKS sh+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1+then :+  emulate sh+  NULLCMD=:+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which+  # contradicts POSIX and common usage.  Disable this.+  alias -g '${1+"$@"}'='"$@"'+  setopt NO_GLOB_SUBST+else case e in #(+  e) case `(set -o) 2>/dev/null` in #(+  *posix*) :+    set -o posix ;; #(+  *) :+     ;;+esac ;;+esac+fi++++# Reset variables that may have inherited troublesome values from+# the environment.++# IFS needs to be set, to space, tab, and newline, in precisely that order.+# (If _AS_PATH_WALK were called with IFS unset, it would have the+# side effect of setting IFS to empty, thus disabling word splitting.)+# Quoting is to prevent editors from complaining about space-tab.+as_nl='+'+export as_nl+IFS=" ""	$as_nl"++PS1='$ '+PS2='> '+PS4='+ '++# Ensure predictable behavior from utilities with locale-dependent output.+LC_ALL=C+export LC_ALL+LANGUAGE=C+export LANGUAGE++# We cannot yet rely on "unset" to work, but we need these variables+# to be unset--not just set to an empty or harmless value--now, to+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh).  This construct+# also avoids known problems related to "unset" and subshell syntax+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH+do eval test \${$as_var+y} \+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :+done++# Ensure that fds 0, 1, and 2 are open.+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi+if (exec 3>&2)            ; then :; else exec 2>/dev/null; fi++# The user is always right.+if ${PATH_SEPARATOR+false} :; then+  PATH_SEPARATOR=:+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||+      PATH_SEPARATOR=';'+  }+fi+++# Find who we are.  Look in the path if we contain no directory separator.+as_myself=+case $0 in #((+  *[\\/]* ) as_myself=$0 ;;+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR+for as_dir in $PATH+do+  IFS=$as_save_IFS+  case $as_dir in #(((+    '') as_dir=./ ;;+    */) ;;+    *) as_dir=$as_dir/ ;;+  esac+    test -r "$as_dir$0" && as_myself=$as_dir$0 && break+  done+IFS=$as_save_IFS++     ;;+esac+# We did not find ourselves, most probably we were run as 'sh COMMAND'+# in which case we are not to be found in the path.+if test "x$as_myself" = x; then+  as_myself=$0+fi+if test ! -f "$as_myself"; then+  printf '%s\n' "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2+  exit 1+fi++++# as_fn_error STATUS ERROR [LINENO LOG_FD]+# ----------------------------------------+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the+# script with STATUS, using 1 if that was 0.+as_fn_error ()+{+  as_status=$1; test $as_status -eq 0 && as_status=1+  if test "$4"; then+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack+    printf '%s\n' "$as_me:${as_lineno-$LINENO}: error: $2" >&$4+  fi+  printf '%s\n' "$as_me: error: $2" >&2+  as_fn_exit $as_status+} # as_fn_error+++# as_fn_set_status STATUS+# -----------------------+# Set $? to STATUS, without forking.+as_fn_set_status ()+{+  return $1+} # as_fn_set_status++# as_fn_exit STATUS+# -----------------+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.+as_fn_exit ()+{+  set +e+  as_fn_set_status $1+  exit $1+} # as_fn_exit++# as_fn_unset VAR+# ---------------+# Portably unset VAR.+as_fn_unset ()+{+  { eval $1=; unset $1;}+}+as_unset=as_fn_unset++# as_fn_append VAR VALUE+# ----------------------+# Append the text in VALUE to the end of the definition contained in VAR. Take+# advantage of any shell optimizations that allow amortized linear growth over+# repeated appends, instead of the typical quadratic growth present in naive+# implementations.+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null+then :+  eval 'as_fn_append ()+  {+    eval $1+=\$2+  }'+else case e in #(+  e) as_fn_append ()+  {+    eval $1=\$$1\$2+  } ;;+esac+fi # as_fn_append++# as_fn_arith ARG...+# ------------------+# Perform arithmetic evaluation on the ARGs, and store the result in the+# global $as_val. Take advantage of shells that can avoid forks. The arguments+# must be portable across $(()) and expr.+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null+then :+  eval 'as_fn_arith ()+  {+    as_val=$(( $* ))+  }'+else case e in #(+  e) as_fn_arith ()+  {+    as_val=`expr "$@" || test $? -eq 1`+  } ;;+esac+fi # as_fn_arith+++if expr a : '\(a\)' >/dev/null 2>&1 &&+   test "X`expr 00001 : '.*\(...\)'`" = X001; then+  as_expr=expr+else+  as_expr=false+fi++if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then+  as_basename=basename+else+  as_basename=false+fi++if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then+  as_dirname=dirname+else+  as_dirname=false+fi++as_me=`$as_basename -- "$0" ||+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \+	 X"$0" : 'X\(//\)$' \| \+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||+printf '%s\n' X/"$0" |+    sed '/^.*\/\([^/][^/]*\)\/*$/{+	    s//\1/+	    q+	  }+	  /^X\/\(\/\/\)$/{+	    s//\1/+	    q+	  }+	  /^X\/\(\/\).*/{+	    s//\1/+	    q+	  }+	  s/.*/./; q'`++# Avoid depending upon Character Ranges.+as_cr_letters='abcdefghijklmnopqrstuvwxyz'+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'+as_cr_Letters=$as_cr_letters$as_cr_LETTERS+as_cr_digits='0123456789'+as_cr_alnum=$as_cr_Letters$as_cr_digits++rm -f conf$$ conf$$.exe conf$$.file+if test -d conf$$.dir; then+  rm -f conf$$.dir/conf$$.file+else+  rm -f conf$$.dir+  mkdir conf$$.dir 2>/dev/null+fi+if (echo >conf$$.file) 2>/dev/null; then+  if ln -s conf$$.file conf$$ 2>/dev/null; then+    as_ln_s='ln -s'+    # ... but there are two gotchas:+    # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail.+    # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable.+    # In both cases, we have to default to 'cp -pR'.+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||+      as_ln_s='cp -pR'+  elif ln conf$$.file conf$$ 2>/dev/null; then+    as_ln_s=ln+  else+    as_ln_s='cp -pR'+  fi+else+  as_ln_s='cp -pR'+fi+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file+rmdir conf$$.dir 2>/dev/null+++# as_fn_mkdir_p+# -------------+# Create "$as_dir" as a directory, including parents if necessary.+as_fn_mkdir_p ()+{++  case $as_dir in #(+  -*) as_dir=./$as_dir;;+  esac+  test -d "$as_dir" || eval $as_mkdir_p || {+    as_dirs=+    while :; do+      case $as_dir in #(+      *\'*) as_qdir=`printf '%s\n' "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(+      *) as_qdir=$as_dir;;+      esac+      as_dirs="'$as_qdir' $as_dirs"+      as_dir=`$as_dirname -- "$as_dir" ||+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \+	 X"$as_dir" : 'X\(//\)[^/]' \| \+	 X"$as_dir" : 'X\(//\)$' \| \+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||+printf '%s\n' X"$as_dir" |+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{+	    s//\1/+	    q+	  }+	  /^X\(\/\/\)[^/].*/{+	    s//\1/+	    q+	  }+	  /^X\(\/\/\)$/{+	    s//\1/+	    q+	  }+	  /^X\(\/\).*/{+	    s//\1/+	    q+	  }+	  s/.*/./; q'`+      test -d "$as_dir" && break+    done+    test -z "$as_dirs" || eval "mkdir $as_dirs"+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"+++} # as_fn_mkdir_p+if mkdir -p . 2>/dev/null; then+  as_mkdir_p='mkdir -p "$as_dir"'+else+  test -d ./-p && rmdir ./-p+  as_mkdir_p=false+fi+++# as_fn_executable_p FILE+# -----------------------+# Test if FILE is an executable regular file.+as_fn_executable_p ()+{+  test -f "$1" && test -x "$1"+} # as_fn_executable_p+as_test_x='test -x'+as_executable_p=as_fn_executable_p++# Sed expression to map a string onto a valid CPP name.+as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"+as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated++# Sed expression to map a string onto a valid variable name.+as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g"+as_tr_sh="eval sed '$as_sed_sh'" # deprecated+++exec 6>&1+## ------------------------------------- ##+## Main body of "$CONFIG_STATUS" script. ##+## ------------------------------------- ##+_ASEOF+test $as_write_fail = 0 && chmod +x "$CONFIG_STATUS" || ac_write_fail=1++cat >>"$CONFIG_STATUS" <<\_ACEOF || ac_write_fail=1+# Save the log message, to keep $0 and so on meaningful, and to+# report actual input values of CONFIG_FILES etc. instead of their+# values after options handling.+ac_log="+This file was extended by Haskell network package $as_me 3.2.7.0, which was+generated by GNU Autoconf 2.73.  Invocation command line was++  CONFIG_FILES    = $CONFIG_FILES+  CONFIG_HEADERS  = $CONFIG_HEADERS+  CONFIG_LINKS    = $CONFIG_LINKS+  CONFIG_COMMANDS = $CONFIG_COMMANDS+  $ $0 $@++on `(hostname || uname -n) 2>/dev/null | sed 1q`+"++_ACEOF+++case $ac_config_headers in *"+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;+esac+++cat >>"$CONFIG_STATUS" <<_ACEOF || ac_write_fail=1+# Files that config.status was made for.+config_headers="$ac_config_headers"++_ACEOF++cat >>"$CONFIG_STATUS" <<\_ACEOF || ac_write_fail=1+ac_cs_usage="\+'$as_me' instantiates files and other configuration actions+from templates according to the current configuration.  Unless the files+and actions are specified as TAGs, all are instantiated by default.++Usage: $0 [OPTION]... [TAG]...++  -h, --help       print this help, then exit+  -V, --version    print version number and configuration settings, then exit+      --config     print configuration, then exit+  -q, --quiet, --silent+                   do not print progress messages+  -d, --debug      don't remove temporary files+      --recheck    update $as_me by reconfiguring in the same conditions+      --header=FILE[:TEMPLATE]+                   instantiate the configuration header FILE++Configuration headers:+$config_headers++Report bugs to <libraries@haskell.org>."++_ACEOF+ac_cs_config=`printf '%s\n' "$ac_configure_args" | sed "$ac_safe_unquote"`+ac_cs_config_escaped=`printf '%s\n' "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`+cat >>"$CONFIG_STATUS" <<_ACEOF || ac_write_fail=1+ac_cs_config='$ac_cs_config_escaped'+ac_cs_version="\\+Haskell network package config.status 3.2.7.0+configured by $0, generated by GNU Autoconf 2.73,+  with options \\"\$ac_cs_config\\"++Copyright (C) 2026 Free Software Foundation, Inc.+This config.status script is free software; the Free Software Foundation+gives unlimited permission to copy, distribute and modify it."++ac_pwd='$ac_pwd'+srcdir='$srcdir'+test -n "\$AWK" || {+  awk '' </dev/null ||+    as_fn_error \$? "try installing gawk"+  AWK=awk+}+_ACEOF++cat >>"$CONFIG_STATUS" <<\_ACEOF || ac_write_fail=1+# The default lists apply if the user does not specify any file.+ac_need_defaults=:+while test $# != 0+do+  case $1 in+  --*=?*)+    ac_option=`expr "X$1" : 'X\([^=]*\)='`+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`+    ac_shift=:+    ;;+  --*=)+    ac_option=`expr "X$1" : 'X\([^=]*\)='`+    ac_optarg=+    ac_shift=:+    ;;+  *)+    ac_option=$1+    ac_optarg=$2+    ac_shift=shift+    ;;+  esac++  case $ac_option in+  # Handling of the options.+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)+    ac_cs_recheck=: ;;+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )+    printf '%s\n' "$ac_cs_version"; exit ;;+  --config | --confi | --conf | --con | --co | --c )+    printf '%s\n' "$ac_cs_config"; exit ;;+  --debug | --debu | --deb | --de | --d | -d )+    debug=: ;;+  --header | --heade | --head | --hea )+    $ac_shift+    case $ac_optarg in+    *\'*) ac_optarg=`printf '%s\n' "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;+    esac+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"+    ac_need_defaults=false;;+  --he | --h)+    # Conflict between --help and --header+    as_fn_error $? "ambiguous option: '$1'+Try '$0 --help' for more information.";;+  --help | --hel | -h )+    printf '%s\n' "$ac_cs_usage"; exit ;;+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \+  | -silent | --silent | --silen | --sile | --sil | --si | --s)+    ac_cs_silent=: ;;++  # This is an error.+  -*) as_fn_error $? "unrecognized option: '$1'+Try '$0 --help' for more information." ;;++  *) as_fn_append ac_config_targets " $1"+     ac_need_defaults=false ;;++  esac+  shift+done++ac_configure_extra_args=++if $ac_cs_silent; then+  exec 6>/dev/null+  ac_configure_extra_args="$ac_configure_extra_args --silent"+fi++_ACEOF+cat >>"$CONFIG_STATUS" <<_ACEOF || ac_write_fail=1+if \$ac_cs_recheck; then+  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion+  shift+  \printf '%s\n' "running CONFIG_SHELL=$SHELL \$*" >&6+  CONFIG_SHELL='$SHELL'+  export CONFIG_SHELL+  exec "\$@"+fi++_ACEOF+cat >>"$CONFIG_STATUS" <<\_ACEOF || ac_write_fail=1+exec 5>>config.log+{+  echo+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX+## Running $as_me. ##+_ASBOX+  printf '%s\n' "$ac_log"+} >&5++_ACEOF+cat >>"$CONFIG_STATUS" <<_ACEOF || ac_write_fail=1+_ACEOF++cat >>"$CONFIG_STATUS" <<\_ACEOF || ac_write_fail=1++# Handling of arguments.+for ac_config_target in $ac_config_targets+do+  case $ac_config_target in+    "include/HsNetworkConfig.h") CONFIG_HEADERS="$CONFIG_HEADERS include/HsNetworkConfig.h" ;;++  *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;;+  esac+done+++# If the user did not use the arguments to specify the items to instantiate,+# then the envvar interface is used.  Set only those that are not.+# We use the long form for the default assignment because of an extremely+# bizarre bug on SunOS 4.1.3.+if $ac_need_defaults; then+  test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers+fi++# Have a temporary directory for convenience.  Make it in the build tree+# simply because there is no reason against having it here, and in addition,+# creating and moving files from /tmp can sometimes cause problems.+# Hook for its removal unless debugging.+# Note that there is a small window in which the directory will not be cleaned:+# after its creation but before its name has been assigned to '$tmp'.+$debug ||+{+  tmp= ac_tmp=+  trap 'exit_status=$?+  : "${ac_tmp:=$tmp}"+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status+' 0+  trap 'as_fn_exit 1' 1 2 13 15+}+# Create a (secure) tmp directory for tmp files.++{+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&+  test -d "$tmp"+}  ||+{+  tmp=./conf$$-$RANDOM+  (umask 077 && mkdir "$tmp")+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5+ac_tmp=$tmp++# Set up the scripts for CONFIG_HEADERS section.+# No need to generate them if there are no CONFIG_HEADERS.+# This happens for instance with './config.status Makefile'.+if test -n "$CONFIG_HEADERS"; then+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||+BEGIN {+_ACEOF++# Transform confdefs.h into an awk script 'defines.awk', embedded as+# here-document in config.status, that substitutes the proper values into+# config.h.in to produce config.h.++# Create a delimiter string that does not exist in confdefs.h, to ease+# handling of long lines.+ac_delim='%!_!# '+for ac_last_try in false false :; do+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`+  if test -z "$ac_tt"; then+    break+  elif $ac_last_try; then+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5+  else+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "+  fi+done++# For the awk script, D is an array of macro values keyed by name,+# likewise P contains macro parameters if any.  Preserve backslash+# newline sequences.++ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*+sed -n '+s/.\{148\}/&'"$ac_delim"'/g+t rset+:rset+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /+t def+d+:def+s/\\$//+t bsnl+s/["\\]/\\&/g+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\+D["\1"]=" \3"/p+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p+d+:bsnl+s/["\\]/\\&/g+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\+D["\1"]=" \3\\\\\\n"\\/p+t cont+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p+t cont+d+:cont+n+s/.\{148\}/&'"$ac_delim"'/g+t clear+:clear+s/\\$//+t bsnlc+s/["\\]/\\&/g; s/^/"/; s/$/"/p+d+:bsnlc+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p+b cont+' <confdefs.h | sed '+s/'"$ac_delim"'/"\\\+"/g' >>"$CONFIG_STATUS" || ac_write_fail=1++cat >>"$CONFIG_STATUS" <<_ACEOF || ac_write_fail=1+  for (key in D) D_is_set[key] = 1+  FS = ""+}+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {+  line = \$ 0+  split(line, arg, " ")+  if (arg[1] == "#") {+    defundef = arg[2]+    mac1 = arg[3]+  } else {+    defundef = substr(arg[1], 2)+    mac1 = arg[2]+  }+  split(mac1, mac2, "(") #)+  macro = mac2[1]+  prefix = substr(line, 1, index(line, defundef) - 1)+  if (D_is_set[macro]) {+    suffix = P[macro] D[macro]+    while (suffix ~ /[\t ]$/) {+      suffix = substr(suffix, 1, length(suffix) - 1)+    }+    # Preserve the white space surrounding the "#".+    print prefix "define", macro suffix+    next+  } else {+    # Replace #undef with comments.  This is necessary, for example,+    # in the case of _POSIX_SOURCE, which is predefined and required+    # on some systems where configure will not decide to define it.+    if (defundef == "undef") {+      print "/*", prefix defundef, macro, "*/"+      next+    }+  }+}+{ print }+_ACAWK+_ACEOF+cat >>"$CONFIG_STATUS" <<\_ACEOF || ac_write_fail=1+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5+fi # test -n "$CONFIG_HEADERS"+++eval set X "    :H $CONFIG_HEADERS    "+shift+for ac_tag+do+  case $ac_tag in+  :[FHLC]) ac_mode=$ac_tag; continue;;+  esac+  case $ac_mode$ac_tag in+  :[FHL]*:*);;+  :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;;+  :[FH]-) ac_tag=-:-;;+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;+  esac+  ac_save_IFS=$IFS+  IFS=:+  set x $ac_tag+  IFS=$ac_save_IFS+  shift+  ac_file=$1+  shift++  case $ac_mode in+  :L) ac_source=$1;;+  :[FH])+    ac_file_inputs=+    for ac_f+    do+      case $ac_f in+      -) ac_f="$ac_tmp/stdin";;+      *) # Look for the file first in the build tree, then in the source tree+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,+	 # because $ac_f cannot contain ':'.+	 test -f "$ac_f" ||+	   case $ac_f in+	   [\\/$]*) false;;+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;+	   esac ||+	   as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;;+      esac+      case $ac_f in *\'*) ac_f=`printf '%s\n' "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac+      as_fn_append ac_file_inputs " '$ac_f'"+    done++    # Let's still pretend it is 'configure' which instantiates (i.e., don't+    # use $as_me), people would be surprised to read:+    #    /* config.h.  Generated by config.status.  */+    configure_input='Generated from '`+	  printf '%s\n' "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'+	`' by configure.'+    if test x"$ac_file" != x-; then+      configure_input="$ac_file.  $configure_input"+      { printf '%s\n' "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5+printf '%s\n' "$as_me: creating $ac_file" >&6;}+    fi+    # Neutralize special characters interpreted by sed in replacement strings.+    case $configure_input in #(+    *\&* | *\|* | *\\* )+       ac_sed_conf_input=`printf '%s\n' "$configure_input" |+       sed 's/[\\\\&|]/\\\\&/g'`;; #(+    *) ac_sed_conf_input=$configure_input;;+    esac++    case $ac_tag in+    *:-:* | *:-) cat >"$ac_tmp/stdin" \+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;+    esac+    ;;+  esac++  ac_dir=`$as_dirname -- "$ac_file" ||+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \+	 X"$ac_file" : 'X\(//\)[^/]' \| \+	 X"$ac_file" : 'X\(//\)$' \| \+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||+printf '%s\n' X"$ac_file" |+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{+	    s//\1/+	    q+	  }+	  /^X\(\/\/\)[^/].*/{+	    s//\1/+	    q+	  }+	  /^X\(\/\/\)$/{+	    s//\1/+	    q+	  }+	  /^X\(\/\).*/{+	    s//\1/+	    q+	  }+	  s/.*/./; q'`+  as_dir="$ac_dir"; as_fn_mkdir_p+  ac_builddir=.++case "$ac_dir" in+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;+*)+  ac_dir_suffix=/`printf '%s\n' "$ac_dir" | sed 's|^\.[\\/]||'`+  # A ".." for each directory in $ac_dir_suffix.+  ac_top_builddir_sub=`printf '%s\n' "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`+  case $ac_top_builddir_sub in+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;+  esac ;;+esac+ac_abs_top_builddir=$ac_pwd+ac_abs_builddir=$ac_pwd$ac_dir_suffix+# for backward compatibility:+ac_top_builddir=$ac_top_build_prefix++case $srcdir in+  .)  # We are building in place.+    ac_srcdir=.+    ac_top_srcdir=$ac_top_builddir_sub+    ac_abs_top_srcdir=$ac_pwd ;;+  [\\/]* | ?:[\\/]* )  # Absolute name.+    ac_srcdir=$srcdir$ac_dir_suffix;+    ac_top_srcdir=$srcdir+    ac_abs_top_srcdir=$srcdir ;;+  *) # Relative name.+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix+    ac_top_srcdir=$ac_top_build_prefix$srcdir+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;+esac+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix+++  case $ac_mode in++  :H)+  #+  # CONFIG_HEADER+  #+  if test x"$ac_file" != x-; then+    {+      printf '%s\n' "/* $configure_input  */" >&1 \+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"+    } >"$ac_tmp/config.h" \+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then+      { printf '%s\n' "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5+printf '%s\n' "$as_me: $ac_file is unchanged" >&6;}+    else+      rm -f "$ac_file"+      mv "$ac_tmp/config.h" "$ac_file" \+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5+    fi+  else+    printf '%s\n' "/* $configure_input  */" >&1 \+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \+      || as_fn_error $? "could not create -" "$LINENO" 5+  fi+ ;;+++  esac++done # for ac_tag+++as_fn_exit 0+_ACEOF+ac_clean_CONFIG_STATUS=++test $ac_write_fail = 0 ||+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5+++# configure is writing to config.log, and then calls config.status.+# config.status does its own redirection, appending to config.log.+# Unfortunately, on DOS this fails, as config.log is still kept open+# by configure, so config.status won't be able to write to it; its+# output is simply discarded.  So we exec the FD to /dev/null,+# effectively closing config.log, so it can be properly (re)opened and+# appended to by config.status.  When coming back to configure, we+# need to make the FD available again.+if test "$no_create" != yes; then+  ac_cs_success=:+  case $CONFIG_STATUS in #(+  -*) :+    ac_no_opts=-- ;; #(+  *) :+    ac_no_opts= ;;+esac+  ac_config_status_args=+  test "$silent" = yes &&+    ac_config_status_args="$ac_config_status_args --quiet"+  exec 5>/dev/null+  $SHELL $ac_no_opts "$CONFIG_STATUS" $ac_config_status_args ||+    ac_cs_success=false+  exec 5>>config.log+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which+  # would make configure fail if this is the last instruction.+  $ac_cs_success || as_fn_exit 1+fi+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then+  { printf '%s\n' "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5+printf '%s\n' "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}+fi+ 
configure.ac view
@@ -1,5 +1,5 @@ AC_INIT([Haskell network package],-        [3.1.4.0],+        [3.2.7.0],         [libraries@haskell.org],         [network]) @@ -86,6 +86,8 @@ AC_CHECK_DECLS([IPV6_V6ONLY]) AC_CHECK_DECLS([IPPROTO_IP, IPPROTO_TCP, IPPROTO_IPV6]) AC_CHECK_DECLS([SO_PEERCRED])+AC_CHECK_DECLS([IP_DONTFRAG])+AC_CHECK_DECLS([IP_MTU_DISCOVER])  AC_CHECK_MEMBERS([struct msghdr.msg_control, struct msghdr.msg_accrights]) AC_CHECK_MEMBERS([struct sockaddr.sa_len])
examples/EchoClient.hs view
@@ -1,9 +1,11 @@ {-# LANGUAGE OverloadedStrings #-}+ -- Echo client program module Main (main) where  import qualified Control.Exception as E import qualified Data.ByteString.Char8 as C+import qualified Data.List.NonEmpty as NE import Network.Socket import Network.Socket.ByteString (recv, sendAll) @@ -21,8 +23,8 @@     E.bracket (open addr) close client   where     resolve = do-        let hints = defaultHints { addrSocketType = Stream }-        head <$> getAddrInfo (Just hints) (Just host) (Just port)+        let hints = defaultHints{addrSocketType = Stream}+        NE.head <$> getAddrInfo (Just hints) (Just host) (Just port)     open addr = E.bracketOnError (openSocket addr) close $ \sock -> do         connect sock $ addrAddress addr         return sock
examples/EchoServer.hs view
@@ -3,8 +3,9 @@  import Control.Concurrent (forkFinally) import qualified Control.Exception as E-import Control.Monad (unless, forever, void)+import Control.Monad (forever, unless, void) import qualified Data.ByteString as S+import qualified Data.List.NonEmpty as NE import Network.Socket import Network.Socket.ByteString (recv, sendAll) @@ -14,8 +15,8 @@     talk s = do         msg <- recv s 1024         unless (S.null msg) $ do-          sendAll s msg-          talk s+            sendAll s msg+            talk s  -- from the "network-run" package. runTCPServer :: Maybe HostName -> ServiceName -> (Socket -> IO a) -> IO a@@ -24,21 +25,24 @@     E.bracket (open addr) close loop   where     resolve = do-        let hints = defaultHints {-                addrFlags = [AI_PASSIVE]-              , addrSocketType = Stream-              }-        head <$> getAddrInfo (Just hints) mhost (Just port)+        let hints =+                defaultHints+                    { addrFlags = [AI_PASSIVE]+                    , addrSocketType = Stream+                    }+        NE.head <$> getAddrInfo (Just hints) mhost (Just port)     open addr = E.bracketOnError (openSocket addr) close $ \sock -> do         setSocketOption sock ReuseAddr 1         withFdSocket sock setCloseOnExecIfNeeded         bind sock $ addrAddress addr         listen sock 1024         return sock-    loop sock = forever $ E.bracketOnError (accept sock) (close . fst)-        $ \(conn, _peer) -> void $-            -- 'forkFinally' alone is unlikely to fail thus leaking @conn@,-            -- but 'E.bracketOnError' above will be necessary if some-            -- non-atomic setups (e.g. spawning a subprocess to handle-            -- @conn@) before proper cleanup of @conn@ is your case-            forkFinally (server conn) (const $ gracefulClose conn 5000)+    loop sock = forever $+        E.bracketOnError (accept sock) (close . fst) $+            \(conn, _peer) ->+                void $+                    -- 'forkFinally' alone is unlikely to fail thus leaking @conn@,+                    -- but 'E.bracketOnError' above will be necessary if some+                    -- non-atomic setups (e.g. spawning a subprocess to handle+                    -- @conn@) before proper cleanup of @conn@ is your case+                    forkFinally (server conn) (const $ gracefulClose conn 5000)
include/HsNet.h view
@@ -160,6 +160,21 @@     freeaddrinfo(ai); } +#ifndef _WIN32+#include <poll.h>++/* Whether the socket is readable (or writable) now, without waiting. */+INLINE int+hsnet_ready_now(int fd, int write)+{+    struct pollfd p;+    p.fd = fd;+    p.events = write ? POLLOUT : POLLIN;+    p.revents = 0;+    return poll(&p, 1, 0) > 0;+}+#endif+ #ifndef IOV_MAX # define IOV_MAX 1024 #endif
include/HsNetworkConfig.h.in view
@@ -1,57 +1,65 @@ /* include/HsNetworkConfig.h.in.  Generated from configure.ac by autoheader.  */ -/* Define to 1 if you have the `accept4' function. */+/* Define to 1 if you have the 'accept4' function. */ #undef HAVE_ACCEPT4  /* Define to 1 if you have the <arpa/inet.h> header file. */ #undef HAVE_ARPA_INET_H -/* Define to 1 if you have the declaration of `AI_ADDRCONFIG', and to 0 if you+/* Define to 1 if you have the declaration of 'AI_ADDRCONFIG', and to 0 if you    don't. */ #undef HAVE_DECL_AI_ADDRCONFIG -/* Define to 1 if you have the declaration of `AI_ALL', and to 0 if you don't.+/* Define to 1 if you have the declaration of 'AI_ALL', and to 0 if you don't.    */ #undef HAVE_DECL_AI_ALL -/* Define to 1 if you have the declaration of `AI_NUMERICSERV', and to 0 if+/* Define to 1 if you have the declaration of 'AI_NUMERICSERV', and to 0 if    you don't. */ #undef HAVE_DECL_AI_NUMERICSERV -/* Define to 1 if you have the declaration of `AI_V4MAPPED', and to 0 if you+/* Define to 1 if you have the declaration of 'AI_V4MAPPED', and to 0 if you    don't. */ #undef HAVE_DECL_AI_V4MAPPED -/* Define to 1 if you have the declaration of `IPPROTO_IP', and to 0 if you+/* Define to 1 if you have the declaration of 'IPPROTO_IP', and to 0 if you    don't. */ #undef HAVE_DECL_IPPROTO_IP -/* Define to 1 if you have the declaration of `IPPROTO_IPV6', and to 0 if you+/* Define to 1 if you have the declaration of 'IPPROTO_IPV6', and to 0 if you    don't. */ #undef HAVE_DECL_IPPROTO_IPV6 -/* Define to 1 if you have the declaration of `IPPROTO_TCP', and to 0 if you+/* Define to 1 if you have the declaration of 'IPPROTO_TCP', and to 0 if you    don't. */ #undef HAVE_DECL_IPPROTO_TCP -/* Define to 1 if you have the declaration of `IPV6_V6ONLY', and to 0 if you+/* Define to 1 if you have the declaration of 'IPV6_V6ONLY', and to 0 if you    don't. */ #undef HAVE_DECL_IPV6_V6ONLY -/* Define to 1 if you have the declaration of `SO_PEERCRED', and to 0 if you+/* Define to 1 if you have the declaration of 'IP_DONTFRAG', and to 0 if you    don't. */+#undef HAVE_DECL_IP_DONTFRAG++/* Define to 1 if you have the declaration of 'IP_MTU_DISCOVER', and to 0 if+   you don't. */+#undef HAVE_DECL_IP_MTU_DISCOVER++/* Define to 1 if you have the declaration of 'SO_PEERCRED', and to 0 if you+   don't. */ #undef HAVE_DECL_SO_PEERCRED  /* Define to 1 if you have the <fcntl.h> header file. */ #undef HAVE_FCNTL_H -/* Define to 1 if you have the `gai_strerror' function. */+/* Define to 1 if you have the 'gai_strerror' function. */ #undef HAVE_GAI_STRERROR -/* Define to 1 if you have the `gethostent' function. */+/* Define to 1 if you have the 'gethostent' function. */ #undef HAVE_GETHOSTENT -/* Define to 1 if you have the `getpeereid' function. */+/* Define to 1 if you have the 'getpeereid' function. */ #undef HAVE_GETPEEREID  /* Define to 1 if you have the <inttypes.h> header file. */@@ -60,9 +68,6 @@ /* Define to 1 if you have the <limits.h> header file. */ #undef HAVE_LIMITS_H -/* Define to 1 if you have the <memory.h> header file. */-#undef HAVE_MEMORY_H- /* Define to 1 if you have the <netdb.h> header file. */ #undef HAVE_NETDB_H @@ -81,6 +86,9 @@ /* Define to 1 if you have the <stdint.h> header file. */ #undef HAVE_STDINT_H +/* Define to 1 if you have the <stdio.h> header file. */+#undef HAVE_STDIO_H+ /* Define to 1 if you have the <stdlib.h> header file. */ #undef HAVE_STDLIB_H @@ -90,16 +98,16 @@ /* Define to 1 if you have the <string.h> header file. */ #undef HAVE_STRING_H -/* Define to 1 if `msg_accrights' is a member of `struct msghdr'. */+/* Define to 1 if 'msg_accrights' is a member of 'struct msghdr'. */ #undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS -/* Define to 1 if `msg_control' is a member of `struct msghdr'. */+/* Define to 1 if 'msg_control' is a member of 'struct msghdr'. */ #undef HAVE_STRUCT_MSGHDR_MSG_CONTROL -/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */+/* Define to 1 if 'sa_len' is a member of 'struct sockaddr'. */ #undef HAVE_STRUCT_SOCKADDR_SA_LEN -/* Define to 1 if the system has the type `struct ucred'. */+/* Define to 1 if the system has the type 'struct ucred'. */ #undef HAVE_STRUCT_UCRED  /* Define to 1 if you have the <sys/socket.h> header file. */@@ -138,8 +146,10 @@ /* Define to the version of this package. */ #undef PACKAGE_VERSION -/* Define to 1 if you have the ANSI C header files. */+/* Define to 1 if all of the C89 standard headers exist (not just the ones+   required in a freestanding environment). This macro is provided for+   backward compatibility; new code need not use it. */ #undef STDC_HEADERS -/* Define to empty if `const' does not conform to ANSI C. */+/* Define to empty if 'const' does not conform to ANSI C. */ #undef const
network.cabal view
@@ -1,14 +1,15 @@ cabal-version:      1.18 name:               network-version:            3.1.4.0+version:            3.2.12.0 license:            BSD3 license-file:       LICENSE-maintainer:         Kazu Yamamoto, Evan Borden+maintainer:         Kazu Yamamoto, Tamar Christina  tested-with:-    GHC == 9.6.1-    GHC == 9.4.4-    GHC == 9.2.7+    GHC == 9.8.2+    GHC == 9.6.4+    GHC == 9.4.8+    GHC == 9.2.8     GHC == 9.0.2     GHC == 8.10.7     GHC == 8.8.4@@ -68,6 +69,7 @@     include/HsNetDef.h     include/afunix_compat.h     cbits/asyncAccept.c+    cbits/overlapped.c     cbits/initWinSock.c     cbits/winSockErr.c     cbits/cmsg.c@@ -114,32 +116,34 @@         Network.Socket.Name         Network.Socket.Options         Network.Socket.ReadShow+        Network.Socket.STM         Network.Socket.Shutdown         Network.Socket.SockAddr         Network.Socket.Syscall         Network.Socket.Types         Network.Socket.Unix+        Network.Socket.Wait      default-language: Haskell2010     include-dirs:     include-    includes:         HsNet.h HsNetDef.h alignment.h win32defs.h     install-includes: HsNet.h HsNetDef.h alignment.h win32defs.h     if os(windows)-        includes:         afunix_compat.h         install-includes: afunix_compat.h      ghc-options:      -Wall -fwarn-tabs     build-depends:         base >=4.9 && <5,-        bytestring >=0.10 && <0.12,+        bytestring >=0.10,         deepseq,-        directory+        directory,+        stm      if !os(windows)         other-modules:             Network.Socket.ByteString.Lazy.Posix             Network.Socket.Posix.Cmsg             Network.Socket.Posix.CmsgHdr+            Network.Socket.Posix.HostName             Network.Socket.Posix.IOVec             Network.Socket.Posix.MsgHdr @@ -155,11 +159,14 @@             cbits/initWinSock.c             cbits/winSockErr.c             cbits/asyncAccept.c+            cbits/overlapped.c          other-modules:             Network.Socket.ByteString.Lazy.Windows+            Network.Socket.Win32.Cancel             Network.Socket.Win32.Cmsg             Network.Socket.Win32.CmsgHdr+            Network.Socket.Win32.HostName             Network.Socket.Win32.WSABuf             Network.Socket.Win32.MsgHdr @@ -173,8 +180,11 @@             cc-options:  -D_WIN32_WINNT=0x0600          build-depends:-            temporary+            Win32 >=2.12.0.1 +    if impl(ghc >=8)+        default-extensions: Strict StrictData+ test-suite spec     type:             exitcode-stdio-1.0     main-is:          Spec.hs@@ -189,14 +199,21 @@     default-language: Haskell2010     ghc-options:      -Wall -threaded     build-depends:-        base >=4.9 && <5,+        base,         bytestring,         directory,         HUnit,         network,+        stm,         temporary,         hspec >=2.6,         QuickCheck      if flag(devel)         cpp-options: -DDEVELOPMENT++    if impl(ghc >=8)+        default-extensions: Strict StrictData++    if os(windows)+        cpp-options: -D_WIN32
tests/BadFileDescriptor.hs view
@@ -7,7 +7,7 @@ module Main where  import Control.Concurrent (forkIO)-import Control.Monad (void, forever)+import Control.Monad (forever, void) import Network.Socket hiding (recv) import Network.Socket.ByteString (recv, sendAll) @@ -32,11 +32,12 @@  serverSocket :: HostName -> ServiceName -> IO Socket serverSocket host port = do-    let hints = defaultHints {-                addrFlags = [AI_PASSIVE]-              , addrSocketType = Stream-              }-    addr:_ <- getAddrInfo (Just hints) (Just host) (Just port)+    let hints =+            defaultHints+                { addrFlags = [AI_PASSIVE]+                , addrSocketType = Stream+                }+    addr : _ <- getAddrInfo (Just hints) (Just host) (Just port)     sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)     bind sock (addrAddress addr)     listen sock 1@@ -44,8 +45,8 @@  clientSocket :: HostName -> ServiceName -> IO Socket clientSocket host port = do-    let hints = defaultHints { addrSocketType = Stream }-    addr:_ <- getAddrInfo (Just hints) (Just host) (Just port)+    let hints = defaultHints{addrSocketType = Stream}+    addr : _ <- getAddrInfo (Just hints) (Just host) (Just port)     sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)     connect sock (addrAddress addr)     return sock
tests/Network/Socket/ByteString/LazySpec.hs view
@@ -5,11 +5,13 @@  import Prelude hiding (getContents) +import Control.Concurrent (threadDelay)+import Control.Concurrent.STM (STM, check, readTVar, registerDelay, retry)+import Control.Monad import qualified Data.ByteString.Lazy as L import Network.Socket import Network.Socket.ByteString.Lazy import Network.Test.Common-import Control.Monad  import Test.Hspec @@ -44,6 +46,31 @@                     sendAll sock lazyTestMsg `shouldThrow` anyException             tcpTest client server +    describe "sendWith" $ do+        it "sends as send does" $ do+            let server sock = recv sock 1024 `shouldReturn` lazyTestMsg+                client sock = sendWith sock lazyTestMsg never `shouldReturn` Right (L.length lazyTestMsg)+            tcpTest client server++    describe "sendAllWith" $ do+        it "sends as sendAll does" $ do+            let server sock = recv sock 1024 `shouldReturn` lazyTestMsg+                client sock = sendAllWith sock lazyTestMsg never `shouldReturn` Right ()+            tcpTest client server++    describe "recvWith" $ do+        it "receives as recv does" $ do+            let server sock = recvWith sock 1024 never `shouldReturn` Right lazyTestMsg+                client sock = sendAll sock lazyTestMsg+            tcpTest client server++        it "gives up when told to, with nothing to receive" $ do+            let server sock = do+                    late <- registerDelay 100000+                    recvWith sock 1024 (check =<< readTVar late) `shouldReturn` Left ()+                client _ = threadDelay 500000+            tcpTest client server+     describe "getContents" $ do         it "works well" $ do             let server sock = getContents sock `shouldReturn` lazyTestMsg@@ -83,3 +110,6 @@             let client s = recv s 4096 `shouldReturn` L.empty                 server s = shutdown s ShutdownSend             tcpTest client server++never :: STM ()+never = retry
tests/Network/Socket/ByteStringSpec.hs view
@@ -2,12 +2,15 @@  module Network.Socket.ByteStringSpec (main, spec) where -import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)-import Data.Bits-import Data.Maybe+import Control.Concurrent (forkIO, threadDelay)+import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar, tryReadMVar)+import Control.Concurrent.STM (STM, check, readTVar, registerDelay, retry)+import Control.Exception (SomeException, finally, try) import Control.Monad+import Data.Bits import qualified Data.ByteString as S import qualified Data.ByteString.Char8 as C+import Data.Maybe import Network.Socket import Network.Socket.ByteString import Network.Test.Common@@ -200,6 +203,98 @@                 seg2 = C.pack "test message."             udpTest client server +    describe "recvMsgWith" $ do+        it "receives as recvMsg does" $ do+            let server sock = do+                    r <- recvMsgWith sock 1024 0 mempty retry+                    case r of+                        Right (_, msg, _, _) -> msg `shouldBe` seg+                        Left () -> expectationFailure "gave up without being told"+                client sock addr = sendTo sock seg addr++                seg = C.pack "This is a test message"+            udpTest client server++        it "gives up when told to, with nothing to receive" $ do+            sock <- socket AF_INET Datagram defaultProtocol+            bind sock $ SockAddrInet 0 $ tupleToHostAddress (127, 0, 0, 1)+            late <- registerDelay 100000+            r <- recvMsgWith sock 1024 0 mempty $ check =<< readTVar late+            close sock+            either (const True) (const False) r `shouldBe` True++    describe "sendWith" $ do+        it "sends as send does" $ do+            let server sock = recv sock 1024 `shouldReturn` testMsg+                client sock = sendWith sock testMsg never `shouldReturn` Right (S.length testMsg)+            tcpTest client server++    describe "sendAllWith" $ do+        it "sends as sendAll does" $ do+            let server sock = recv sock 1024 `shouldReturn` testMsg+                client sock = sendAllWith sock testMsg never `shouldReturn` Right ()+            tcpTest client server++        it "gives up when the peer does not read" $ withStalledPeer $ \sock -> do+            late <- registerDelay 200000+            gaveUp (sendAllWith sock chunk $ check =<< readTVar late)+                `shouldReturn` True++    describe "giving up" $ do+        -- On Windows a give-up cancels the operation; that must not+        -- reach another thread's operation on the same socket.+        it "leaves another thread's send alone" $ withStalledPeer $ \sock -> do+            ended <- newEmptyMVar+            _ <- forkIO $ do+                r <- try $ forever $ sendAll sock chunk+                putMVar ended (r :: Either SomeException ())+            threadDelay 300000+            late <- registerDelay 200000+            r <- recvWith sock 4096 $ check =<< readTVar late+            either (const True) (const False) r `shouldBe` True+            threadDelay 300000+            isNothing <$> tryReadMVar ended `shouldReturn` True++        it "leaves another thread's recv alone" $ withStalledPeer $ \sock -> do+            ended <- newEmptyMVar+            _ <- forkIO $ do+                r <- try $ recv sock 4096+                putMVar ended (r :: Either SomeException S.ByteString)+            threadDelay 100000+            late <- registerDelay 200000+            gaveUp (sendAllWith sock chunk $ check =<< readTVar late)+                `shouldReturn` True+            threadDelay 300000+            isNothing <$> tryReadMVar ended `shouldReturn` True++    describe "sendManyWith" $ do+        it "sends as sendMany does" $ do+            let server sock = recv sock 1024 `shouldReturn` S.append seg1 seg2+                client sock = sendManyWith sock [seg1, seg2] never `shouldReturn` Right ()+                seg1 = C.pack "This is a "+                seg2 = C.pack "test message."+            tcpTest client server++        it "gives up when the peer does not read" $ withStalledPeer $ \sock -> do+            late <- registerDelay 200000+            gaveUp (sendManyWith sock [chunk, chunk] $ check =<< readTVar late)+                `shouldReturn` True++    describe "sendToWith" $ do+        it "sends as sendTo does" $ do+            let server sock = recv sock 1024 `shouldReturn` testMsg+                client sock addr =+                    sendToWith sock testMsg addr never `shouldReturn` Right (S.length testMsg)+            udpTest client server++    describe "sendMsgWith" $ do+        it "sends as sendMsg does" $ do+            let server sock = recv sock 1024 `shouldReturn` testMsg+                client sock addr =+                    sendMsgWith sock addr [testMsg] [] mempty never+                        `shouldReturn` Right (S.length testMsg)+            udpTest client server+     describe "recvMsg" $ do         it "works well" $ do             let server sock = do@@ -243,20 +338,23 @@             serverReady <- newEmptyMVar              let server sock = do-                    whenSupported RecvIPv4TTL     $ setSocketOption sock RecvIPv4TTL 1+                    whenSupported RecvIPv4TTL $ setSocketOption sock RecvIPv4TTL 1                     whenSupported RecvIPv4PktInfo $ setSocketOption sock RecvIPv4PktInfo 1-                    whenSupported RecvIPv4TOS     $ setSocketOption sock RecvIPv4TOS 1+                    whenSupported RecvIPv4TOS $ setSocketOption sock RecvIPv4TOS 1                     putMVar serverReady ()                      (_, _, cmsgs, _) <- recvMsg sock 1024 128 mempty                      whenSupported RecvIPv4PktInfo $-                      ((lookupCmsg CmsgIdIPv4PktInfo cmsgs >>= decodeCmsg) :: Maybe IPv4PktInfo) `shouldNotBe` Nothing+                        ((lookupCmsg CmsgIdIPv4PktInfo cmsgs >>= decodeCmsg) :: Maybe IPv4PktInfo)+                            `shouldNotBe` Nothing                     when (not isAppVeyor) $ do-                      whenSupported RecvIPv4TTL $-                        ((lookupCmsg CmsgIdIPv4TTL cmsgs >>= decodeCmsg) :: Maybe IPv4TTL) `shouldNotBe` Nothing-                      whenSupported RecvIPv4TOS $-                        ((lookupCmsg CmsgIdIPv4TOS cmsgs >>= decodeCmsg) :: Maybe IPv4TOS) `shouldNotBe` Nothing+                        whenSupported RecvIPv4TTL $+                            ((lookupCmsg CmsgIdIPv4TTL cmsgs >>= decodeCmsg) :: Maybe IPv4TTL)+                                `shouldNotBe` Nothing+                        whenSupported RecvIPv4TOS $+                            ((lookupCmsg CmsgIdIPv4TOS cmsgs >>= decodeCmsg) :: Maybe IPv4TOS)+                                `shouldNotBe` Nothing                 client sock addr = takeMVar serverReady >> sendTo sock seg addr                  seg = C.pack "This is a test message"@@ -270,18 +368,21 @@              let server sock = do                     whenSupported RecvIPv6HopLimit $ setSocketOption sock RecvIPv6HopLimit 1-                    whenSupported RecvIPv6TClass   $ setSocketOption sock RecvIPv6TClass 1-                    whenSupported RecvIPv6PktInfo  $ setSocketOption sock RecvIPv6PktInfo 1+                    whenSupported RecvIPv6TClass $ setSocketOption sock RecvIPv6TClass 1+                    whenSupported RecvIPv6PktInfo $ setSocketOption sock RecvIPv6PktInfo 1                     putMVar serverReady ()                      (_, _, cmsgs, _) <- recvMsg sock 1024 128 mempty                      whenSupported RecvIPv6HopLimit $-                      ((lookupCmsg CmsgIdIPv6HopLimit cmsgs >>= decodeCmsg) :: Maybe IPv6HopLimit) `shouldNotBe` Nothing+                        ((lookupCmsg CmsgIdIPv6HopLimit cmsgs >>= decodeCmsg) :: Maybe IPv6HopLimit)+                            `shouldNotBe` Nothing                     whenSupported RecvIPv6TClass $-                      ((lookupCmsg CmsgIdIPv6TClass cmsgs >>= decodeCmsg) :: Maybe IPv6TClass) `shouldNotBe` Nothing+                        ((lookupCmsg CmsgIdIPv6TClass cmsgs >>= decodeCmsg) :: Maybe IPv6TClass)+                            `shouldNotBe` Nothing                     whenSupported RecvIPv6PktInfo $-                      ((lookupCmsg CmsgIdIPv6PktInfo cmsgs >>= decodeCmsg) :: Maybe IPv6PktInfo) `shouldNotBe` Nothing+                        ((lookupCmsg CmsgIdIPv6PktInfo cmsgs >>= decodeCmsg) :: Maybe IPv6PktInfo)+                            `shouldNotBe` Nothing                 client sock addr = takeMVar serverReady >> sendTo sock seg addr                  seg = C.pack "This is a test message"@@ -294,8 +395,8 @@             serverReady <- newEmptyMVar              let server sock = do-                    whenSupported RecvIPv4TTL     $ setSocketOption sock RecvIPv4TTL 1-                    whenSupported RecvIPv4TOS     $ setSocketOption sock RecvIPv4TOS 1+                    whenSupported RecvIPv4TTL $ setSocketOption sock RecvIPv4TTL 1+                    whenSupported RecvIPv4TOS $ setSocketOption sock RecvIPv4TOS 1                     whenSupported RecvIPv4PktInfo $ setSocketOption sock RecvIPv4PktInfo 1                     putMVar serverReady () @@ -306,3 +407,32 @@                  seg = C.pack "This is a test message"             udpTest client server++-- A connection whose other end never reads, with small buffers, so that+-- sending blocks once they are full.+withStalledPeer :: (Socket -> IO a) -> IO a+withStalledPeer body = do+    let localhost = tupleToHostAddress (127, 0, 0, 1)+    listener <- socket AF_INET Stream defaultProtocol+    setSocketOption listener RecvBuffer 4096+    bind listener $ SockAddrInet 0 localhost+    listen listener 1+    port <- socketPort listener+    sock <- socket AF_INET Stream defaultProtocol+    setSocketOption sock SendBuffer 4096+    connect sock $ SockAddrInet port localhost+    (peer, _) <- accept listener+    body sock `finally` mapM_ close [sock, peer, listener]++-- Sending until the action gives up, and whether it did within 1 GiB.+gaveUp :: IO (Either () ()) -> IO Bool+gaveUp send1 = loop (1024 :: Int)+  where+    loop 0 = return False+    loop n = send1 >>= either (const $ return True) (const $ loop (n - 1))++chunk :: S.ByteString+chunk = S.replicate (1024 * 1024) 0x41++never :: STM ()+never = retry
tests/Network/SocketSpec.hs view
@@ -4,8 +4,15 @@ module Network.SocketSpec (main, spec) where  import Control.Concurrent (threadDelay, forkIO)-import Control.Concurrent.MVar (readMVar)+import Control.Concurrent.MVar (newEmptyMVar, putMVar, readMVar, takeMVar)+import Control.Exception (bracket)+import Control.Concurrent.STM import Control.Monad+import Data.ByteString (ByteString)+import qualified Data.ByteString as BS+import qualified Data.ByteString.Unsafe as BU+import Foreign.Marshal.Alloc (allocaBytes)+import Foreign.Ptr (castPtr) import Data.Maybe (fromJust) import Data.List (nub) import Network.Socket@@ -14,7 +21,9 @@ import System.Mem (performGC) import System.IO.Error (tryIOError) import System.IO.Temp (withSystemTempDirectory)+import System.Posix.Types (Fd(..)) import Foreign.C.Types ()+import System.Timeout (timeout)  import Test.Hspec import Test.QuickCheck@@ -22,6 +31,39 @@ main :: IO () main = hspec spec +-- Send through the given action to a port nobody has bound, then receive+-- on the same socket.  'Nothing' if the receive heard nothing in time.+bounce :: (Socket -> SockAddr -> IO ()) -> IO (Maybe ByteString)+bounce = bounceWith $ \sock giveUp -> fmap fst <$> recvFromWith sock 2048 giveUp++bounceWith+    :: (Socket -> STM () -> IO (Either () ByteString))+    -> (Socket -> SockAddr -> IO ())+    -> IO (Maybe ByteString)+bounceWith receive send' = do+    dead <- deadPort+    sock <- socket AF_INET Datagram defaultProtocol+    bind sock $ SockAddrInet 0 localhost+    send' sock dead+    -- Long enough for the unreachable to come back before the receive.+    waitFor 300000+    late <- registerDelay 300000+    r <- receive sock $ check =<< readTVar late+    close sock+    return $ either (const Nothing) Just r+  where+    localhost = tupleToHostAddress (127, 0, 0, 1)+    waitFor us = do+        late <- registerDelay us+        atomically $ check =<< readTVar late+    -- Bind a port, read it, and let it go again.+    deadPort = do+        s <- socket AF_INET Datagram defaultProtocol+        bind s $ SockAddrInet 0 localhost+        sa <- getSocketName s+        close s+        return sa+ spec :: Spec spec = do     describe "connect" $ do@@ -41,6 +83,63 @@                 { clientSetup = readMVar portVar >>= connect'                 } +    describe "connectWith" $ do+        let+          hints = defaultHints { addrSocketType = Stream }+          connectWith' serverPort giveUp = do+              addr:_ <- getAddrInfo (Just hints) (Just serverAddr) (Just $ show serverPort)+              sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+              r <- connectWith sock (addrAddress addr) giveUp+              return (sock, r)++        it "connects as connect does" $ do+            withPort $ \portVar -> test (tcp serverAddr return portVar)+                { clientSetup = do+                    (sock, r) <- readMVar portVar >>= \p -> connectWith' p (retry :: STM ())+                    r `shouldBe` Right ()+                    return sock+                }++        it "throws as connect does" $ do+            connectWith' (8003 :: Int) (retry :: STM ()) `shouldThrow` anyIOException++        it "gives up when already told to" $ do+            (sock, r) <- connectWith' (8003 :: Int) (return ())+            close sock+            r `shouldBe` Left ()++        it "gives up on a connection which does not come" $ do+            -- Nothing answers here, unless the network says it is+            -- unreachable at once, which is not giving up but is fine.+            sock <- socket AF_INET Stream defaultProtocol+            late <- registerDelay 300000+            r <- tryIOError $ connectWith sock (SockAddrInet 9 $ tupleToHostAddress (10, 255, 255, 1)) $+                check =<< readTVar late+            close sock+            r `shouldSatisfy` either (const True) (== Left ())++    describe "sendBufMsgWith and recvBufMsgWith" $ do+        it "send and receive as sendBufMsg and recvBufMsg do" $ do+            let server sock = allocaBytes 1024 $ \buf -> do+                    r <- recvBufMsgWith sock [(buf, 1024)] 0 mempty (retry :: STM ())+                    case r of+                        Right (_, n, _, _) ->+                            BS.packCStringLen (castPtr buf, n) `shouldReturn` testMsg+                        Left () -> expectationFailure "gave up without being told"+                client sock addr = BU.unsafeUseAsCStringLen testMsg $ \(p, n) ->+                    sendBufMsgWith sock addr [(castPtr p, n)] [] mempty (retry :: STM ())+                        `shouldReturn` Right n+            udpTest client server++        it "recvBufMsgWith gives up when told to" $ do+            sock <- socket AF_INET Datagram defaultProtocol+            bind sock $ SockAddrInet 0 $ tupleToHostAddress (127, 0, 0, 1)+            late <- registerDelay 100000+            r <- allocaBytes 1024 $ \buf ->+                recvBufMsgWith sock [(buf, 1024)] 0 mempty $ check =<< readTVar late+            close sock+            either (const True) (const False) r `shouldBe` True+     describe "bind" $ do         let hints = defaultHints                 { addrFlags = [AI_PASSIVE]@@ -100,6 +199,13 @@               getSocketOption sock UserTimeout `shouldReturn` 2000               close sock +    describe "DontFragment" $ do+        it "can be set" $ do+            sock <- socket AF_INET Stream defaultProtocol+            when (isSupportedSocketOption DontFragment) $+                setSocketOption sock DontFragment 1+            close sock+     describe "getAddrInfo" $ do         it "works for IPv4 address" $ do             let hints = defaultHints { addrFlags = [AI_NUMERICHOST, AI_ADDRCONFIG] }@@ -117,7 +223,7 @@          it "does not cause segfault on macOS 10.8.2 due to AI_NUMERICSERV" $ do             let hints = defaultHints { addrFlags = [AI_NUMERICSERV] }-            void $ getAddrInfo (Just hints) (Just "localhost") Nothing+            void (getAddrInfo (Just hints) (Just "localhost") Nothing :: IO [AddrInfo])  #if defined(mingw32_HOST_OS)     let lpdevname = "loopback_0"@@ -153,15 +259,36 @@             -- check if an exception is not thrown.             isSupportedSockAddr addr `shouldBe` True +    describe "socketPair" $ do+        it "can send and recieve bi-directionally" $ do+            (s1, s2) <- socketPair AF_UNIX Stream defaultProtocol+            void $ send s1 testMsg+            recv s2 1024 `shouldReturn` testMsg+            void $ send s2 testMsg+            recv s1 1024 `shouldReturn` testMsg++        -- Windows' AF_UNIX pair now and then missed a close racing the+        -- recv (seen in C and the non-threaded RTS, rarely here).+        it "tells a waiting recv that the peer has closed" $+            replicateM_ 100 $ do+                (s1, s2) <- socketPair AF_UNIX Stream defaultProtocol+                got <- newEmptyMVar+                _ <- forkIO $ recv s2 1024 >>= putMVar got+                _ <- forkIO $ close s1+                timeout 5000000 (takeMVar got) `shouldReturn` Just ""+                close s2+ #if !defined(mingw32_HOST_OS)     when isUnixDomainSocketAvailable $ do         context "unix sockets" $ do             it "basic unix sockets end-to-end" $ do-                let client sock = send sock testMsg-                    server (sock, addr) = do-                        recv sock 1024 `shouldReturn` testMsg-                        addr `shouldBe` (SockAddrUnix "")-                test . setClientAction client $ unixWithUnlink unixAddr server+                withSystemTempDirectory "haskell-network" $ \path -> do+                    let unixAddr = path ++ "/socket-file"+                    let client sock = send sock testMsg+                        server (sock, addr) = do+                            recv sock 1024 `shouldReturn` testMsg+                            addr `shouldBe` (SockAddrUnix "")+                    test . setClientAction client $ unixWithUnlink unixAddr server #endif  #ifdef linux_HOST_OS@@ -182,14 +309,6 @@ #endif  #if !defined(mingw32_HOST_OS)-            describe "socketPair" $ do-                it "can send and recieve bi-directionally" $ do-                    (s1, s2) <- socketPair AF_UNIX Stream defaultProtocol-                    void $ send s1 testMsg-                    recv s2 1024 `shouldReturn` testMsg-                    void $ send s2 testMsg-                    recv s1 1024 `shouldReturn` testMsg-             describe "sendFd/recvFd" $ do                 it "can send and recieve a file descriptor" $ do                     (s1, s2) <- socketPair AF_UNIX Stream defaultProtocol@@ -207,19 +326,21 @@         --         describe "getPeerCredential" $ do             it "can return something" $ do-                -- It would be useful to check that we did not get garbage-                -- back, but rather the actual uid of the test program.  For-                -- that we'd need System.Posix.User, but that is not available-                -- under Windows.  For now, accept the risk that we did not get-                -- the right answer.-                ---                let server (sock, _) = do-                        (_, uid, _) <- getPeerCredential sock-                        uid `shouldNotBe` Nothing-                    client sock = do-                        (_, uid, _) <- getPeerCredential sock-                        uid `shouldNotBe` Nothing-                test . setClientAction client $ unixWithUnlink unixAddr server+                withSystemTempDirectory "haskell-network" $ \path -> do+                    let unixAddr = path ++ "/socket-file"+                    -- It would be useful to check that we did not get garbage+                    -- back, but rather the actual uid of the test program.  For+                    -- that we'd need System.Posix.User, but that is not available+                    -- under Windows.  For now, accept the risk that we did not get+                    -- the right answer.+                    --+                    let server (sock, _) = do+                            (_, uid, _) <- getPeerCredential sock+                            uid `shouldNotBe` Nothing+                        client sock = do+                            (_, uid, _) <- getPeerCredential sock+                            uid `shouldNotBe` Nothing+                    test . setClientAction client $ unixWithUnlink unixAddr server             {- The below test fails on many *BSD systems, because the getsockopt()             call that underlies getpeereid() does not have the same meaning for             all address families, but the C-library was not checking that the@@ -238,11 +359,30 @@             -} #endif +    -- A send to a port nobody has bound brings an ICMP unreachable back.+    -- POSIX hands it to the sender only once the socket is connected, and+    -- Winsock hands it to every datagram socket; a reply bouncing off a+    -- client which has gone would then end a server's receive loop.+    describe "an ICMP unreachable from a send of one's own" $ do+        let connectSend sock dead = connect sock dead >> void (send sock "bounce")+            recvMsg' sock giveUp =+                fmap (\(_, bs, _, _) -> bs) <$> recvMsgWith sock 2048 0 mempty giveUp+        it "is not heard by a socket which was never connected" $+            bounce (\sock dead -> void $ sendTo sock "bounce" dead)+                `shouldReturn` Nothing+        it "is heard by a connected one" $+            bounce connectSend `shouldThrow` isPortUnreachableError+        it "is heard by a connected one through recv" $+            bounceWith (\sock -> recvWith sock 2048) connectSend+                `shouldThrow` isPortUnreachableError+        it "is heard by a connected one through recvMsg" $+            bounceWith recvMsg' connectSend `shouldThrow` isPortUnreachableError+     describe "gracefulClose" $ do         it "does not send TCP RST back" $ do             let server sock = do                     void $ recv sock 1024 -- receiving "GOAWAY"-                    gracefulClose sock 3000+                    gracefulClose sock 300                 client sock = do                     sendAll sock "GOAWAY"                     threadDelay 10000@@ -251,6 +391,75 @@                     void $ recv sock 1024             tcpTest client server +    describe "unsafeGracefulClose" $ do+        it "does not send TCP RST back" $ do+            let server sock = do+                    void $ recv sock 1024 -- receiving "GOAWAY"+                    unsafeGracefulClose sock 300+                client sock = do+                    sendAll sock "GOAWAY"+                    threadDelay 10000+                    sendAll sock "PING"+                    threadDelay 10000+                    void $ recv sock 1024+            tcpTest client server++    describe "giving up" $ do+        it "ends a receive which is told to stop, leaving the socket usable" $ do+            let server sock = do+                    stop <- newTVarIO False+                    done <- newEmptyMVar+                    void $ forkIO $ do+                        r <- recvWith sock 1024 (check =<< readTVar stop)+                        putMVar done r+                    threadDelay 100000+                    atomically $ writeTVar stop True+                    takeMVar done `shouldReturn` Left ()+                    -- Nothing was closed, so the socket is still the+                    -- caller's to read.+                    recv sock 1024 `shouldReturn` testMsg+                client sock = do+                    threadDelay 300000+                    void $ send sock testMsg+            tcpTest client server++        -- A tie goes to the data: answering Left would leave bytes+        -- already received unread, which for a stream loses them.+        it "takes what is there even once the caller has given up" $ do+            let server sock = do+                    threadDelay 100000+                    gone <- newTVarIO True+                    recvWith sock 1024 (check =<< readTVar gone)+                        `shouldReturn` Right testMsg+                client sock = void $ send sock testMsg+            tcpTest client server++        it "ends an accept which is told to stop, leaving the socket usable" $+            withListener $ \sock port -> do+                stop <- newTVarIO False+                done <- newEmptyMVar+                void $ forkIO $ do+                    r <- acceptWith sock (check =<< readTVar stop)+                    putMVar done $+                        either (const True) (const False)+                            (r :: Either () (Socket, SockAddr))+                threadDelay 100000+                atomically $ writeTVar stop True+                takeMVar done `shouldReturn` True+                -- The listening socket was not closed to end that+                -- accept, so it still accepts.+                bracket (socket AF_INET Stream defaultProtocol) close $ \cli -> do+                    connect cli $ SockAddrInet port $ tupleToHostAddress (127, 0, 0, 1)+                    bracket (fst <$> accept sock) close $ \_ -> return ()++        it "tells a socket closed under an accept from other errors" $ do+            sock <- socket AF_INET Stream defaultProtocol+            bind sock $ SockAddrInet 0 $ tupleToHostAddress (127, 0, 0, 1)+            listen sock 1+            close sock+            r <- tryIOError $ accept sock+            either isClosedSocketError (const False) r `shouldBe` True+     describe "socketToFd" $ do         it "socketToFd can send using fd" $ do             let server sock = do@@ -378,6 +587,12 @@             let msgid = CmsgId (-300) (-300) in             show msgid `shouldBe` "CmsgId (-300) (-300)" +#if !defined(_WIN32)+    describe "bijective encodeCmsg-decodeCmsg roundtrip equality" $ do+        it "holds for [Fd]" $ forAll genFds $+            \x -> (decodeCmsg . encodeCmsg $ x) == Just (x :: [Fd])+#endif+     describe "bijective read-show roundtrip equality" $ do         it "holds for Family" $ forAll familyGen $             \x -> (read . show $ x) == (x :: Family)@@ -391,6 +606,10 @@         it "holds for CmsgId" $ forAll cmsgidGen $             \x -> (read . show $ x) == (x :: CmsgId) +    describe "hostname" $ do+        it "is not empty" $ do+          hostname <- getHostName+          hostname `shouldSatisfy` (not . null)  -- Type-specific generators with strong bias towards pattern synonyms @@ -415,6 +634,9 @@ cmsgidGen :: Gen CmsgId cmsgidGen = biasedGen (\g -> CmsgId <$> g <*> g) cmsgidPatterns arbitrary +genFds :: Gen [Fd]+genFds = listOf (Fd <$> arbitrary)+ -- pruned lists of pattern synonym values for each type to generate values from  familyPatterns :: [Family]@@ -446,11 +668,11 @@ sockoptPatterns = nub     [UnsupportedSocketOption     ,Debug,ReuseAddr,SoDomain,Type,SoProtocol,SoError,DontRoute-    ,Broadcast,SendBuffer,RecvBuffer,KeepAlive,OOBInline,TimeToLive-    ,MaxSegment,NoDelay,Cork,Linger,ReusePort+    ,Broadcast,SendBuffer,RecvBuffer,KeepAlive,KeepInit,OOBInline+    ,TimeToLive,MaxSegment,NoDelay,Cork,Linger,ReusePort     ,RecvLowWater,SendLowWater,RecvTimeOut,SendTimeOut     ,UseLoopBack,UserTimeout,IPv6Only-    ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo+    ,RecvIPv4TTL,RecvIPv4TOS,RecvIPv4PktInfo,DontFragment     ,RecvIPv6HopLimit,RecvIPv6TClass,RecvIPv6PktInfo]  cmsgidPatterns :: [CmsgId]@@ -462,5 +684,15 @@     , CmsgIdIPv6TClass     , CmsgIdIPv4PktInfo     , CmsgIdIPv6PktInfo-    , CmsgIdFd+    , CmsgIdFds     ]++-- A listening socket on the loopback, and the port it got.+withListener :: (Socket -> PortNumber -> IO a) -> IO a+withListener action =+    bracket (socket AF_INET Stream defaultProtocol) close $ \sock -> do+        setSocketOption sock ReuseAddr 1+        bind sock $ SockAddrInet 0 $ tupleToHostAddress (127, 0, 0, 1)+        listen sock 1+        port <- socketPort sock+        action sock port
tests/Network/Test/Common.hs view
@@ -21,7 +21,6 @@   -- * Common constants   , serverAddr   , serverAddr6-  , unixAddr   , testMsg   , lazyTestMsg   ) where@@ -35,6 +34,7 @@ import Control.Monad import Data.ByteString (ByteString) import qualified Data.ByteString.Lazy as L+import qualified Data.List.NonEmpty as NE import Network.Socket import System.Directory import System.Timeout (timeout)@@ -52,9 +52,6 @@ lazyTestMsg :: L.ByteString lazyTestMsg = L.fromStrict "This is a test message." -unixAddr :: String-unixAddr = "/tmp/network-test"- -- | Establish a connection between client and server and then run -- 'clientAct' and 'serverAct', in different threads.  Both actions -- get passed a connected 'Socket', used for communicating between@@ -244,7 +241,7 @@  resolveClient :: SocketType -> HostName -> PortNumber -> IO AddrInfo resolveClient socketType host port =-    head <$> getAddrInfo (Just hints) (Just host) (Just $ show port)+    NE.head <$> getAddrInfo (Just hints) (Just host) (Just $ show port)   where     hints = defaultHints {         addrSocketType = socketType@@ -253,7 +250,7 @@  resolveServer :: SocketType -> HostName -> IO AddrInfo resolveServer socketType host =-    head <$> getAddrInfo (Just hints) (Just host) Nothing+    NE.head <$> getAddrInfo (Just hints) (Just host) Nothing   where     hints = defaultHints {         addrSocketType = socketType