packages feed

network 2.7.0.2 → 3.2.8.0

raw patch · 70 files changed

Files

CHANGELOG.md view
@@ -1,3 +1,297 @@+# CHANGELOG for network++## 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.+  [#556](https://github.com/haskell/network/pull/556)+* Supporting SO_SNDTIMEO and SO_RCVTIMEO.+  [#555](https://github.com/haskell/network/pull/555)+* Emulating socketPair on Windows.+  [#554](https://github.com/haskell/network/pull/554)++## Version 3.1.3.0++* Supporting AF_UNIX on Windows+  [#553](https://github.com/haskell/network/issues/553)++## Version 3.1.2.9++* Resolving the runtime linker problem on Windows.+  [#552](https://github.com/haskell/network/issues/552)++## Version 3.1.2.8++* Ignoring error from shutdown in gracefulClose+* Fix bitsize of some msghdr and cmsghdr fields on Linux+  [#535](https://github.com/haskell/network/issues/535)+* Add SO_ACCEPTCONN SocketOption+  [#524](https://github.com/haskell/network/issues/524)++## Version 3.1.2.7++* No change from 3.1.2.6 but to take a right procedure to upload "network"+  to Hackage for Windows.++## Version 3.1.2.6++* Making IPv4PktInfo on Win the same as that on Posix+  [#522](https://github.com/haskell/network/issues/522)+* Add support for nix/ghcjs+  [#517](https://github.com/haskell/network/issues/517)++## Version 3.1.2.5++* Regenerate `configure` script with autoconf-2.69 to temporarily fix broken cabal-3.4.0.0 on Windows. Note that the old one was generated with autoconf-2.71.+  [#513](https://github.com/haskell/network/issues/513)++## Version 3.1.2.3++* Supporting M1 Mac+  [#510](https://github.com/haskell/network/pull/510)+* Workaround for autoconf on Windows+  [#508](https://github.com/haskell/network/pull/508)+* Fixing building failure on SmartOS+  [#507](https://github.com/haskell/network/pull/507)+* HsNet.h: remove unused fn hsnet_inet_ntoa definition+  [#504](https://github.com/haskell/network/pull/504)+* Use a working define for OpenBSD detection+  [#503](https://github.com/haskell/network/pull/503)++## Version 3.1.2.2++* Allow bytestring 0.11+  [#490](https://github.com/haskell/network/pull/490)+* Export StructLinger+  [#491](https://github.com/haskell/network/pull/491)+* Fix a couple of broken tests on OpenBSD+  [#498](https://github.com/haskell/network/pull/498)++## Version 3.1.2.1++* Increasing base lower bound to 4.9.+  [#473](https://github.com/haskell/network/pull/473)+* Suppressing errors from removeFile in UNIX bind.+  [#478](https://github.com/haskell/network/pull/478)+* Restoring UNIX stub functions on Windows.+  [#489](https://github.com/haskell/network/pull/489)++## Version 3.1.2.0++* Added `-f devel` for test cases that are known to fail.+  [#471](https://github.com/haskell/network/pull/471)+* Improved precedence-compliant Read/Show instances. Verified via QuickCheck.+  [#465](https://github.com/haskell/network/pull/465)+  [#466](https://github.com/haskell/network/pull/466)+* Removed the racing graceful close implementation to avoid issues with `CLOSE_WAIT`.+  [#460](https://github.com/haskell/network/pull/438)+* Gracefully handle binding of UNIX domain sockets.+  [#460](https://github.com/haskell/network/pull/460)+* Replace Socket type and family with extensible `CInt` pattern and synonyms.+  [#459](https://github.com/haskell/network/pull/459)+* Fixed race conditions in tests.+  [#458](https://github.com/haskell/network/pull/458)+* Removed many legacy uses of `undefined`.+  [#456](https://github.com/haskell/network/pull/456)+* Defined extensible `CustomSockOpt` via `ViewPatterns`.+  [#455](https://github.com/haskell/network/pull/455)+* Defined `openSocket` in terms of `AddrInfo`.+  [5b0987197fe2ed7beddd7b2096522d624e71151e](https://github.com/haskell/network/commit/5b0987197fe2ed7beddd7b2096522d624e71151e)+* Improved FreeBSD portability for Control Messages and tests+  [#452](https://github.com/haskell/network/pull/452)+* Support `sendMsg` and `recvMsg`+  [#433](https://github.com/haskell/network/pull/433)+  [#445](https://github.com/haskell/network/pull/445)+  [#451](https://github.com/haskell/network/pull/451)+    * Added `sendMsg` and `recvMsg` APIs+    * Redefined `SocketOption` as pattern synonym+* Implement total Show functions for SockAddr+  [#441](https://github.com/haskell/network/pull/441)+* Improve portability changing `u_int32_t` to `uint32_t`.+  [#442](https://github.com/haskell/network/pull/442)+* Removed obsolete CPP statements.+  [d1f4ee60ce6a4a85abb79532f64d4a4e71e2b1ce](https://github.com/haskell/network/commit/d1f4ee60ce6a4a85abb79532f64d4a4e71e2b1ce)+* Loads of improved test coverage.+  [cbd67cc50a37770432eb978ac8b8eb6da3664817](https://github.com/haskell/network/commit/cbd67cc50a37770432eb978ac8b8eb6da3664817)+  [fcc2d86d53a6bec793f6a979a9e8fdf7fe3f4c22](https://github.com/haskell/network/commit/fcc2d86d53a6bec793f6a979a9e8fdf7fe3f4c22)+  [6db96969b3e8974abbfd50a7f073baa57376fd5e](https://github.com/haskell/network/commit/6db96969b3e8974abbfd50a7f073baa57376fd5e)++## Version 3.1.1.1++* Fix for GHCJS.+  [#431](https://github.com/haskell/network/pull/431)++## Version 3.1.1.0++* A new API: `gracefulClose`.+  [#417](https://github.com/haskell/network/pull/417)+* `touchSocket`, `unsafeFdSocket`: Allow direct access to a socket's file+  descriptor while providing tools to prevent it from being garbage collected.+  This also deprecated `fdSocket` in favor of `unsafeFdSocket` and+  `withFdSocket`.+  [#423](https://github.com/haskell/network/pull/423)+* `socketToFd`: Duplicates a socket as a file desriptor and closes the source+  socket.+  [#424](https://github.com/haskell/network/pull/424)++## Version 3.1.0.1++* getAddrInfo: raise exception if no AddrInfo returned.+  [#410](https://github.com/haskell/network/pull/410)+* Avoid catching SomeException.+  [#411](https://github.com/haskell/network/pull/411)++## Version 3.1.0.0++* Making GC of socket safer.+  [#399](https://github.com/haskell/network/pull/399)+* Deprecating fdSocket. Use withFdSocket instead to ensure+  that sockets are GCed in proper time.+  [#399](https://github.com/haskell/network/pull/399)++## Version 3.0.1.1++* Fix blocking `if_nametoindex` errors on Windows+  [#391](https://github.com/haskell/network/pull/391)++## Version 3.0.1.0++* Added `getSocketType :: Socket -> IO SocketType`.+  [#372](https://github.com/haskell/network/pull/372)+* Correcting manual and brushing up test cases+  [#375](https://github.com/haskell/network/pull/375)+* Fixed longstanded bug in `getContents` on mac+  [#375](https://github.com/haskell/network/pull/375)+* Fixing regression: set correct sockaddr length for abstract addresses+  for Linux.+  [#374](https://github.com/haskell/network/pull/374)++## Version 3.0.0.1++* Fixed a bug in `connect` where exceptions were not thrown+  [#368](https://github.com/haskell/network/pull/368)++## Version 3.0.0.0++* Breaking change: the Network and Network.BSD are removed.+  Network.BSD is provided a new package: network-bsd.+* Breaking change: the signatures are changed:+```+old fdSocket :: Socket -> CInt+new fdSocket :: Socket -> IO CInt++old mkSocket :: CInt -> Family -> SocketType -> ProtocolNumber -> SocketStatus -> IO Socket+new mkSocket :: CInt -> IO Socket+```+* Breaking change: the deprecated APIs are removed: send, sendTo, recv, recvFrom, recvLen, htonl, ntohl, inet_addr, int_ntoa, bindSocket, sClose, SocketStatus, isConnected, isBound, isListening, isReadable, isWritable, sIsConnected, sIsBound, sIsListening, sIsReadable, sIsWritable, aNY_PORT, iNADDR_ANY, iN6ADDR_ANY, sOMAXCONN, sOL_SOCKET, sCM_RIGHTS, packSocketType, getPeerCred.+* Breaking change: SockAddrCan is removed from SockAddr.+* Socket addresses are extendable with Network.Socket.Address.+* "socket" is now asynchronous-exception-safe.+  [#336](https://github.com/haskell/network/pull/336)+* "recvFrom" returns (0, addr) instead of throwing an error on EOF.+  [#360](https://github.com/haskell/network/pull/360)+* All APIs are available on any platforms.+* Build system is simplified.+* Bug fixes.++## Version 2.8.0.1++* Eensuring that accept returns a correct sockaddr for unix domain.+  [#400](https://github.com/haskell/network/pull/400)+* Avoid out of bounds writes in pokeSockAddr.+  [#400](https://github.com/haskell/network/pull/400)++## Version 2.8.0.0++* Breaking change: PortNumber originally contained Word16 in network+  byte order and used "deriving Ord". This results in strange behavior+  on the Ord instance. Now PortNumber holds Word16 in host byte order.+  [#347](https://github.com/haskell/network/pull/347)+* Breaking change: stopping the export of the PortNum constructor in+  PortNumber.+* Use bytestring == 0.10.* only.+* Use base >= 4.7 && < 5.+ ## Version 2.7.0.2  * Removing withMVar to avoid the deadlock between "accept" and "close"@@ -33,7 +327,7 @@               aNY_PORT, iNADDR_ANY, iN6ADDR_ANY, sOMAXCONN,               sOL_SOCKET, sCM_RIGHTS,               packFamily, unpackFamily, packSocketType- * Do not closeFd within sendFd.+ * Breaking change: do not closeFd within sendFd.    [#271](https://github.com/haskell/network/pull/271)  * Exporting ifNameToIndex and ifIndexToName from Network.Socket.  * New APIs: setCloseOnExecIfNeeded, getCloseOnExec and getNonBlock@@ -56,10 +350,9 @@ ## Version 2.6.3.3   * Adds a function to show the defaultHints without reading their undefined fields-   [#291](https://github.com/haskell/network/pull/291)+   [#291](https://github.com/haskell/network/pull/292)  * Improve exception error messages for getAddrInfo and getNameInfo    [#289](https://github.com/haskell/network/pull/289)- * Deprecating SockAddrCan.  ## Version 2.6.3.2 @@ -124,15 +417,15 @@  ## Version 2.6.2.1 - * Regenerate configure and HsNetworkConfig.h.in.+ * Regenerate configure and `HsNetworkConfig.h.in`.   * Better detection of CAN sockets.  ## Version 2.6.2.0 - * Add support for TCP_USER_TIMEOUT.+ * Add support for `TCP_USER_TIMEOUT`. - * Don't conditionally export the SockAddr constructors.+ * Don't conditionally export the `SockAddr` constructors. - * Add isSupportSockAddr to allow checking for supported address types+ * Add `isSupportSockAddr` to allow checking for supported address types    at runtime.
− Network.hs
@@ -1,480 +0,0 @@-{-# LANGUAGE CPP #-}-{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}-{-# OPTIONS_HADDOCK hide #-}--------------------------------------------------------------------------------- |--- Module      :  Network--- Copyright   :  (c) The University of Glasgow 2001--- License     :  BSD-style (see the file libraries/network/LICENSE)------ Maintainer  :  libraries@haskell.org--- Stability   :  provisional--- Portability :  portable------ This module is kept for backwards-compatibility. New users are--- encouraged to use "Network.Socket" instead.------ "Network" was intended as a \"higher-level\" interface to networking--- facilities, and only supports TCP.-----------------------------------------------------------------------------------#include "HsNetworkConfig.h"--#ifdef HAVE_GETADDRINFO--- Use IPv6-capable function definitions if the OS supports it.-#define IPV6_SOCKET_SUPPORT 1-#endif--module Network {-# DEPRECATED "The high level Network interface is no longer supported. Please use Network.Socket." #-}-    (-    -- * Basic data types-      Socket-    , PortID(..)-    , HostName-    , PortNumber--    -- * Initialisation-    , withSocketsDo--    -- * Server-side connections-    , listenOn-    , accept-    , sClose--    -- * Client-side connections-    , connectTo--    -- * Simple sending and receiving-    {-$sendrecv-}-    , sendTo-    , recvFrom--    -- * Miscellaneous-    , socketPort--    -- * Networking Issues-    -- ** Buffering-    {-$buffering-}--    -- ** Improving I\/O Performance over sockets-    {-$performance-}-    ) where--import Control.Monad (liftM)-import Data.Maybe (fromJust)-import Network.BSD-import Network.Socket hiding (accept, socketPort, recvFrom,-                              sendTo, PortNumber, sClose)-import qualified Network.Socket as Socket (accept)-import System.IO-import Prelude-import qualified Control.Exception as Exception---- ------------------------------------------------------------------------------ High Level ``Setup'' functions---- If the @PortID@ specifies a unix family socket and the @Hostname@--- differs from that returned by @getHostname@ then an error is--- raised. Alternatively an empty string may be given to @connectTo@--- signalling that the current hostname applies.--data PortID =-          Service String                -- Service Name eg "ftp"-        | PortNumber PortNumber         -- User defined Port Number-#if !defined(mingw32_HOST_OS)-        | UnixSocket String             -- Unix family socket in file system-#endif-        deriving (Show, Eq)---- | Calling 'connectTo' creates a client side socket which is--- connected to the given host and port.  The Protocol and socket type is--- derived from the given port identifier.  If a port number is given--- then the result is always an internet family 'Stream' socket.--connectTo :: HostName           -- Hostname-          -> PortID             -- Port Identifier-          -> IO Handle          -- Connected Socket--#if defined(IPV6_SOCKET_SUPPORT)--- IPv6 and IPv4.--connectTo hostname (Service serv) = connect' "Network.connectTo" hostname serv--connectTo hostname (PortNumber port) = connect' "Network.connectTo" hostname (show port)-#else--- IPv4 only.--connectTo hostname (Service serv) = do-    proto <- getProtocolNumber "tcp"-    bracketOnError-        (socket AF_INET Stream proto)-        (sClose)  -- only done if there's an error-        (\sock -> do-          port  <- getServicePortNumber serv-          he    <- getHostByName hostname-          connect sock (SockAddrInet port (hostAddress he))-          socketToHandle sock ReadWriteMode-        )--connectTo hostname (PortNumber port) = do-    proto <- getProtocolNumber "tcp"-    bracketOnError-        (socket AF_INET Stream proto)-        (sClose)  -- only done if there's an error-        (\sock -> do-          he <- getHostByName hostname-          connect sock (SockAddrInet port (hostAddress he))-          socketToHandle sock ReadWriteMode-        )-#endif--#if !defined(mingw32_HOST_OS)-connectTo _ (UnixSocket path) = do-    bracketOnError-        (socket AF_UNIX Stream 0)-        (sClose)-        (\sock -> do-          connect sock (SockAddrUnix path)-          socketToHandle sock ReadWriteMode-        )-#endif--#if defined(IPV6_SOCKET_SUPPORT)-connect' :: String -> HostName -> ServiceName -> IO Handle--connect' caller host serv = do-    proto <- getProtocolNumber "tcp"-    let hints = defaultHints { addrFlags = [AI_ADDRCONFIG]-                             , addrProtocol = proto-                             , addrSocketType = Stream }-    addrs <- getAddrInfo (Just hints) (Just host) (Just serv)-    firstSuccessful caller $ map tryToConnect addrs-  where-  tryToConnect addr =-    bracketOnError-        (socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr))-        (sClose)  -- only done if there's an error-        (\sock -> do-          connect sock (addrAddress addr)-          socketToHandle sock ReadWriteMode-        )-#endif---- | Creates the server side socket which has been bound to the--- specified port.------ 'maxListenQueue' (typically 128) is specified to the listen queue.--- This is good enough for normal network servers but is too small--- for high performance servers.------ To avoid the \"Address already in use\" problems,--- the 'ReuseAddr' socket option is set on the listening socket.------ If available, the 'IPv6Only' socket option is set to 0--- so that both IPv4 and IPv6 can be accepted with this socket.------ If you don't like the behavior above, please use the lower level--- 'Network.Socket.listen' instead.--listenOn :: PortID      -- ^ Port Identifier-         -> IO Socket   -- ^ Listening Socket--#if defined(IPV6_SOCKET_SUPPORT)--- IPv6 and IPv4.--listenOn (Service serv) = listen' serv--listenOn (PortNumber port) = listen' (show port)-#else--- IPv4 only.--listenOn (Service serv) = do-    proto <- getProtocolNumber "tcp"-    bracketOnError-        (socket AF_INET Stream proto)-        (sClose)-        (\sock -> do-            port    <- getServicePortNumber serv-            setSocketOption sock ReuseAddr 1-            bind sock (SockAddrInet port iNADDR_ANY)-            listen sock maxListenQueue-            return sock-        )--listenOn (PortNumber port) = do-    proto <- getProtocolNumber "tcp"-    bracketOnError-        (socket AF_INET Stream proto)-        (sClose)-        (\sock -> do-            setSocketOption sock ReuseAddr 1-            bind sock (SockAddrInet port iNADDR_ANY)-            listen sock maxListenQueue-            return sock-        )-#endif--#if !defined(mingw32_HOST_OS)-listenOn (UnixSocket path) =-    bracketOnError-        (socket AF_UNIX Stream 0)-        (sClose)-        (\sock -> do-            setSocketOption sock ReuseAddr 1-            bind sock (SockAddrUnix path)-            listen sock maxListenQueue-            return sock-        )-#endif--#if defined(IPV6_SOCKET_SUPPORT)-listen' :: ServiceName -> IO Socket--listen' serv = do-    proto <- getProtocolNumber "tcp"-    -- We should probably specify addrFamily = AF_INET6 and the filter-    -- code below should be removed. AI_ADDRCONFIG is probably not-    -- necessary. But this code is well-tested. So, let's keep it.-    let hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_PASSIVE]-                             , addrSocketType = Stream-                             , addrProtocol = proto }-    addrs <- getAddrInfo (Just hints) Nothing (Just serv)-    -- Choose an IPv6 socket if exists.  This ensures the socket can-    -- handle both IPv4 and IPv6 if v6only is false.-    let addrs' = filter (\x -> addrFamily x == AF_INET6) addrs-        addr = if null addrs' then head addrs else head addrs'-    bracketOnError-        (socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr))-        (sClose)-        (\sock -> do-            setSocketOption sock ReuseAddr 1-            bind sock (addrAddress addr)-            listen sock maxListenQueue-            return sock-        )-#endif---- -------------------------------------------------------------------------------- accept---- | Accept a connection on a socket created by 'listenOn'.  Normal--- I\/O operations (see "System.IO") can be used on the 'Handle'--- returned to communicate with the client.--- Notice that although you can pass any Socket to Network.accept,--- only sockets of either AF_UNIX, AF_INET, or AF_INET6 will work--- (this shouldn't be a problem, though). When using AF_UNIX, HostName--- will be set to the path of the socket and PortNumber to -1.----accept :: Socket                -- ^ Listening Socket-       -> IO (Handle,-              HostName,-              PortNumber)       -- ^ Triple of: read\/write 'Handle' for-                                -- communicating with the client,-                                -- the 'HostName' of the peer socket, and-                                -- the 'PortNumber' of the remote connection.-accept sock@(MkSocket _ AF_INET _ _ _) = do- ~(sock', (SockAddrInet port haddr)) <- Socket.accept sock- peer <- catchIO-          (do-             (HostEntry peer _ _ _) <- getHostByAddr AF_INET haddr-             return peer-          )-          (\_e -> inet_ntoa haddr)-                -- if getHostByName fails, we fall back to the IP address- handle <- socketToHandle sock' ReadWriteMode- return (handle, peer, port)-#if defined(IPV6_SOCKET_SUPPORT)-accept sock@(MkSocket _ AF_INET6 _ _ _) = do- (sock', addr) <- Socket.accept sock- peer <- catchIO ((fromJust . fst) `liftM` getNameInfo [] True False addr) $-         \_ -> case addr of-                 SockAddrInet  _   a   -> inet_ntoa a-                 SockAddrInet6 _ _ a _ -> return (show a)-#if defined(mingw32_HOST_OS)-                 SockAddrUnix {}       -> ioError $ userError "Network.accept: peer socket address 'SockAddrUnix' not supported on this platform."-#else-                 SockAddrUnix      a   -> return a-#endif-#if defined(CAN_SOCKET_SUPPORT)-                 SockAddrCan {}        -> ioError $ userError "Network.accept: peer socket address 'SockAddrCan' not supported."-#else-                 SockAddrCan {}        -> ioError $ userError "Network.accept: peer socket address 'SockAddrCan' not supported on this platform."-#endif- handle <- socketToHandle sock' ReadWriteMode- let port = case addr of-              SockAddrInet  p _     -> p-              SockAddrInet6 p _ _ _ -> p-              _                     -> -1- return (handle, peer, port)-#endif-#if !defined(mingw32_HOST_OS)-accept sock@(MkSocket _ AF_UNIX _ _ _) = do- ~(sock', (SockAddrUnix path)) <- Socket.accept sock- handle <- socketToHandle sock' ReadWriteMode- return (handle, path, -1)-#endif-accept (MkSocket _ family _ _ _) =-  ioError $ userError $ "Network.accept: address family '" ++-    show family ++ "' not supported."----- | Close the socket. Sending data to or receiving data from closed socket--- may lead to undefined behaviour.-sClose :: Socket -> IO ()-sClose = close -- Explicit redefinition because Network.sClose is deprecated,-               -- hence the re-export would also be marked as such.---- -------------------------------------------------------------------------------- sendTo/recvFrom--{-$sendrecv-Send and receive data from\/to the given host and port number.  These-should normally only be used where the socket will not be required for-further calls. Also, note that due to the use of 'hGetContents' in 'recvFrom'-the socket will remain open (i.e. not available) even if the function already-returned. Their use is strongly discouraged except for small test-applications-or invocations from the command line.--}--sendTo :: HostName      -- Hostname-       -> PortID        -- Port Number-       -> String        -- Message to send-       -> IO ()-sendTo h p msg = do-  s <- connectTo h p-  hPutStr s msg-  hClose s--recvFrom :: HostName    -- Hostname-         -> PortID      -- Port Number-         -> IO String   -- Received Data--#if defined(IPV6_SOCKET_SUPPORT)-recvFrom host port = do-    proto <- getProtocolNumber "tcp"-    let hints = defaultHints { addrFlags = [AI_ADDRCONFIG]-                             , addrProtocol = proto-                             , addrSocketType = Stream }-    allowed <- map addrAddress `liftM` getAddrInfo (Just hints) (Just host)-                                                   Nothing-    s <- listenOn port-    let waiting = do-        (s', addr) <- Socket.accept s-        if not (addr `oneOf` allowed)-         then sClose s' >> waiting-         else socketToHandle s' ReadMode >>= hGetContents-    waiting-  where-    a@(SockAddrInet _ ha) `oneOf` ((SockAddrInet _ hb):bs)-        | ha == hb = True-        | otherwise = a `oneOf` bs-    a@(SockAddrInet6 _ _ ha _) `oneOf` ((SockAddrInet6 _ _ hb _):bs)-        | ha == hb = True-        | otherwise = a `oneOf` bs-    _ `oneOf` _ = False-#else-recvFrom host port = do- ip  <- getHostByName host- let ipHs = hostAddresses ip- s   <- listenOn port- let-  waiting = do-     ~(s', SockAddrInet _ haddr)  <-  Socket.accept s-     he <- getHostByAddr AF_INET haddr-     if not (any (`elem` ipHs) (hostAddresses he))-      then do-         sClose s'-         waiting-      else do-        h <- socketToHandle s' ReadMode-        msg <- hGetContents h-        return msg-- message <- waiting- return message-#endif---- ------------------------------------------------------------------------------ Access function returning the port type/id of socket.---- | Returns the 'PortID' associated with a given socket.-socketPort :: Socket -> IO PortID-socketPort s = do-    sockaddr <- getSocketName s-    case sockaddr of-      SockAddrInet port _      -> return $ PortNumber port-#if defined(IPV6_SOCKET_SUPPORT)-      SockAddrInet6 port _ _ _ -> return $ PortNumber port-#else-      SockAddrInet6 {}         -> ioError $ userError "Network.socketPort: socket address 'SockAddrInet6' not supported on this platform."-#endif-#if defined(mingw32_HOST_OS)-      SockAddrUnix {}          -> ioError $ userError "Network.socketPort: socket address 'SockAddrUnix' not supported on this platform."-#else-      SockAddrUnix path        -> return $ UnixSocket path-#endif-      SockAddrCan {}           -> ioError $ userError "Network.socketPort: socket address 'SockAddrCan' not supported."---- ------------------------------------------------------------------------------ Utils---- Like bracket, but only performs the final action if there was an--- exception raised by the middle bit.-bracketOnError-        :: IO a         -- ^ computation to run first (\"acquire resource\")-        -> (a -> IO b)  -- ^ computation to run last (\"release resource\")-        -> (a -> IO c)  -- ^ computation to run in-between-        -> IO c         -- returns the value from the in-between computation-bracketOnError = Exception.bracketOnError---------------------------------------------------------------------------------- Extra documentation--{-$buffering--The 'Handle' returned by 'connectTo' and 'accept' is 'NoBuffering' by-default.  For an interactive application you may want to set the-buffering mode on the 'Handle' to-'LineBuffering' or 'BlockBuffering', like so:--> h <- connectTo host port-> hSetBuffering h LineBuffering--}--{-$performance--For really fast I\/O, it might be worth looking at the 'hGetBuf' and-'hPutBuf' family of functions in "System.IO".--}--catchIO :: IO a -> (Exception.IOException -> IO a) -> IO a-#if MIN_VERSION_base(4,0,0)-catchIO = Exception.catch-#else-catchIO = Exception.catchJust Exception.ioErrors-#endif---- Version of try implemented in terms of the locally defined catchIO-tryIO :: IO a -> IO (Either Exception.IOException a)-tryIO m = catchIO (liftM Right m) (return . Left)---- Returns the first action from a list which does not throw an exception.--- If all the actions throw exceptions (and the list of actions is not empty),--- the last exception is thrown.--- The operations are run outside of the catchIO cleanup handler because--- catchIO masks asynchronous exceptions in the cleanup handler.--- In the case of complete failure, the last exception is actually thrown.-firstSuccessful :: String -> [IO a] -> IO a-firstSuccessful caller = go Nothing-  where-  -- Attempt the next operation, remember exception on failure-  go _ (p:ps) =-    do r <- tryIO p-       case r of-         Right x -> return x-         Left  e -> go (Just e) ps--  -- All operations failed, throw error if one exists-  go Nothing  [] = ioError $ userError $ caller ++ ": firstSuccessful: empty list"-  go (Just e) [] = Exception.throwIO e
− Network/BSD.hsc
@@ -1,574 +0,0 @@-{-# LANGUAGE CPP, ForeignFunctionInterface #-}-{-# OPTIONS_HADDOCK hide #-}-{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}--------------------------------------------------------------------------------- |--- Module      :  Network.BSD--- Copyright   :  (c) The University of Glasgow 2001--- License     :  BSD-style (see the file libraries/network/LICENSE)------ Maintainer  :  libraries@haskell.org--- Stability   :  experimental--- Portability :  non-portable------ The "Network.BSD" module defines Haskell bindings to network--- programming functionality provided by BSD Unix derivatives.-----------------------------------------------------------------------------------#include "HsNet.h"-##include "HsNetDef.h"--module Network.BSD  {-# DEPRECATED "This platform dependent module is no longer supported." #-}-    (-    -- * Host names-      HostName-    , getHostName--    , HostEntry(..)-    , getHostByName-    , getHostByAddr-    , hostAddress--#if defined(HAVE_GETHOSTENT) && !defined(mingw32_HOST_OS)-    , getHostEntries--    -- ** Low level functionality-    , setHostEntry-    , getHostEntry-    , endHostEntry-#endif--    -- * Service names-    , ServiceEntry(..)-    , ServiceName-    , getServiceByName-    , getServiceByPort-    , getServicePortNumber--#if !defined(mingw32_HOST_OS)-    , getServiceEntries--    -- ** Low level functionality-    , getServiceEntry-    , setServiceEntry-    , endServiceEntry-#endif--    -- * Protocol names-    , ProtocolName-    , ProtocolNumber-    , ProtocolEntry(..)-    , getProtocolByName-    , getProtocolByNumber-    , getProtocolNumber-    , defaultProtocol--#if !defined(mingw32_HOST_OS)-    , getProtocolEntries-    -- ** Low level functionality-    , setProtocolEntry-    , getProtocolEntry-    , endProtocolEntry-#endif--    -- * Port numbers-    , PortNumber--    -- * Network names-    , NetworkName-    , NetworkAddr-    , NetworkEntry(..)--#if !defined(mingw32_HOST_OS)-    , getNetworkByName-    , getNetworkByAddr-    , getNetworkEntries-    -- ** Low level functionality-    , setNetworkEntry-    , getNetworkEntry-    , endNetworkEntry-#endif--#if defined(HAVE_IF_NAMETOINDEX)-    -- * Interface names-    , ifNameToIndex-#endif--    ) where--import Network.Socket--import Control.Concurrent (MVar, newMVar, withMVar)-import qualified Control.Exception as E-import Foreign.C.String (CString, peekCString, withCString)-#if defined(HAVE_WINSOCK2_H)-import Foreign.C.Types ( CShort )-#endif-import Foreign.C.Types ( CInt(..), CULong(..), CSize(..) )-import Foreign.Ptr (Ptr, nullPtr)-import Foreign.Storable (Storable(..))-import Foreign.Marshal.Array (allocaArray0, peekArray0)-import Foreign.Marshal.Utils (with, fromBool)-import Data.Typeable-import System.IO.Error (ioeSetErrorString, mkIOError)-import System.IO.Unsafe (unsafePerformIO)--import GHC.IO.Exception--import Control.Monad (liftM)--import Network.Socket.Internal (throwSocketErrorIfMinus1_)---- ------------------------------------------------------------------------------ Basic Types--type ProtocolName = String---- ------------------------------------------------------------------------------ Service Database Access---- Calling getServiceByName for a given service and protocol returns--- the systems service entry.  This should be used to find the port--- numbers for standard protocols such as SMTP and FTP.  The remaining--- three functions should be used for browsing the service database--- sequentially.---- Calling setServiceEntry with True indicates that the service--- database should be left open between calls to getServiceEntry.  To--- close the database a call to endServiceEntry is required.  This--- database file is usually stored in the file /etc/services.--data ServiceEntry  =-  ServiceEntry  {-     serviceName     :: ServiceName,    -- Official Name-     serviceAliases  :: [ServiceName],  -- aliases-     servicePort     :: PortNumber,     -- Port Number  ( network byte order )-     serviceProtocol :: ProtocolName    -- Protocol-  } deriving (Show, Typeable)--instance Storable ServiceEntry where-   sizeOf    _ = #const sizeof(struct servent)-   alignment _ = alignment (undefined :: CInt) -- ???--   peek p = do-        s_name    <- (#peek struct servent, s_name) p >>= peekCString-        s_aliases <- (#peek struct servent, s_aliases) p-                           >>= peekArray0 nullPtr-                           >>= mapM peekCString-        s_port    <- (#peek struct servent, s_port) p-        s_proto   <- (#peek struct servent, s_proto) p >>= peekCString-        return (ServiceEntry {-                        serviceName     = s_name,-                        serviceAliases  = s_aliases,-#if defined(HAVE_WINSOCK2_H)-                        servicePort     = (fromIntegral (s_port :: CShort)),-#else-                           -- s_port is already in network byte order, but it-                           -- might be the wrong size.-                        servicePort     = (fromIntegral (s_port :: CInt)),-#endif-                        serviceProtocol = s_proto-                })--   poke = throwUnsupportedOperationPoke "ServiceEntry"----- | Get service by name.-getServiceByName :: ServiceName         -- Service Name-                 -> ProtocolName        -- Protocol Name-                 -> IO ServiceEntry     -- Service Entry-getServiceByName name proto = withLock $ do- withCString name  $ \ cstr_name  -> do- withCString proto $ \ cstr_proto -> do- throwNoSuchThingIfNull "Network.BSD.getServiceByName" "no such service entry"-   $ c_getservbyname cstr_name cstr_proto- >>= peek--foreign import CALLCONV unsafe "getservbyname"-  c_getservbyname :: CString -> CString -> IO (Ptr ServiceEntry)---- | Get the service given a 'PortNumber' and 'ProtocolName'.-getServiceByPort :: PortNumber -> ProtocolName -> IO ServiceEntry-getServiceByPort port proto = withLock $ do- withCString proto $ \ cstr_proto -> do- throwNoSuchThingIfNull "Network.BSD.getServiceByPort" "no such service entry"-   $ c_getservbyport (fromIntegral port) cstr_proto- >>= peek--foreign import CALLCONV unsafe "getservbyport"-  c_getservbyport :: CInt -> CString -> IO (Ptr ServiceEntry)---- | Get the 'PortNumber' corresponding to the 'ServiceName'.-getServicePortNumber :: ServiceName -> IO PortNumber-getServicePortNumber name = do-    (ServiceEntry _ _ port _) <- getServiceByName name "tcp"-    return port--#if !defined(mingw32_HOST_OS)-getServiceEntry :: IO ServiceEntry-getServiceEntry = withLock $ do- throwNoSuchThingIfNull "Network.BSD.getServiceEntry" "no such service entry"-   $ c_getservent- >>= peek--foreign import ccall unsafe "getservent" c_getservent :: IO (Ptr ServiceEntry)--setServiceEntry :: Bool -> IO ()-setServiceEntry flg = withLock $ c_setservent (fromBool flg)--foreign import ccall unsafe  "setservent" c_setservent :: CInt -> IO ()--endServiceEntry :: IO ()-endServiceEntry = withLock $ c_endservent--foreign import ccall unsafe  "endservent" c_endservent :: IO ()--getServiceEntries :: Bool -> IO [ServiceEntry]-getServiceEntries stayOpen = do-  setServiceEntry stayOpen-  getEntries (getServiceEntry) (endServiceEntry)-#endif---- ------------------------------------------------------------------------------ Protocol Entries---- The following relate directly to the corresponding UNIX C--- calls for returning the protocol entries. The protocol entry is--- represented by the Haskell type ProtocolEntry.---- As for setServiceEntry above, calling setProtocolEntry.--- determines whether or not the protocol database file, usually--- @/etc/protocols@, is to be kept open between calls of--- getProtocolEntry. Similarly,--data ProtocolEntry =-  ProtocolEntry  {-     protoName    :: ProtocolName,      -- Official Name-     protoAliases :: [ProtocolName],    -- aliases-     protoNumber  :: ProtocolNumber     -- Protocol Number-  } deriving (Read, Show, Typeable)--instance Storable ProtocolEntry where-   sizeOf    _ = #const sizeof(struct protoent)-   alignment _ = alignment (undefined :: CInt) -- ???--   peek p = do-        p_name    <- (#peek struct protoent, p_name) p >>= peekCString-        p_aliases <- (#peek struct protoent, p_aliases) p-                           >>= peekArray0 nullPtr-                           >>= mapM peekCString-#if defined(HAVE_WINSOCK2_H)-         -- With WinSock, the protocol number is only a short;-         -- hoist it in as such, but represent it on the Haskell side-         -- as a CInt.-        p_proto_short  <- (#peek struct protoent, p_proto) p-        let p_proto = fromIntegral (p_proto_short :: CShort)-#else-        p_proto        <- (#peek struct protoent, p_proto) p-#endif-        return (ProtocolEntry {-                        protoName    = p_name,-                        protoAliases = p_aliases,-                        protoNumber  = p_proto-                })--   poke = throwUnsupportedOperationPoke "ProtocolEntry"---getProtocolByName :: ProtocolName -> IO ProtocolEntry-getProtocolByName name = withLock $ do- withCString name $ \ name_cstr -> do- throwNoSuchThingIfNull "Network.BSD.getProtocolByName" ("no such protocol name: " ++ name)-   $ c_getprotobyname name_cstr- >>= peek--foreign import  CALLCONV unsafe  "getprotobyname"-   c_getprotobyname :: CString -> IO (Ptr ProtocolEntry)---getProtocolByNumber :: ProtocolNumber -> IO ProtocolEntry-getProtocolByNumber num = withLock $ do- throwNoSuchThingIfNull "Network.BSD.getProtocolByNumber" ("no such protocol number: " ++ show num)-   $ c_getprotobynumber (fromIntegral num)- >>= peek--foreign import CALLCONV unsafe  "getprotobynumber"-   c_getprotobynumber :: CInt -> IO (Ptr ProtocolEntry)---getProtocolNumber :: ProtocolName -> IO ProtocolNumber-getProtocolNumber proto = do- (ProtocolEntry _ _ num) <- getProtocolByName proto- return num--#if !defined(mingw32_HOST_OS)-getProtocolEntry :: IO ProtocolEntry    -- Next Protocol Entry from DB-getProtocolEntry = withLock $ do- ent <- throwNoSuchThingIfNull "Network.BSD.getProtocolEntry" "no such protocol entry"-                $ c_getprotoent- peek ent--foreign import ccall unsafe  "getprotoent" c_getprotoent :: IO (Ptr ProtocolEntry)--setProtocolEntry :: Bool -> IO ()       -- Keep DB Open ?-setProtocolEntry flg = withLock $ c_setprotoent (fromBool flg)--foreign import ccall unsafe "setprotoent" c_setprotoent :: CInt -> IO ()--endProtocolEntry :: IO ()-endProtocolEntry = withLock $ c_endprotoent--foreign import ccall unsafe "endprotoent" c_endprotoent :: IO ()--getProtocolEntries :: Bool -> IO [ProtocolEntry]-getProtocolEntries stayOpen = withLock $ do-  setProtocolEntry stayOpen-  getEntries (getProtocolEntry) (endProtocolEntry)-#endif---- ------------------------------------------------------------------------------ Host lookups--data HostEntry =-  HostEntry  {-     hostName      :: HostName,         -- Official Name-     hostAliases   :: [HostName],       -- aliases-     hostFamily    :: Family,           -- Host Type (currently AF_INET)-     hostAddresses :: [HostAddress]     -- Set of Network Addresses  (in network byte order)-  } deriving (Read, Show, Typeable)--instance Storable HostEntry where-   sizeOf    _ = #const sizeof(struct hostent)-   alignment _ = alignment (undefined :: CInt) -- ???--   peek p = do-        h_name       <- (#peek struct hostent, h_name) p >>= peekCString-        h_aliases    <- (#peek struct hostent, h_aliases) p-                                >>= peekArray0 nullPtr-                                >>= mapM peekCString-        h_addrtype   <- (#peek struct hostent, h_addrtype) p-        -- h_length       <- (#peek struct hostent, h_length) p-        h_addr_list  <- (#peek struct hostent, h_addr_list) p-                                >>= peekArray0 nullPtr-                                >>= mapM peek-        return (HostEntry {-                        hostName       = h_name,-                        hostAliases    = h_aliases,-#if defined(HAVE_WINSOCK2_H)-                        hostFamily     = unpackFamily (fromIntegral (h_addrtype :: CShort)),-#else-                        hostFamily     = unpackFamily h_addrtype,-#endif-                        hostAddresses  = h_addr_list-                })--   poke = throwUnsupportedOperationPoke "HostEntry"----- convenience function:-hostAddress :: HostEntry -> HostAddress-hostAddress (HostEntry nm _ _ ls) =- case ls of-   []    -> error $ "Network.BSD.hostAddress: empty network address list for " ++ nm-   (x:_) -> x---- getHostByName must use the same lock as the *hostent functions--- may cause problems if called concurrently.---- | Resolve a 'HostName' to IPv4 address.-getHostByName :: HostName -> IO HostEntry-getHostByName name = withLock $ do-  withCString name $ \ name_cstr -> do-   ent <- throwNoSuchThingIfNull "Network.BSD.getHostByName" "no such host entry"-                $ c_gethostbyname name_cstr-   peek ent--foreign import CALLCONV safe "gethostbyname"-   c_gethostbyname :: CString -> IO (Ptr HostEntry)----- The locking of gethostbyaddr is similar to gethostbyname.--- | Get a 'HostEntry' corresponding to the given address and family.--- Note that only IPv4 is currently supported.-getHostByAddr :: Family -> HostAddress -> IO HostEntry-getHostByAddr family addr = do- with addr $ \ ptr_addr -> withLock $ do- throwNoSuchThingIfNull "Network.BSD.getHostByAddr" "no such host entry"-   $ c_gethostbyaddr ptr_addr (fromIntegral (sizeOf addr)) (packFamily family)- >>= peek--foreign import CALLCONV safe "gethostbyaddr"-   c_gethostbyaddr :: Ptr HostAddress -> CInt -> CInt -> IO (Ptr HostEntry)--#if defined(HAVE_GETHOSTENT) && !defined(mingw32_HOST_OS)-getHostEntry :: IO HostEntry-getHostEntry = withLock $ do- throwNoSuchThingIfNull "Network.BSD.getHostEntry" "unable to retrieve host entry"-   $ c_gethostent- >>= peek--foreign import ccall unsafe "gethostent" c_gethostent :: IO (Ptr HostEntry)--setHostEntry :: Bool -> IO ()-setHostEntry flg = withLock $ c_sethostent (fromBool flg)--foreign import ccall unsafe "sethostent" c_sethostent :: CInt -> IO ()--endHostEntry :: IO ()-endHostEntry = withLock $ c_endhostent--foreign import ccall unsafe "endhostent" c_endhostent :: IO ()--getHostEntries :: Bool -> IO [HostEntry]-getHostEntries stayOpen = do-  setHostEntry stayOpen-  getEntries (getHostEntry) (endHostEntry)-#endif---- ------------------------------------------------------------------------------ Accessing network information---- Same set of access functions as for accessing host,protocol and--- service system info, this time for the types of networks supported.---- network addresses are represented in host byte order.-type NetworkAddr = CULong--type NetworkName = String--data NetworkEntry =-  NetworkEntry {-     networkName        :: NetworkName,   -- official name-     networkAliases     :: [NetworkName], -- aliases-     networkFamily      :: Family,         -- type-     networkAddress     :: NetworkAddr-   } deriving (Read, Show, Typeable)--instance Storable NetworkEntry where-   sizeOf    _ = #const sizeof(struct hostent)-   alignment _ = alignment (undefined :: CInt) -- ???--   peek p = do-        n_name         <- (#peek struct netent, n_name) p >>= peekCString-        n_aliases      <- (#peek struct netent, n_aliases) p-                                >>= peekArray0 nullPtr-                                >>= mapM peekCString-        n_addrtype     <- (#peek struct netent, n_addrtype) p-        n_net          <- (#peek struct netent, n_net) p-        return (NetworkEntry {-                        networkName      = n_name,-                        networkAliases   = n_aliases,-                        networkFamily    = unpackFamily (fromIntegral-                                                        (n_addrtype :: CInt)),-                        networkAddress   = n_net-                })--   poke = throwUnsupportedOperationPoke "NetworkEntry"---#if !defined(mingw32_HOST_OS)-getNetworkByName :: NetworkName -> IO NetworkEntry-getNetworkByName name = withLock $ do- withCString name $ \ name_cstr -> do-  throwNoSuchThingIfNull "Network.BSD.getNetworkByName" "no such network entry"-    $ c_getnetbyname name_cstr-  >>= peek--foreign import ccall unsafe "getnetbyname"-   c_getnetbyname  :: CString -> IO (Ptr NetworkEntry)--getNetworkByAddr :: NetworkAddr -> Family -> IO NetworkEntry-getNetworkByAddr addr family = withLock $ do- throwNoSuchThingIfNull "Network.BSD.getNetworkByAddr" "no such network entry"-   $ c_getnetbyaddr addr (packFamily family)- >>= peek--foreign import ccall unsafe "getnetbyaddr"-   c_getnetbyaddr  :: NetworkAddr -> CInt -> IO (Ptr NetworkEntry)--getNetworkEntry :: IO NetworkEntry-getNetworkEntry = withLock $ do- throwNoSuchThingIfNull "Network.BSD.getNetworkEntry" "no more network entries"-          $ c_getnetent- >>= peek--foreign import ccall unsafe "getnetent" c_getnetent :: IO (Ptr NetworkEntry)---- | Open the network name database. The parameter specifies--- whether a connection is maintained open between various--- networkEntry calls-setNetworkEntry :: Bool -> IO ()-setNetworkEntry flg = withLock $ c_setnetent (fromBool flg)--foreign import ccall unsafe "setnetent" c_setnetent :: CInt -> IO ()---- | Close the connection to the network name database.-endNetworkEntry :: IO ()-endNetworkEntry = withLock $ c_endnetent--foreign import ccall unsafe "endnetent" c_endnetent :: IO ()---- | Get the list of network entries.-getNetworkEntries :: Bool -> IO [NetworkEntry]-getNetworkEntries stayOpen = do-  setNetworkEntry stayOpen-  getEntries (getNetworkEntry) (endNetworkEntry)-#endif---- Mutex for name service lockdown--{-# NOINLINE lock #-}-lock :: MVar ()-lock = unsafePerformIO $ withSocketsDo $ newMVar ()--withLock :: IO a -> IO a-withLock act = withMVar lock (\_ -> act)---- ------------------------------------------------------------------------------ Miscellaneous Functions---- | Calling getHostName returns the standard host name for the current--- processor, as set at boot time.--getHostName :: IO HostName-getHostName = do-  let size = 256-  allocaArray0 size $ \ cstr -> do-    throwSocketErrorIfMinus1_ "Network.BSD.getHostName" $ c_gethostname cstr (fromIntegral size)-    peekCString cstr--foreign import CALLCONV unsafe "gethostname"-   c_gethostname :: CString -> CSize -> IO CInt---- Helper function used by the exported functions that provides a--- Haskellised view of the enumerator functions:--getEntries :: IO a  -- read-           -> IO () -- at end-           -> IO [a]-getEntries getOne atEnd = loop-  where-    loop = do-      vv <- E.catch (liftM Just getOne)-            (\ e -> let _types = e :: IOException in return Nothing)-      case vv of-        Nothing -> return []-        Just v  -> loop >>= \ vs -> atEnd >> return (v:vs)---throwNoSuchThingIfNull :: String -> String -> IO (Ptr a) -> IO (Ptr a)-throwNoSuchThingIfNull loc desc act = do-  ptr <- act-  if (ptr == nullPtr)-   then ioError (ioeSetErrorString (mkIOError NoSuchThing loc Nothing Nothing) desc)-   else return ptr--throwUnsupportedOperationPoke :: String -> Ptr a -> a -> IO ()-throwUnsupportedOperationPoke typ _ _ =-  ioError $ ioeSetErrorString ioe "Operation not implemented"-  where-    ioe = mkIOError UnsupportedOperation-                    ("Network.BSD: instance Storable " ++ typ ++ ": poke")-                    Nothing-                    Nothing
+ Network/Socket.hs view
@@ -0,0 +1,428 @@+{-# LANGUAGE CPP #-}++#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+-- License     :  BSD-style (see the file libraries/network/LICENSE)+--+-- Maintainer  :  libraries@haskell.org+-- Stability   :  provisional+-- Portability :  portable+--+-- This is the main module of the network package supposed to be+-- used with either "Network.Socket.ByteString" or+-- "Network.Socket.ByteString.Lazy" for sending/receiving.+--+-- Here are two minimal example programs using the TCP/IP protocol:+--+-- * a server that echoes all data that it receives back+-- * a client using it+--+-- > -- Echo server program+-- > module Main (main) where+-- >+-- > import Control.Concurrent (forkFinally)+-- > 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)+-- >+-- > main :: IO ()+-- > main = runTCPServer Nothing "3000" talk+-- >   where+-- >     talk s = do+-- >         msg <- recv s 1024+-- >         unless (S.null msg) $ do+-- >           sendAll s msg+-- >           talk s+-- >+-- > -- from the "network-run" package.+-- > runTCPServer :: Maybe HostName -> ServiceName -> (Socket -> IO a) -> IO a+-- > runTCPServer mhost port server = do+-- >     addr <- resolve+-- >     E.bracket (open addr) close loop+-- >   where+-- >     resolve = do+-- >         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)+--+-- > {-# 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)+-- >+-- > main :: IO ()+-- > main = runTCPClient "127.0.0.1" "3000" $ \s -> do+-- >     sendAll s "Hello, world!"+-- >     msg <- recv s 1024+-- >     putStr "Received: "+-- >     C.putStrLn msg+-- >+-- > -- from the "network-run" package.+-- > runTCPClient :: HostName -> ServiceName -> (Socket -> IO a) -> IO a+-- > runTCPClient host port client = do+-- >     addr <- resolve+-- >     E.bracket (open addr) close client+-- >   where+-- >     resolve = do+-- >         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+--+-- The proper programming model is that one 'Socket' is handled by+-- a single thread. If multiple threads use one 'Socket' concurrently,+-- 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.+module Network.Socket (+    -- * Address information+    getAddrInfo,++    -- ** Types+    HostName,+    ServiceName,+    AddrInfo (..),+    defaultHints,++    -- ** Flags+    AddrInfoFlag (..),+    addrInfoFlagImplemented,++    -- * Socket operations+    connect,+    bind,+    listen,+    accept,++    -- ** Closing+    close,+    close',+    gracefulClose,+    shutdown,+    ShutdownCmd (..),++    -- * Socket options+    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+    ),+    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,++    -- ** Types of Socket+    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,++    -- ** Protocol number+    ProtocolNumber,+    defaultProtocol,++    -- * Basic socket address type+    SockAddr (..),+    isSupportedSockAddr,+    getPeerName,+    getSocketName,++    -- ** Host address+    HostAddress,+    hostAddressToTuple,+    tupleToHostAddress,++    -- ** Host address6+    HostAddress6,+    hostAddress6ToTuple,+    tupleToHostAddress6,++    -- ** Flow Info+    FlowInfo,++    -- ** Scope ID+    ScopeID,+    ifNameToIndex,+    ifIndexToName,++    -- ** Port number+    PortNumber,+    defaultPort,+    socketPortSafe,+    socketPort,++    -- * UNIX-domain socket+    isUnixDomainSocketAvailable,+    socketPair,+    sendFd,+    recvFd,+    getPeerCredential,++    -- * Name information+    getNameInfo,+    NameInfoFlag (..),++    -- * Low level++    -- ** socket operations+    setCloseOnExecIfNeeded,+    getCloseOnExec,+    setNonBlockIfNeeded,+    getNonBlock,++    -- ** Sending and receiving data+    sendBuf,+    recvBuf,+    sendBufTo,+    recvBufFrom,++    -- ** Advanced IO+    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,+        CmsgIdFds,+        UnsupportedCmsgId+    ),++    -- ** APIs for control message+    lookupCmsg,+    filterCmsg,++    -- ** Class and types for control message+    ControlMessage (..),+    IPv4TTL (..),+    IPv6HopLimit (..),+    IPv4TOS (..),+    IPv6TClass (..),+    IPv4PktInfo (..),+    IPv6PktInfo (..),++    -- * Special constants+    maxListenQueue,++    -- * STM to check read and write+    waitReadSocketSTM,+    waitAndCancelReadSocketSTM,+    waitWriteSocketSTM,+    waitAndCancelWriteSocketSTM,++    -- * Deprecated+    withSocketsDo,+) 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+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 (accept, bind, connect)+import Network.Socket.Types+import Network.Socket.Unix+#if !defined(mingw32_HOST_OS)+import Network.Socket.Posix.Cmsg+#else+import Network.Socket.Win32.Cmsg+#endif
− Network/Socket.hsc
@@ -1,1965 +0,0 @@-{-# LANGUAGE CPP, ScopedTypeVariables, RecordWildCards #-}-{-# OPTIONS_GHC -fno-warn-orphans #-}-{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}--------------------------------------------------------------------------------- |--- Module      :  Network.Socket--- Copyright   :  (c) The University of Glasgow 2001--- License     :  BSD-style (see the file libraries/network/LICENSE)------ Maintainer  :  libraries@haskell.org--- Stability   :  provisional--- Portability :  portable------ This is the main module of the network package supposed to be--- used with either "Network.Socket.ByteString" or--- "Network.Socket.ByteString.Lazy" for sending/receiving.------ Here are two minimal example programs using the TCP/IP protocol: a--- server that echoes all data that it receives back (servicing only--- one client) and a client using it.------ > -- Echo server program--- > module Main (main) where--- >--- > import Control.Concurrent (forkFinally)--- > import qualified Control.Exception as E--- > import Control.Monad (unless, forever, void)--- > import qualified Data.ByteString as S--- > import Network.Socket hiding (recv)--- > import Network.Socket.ByteString (recv, sendAll)--- >--- > main :: IO ()--- > main = withSocketsDo $ do--- >     addr <- resolve "3000"--- >     E.bracket (open addr) close loop--- >   where--- >     resolve port = do--- >         let hints = defaultHints {--- >                 addrFlags = [AI_PASSIVE]--- >               , addrSocketType = Stream--- >               }--- >         addr:_ <- getAddrInfo (Just hints) Nothing (Just port)--- >         return addr--- >     open addr = do--- >         sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)--- >         setSocketOption sock ReuseAddr 1--- >         bind sock (addrAddress addr)--- >         -- If the prefork technique is not used,--- >         -- set CloseOnExec for the security reasons.--- >         let fd = fdSocket sock--- >         setCloseOnExecIfNeeded fd--- >         listen sock 10--- >         return sock--- >     loop sock = forever $ do--- >         (conn, peer) <- accept sock--- >         putStrLn $ "Connection from " ++ show peer--- >         void $ forkFinally (talk conn) (\_ -> close conn)--- >     talk conn = do--- >         msg <- recv conn 1024--- >         unless (S.null msg) $ do--- >           sendAll conn msg--- >           talk conn------ > {-# LANGUAGE OverloadedStrings #-}--- > -- Echo client program--- > module Main (main) where--- >--- > import qualified Control.Exception as E--- > import qualified Data.ByteString.Char8 as C--- > import Network.Socket hiding (recv)--- > import Network.Socket.ByteString (recv, sendAll)--- >--- > main :: IO ()--- > main = withSocketsDo $ do--- >     addr <- resolve "127.0.0.1" "3000"--- >     E.bracket (open addr) close talk--- >   where--- >     resolve host port = do--- >         let hints = defaultHints { addrSocketType = Stream }--- >         addr:_ <- getAddrInfo (Just hints) (Just host) (Just port)--- >         return addr--- >     open addr = do--- >         sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)--- >         connect sock $ addrAddress addr--- >         return sock--- >     talk sock = do--- >         sendAll sock "Hello, world!"--- >         msg <- recv sock 1024--- >         putStr "Received: "--- >         C.putStrLn msg------ The proper programming model is that one 'Socket' is handled by--- a single thread. If multiple threads use one 'Socket' concurrently,--- 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.--------------------------------------------------------------------------------#include "HsNet.h"-##include "HsNetDef.h"--module Network.Socket-    (-    -- * Initialisation-      withSocketsDo-    -- * Address information-    , getAddrInfo-    -- ** Types-    , HostName-    , ServiceName-    , AddrInfo(..)-    , defaultHints-    -- ** Flags-    , AddrInfoFlag(..)-    , addrInfoFlagImplemented-    -- * Socket operations-    , connect-    , bind-    , listen-    , accept-    -- ** Closing-    , close-    , close'-    , shutdown-    , ShutdownCmd(..)-    -- * Socket options-    , SocketOption(..)-    , isSupportedSocketOption-    , getSocketOption-    , setSocketOption-    -- * Socket-    , Socket(..)-    , socket-    , fdSocket-    , mkSocket-    , socketToHandle-    -- ** Types of Socket-    , SocketType(..)-    , isSupportedSocketType-    -- ** Family-    , Family(..)-    , isSupportedFamily-    -- ** Protocol number-    , ProtocolNumber-    , defaultProtocol-    -- * Socket address-    , SockAddr(..)-    , isSupportedSockAddr-    , getPeerName-    , getSocketName-    -- ** Host address-    , HostAddress-    , hostAddressToTuple-    , tupleToHostAddress-#if defined(IPV6_SOCKET_SUPPORT)-    -- ** Host address6-    , HostAddress6-    , hostAddress6ToTuple-    , tupleToHostAddress6-    -- ** Flow Info-    , FlowInfo-    -- ** Scope ID-    , ScopeID-# if defined(HAVE_IF_NAMETOINDEX)-    , ifNameToIndex-    , ifIndexToName-# endif-#endif-    -- ** Port number-    , PortNumber(..)-    , defaultPort-    , socketPortSafe-    , socketPort-    -- * UNIX-domain socket-    , isUnixDomainSocketAvailable-    , socketPair-    , sendFd-    , recvFd-    , getPeerCredential-#if defined(IPV6_SOCKET_SUPPORT)-    -- * Name information-    , NameInfoFlag(..)-    , getNameInfo-#endif-    -- * Low level operations-    , setCloseOnExecIfNeeded-    , getCloseOnExec-    , setNonBlockIfNeeded-    , getNonBlock-    -- * Sending and receiving data-    , sendBuf-    , recvBuf-    , sendBufTo-    , recvBufFrom-    -- * Special constants-    , maxListenQueue-    -- * Deprecated-    -- ** Deprecated sending and receiving-    , send-    , sendTo-    , recv-    , recvFrom-    , recvLen-    -- ** Deprecated address functions-    , htonl-    , ntohl-    , inet_addr-    , inet_ntoa-    -- ** Deprecated socket operations-    , bindSocket-    , sClose-    -- ** Deprecated socket status-    , SocketStatus(..) -- fixme-    , isConnected-    , isBound-    , isListening-    , isReadable-    , isWritable-    , sIsConnected-    , sIsBound-    , sIsListening-    , sIsReadable-    , sIsWritable-    -- ** Deprecated special constants-    , aNY_PORT-    , iNADDR_ANY-#if defined(IPV6_SOCKET_SUPPORT)-    , iN6ADDR_ANY-#endif-    , sOMAXCONN-    , sOL_SOCKET-#ifdef SCM_RIGHTS-    , sCM_RIGHTS-#endif-    -- ** Decrecated internal functions-    , packFamily-    , unpackFamily-    , packSocketType-    -- ** Decrecated UNIX-domain functions-#if defined(HAVE_STRUCT_UCRED) || defined(HAVE_GETPEEREID)-    -- get the credentials of our domain socket peer.-    , getPeerCred-#if defined(HAVE_GETPEEREID)-    , getPeerEid-#endif-#endif-    ) where--import Data.Bits-import Data.Functor-import Data.List (foldl')-import Data.Maybe (isJust)-import Data.Word (Word8, Word32)-import Foreign.Ptr (Ptr, castPtr, nullPtr)-import Foreign.Storable (Storable(..))-import Foreign.C.Error-import Foreign.C.String (CString, withCString, withCStringLen, peekCString, peekCStringLen)-import Foreign.C.Types (CUInt(..), CChar)-import Foreign.C.Types (CInt(..), CSize(..))-import Foreign.Marshal.Alloc ( alloca, allocaBytes )-import Foreign.Marshal.Array ( peekArray )-import Foreign.Marshal.Utils ( maybeWith, with )--import System.IO-import Control.Monad (liftM, when)--import qualified Control.Exception as E-import Control.Concurrent.MVar-import Data.Typeable-import System.IO.Error--import GHC.Conc (threadWaitWrite)-# ifdef HAVE_ACCEPT4-import GHC.Conc (threadWaitRead)-# endif-##if MIN_VERSION_base(4,3,1)-import GHC.Conc (closeFdWith)-##endif-# if defined(mingw32_HOST_OS)-import GHC.Conc (asyncDoProc)-import GHC.IO.FD (FD(..), readRawBufferPtr, writeRawBufferPtr)-import Foreign (FunPtr)-# endif-# if defined(darwin_HOST_OS)-import Data.List (delete)-# endif-import qualified GHC.IO.Device-import GHC.IO.Handle.FD-import GHC.IO.Exception-import GHC.IO-import qualified System.Posix.Internals--import Network.Socket.Internal-import Network.Socket.Types--import Prelude -- Silence AMP warnings---- | Either a host name e.g., @\"haskell.org\"@ or a numeric host--- address string consisting of a dotted decimal IPv4 address or an--- IPv6 address e.g., @\"192.168.0.1\"@.-type HostName       = String-type ServiceName    = String---- ------------------------------------------------------------------------------- On Windows, our sockets are not put in non-blocking mode (non-blocking--- is not supported for regular file descriptors on Windows, and it would--- be a pain to support it only for sockets).  So there are two cases:------  - the threaded RTS uses safe calls for socket operations to get---    non-blocking I/O, just like the rest of the I/O library------  - with the non-threaded RTS, only some operations on sockets will be---    non-blocking.  Reads and writes go through the normal async I/O---    system.  accept() uses asyncDoProc so is non-blocking.  A handful---    of others (recvFrom, sendFd, recvFd) will block all threads - if this---    is a problem, -threaded is the workaround.----##if defined(mingw32_HOST_OS)-##define SAFE_ON_WIN safe-##else-##define SAFE_ON_WIN unsafe-##endif---------------------------------------------------------------------------------- Socket types--#if defined(mingw32_HOST_OS)-socket2FD  (MkSocket fd _ _ _ _) =-  -- HACK, 1 means True-  FD{fdFD = fd,fdIsSocket_ = 1}-#endif---- | Smart constructor for constructing a 'Socket'. It should only be--- called once for every new file descriptor. The caller must make--- sure that the socket is in non-blocking mode. See--- 'setNonBlockIfNeeded'.-mkSocket :: CInt-         -> Family-         -> SocketType-         -> ProtocolNumber-         -> SocketStatus-         -> IO Socket-mkSocket fd fam sType pNum stat = do-   mStat <- newMVar stat-   withSocketsDo $ return ()-   return $ MkSocket fd fam sType pNum mStat---- | This is the default protocol for a given service.-defaultProtocol :: ProtocolNumber-defaultProtocol = 0---------------------------------------------------------------------------------- SockAddr--instance Show SockAddr where-#if defined(DOMAIN_SOCKET_SUPPORT)-  showsPrec _ (SockAddrUnix str) = showString str-#endif-  showsPrec _ (SockAddrInet port ha)-   = showString (unsafePerformIO (inet_ntoa ha))-   . showString ":"-   . shows port-#if defined(IPV6_SOCKET_SUPPORT)-  showsPrec _ addr@(SockAddrInet6 port _ _ _)-   = showChar '['-   . showString (unsafePerformIO $-                 fst `liftM` getNameInfo [NI_NUMERICHOST] True False addr >>=-                 maybe (fail "showsPrec: impossible internal error") return)-   . showString "]:"-   . shows port-#endif-#if defined(CAN_SOCKET_SUPPORT)-  showsPrec _ (SockAddrCan ifidx) = shows ifidx-#endif-#if !(defined(IPV6_SOCKET_SUPPORT) \-      && defined(DOMAIN_SOCKET_SUPPORT) && defined(CAN_SOCKET_SUPPORT))-  showsPrec _ _ = error "showsPrec: not supported"-#endif---------------------------------------------------------------------------------- Connection Functions---- In the following connection and binding primitives.  The names of--- the equivalent C functions have been preserved where possible. It--- should be noted that some of these names used in the C library,--- \tr{bind} in particular, have a different meaning to many Haskell--- programmers and have thus been renamed by appending the prefix--- Socket.---- | Create a new socket using the given address family, socket type--- and protocol number.  The address family is usually 'AF_INET',--- 'AF_INET6', or 'AF_UNIX'.  The socket type is usually 'Stream' or--- 'Datagram'.  The protocol number is usually 'defaultProtocol'.--- If 'AF_INET6' is used and the socket type is 'Stream' or 'Datagram',--- the 'IPv6Only' socket option is set to 0 so that both IPv4 and IPv6--- can be handled with one socket.------ >>> let hints = defaultHints { addrFlags = [AI_NUMERICHOST, AI_NUMERICSERV], addrSocketType = Stream }--- >>> addr:_ <- getAddrInfo (Just hints) (Just "127.0.0.1") (Just "5000")--- >>> sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)--- >>> bind sock (addrAddress addr)--- >>> getSocketName sock--- 127.0.0.1:5000-socket :: Family         -- Family Name (usually AF_INET)-       -> SocketType     -- Socket Type (usually Stream)-       -> ProtocolNumber -- Protocol Number (getProtocolByName to find value)-       -> IO Socket      -- Unconnected Socket-socket family stype protocol = do-    c_stype <- packSocketTypeOrThrow "socket" stype-    fd <- throwSocketErrorIfMinus1Retry "Network.Socket.socket" $-                c_socket (packFamily family) c_stype protocol-    setNonBlockIfNeeded fd-    sock <- mkSocket fd family stype protocol NotConnected-#if HAVE_DECL_IPV6_V6ONLY-    -- The default value of the IPv6Only option is platform specific,-    -- so we explicitly set it to 0 to provide a common default.-# if defined(mingw32_HOST_OS)-    -- The IPv6Only option is only supported on Windows Vista and later,-    -- so trying to change it might throw an error.-    when (family == AF_INET6 && (stype == Stream || stype == Datagram)) $-      E.catch (setSocketOption sock IPv6Only 0) $ (\(_ :: E.IOException) -> return ())-# elif !defined(__OpenBSD__)-    when (family == AF_INET6 && (stype == Stream || stype == Datagram)) $-      setSocketOption sock IPv6Only 0 `onException` close sock-# endif-#endif-    return sock---- | Build a pair of connected socket objects using the given address--- family, socket type, and protocol number.  Address family, socket--- type, and protocol number are as for the 'socket' function above.--- Availability: Unix.-socketPair :: Family              -- Family Name (usually AF_INET or AF_INET6)-           -> SocketType          -- Socket Type (usually Stream)-           -> ProtocolNumber      -- Protocol Number-           -> IO (Socket, Socket) -- unnamed and connected.-#if defined(DOMAIN_SOCKET_SUPPORT)-socketPair family stype protocol = do-    allocaBytes (2 * sizeOf (1 :: CInt)) $ \ fdArr -> do-    c_stype <- packSocketTypeOrThrow "socketPair" stype-    _rc <- throwSocketErrorIfMinus1Retry "Network.Socket.socketpair" $-                c_socketpair (packFamily family) c_stype protocol fdArr-    [fd1,fd2] <- peekArray 2 fdArr-    s1 <- mkNonBlockingSocket fd1-    s2 <- mkNonBlockingSocket fd2-    return (s1,s2)-  where-    mkNonBlockingSocket fd = do-       setNonBlockIfNeeded fd-       mkSocket fd family stype protocol Connected--foreign import ccall unsafe "socketpair"-  c_socketpair :: CInt -> CInt -> CInt -> Ptr CInt -> IO CInt-#else-socketPair _ _ _ = error "Network.Socket.socketPair"-#endif---------------------------------------------------------------------------------#if defined(mingw32_HOST_OS)-#else-fGetFd :: CInt-fGetFd = #const F_GETFD-fGetFl :: CInt-fGetFl = #const F_GETFL-fdCloexec :: CInt-fdCloexec = #const FD_CLOEXEC-oNonBlock :: CInt-oNonBlock = #const O_NONBLOCK-# if defined(HAVE_ACCEPT4)-sockNonBlock :: CInt-sockNonBlock = #const SOCK_NONBLOCK-sockCloexec :: CInt-sockCloexec = #const SOCK_CLOEXEC-# endif-#endif---- | Set the nonblocking flag on Unix.---   On Windows, nothing is done.-setNonBlockIfNeeded :: CInt -> IO ()-setNonBlockIfNeeded fd =-    System.Posix.Internals.setNonBlockingFD fd True---- | Set the close_on_exec flag on Unix.---   On Windows, nothing is done.------   Since 2.7.0.0.-setCloseOnExecIfNeeded :: CInt -> IO ()-#if defined(mingw32_HOST_OS)-setCloseOnExecIfNeeded _ = return ()-#else-setCloseOnExecIfNeeded fd = System.Posix.Internals.setCloseOnExec fd-#endif--#if !defined(mingw32_HOST_OS)-foreign import ccall unsafe "fcntl"-  c_fcntl_read  :: CInt -> CInt -> CInt -> IO CInt-#endif---- | Get the nonblocking flag.---   On Windows, this function always returns 'False'.------   Since 2.7.0.0.-getCloseOnExec :: CInt -> IO Bool-#if defined(mingw32_HOST_OS)-getCloseOnExec _ = return False-#else-getCloseOnExec fd = do-    flags <- c_fcntl_read fd fGetFd 0-    let ret = flags .&. fdCloexec-    return (ret /= 0)-#endif---- | Get the close_on_exec flag.---   On Windows, this function always returns 'False'.------   Since 2.7.0.0.-getNonBlock :: CInt -> IO Bool-#if defined(mingw32_HOST_OS)-getNonBlock _ = return False-#else-getNonBlock fd = do-    flags <- c_fcntl_read fd fGetFl 0-    let ret = flags .&. oNonBlock-    return (ret /= 0)-#endif---------------------------------------------------------------------------------- Binding a socket---- | 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    -- Unconnected Socket-           -> SockAddr  -- Address to Bind to-           -> IO ()-bind (MkSocket s _family _stype _protocol socketStatus) addr = do- modifyMVar_ socketStatus $ \ status -> do- if status /= NotConnected-  then-   ioError $ userError $-     "Network.Socket.bind: can't bind to socket with status " ++ show status-  else do-   withSockAddr addr $ \p_addr sz -> do-   _status <- throwSocketErrorIfMinus1Retry "Network.Socket.bind" $-     c_bind s p_addr (fromIntegral sz)-   return Bound---------------------------------------------------------------------------------- Connecting a socket---- | Connect to a remote socket at address.-connect :: Socket    -- Unconnected Socket-        -> SockAddr  -- Socket address stuff-        -> IO ()-connect sock@(MkSocket s _family _stype _protocol socketStatus) addr = withSocketsDo $ do- modifyMVar_ socketStatus $ \currentStatus -> do- if currentStatus /= NotConnected && currentStatus /= Bound-  then-    ioError $ userError $-      errLoc ++ ": can't connect to socket with status " ++ show currentStatus-  else do-    withSockAddr addr $ \p_addr sz -> do--    let connectLoop = do-           r <- c_connect s p_addr (fromIntegral sz)-           if r == -1-               then do-#if !(defined(HAVE_WINSOCK2_H))-                   err <- getErrno-                   case () of-                     _ | err == eINTR       -> connectLoop-                     _ | err == eINPROGRESS -> connectBlocked---                   _ | err == eAGAIN      -> connectBlocked-                     _otherwise             -> throwSocketError errLoc-#else-                   throwSocketError errLoc-#endif-               else return ()--        connectBlocked = do-           threadWaitWrite (fromIntegral s)-           err <- getSocketOption sock SoError-           if (err == 0)-                then return ()-                else throwSocketErrorCode errLoc (fromIntegral err)--    connectLoop-    return Connected- where-   errLoc = "Network.Socket.connect: " ++ show sock---------------------------------------------------------------------------------- Listen---- | Listen for connections made to the socket.  The second argument--- specifies the maximum number of queued connections and should be at--- least 1; the maximum value is system-dependent (usually 5).-listen :: Socket  -- Connected & Bound Socket-       -> Int     -- Queue Length-       -> IO ()-listen (MkSocket s _family _stype _protocol socketStatus) backlog = do- modifyMVar_ socketStatus $ \ status -> do- if status /= Bound-   then-     ioError $ userError $-       "Network.Socket.listen: can't listen on socket with status " ++ show status-   else do-     throwSocketErrorIfMinus1Retry_ "Network.Socket.listen" $-       c_listen s (fromIntegral backlog)-     return Listening---------------------------------------------------------------------------------- Accept------ A call to `accept' only returns when data is available on the given--- socket, unless the socket has been set to non-blocking.  It will--- return a new socket which should be used to read the incoming data and--- should then be closed. Using the socket returned by `accept' allows--- incoming requests to be queued on the original socket.---- | Accept a connection.  The socket must be bound to an address and--- listening for connections.  The return value is a pair @(conn,--- address)@ where @conn@ is a new socket object usable to send and--- receive data on the connection, and @address@ is the address bound--- to the socket on the other end of the connection.-accept :: Socket                        -- Queue Socket-       -> IO (Socket,                   -- Readable Socket-              SockAddr)                 -- Peer details--accept sock@(MkSocket s family stype protocol status) = do- currentStatus <- readMVar status- if not $ isAcceptable family stype currentStatus-   then-     ioError $ userError $-       "Network.Socket.accept: can't accept socket (" ++-         show (family, stype, protocol) ++ ") with status " ++-         show currentStatus-   else do-     let sz = sizeOfSockAddrByFamily family-     allocaBytes sz $ \ sockaddr -> do-#if defined(mingw32_HOST_OS)-     new_sock <--        if threaded-           then with (fromIntegral sz) $ \ ptr_len ->-                  throwSocketErrorIfMinus1Retry "Network.Socket.accept" $-                    c_accept_safe s sockaddr ptr_len-           else do-                paramData <- c_newAcceptParams s (fromIntegral sz) sockaddr-                rc        <- asyncDoProc c_acceptDoProc paramData-                new_sock  <- c_acceptNewSock    paramData-                c_free paramData-                when (rc /= 0) $-                     throwSocketErrorCode "Network.Socket.accept" (fromIntegral rc)-                return new_sock-#else-     with (fromIntegral sz) $ \ ptr_len -> do-# ifdef HAVE_ACCEPT4-     new_sock <- throwSocketErrorIfMinus1RetryMayBlock "Network.Socket.accept"-                        (threadWaitRead (fromIntegral s))-                        (c_accept4 s sockaddr ptr_len (sockNonBlock .|. sockCloexec))-# else-     new_sock <- throwSocketErrorWaitRead sock "Network.Socket.accept"-                        (c_accept s sockaddr ptr_len)-     setNonBlockIfNeeded new_sock-     setCloseOnExecIfNeeded new_sock-# endif /* HAVE_ACCEPT4 */-#endif-     addr <- peekSockAddr sockaddr-     sock' <- mkSocket new_sock family stype protocol Connected-     return (sock', addr)--#if defined(mingw32_HOST_OS)-foreign import ccall unsafe "HsNet.h acceptNewSock"-  c_acceptNewSock :: Ptr () -> IO CInt-foreign import ccall unsafe "HsNet.h newAcceptParams"-  c_newAcceptParams :: CInt -> CInt -> Ptr a -> IO (Ptr ())-foreign import ccall unsafe "HsNet.h &acceptDoProc"-  c_acceptDoProc :: FunPtr (Ptr () -> IO Int)-foreign import ccall unsafe "free"-  c_free:: Ptr a -> IO ()-#endif---------------------------------------------------------------------------------- ** Sending and receiving data---- $sendrecv------ Do not use the @send@ and @recv@ functions defined in this section--- in new code, as they incorrectly represent binary data as a Unicode--- string.  As a result, these functions are inefficient and may lead--- to bugs in the program.  Instead use the @send@ and @recv@--- functions defined in the "Network.Socket.ByteString" module.---------------------------------------------------------------------------------- sendTo & recvFrom---- | 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--- ensuring that all data has been sent.------ NOTE: blocking on Windows unless you compile with -threaded (see--- GHC ticket #1129)-{-# DEPRECATED sendTo "Use sendTo defined in \"Network.Socket.ByteString\"" #-}-sendTo :: Socket        -- (possibly) bound/connected Socket-       -> String        -- Data to send-       -> SockAddr-       -> IO Int        -- Number of Bytes sent-sendTo sock xs addr = do- withCStringLen xs $ \(str, len) -> do-   sendBufTo sock str len addr---- | 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--- ensuring that all data has been sent.-sendBufTo :: Socket            -- (possibly) bound/connected Socket-          -> Ptr a -> Int  -- Data to send-          -> SockAddr-          -> IO Int            -- Number of Bytes sent-sendBufTo sock@(MkSocket s _family _stype _protocol _status) ptr nbytes addr = do- withSockAddr addr $ \p_addr sz -> do-   liftM fromIntegral $-     throwSocketErrorWaitWrite sock "Network.Socket.sendBufTo" $-        c_sendto s ptr (fromIntegral $ nbytes) 0{-flags-}-                        p_addr (fromIntegral sz)---- | Receive data from the socket. The socket need not be in a--- connected state. Returns @(bytes, nbytes, address)@ where @bytes@--- is a @String@ of length @nbytes@ representing the data received and--- @address@ is a 'SockAddr' representing the address of the sending--- socket.------ NOTE: blocking on Windows unless you compile with -threaded (see--- GHC ticket #1129)-{-# DEPRECATED recvFrom "Use recvFrom defined in \"Network.Socket.ByteString\"" #-}-recvFrom :: Socket -> Int -> IO (String, Int, SockAddr)-recvFrom sock nbytes =-  allocaBytes nbytes $ \ptr -> do-    (len, sockaddr) <- recvBufFrom sock ptr nbytes-    str <- peekCStringLen (ptr, len)-    return (str, len, sockaddr)---- | 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--- bytes received and @address@ is a 'SockAddr' representing the--- address of the sending socket.------ NOTE: blocking on Windows unless you compile with -threaded (see--- GHC ticket #1129)-recvBufFrom :: Socket -> Ptr a -> Int -> IO (Int, SockAddr)-recvBufFrom sock@(MkSocket s family _stype _protocol _status) ptr nbytes- | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvBufFrom")- | otherwise   =-    withNewSockAddr family $ \ptr_addr sz -> do-      alloca $ \ptr_len -> do-        poke ptr_len (fromIntegral sz)-        len <- throwSocketErrorWaitRead sock "Network.Socket.recvBufFrom" $-                   c_recvfrom s ptr (fromIntegral nbytes) 0{-flags-}-                                ptr_addr ptr_len-        let len' = fromIntegral len-        if len' == 0-         then ioError (mkEOFError "Network.Socket.recvFrom")-         else do-           flg <- isConnected sock-             -- For at least one implementation (WinSock 2), recvfrom() ignores-             -- filling in the sockaddr for connected TCP sockets. Cope with-             -- this by using getPeerName instead.-           sockaddr <--                if flg then-                   getPeerName sock-                else-                   peekSockAddr ptr_addr-           return (len', sockaddr)---------------------------------------------------------------------------------- send & recv---- | Send data to the socket. The socket must be connected to a remote--- socket. Returns the number of bytes sent.  Applications are--- responsible for ensuring that all data has been sent.------ Sending data to closed socket may lead to undefined behaviour.-{-# DEPRECATED send "Use send defined in \"Network.Socket.ByteString\"" #-}-send :: Socket  -- Bound/Connected Socket-     -> String  -- Data to send-     -> IO Int  -- Number of Bytes sent-send sock xs = withCStringLen xs $ \(str, len) ->-    sendBuf sock (castPtr str) len---- | Send data to the socket. The socket must be connected to a remote--- socket. Returns the number of bytes sent.  Applications are--- responsible for ensuring that all data has been sent.------ Sending data to closed socket may lead to undefined behaviour.-sendBuf :: Socket     -- Bound/Connected Socket-        -> Ptr Word8  -- Pointer to the data to send-        -> Int        -- Length of the buffer-        -> IO Int     -- Number of Bytes sent-sendBuf sock@(MkSocket s _family _stype _protocol _status) str len = do-   liftM fromIntegral $-#if defined(mingw32_HOST_OS)--- 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--- bug is supported.-    throwSocketErrorIfMinus1Retry "Network.Socket.sendBuf" $ writeRawBufferPtr-      "Network.Socket.sendBuf"-      (socket2FD sock)-      (castPtr str)-      0-      (fromIntegral len)-#else-     throwSocketErrorWaitWrite sock "Network.Socket.sendBuf" $-        c_send s str (fromIntegral len) 0{-flags-}-#endif----- | Receive data from the socket.  The socket must be in a connected--- state. This function may return fewer bytes than specified.  If the--- message is longer than the specified length, it may be discarded--- depending on the type of socket.  This function may block until a--- message arrives.------ Considering hardware and network realities, the maximum number of--- bytes to receive should be a small power of 2, e.g., 4096.------ For TCP sockets, a zero length return value means the peer has--- closed its half side of the connection.------ Receiving data from closed socket may lead to undefined behaviour.-{-# DEPRECATED recv "Use recv defined in \"Network.Socket.ByteString\"" #-}-recv :: Socket -> Int -> IO String-recv sock l = fst <$> recvLen sock l--{-# DEPRECATED recvLen "Use recv defined in \"Network.Socket.ByteString\" with \"Data.Bytestring.length\"" #-}-recvLen :: Socket -> Int -> IO (String, Int)-recvLen sock nbytes =-     allocaBytes nbytes $ \ptr -> do-        len <- recvBuf sock ptr nbytes-        s <- peekCStringLen (castPtr ptr,len)-        return (s, len)---- | Receive data from the socket.  The socket must be in a connected--- state. This function may return fewer bytes than specified.  If the--- message is longer than the specified length, it may be discarded--- depending on the type of socket.  This function may block until a--- message arrives.------ Considering hardware and network realities, the maximum number of--- bytes to receive should be a small power of 2, e.g., 4096.------ For TCP sockets, a zero length return value means the peer has--- closed its half side of the connection.------ Receiving data from closed socket may lead to undefined behaviour.-recvBuf :: Socket -> Ptr Word8 -> Int -> IO Int-recvBuf sock@(MkSocket s _family _stype _protocol _status) ptr nbytes- | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvBuf")- | otherwise   = do-        len <--#if defined(mingw32_HOST_OS)--- see comment in sendBuf above.-            throwSocketErrorIfMinus1Retry "Network.Socket.recvBuf" $-                readRawBufferPtr "Network.Socket.recvBuf"-                (socket2FD sock) ptr 0 (fromIntegral nbytes)-#else-               throwSocketErrorWaitRead sock "Network.Socket.recvBuf" $-                   c_recv s (castPtr ptr) (fromIntegral nbytes) 0{-flags-}-#endif-        let len' = fromIntegral len-        if len' == 0-         then ioError (mkEOFError "Network.Socket.recvBuf")-         else return len'----- ------------------------------------------------------------------------------ socketPort------ The port number the given socket is currently connected to can be--- determined by calling $port$, is generally only useful when bind--- was given $aNY\_PORT$.---- | Getting the port of socket.---   `IOError` is thrown if a port is not available.-socketPort :: Socket            -- Connected & Bound Socket-           -> IO PortNumber     -- Port Number of Socket-socketPort sock@(MkSocket _ AF_INET _ _ _) = do-    (SockAddrInet port _) <- getSocketName sock-    return port-#if defined(IPV6_SOCKET_SUPPORT)-socketPort sock@(MkSocket _ AF_INET6 _ _ _) = do-    (SockAddrInet6 port _ _ _) <- getSocketName sock-    return port-#endif-socketPort (MkSocket _ family _ _ _) =-    ioError $ userError $-      "Network.Socket.socketPort: address family '" ++ show family ++-      "' not supported."----- ------------------------------------------------------------------------------ socketPortSafe--- | Getting the port of socket.-socketPortSafe :: Socket                -- Connected & Bound Socket-               -> IO (Maybe PortNumber) -- Port Number of Socket-socketPortSafe s = do-    sa <- getSocketName s-    return $ case sa of-      SockAddrInet port _      -> Just port-#if defined(IPV6_SOCKET_SUPPORT)-      SockAddrInet6 port _ _ _ -> Just port-#endif-      _                        -> Nothing---- ------------------------------------------------------------------------------ getPeerName---- Calling $getPeerName$ returns the address details of the machine,--- other than the local one, which is connected to the socket. This is--- used in programs such as FTP to determine where to send the--- returning data.  The corresponding call to get the details of the--- local machine is $getSocketName$.--getPeerName   :: Socket -> IO SockAddr-getPeerName (MkSocket s family _ _ _) = do- withNewSockAddr family $ \ptr sz -> do-   with (fromIntegral sz) $ \int_star -> do-   throwSocketErrorIfMinus1Retry_ "Network.Socket.getPeerName" $-     c_getpeername s ptr int_star-   _sz <- peek int_star-   peekSockAddr ptr--getSocketName :: Socket -> IO SockAddr-getSocketName (MkSocket s family _ _ _) = do- withNewSockAddr family $ \ptr sz -> do-   with (fromIntegral sz) $ \int_star -> do-   throwSocketErrorIfMinus1Retry_ "Network.Socket.getSocketName" $-     c_getsockname s ptr int_star-   peekSockAddr ptr---------------------------------------------------------------------------------- Socket Properties---- | Socket options for use with 'setSocketOption' and 'getSocketOption'.------ The existence of a constructor does not imply that the relevant option--- is supported on your system: see 'isSupportedSocketOption'-data SocketOption-    = Debug         -- ^ SO_DEBUG-    | ReuseAddr     -- ^ SO_REUSEADDR-    | Type          -- ^ SO_TYPE-    | SoError       -- ^ SO_ERROR-    | DontRoute     -- ^ SO_DONTROUTE-    | Broadcast     -- ^ SO_BROADCAST-    | SendBuffer    -- ^ SO_SNDBUF-    | RecvBuffer    -- ^ SO_RCVBUF-    | KeepAlive     -- ^ SO_KEEPALIVE-    | OOBInline     -- ^ SO_OOBINLINE-    | TimeToLive    -- ^ IP_TTL-    | MaxSegment    -- ^ TCP_MAXSEG-    | NoDelay       -- ^ TCP_NODELAY-    | Cork          -- ^ TCP_CORK-    | Linger        -- ^ SO_LINGER-    | ReusePort     -- ^ SO_REUSEPORT-    | RecvLowWater  -- ^ SO_RCVLOWAT-    | SendLowWater  -- ^ SO_SNDLOWAT-    | RecvTimeOut   -- ^ SO_RCVTIMEO-    | SendTimeOut   -- ^ SO_SNDTIMEO-    | UseLoopBack   -- ^ SO_USELOOPBACK-    | UserTimeout   -- ^ TCP_USER_TIMEOUT-    | IPv6Only      -- ^ IPV6_V6ONLY-    | CustomSockOpt (CInt, CInt)-    deriving (Show, Typeable)---- | Does the 'SocketOption' exist on this system?-isSupportedSocketOption :: SocketOption -> Bool-isSupportedSocketOption = isJust . packSocketOption---- | For a socket option, return Just (level, value) where level is the--- corresponding C option level constant (e.g. SOL_SOCKET) and value is--- the option constant itself (e.g. SO_DEBUG)--- If either constant does not exist, return Nothing.-packSocketOption :: SocketOption -> Maybe (CInt, CInt)-packSocketOption so =-  -- The Just here is a hack to disable GHC's overlapping pattern detection:-  -- the problem is if all constants are present, the fallback pattern is-  -- redundant, but if they aren't then it isn't. Hence we introduce an-  -- extra pattern (Nothing) that can't possibly happen, so that the-  -- fallback is always (in principle) necessary.-  -- I feel a little bad for including this, but such are the sacrifices we-  -- make while working with CPP - excluding the fallback pattern correctly-  -- would be a serious nuisance.-  -- (NB: comments elsewhere in this file refer to this one)-  case Just so of-#ifdef SOL_SOCKET-#ifdef SO_DEBUG-    Just Debug         -> Just ((#const SOL_SOCKET), (#const SO_DEBUG))-#endif-#ifdef SO_REUSEADDR-    Just ReuseAddr     -> Just ((#const SOL_SOCKET), (#const SO_REUSEADDR))-#endif-#ifdef SO_TYPE-    Just Type          -> Just ((#const SOL_SOCKET), (#const SO_TYPE))-#endif-#ifdef SO_ERROR-    Just SoError       -> Just ((#const SOL_SOCKET), (#const SO_ERROR))-#endif-#ifdef SO_DONTROUTE-    Just DontRoute     -> Just ((#const SOL_SOCKET), (#const SO_DONTROUTE))-#endif-#ifdef SO_BROADCAST-    Just Broadcast     -> Just ((#const SOL_SOCKET), (#const SO_BROADCAST))-#endif-#ifdef SO_SNDBUF-    Just SendBuffer    -> Just ((#const SOL_SOCKET), (#const SO_SNDBUF))-#endif-#ifdef SO_RCVBUF-    Just RecvBuffer    -> Just ((#const SOL_SOCKET), (#const SO_RCVBUF))-#endif-#ifdef SO_KEEPALIVE-    Just KeepAlive     -> Just ((#const SOL_SOCKET), (#const SO_KEEPALIVE))-#endif-#ifdef SO_OOBINLINE-    Just OOBInline     -> Just ((#const SOL_SOCKET), (#const SO_OOBINLINE))-#endif-#ifdef SO_LINGER-    Just Linger        -> Just ((#const SOL_SOCKET), (#const SO_LINGER))-#endif-#ifdef SO_REUSEPORT-    Just ReusePort     -> Just ((#const SOL_SOCKET), (#const SO_REUSEPORT))-#endif-#ifdef SO_RCVLOWAT-    Just RecvLowWater  -> Just ((#const SOL_SOCKET), (#const SO_RCVLOWAT))-#endif-#ifdef SO_SNDLOWAT-    Just SendLowWater  -> Just ((#const SOL_SOCKET), (#const SO_SNDLOWAT))-#endif-#ifdef SO_RCVTIMEO-    Just RecvTimeOut   -> Just ((#const SOL_SOCKET), (#const SO_RCVTIMEO))-#endif-#ifdef SO_SNDTIMEO-    Just SendTimeOut   -> Just ((#const SOL_SOCKET), (#const SO_SNDTIMEO))-#endif-#ifdef SO_USELOOPBACK-    Just UseLoopBack   -> Just ((#const SOL_SOCKET), (#const SO_USELOOPBACK))-#endif-#endif // SOL_SOCKET-#if HAVE_DECL_IPPROTO_IP-#ifdef IP_TTL-    Just TimeToLive    -> Just ((#const IPPROTO_IP), (#const IP_TTL))-#endif-#endif // HAVE_DECL_IPPROTO_IP-#if HAVE_DECL_IPPROTO_TCP-#ifdef TCP_MAXSEG-    Just MaxSegment    -> Just ((#const IPPROTO_TCP), (#const TCP_MAXSEG))-#endif-#ifdef TCP_NODELAY-    Just NoDelay       -> Just ((#const IPPROTO_TCP), (#const TCP_NODELAY))-#endif-#ifdef TCP_USER_TIMEOUT-    Just UserTimeout   -> Just ((#const IPPROTO_TCP), (#const TCP_USER_TIMEOUT))-#endif-#ifdef TCP_CORK-    Just Cork          -> Just ((#const IPPROTO_TCP), (#const TCP_CORK))-#endif-#endif // HAVE_DECL_IPPROTO_TCP-#if HAVE_DECL_IPPROTO_IPV6-#if HAVE_DECL_IPV6_V6ONLY-    Just IPv6Only      -> Just ((#const IPPROTO_IPV6), (#const IPV6_V6ONLY))-#endif-#endif // HAVE_DECL_IPPROTO_IPV6-    Just (CustomSockOpt opt) -> Just opt-    _             -> Nothing---- | Return the option level and option value if they exist,--- otherwise throw an error that begins "Network.Socket." ++ the String--- parameter-packSocketOption' :: String -> SocketOption -> IO (CInt, CInt)-packSocketOption' caller so = maybe err return (packSocketOption so)- where-  err = ioError . userError . concat $ ["Network.Socket.", caller,-    ": socket option ", show so, " unsupported on this system"]---- | Set a socket option that expects an Int value.--- There is currently no API to set e.g. the timeval socket options-setSocketOption :: Socket-                -> SocketOption -- Option Name-                -> Int          -- Option Value-                -> IO ()-setSocketOption (MkSocket s _ _ _ _) so v = do-   (level, opt) <- packSocketOption' "setSocketOption" so-   with (fromIntegral v) $ \ptr_v -> do-   throwSocketErrorIfMinus1_ "Network.Socket.setSocketOption" $-       c_setsockopt s level opt ptr_v-          (fromIntegral (sizeOf (undefined :: CInt)))-   return ()----- | Get a socket option that gives an Int value.--- There is currently no API to get e.g. the timeval socket options-getSocketOption :: Socket-                -> SocketOption  -- Option Name-                -> IO Int        -- Option Value-getSocketOption (MkSocket s _ _ _ _) so = do-   (level, opt) <- packSocketOption' "getSocketOption" so-   alloca $ \ptr_v ->-     with (fromIntegral (sizeOf (undefined :: CInt))) $ \ptr_sz -> do-       throwSocketErrorIfMinus1Retry_ "Network.Socket.getSocketOption" $-         c_getsockopt s level opt ptr_v ptr_sz-       fromIntegral `liftM` peek ptr_v----- | Getting process ID, user ID and group ID for UNIX-domain sockets.------   This is implemented with SO_PEERCRED on Linux and getpeereid()---   on BSD variants. Unfortunately, on some BSD variants---   getpeereid() returns unexpected results, rather than an error,---   for AF_INET sockets. It is the user's responsibility to make sure---   that the socket is a UNIX-domain socket.---   Also, on some BSD variants, getpeereid() does not return credentials---   for sockets created via 'socketPair', only separately created and then---   explicitly connected UNIX-domain sockets work on such systems.------   Since 2.7.0.0.-getPeerCredential :: Socket -> IO (Maybe CUInt, Maybe CUInt, Maybe CUInt)-#ifdef HAVE_STRUCT_UCRED-getPeerCredential sock = do-    (pid, uid, gid) <- getPeerCred sock-    if uid == maxBound then-        return (Nothing, Nothing, Nothing)-      else-        return (Just pid, Just uid, Just gid)-#elif defined(HAVE_GETPEEREID)-getPeerCredential sock = E.handle (\(E.SomeException _) -> return (Nothing,Nothing,Nothing)) $ do-    (uid, gid) <- getPeerEid sock-    return (Nothing, Just uid, Just gid)-#else-getPeerCredential _ = return (Nothing, Nothing, Nothing)-#endif--#if defined(HAVE_STRUCT_UCRED) || defined(HAVE_GETPEEREID)-{-# DEPRECATED getPeerCred "Use getPeerCredential instead" #-}--- | Returns the processID, userID and groupID of the socket's peer.------ Only available on platforms that support SO_PEERCRED or GETPEEREID(3)--- on domain sockets.--- GETPEEREID(3) returns userID and groupID. processID is always 0.-getPeerCred :: Socket -> IO (CUInt, CUInt, CUInt)-getPeerCred sock = do-#ifdef HAVE_STRUCT_UCRED-  let fd = fdSocket sock-  let sz = (#const sizeof(struct ucred))-  allocaBytes sz $ \ ptr_cr ->-   with (fromIntegral sz) $ \ ptr_sz -> do-     _ <- ($) throwSocketErrorIfMinus1Retry "Network.Socket.getPeerCred" $-       c_getsockopt fd (#const SOL_SOCKET) (#const SO_PEERCRED) ptr_cr ptr_sz-     pid <- (#peek struct ucred, pid) ptr_cr-     uid <- (#peek struct ucred, uid) ptr_cr-     gid <- (#peek struct ucred, gid) ptr_cr-     return (pid, uid, gid)-#else-  (uid,gid) <- getPeerEid sock-  return (0,uid,gid)-#endif--#ifdef HAVE_GETPEEREID-{-# DEPRECATED getPeerEid "Use getPeerCredential instead" #-}--- | The getpeereid() function returns the effective user and group IDs of the--- peer connected to a UNIX-domain socket-getPeerEid :: Socket -> IO (CUInt, CUInt)-getPeerEid sock = do-  let fd = fdSocket sock-  alloca $ \ ptr_uid ->-    alloca $ \ ptr_gid -> do-      throwSocketErrorIfMinus1Retry_ "Network.Socket.getPeerEid" $-        c_getpeereid fd ptr_uid ptr_gid-      uid <- peek ptr_uid-      gid <- peek ptr_gid-      return (uid, gid)-#endif-#endif---- | Whether or not UNIX-domain sockets are available.------   Since 3.0.0.0.-isUnixDomainSocketAvailable :: Bool-#if defined(DOMAIN_SOCKET_SUPPORT)-isUnixDomainSocketAvailable = True-#else-isUnixDomainSocketAvailable = False-#endif--##if !(MIN_VERSION_base(4,3,1))-closeFdWith closer fd = closer fd-##endif---- sending/receiving ancillary socket data; low-level mechanism--- for transmitting file descriptors, mainly.-sendFd :: Socket -> CInt -> IO ()-#if defined(DOMAIN_SOCKET_SUPPORT)-sendFd sock outfd = do-  _ <- throwSocketErrorWaitWrite sock "Network.Socket.sendFd" $ c_sendFd (fdSocket sock) outfd-  return ()-foreign import ccall SAFE_ON_WIN "sendFd" c_sendFd :: CInt -> CInt -> IO CInt-#else-sendFd _ _ = error "Network.Socket.sendFd"-#endif---- | Receive a file descriptor over a domain socket. Note that the resulting--- file descriptor may have to be put into non-blocking mode in order to be--- used safely. See 'setNonBlockIfNeeded'.-recvFd :: Socket -> IO CInt-#if defined(DOMAIN_SOCKET_SUPPORT)-recvFd sock = do-  theFd <- throwSocketErrorWaitRead sock "Network.Socket.recvFd" $-               c_recvFd (fdSocket sock)-  return theFd-foreign import ccall SAFE_ON_WIN "recvFd" c_recvFd :: CInt -> IO CInt-#else-recvFd _ = error "Network.Socket.recvFd"-#endif---- ------------------------------------------------------------------------------ Utility Functions--{-# DEPRECATED aNY_PORT "Use defaultPort instead" #-}-aNY_PORT :: PortNumber-aNY_PORT = 0--defaultPort :: PortNumber-defaultPort = 0---- | The IPv4 wild card address.--{-# DEPRECATED iNADDR_ANY "Use getAddrInfo instead" #-}-iNADDR_ANY :: HostAddress-iNADDR_ANY = htonl (#const INADDR_ANY)---- | Converts the from host byte order to network byte order.-foreign import CALLCONV unsafe "htonl" htonl :: Word32 -> Word32--- | Converts the from network byte order to host byte order.-foreign import CALLCONV unsafe "ntohl" ntohl :: Word32 -> Word32--{-# DEPRECATED htonl "Use getAddrInfo instead" #-}-{-# DEPRECATED ntohl "Use getAddrInfo instead" #-}--#if defined(IPV6_SOCKET_SUPPORT)--- | The IPv6 wild card address.--{-# DEPRECATED iN6ADDR_ANY "Use getAddrInfo instead" #-}-iN6ADDR_ANY :: HostAddress6-iN6ADDR_ANY = (0, 0, 0, 0)-#endif--{-# DEPRECATED sOMAXCONN "Use maxListenQueue instead" #-}-sOMAXCONN :: Int-sOMAXCONN = #const SOMAXCONN--{-# DEPRECATED sOL_SOCKET "This is not necessary anymore" #-}-sOL_SOCKET :: Int-sOL_SOCKET = #const SOL_SOCKET--#ifdef SCM_RIGHTS-{-# DEPRECATED sCM_RIGHTS "This is not necessary anymore" #-}-sCM_RIGHTS :: Int-sCM_RIGHTS = #const SCM_RIGHTS-#endif---- | This is the value of SOMAXCONN, typically 128.--- 128 is good enough for normal network servers but--- is too small for high performance servers.-maxListenQueue :: Int-maxListenQueue = sOMAXCONN---- -------------------------------------------------------------------------------data ShutdownCmd- = ShutdownReceive- | ShutdownSend- | ShutdownBoth- deriving Typeable--sdownCmdToInt :: ShutdownCmd -> CInt-sdownCmdToInt ShutdownReceive = 0-sdownCmdToInt ShutdownSend    = 1-sdownCmdToInt ShutdownBoth    = 2---- | Shut down one or both halves of the connection, depending on the--- second argument to the function.  If the second argument is--- 'ShutdownReceive', further receives are disallowed.  If it is--- 'ShutdownSend', further sends are disallowed.  If it is--- 'ShutdownBoth', further sends and receives are disallowed.-shutdown :: Socket -> ShutdownCmd -> IO ()-shutdown (MkSocket s _ _ _ _) stype = do-  throwSocketErrorIfMinus1Retry_ "Network.Socket.shutdown" $-    c_shutdown s (sdownCmdToInt stype)-  return ()---- --------------------------------------------------------------------------------- | Close the socket. This function does not throw exceptions even if---   the underlying system call returns errors.------   Sending data to or receiving data from closed socket---   may lead to undefined behaviour.------   If multiple threads use the same socket and one uses 'fdSocket' and---   the other use 'close', unexpected behavior may happen.---   For more information, please refer to the documentation of 'fdSocket'.-close :: Socket -> IO ()-close (MkSocket s _ _ _ socketStatus) = modifyMVar_ socketStatus $ \ status ->-   case status of-     ConvertedToHandle -> return ConvertedToHandle-     Closed            -> return Closed-     _                 -> do-         -- closeFdWith avoids the deadlock of IO manager.-         closeFdWith (void . c_close . fromIntegral) (fromIntegral s)-         return Closed---- | Close the socket. This function throws exceptions if---   the underlying system call returns errors.------   Sending data to or receiving data from closed socket---   may lead to undefined behaviour.-close' :: Socket -> IO ()-close' (MkSocket s _ _ _ socketStatus) = modifyMVar_ socketStatus $ \ status ->-   case status of-     ConvertedToHandle -> ioError (userError ("close: converted to a Handle, use hClose instead"))-     Closed            -> return Closed-     _                 -> do-         -- closeFdWith avoids the deadlock of IO manager.-         -- closeFd throws exceptions.-         closeFdWith (closeFd . fromIntegral) (fromIntegral s)-         return Closed---- --------------------------------------------------------------------------------- | Determines whether 'close' has been used on the 'Socket'. This--- does /not/ indicate any status about the socket beyond this. If the--- socket has been closed remotely, this function can still return--- 'True'.-isConnected :: Socket -> IO Bool-isConnected (MkSocket _ _ _ _ status) = do-    value <- readMVar status-    return (value == Connected)-{-# DEPRECATED isConnected "SocketStatus will be removed" #-}---- -------------------------------------------------------------------------------- Socket Predicates--isBound :: Socket -> IO Bool-isBound (MkSocket _ _ _ _ status) = do-    value <- readMVar status-    return (value == Bound)-{-# DEPRECATED isBound "SocketStatus will be removed" #-}--isListening :: Socket -> IO Bool-isListening (MkSocket _ _ _  _ status) = do-    value <- readMVar status-    return (value == Listening)-{-# DEPRECATED isListening "SocketStatus will be removed" #-}--isReadable  :: Socket -> IO Bool-isReadable (MkSocket _ _ _ _ status) = do-    value <- readMVar status-    return (value == Listening || value == Connected)-{-# DEPRECATED isReadable "SocketStatus will be removed" #-}--isWritable  :: Socket -> IO Bool-isWritable = isReadable -- sort of.-{-# DEPRECATED isWritable "SocketStatus will be removed" #-}--isAcceptable :: Family -> SocketType -> SocketStatus -> Bool-#if defined(DOMAIN_SOCKET_SUPPORT)-isAcceptable AF_UNIX sockTyp status-    | sockTyp == Stream || sockTyp == SeqPacket =-        status == Connected || status == Bound || status == Listening-isAcceptable AF_UNIX _ _ = False-#endif-isAcceptable _ _ status = status == Connected || status == Listening-{-# DEPRECATED isAcceptable "SocketStatus will be removed" #-}---- -------------------------------------------------------------------------------- Internet address manipulation routines:--{-# DEPRECATED inet_addr "Use \"getAddrInfo\" instead" #-}-inet_addr :: String -> IO HostAddress-inet_addr ipstr = withSocketsDo $ do-   withCString ipstr $ \str -> do-   had <- c_inet_addr str-   if had == maxBound-    then ioError $ userError $-      "Network.Socket.inet_addr: Malformed address: " ++ ipstr-    else return had  -- network byte order--{-# DEPRECATED inet_ntoa "Use \"getNameInfo\" instead" #-}-inet_ntoa :: HostAddress -> IO String-inet_ntoa haddr = withSocketsDo $ do-  pstr <- c_inet_ntoa haddr-  peekCString pstr---- | Turns a Socket into an 'Handle'. By default, the new handle is--- unbuffered. Use 'System.IO.hSetBuffering' to change the buffering.------ Note that since a 'Handle' is automatically closed by a finalizer--- when it is no longer referenced, you should avoid doing any more--- operations on the 'Socket' after calling 'socketToHandle'.  To--- close the 'Socket' after 'socketToHandle', call 'System.IO.hClose'--- on the 'Handle'.--socketToHandle :: Socket -> IOMode -> IO Handle-socketToHandle s@(MkSocket fd _ _ _ socketStatus) mode = do- modifyMVar socketStatus $ \ status ->-    if status == ConvertedToHandle-        then ioError (userError ("socketToHandle: already a Handle"))-        else do-    h <- fdToHandle' (fromIntegral fd) (Just GHC.IO.Device.Stream) True (show s) mode True{-bin-}-    hSetBuffering h NoBuffering-    return (ConvertedToHandle, h)---- | Pack a list of values into a bitmask.  The possible mappings from--- value to bit-to-set are given as the first argument.  We assume--- that each value can cause exactly one bit to be set; unpackBits will--- break if this property is not true.--packBits :: (Eq a, Num b, Bits b) => [(a, b)] -> [a] -> b--packBits mapping xs = foldl' pack 0 mapping-    where pack acc (k, v) | k `elem` xs = acc .|. v-                          | otherwise   = acc---- | Unpack a bitmask into a list of values.--unpackBits :: (Num b, Bits b) => [(a, b)] -> b -> [a]---- Be permissive and ignore unknown bit values. At least on OS X,--- getaddrinfo returns an ai_flags field with bits set that have no--- entry in <netdb.h>.-unpackBits [] _    = []-unpackBits ((k,v):xs) r-    | r .&. v /= 0 = k : unpackBits xs (r .&. complement v)-    | otherwise    = unpackBits xs r---------------------------------------------------------------------------------- Address and service lookups--#if defined(IPV6_SOCKET_SUPPORT)---- | Flags that control the querying behaviour of 'getAddrInfo'.---   For more information, see <https://tools.ietf.org/html/rfc3493#page-25>-data AddrInfoFlag =-    -- | The list of returned 'AddrInfo' values will-    --   only contain IPv4 addresses if the local system has at least-    --   one IPv4 interface configured, and likewise for IPv6.-    --   (Only some platforms support this.)-      AI_ADDRCONFIG-    -- | If 'AI_ALL' is specified, return all matching IPv6 and-    --   IPv4 addresses.  Otherwise, this flag has no effect.-    --   (Only some platforms support this.)-    | AI_ALL-    -- | The 'addrCanonName' field of the first returned-    --   'AddrInfo' will contain the "canonical name" of the host.-    | AI_CANONNAME-    -- | The 'HostName' argument /must/ be a numeric-    --   address in string form, and network name lookups will not be-    --   attempted.-    | AI_NUMERICHOST-    -- | The 'ServiceName' argument /must/ be a port-    --   number in string form, and service name lookups will not be-    --   attempted. (Only some platforms support this.)-    | AI_NUMERICSERV-    -- | If no 'HostName' value is provided, the network-    --   address in each 'SockAddr'-    --   will be left as a "wild card".-    --   This is useful for server applications that-    --   will accept connections from any client.-    | AI_PASSIVE-    -- | If an IPv6 lookup is performed, and no IPv6-    --   addresses are found, IPv6-mapped IPv4 addresses will be-    --   returned. (Only some platforms support this.)-    | AI_V4MAPPED-    deriving (Eq, Read, Show, Typeable)--aiFlagMapping :: [(AddrInfoFlag, CInt)]--aiFlagMapping =-    [-#if HAVE_DECL_AI_ADDRCONFIG-     (AI_ADDRCONFIG, #const AI_ADDRCONFIG),-#else-     (AI_ADDRCONFIG, 0),-#endif-#if HAVE_DECL_AI_ALL-     (AI_ALL, #const AI_ALL),-#else-     (AI_ALL, 0),-#endif-     (AI_CANONNAME, #const AI_CANONNAME),-     (AI_NUMERICHOST, #const AI_NUMERICHOST),-#if HAVE_DECL_AI_NUMERICSERV-     (AI_NUMERICSERV, #const AI_NUMERICSERV),-#else-     (AI_NUMERICSERV, 0),-#endif-     (AI_PASSIVE, #const AI_PASSIVE),-#if HAVE_DECL_AI_V4MAPPED-     (AI_V4MAPPED, #const AI_V4MAPPED)-#else-     (AI_V4MAPPED, 0)-#endif-    ]---- | Indicate whether the given 'AddrInfoFlag' will have any effect on--- this system.-addrInfoFlagImplemented :: AddrInfoFlag -> Bool-addrInfoFlagImplemented f = packBits aiFlagMapping [f] /= 0--data AddrInfo =-    AddrInfo {-        addrFlags :: [AddrInfoFlag],-        addrFamily :: Family,-        addrSocketType :: SocketType,-        addrProtocol :: ProtocolNumber,-        addrAddress :: SockAddr,-        addrCanonName :: Maybe String-        }-    deriving (Eq, Show, Typeable)--instance Storable AddrInfo where-    sizeOf    _ = #const sizeof(struct addrinfo)-    alignment _ = alignment (undefined :: CInt)--    peek p = do-        ai_flags <- (#peek struct addrinfo, ai_flags) p-        ai_family <- (#peek struct addrinfo, ai_family) p-        ai_socktype <- (#peek struct addrinfo, ai_socktype) p-        ai_protocol <- (#peek struct addrinfo, ai_protocol) p-        ai_addr <- (#peek struct addrinfo, ai_addr) p >>= peekSockAddr-        ai_canonname_ptr <- (#peek struct addrinfo, ai_canonname) p--        ai_canonname <- if ai_canonname_ptr == nullPtr-                        then return Nothing-                        else liftM Just $ peekCString ai_canonname_ptr--        socktype <- unpackSocketType' "AddrInfo.peek" ai_socktype-        return (AddrInfo-                {-                 addrFlags = unpackBits aiFlagMapping ai_flags,-                 addrFamily = unpackFamily ai_family,-                 addrSocketType = socktype,-                 addrProtocol = ai_protocol,-                 addrAddress = ai_addr,-                 addrCanonName = ai_canonname-                })--    poke p (AddrInfo flags family socketType protocol _ _) = do-        c_stype <- packSocketTypeOrThrow "AddrInfo.poke" socketType--        (#poke struct addrinfo, ai_flags) p (packBits aiFlagMapping flags)-        (#poke struct addrinfo, ai_family) p (packFamily family)-        (#poke struct addrinfo, ai_socktype) p c_stype-        (#poke struct addrinfo, ai_protocol) p protocol--        -- stuff below is probably not needed, but let's zero it for safety--        (#poke struct addrinfo, ai_addrlen) p (0::CSize)-        (#poke struct addrinfo, ai_addr) p nullPtr-        (#poke struct addrinfo, ai_canonname) p nullPtr-        (#poke struct addrinfo, ai_next) p nullPtr---- | Flags that control the querying behaviour of 'getNameInfo'.---   For more information, see <https://tools.ietf.org/html/rfc3493#page-30>-data NameInfoFlag =-    -- | Resolve a datagram-based service name.  This is-    --   required only for the few protocols that have different port-    --   numbers for their datagram-based versions than for their-    --   stream-based versions.-      NI_DGRAM-    -- | If the hostname cannot be looked up, an IO error is thrown.-    | NI_NAMEREQD-    -- | If a host is local, return only the hostname part of the FQDN.-    | NI_NOFQDN-    -- | The name of the host is not looked up.-    --   Instead, a numeric representation of the host's-    --   address is returned.  For an IPv4 address, this will be a-    --   dotted-quad string.  For IPv6, it will be colon-separated-    --   hexadecimal.-    | NI_NUMERICHOST-    -- | The name of the service is not-    --   looked up.  Instead, a numeric representation of the-    --   service is returned.-    | NI_NUMERICSERV-    deriving (Eq, Read, Show, Typeable)--niFlagMapping :: [(NameInfoFlag, CInt)]--niFlagMapping = [(NI_DGRAM, #const NI_DGRAM),-                 (NI_NAMEREQD, #const NI_NAMEREQD),-                 (NI_NOFQDN, #const NI_NOFQDN),-                 (NI_NUMERICHOST, #const NI_NUMERICHOST),-                 (NI_NUMERICSERV, #const NI_NUMERICSERV)]---- | Default hints for address lookup with 'getAddrInfo'.  The values--- of the 'addrAddress' and 'addrCanonName' fields are 'undefined',--- and are never inspected by 'getAddrInfo'.------ >>> addrFlags defaultHints--- []--- >>> addrFamily defaultHints--- AF_UNSPEC--- >>> addrSocketType defaultHints--- NoSocketType--- >>> addrProtocol defaultHints--- 0--defaultHints :: AddrInfo-defaultHints = AddrInfo {-                         addrFlags = [],-                         addrFamily = AF_UNSPEC,-                         addrSocketType = NoSocketType,-                         addrProtocol = defaultProtocol,-                         addrAddress = undefined,-                         addrCanonName = undefined-                        }---- | Shows the fields of 'defaultHints', without inspecting the by-default undefined fields 'addrAddress' and 'addrCanonName'.-showDefaultHints :: AddrInfo -> String-showDefaultHints AddrInfo{..} = concat-    [ "AddrInfo {"-    , "addrFlags = "-    , show addrFlags-    , ", addrFamily = "-    , show addrFamily-    , ", addrSocketType = "-    , show addrSocketType-    , ", addrProtocol = "-    , show addrProtocol-    , ", addrAddress = "-    , "<assumed to be undefined>"-    , ", addrCanonName = "-    , "<assumed to be undefined>"-    , "}"-    ]---- | 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--getAddrInfo :: 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 = withSocketsDo $-  maybeWith withCString node $ \c_node ->-    maybeWith withCString service $ \c_service ->-      maybeWith with filteredHints $ \c_hints ->-        alloca $ \ptr_ptr_addrs -> do-          ret <- c_getaddrinfo c_node c_service c_hints ptr_ptr_addrs-          case ret of-            0 -> do ptr_addrs <- peek ptr_ptr_addrs-                    ais <- followAddrInfo ptr_addrs-                    c_freeaddrinfo ptr_addrs-                    return ais-            _ -> do err <- gai_strerror ret-                    let message = concat-                            [ "Network.Socket.getAddrInfo (called with preferred socket type/protocol: "-                            , maybe (show hints) showDefaultHints hints-                            , ", host name: "-                            , show node-                            , ", service name: "-                            , show service-                            , ")"-                            ]-                    ioError (ioeSetErrorString-                             (mkIOError NoSuchThing message Nothing-                              Nothing) err)-    -- Leaving out the service and using AI_NUMERICSERV causes a-    -- segfault on OS X 10.8.2. This code removes AI_NUMERICSERV-    -- (which has no effect) in that case.-  where-#if defined(darwin_HOST_OS)-    filteredHints = case service of-        Nothing -> fmap (\ h -> h { addrFlags = delete AI_NUMERICSERV (addrFlags h) }) hints-        _       -> hints-#else-    filteredHints = hints-#endif--followAddrInfo :: Ptr AddrInfo -> IO [AddrInfo]--followAddrInfo ptr_ai | ptr_ai == nullPtr = return []-                      | otherwise = do-    a <- peek ptr_ai-    as <- (#peek struct addrinfo, ai_next) ptr_ai >>= followAddrInfo-    return (a:as)--foreign import ccall safe "hsnet_getaddrinfo"-    c_getaddrinfo :: CString -> CString -> Ptr AddrInfo -> Ptr (Ptr AddrInfo)-                  -> IO CInt--foreign import ccall safe "hsnet_freeaddrinfo"-    c_freeaddrinfo :: Ptr AddrInfo -> IO ()--gai_strerror :: CInt -> IO String--#ifdef HAVE_GAI_STRERROR-gai_strerror n = c_gai_strerror n >>= peekCString--foreign import ccall safe "gai_strerror"-    c_gai_strerror :: CInt -> IO CString-#else-gai_strerror n = ioError $ userError $ "Network.Socket.gai_strerror not supported: " ++ show n-#endif--withCStringIf :: Bool -> Int -> (CSize -> CString -> IO a) -> IO a-withCStringIf False _ f = f 0 nullPtr-withCStringIf True n f = allocaBytes n (f (fromIntegral n))---- | Resolve an address to a host or service name.--- This function is protocol independent.--- The list of 'NameInfoFlag' values controls query behaviour.------ If a host or service's name cannot be looked up, then the numeric--- form of the address or service will be returned.------ If the query fails, this function throws an IO exception.------ Example:--- @---   (hostName, _) <- getNameInfo [] True False myAddress--- @--getNameInfo :: [NameInfoFlag] -- ^ flags to control lookup behaviour-            -> Bool -- ^ whether to look up a hostname-            -> Bool -- ^ whether to look up a service name-            -> SockAddr -- ^ the address to look up-            -> IO (Maybe HostName, Maybe ServiceName)--getNameInfo flags doHost doService addr = withSocketsDo $-  withCStringIf doHost (#const NI_MAXHOST) $ \c_hostlen c_host ->-    withCStringIf doService (#const NI_MAXSERV) $ \c_servlen c_serv -> do-      withSockAddr addr $ \ptr_addr sz -> do-        ret <- c_getnameinfo ptr_addr (fromIntegral sz) c_host c_hostlen-                             c_serv c_servlen (packBits niFlagMapping flags)-        case ret of-          0 -> do-            let peekIf doIf c_val = if doIf-                                     then liftM Just $ peekCString c_val-                                     else return Nothing-            host <- peekIf doHost c_host-            serv <- peekIf doService c_serv-            return (host, serv)-          _ -> do err <- gai_strerror ret-                  let message = concat-                        [ "Network.Socket.getNameInfo (called with flags: "-                        , show flags-                        , ", hostname lookup: "-                        , show doHost-                        , ", service name lookup: "-                        , show doService-                        , ", socket address: "-                        , show addr-                        , ")"-                        ]-                  ioError (ioeSetErrorString-                           (mkIOError NoSuchThing message Nothing-                            Nothing) err)--foreign import ccall safe "hsnet_getnameinfo"-    c_getnameinfo :: Ptr SockAddr -> CInt{-CSockLen???-} -> CString -> CSize -> CString-                  -> CSize -> CInt -> IO CInt-#endif--mkInvalidRecvArgError :: String -> IOError-mkInvalidRecvArgError loc = ioeSetErrorString (mkIOError-                                    InvalidArgument-                                    loc Nothing Nothing) "non-positive length"--mkEOFError :: String -> IOError-mkEOFError loc = ioeSetErrorString (mkIOError EOF loc Nothing Nothing) "end of file"---- ------------------------------------------------------------------------------ foreign imports from the C library--foreign import ccall unsafe "hsnet_inet_ntoa"-  c_inet_ntoa :: HostAddress -> IO (Ptr CChar)--foreign import CALLCONV unsafe "inet_addr"-  c_inet_addr :: Ptr CChar -> IO HostAddress--foreign import CALLCONV unsafe "shutdown"-  c_shutdown :: CInt -> CInt -> IO CInt--closeFd :: CInt -> IO ()-closeFd fd = throwSocketErrorIfMinus1_ "Network.Socket.close" $ c_close fd--#if !defined(WITH_WINSOCK)-foreign import ccall unsafe "close"-  c_close :: CInt -> IO CInt-#else-foreign import stdcall unsafe "closesocket"-  c_close :: CInt -> IO CInt-#endif--foreign import CALLCONV unsafe "socket"-  c_socket :: CInt -> CInt -> CInt -> IO CInt-foreign import CALLCONV unsafe "bind"-  c_bind :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt-foreign import CALLCONV SAFE_ON_WIN "connect"-  c_connect :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt-#ifdef HAVE_ACCEPT4-foreign import CALLCONV unsafe "accept4"-  c_accept4 :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> CInt -> IO CInt-#else-foreign import CALLCONV unsafe "accept"-  c_accept :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt-#endif-foreign import CALLCONV unsafe "listen"-  c_listen :: CInt -> CInt -> IO CInt--#if defined(mingw32_HOST_OS)-foreign import CALLCONV safe "accept"-  c_accept_safe :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt--foreign import ccall unsafe "rtsSupportsBoundThreads" threaded :: Bool-#endif--foreign import CALLCONV unsafe "send"-  c_send :: CInt -> Ptr a -> CSize -> CInt -> IO CInt-foreign import CALLCONV SAFE_ON_WIN "sendto"-  c_sendto :: CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> CInt -> IO CInt-foreign import CALLCONV unsafe "recv"-  c_recv :: CInt -> Ptr CChar -> CSize -> CInt -> IO CInt-foreign import CALLCONV SAFE_ON_WIN "recvfrom"-  c_recvfrom :: CInt -> Ptr a -> CSize -> CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt-foreign import CALLCONV unsafe "getpeername"-  c_getpeername :: CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt-foreign import CALLCONV unsafe "getsockname"-  c_getsockname :: CInt -> Ptr SockAddr -> Ptr CInt -> IO CInt--foreign import CALLCONV unsafe "getsockopt"-  c_getsockopt :: CInt -> CInt -> CInt -> Ptr CInt -> Ptr CInt -> IO CInt-foreign import CALLCONV unsafe "setsockopt"-  c_setsockopt :: CInt -> CInt -> CInt -> Ptr CInt -> CInt -> IO CInt--#if defined(HAVE_GETPEEREID)-foreign import CALLCONV unsafe "getpeereid"-  c_getpeereid :: CInt -> Ptr CUInt -> Ptr CUInt -> IO CInt-#endif--- ------------------------------------------------------------------------------ * Deprecated aliases---- $deprecated-aliases------ These aliases are deprecated and should not be used in new code.--- They will be removed in some future version of the package.--{-# DEPRECATED bindSocket "use 'bind'" #-}---- | Deprecated alias for 'bind'.-bindSocket :: Socket    -- Unconnected Socket-           -> SockAddr  -- Address to Bind to-           -> IO ()-bindSocket = bind--{-# DEPRECATED sClose "use 'close'" #-}---- | Deprecated alias for 'close'.-sClose :: Socket -> IO ()-sClose = close--{-# DEPRECATED sIsConnected "SocketStatus will be removed" #-}--sIsConnected :: Socket -> IO Bool-sIsConnected = isConnected--{-# DEPRECATED sIsBound "SocketStatus will be removed" #-}--sIsBound :: Socket -> IO Bool-sIsBound = isBound--{-# DEPRECATED sIsListening "SocketStatus will be removed" #-}--sIsListening :: Socket -> IO Bool-sIsListening = isListening--{-# DEPRECATED sIsReadable "SocketStatus will be removed" #-}--sIsReadable  :: Socket -> IO Bool-sIsReadable = isReadable--{-# DEPRECATED sIsWritable "SocketStatus will be removed" #-}--sIsWritable  :: Socket -> IO Bool-sIsWritable = isWritable--#if defined(HAVE_IF_NAMETOINDEX)--- | Returns the index corresponding to the interface name.------   Since 2.7.0.0.-ifNameToIndex :: String -> IO (Maybe Int)-ifNameToIndex ifname = do-  index <- withCString ifname c_if_nametoindex-  -- On failure zero is returned. We'll return Nothing.-  return $ if index == 0 then Nothing else Just $ fromIntegral index---- | Returns the interface name corresponding to the index.------   Since 2.7.0.0.-ifIndexToName :: Int -> IO (Maybe String)-ifIndexToName ifn = allocaBytes 16 $ \ptr -> do -- 16 == IFNAMSIZ-    r <- c_if_indextoname (fromIntegral ifn) ptr-    if r == nullPtr then-        return Nothing-      else-        Just <$> peekCString ptr--foreign import CALLCONV safe "if_nametoindex"-   c_if_nametoindex :: CString -> IO CUInt--foreign import CALLCONV safe "if_indextoname"-   c_if_indextoname :: CUInt -> CString -> IO CString-#endif
+ Network/Socket/Address.hs view
@@ -0,0 +1,31 @@+-- | This module provides extensible APIs for socket addresses.+module Network.Socket.Address (+    -- * Socket Address+    SocketAddress (..),+    getPeerName,+    getSocketName,++    -- * Socket operations+    connect,+    bind,+    accept,++    -- * Sending and receiving ByteString+    sendTo,+    sendAllTo,+    recvFrom,++    -- * Sending and receiving data from a buffer+    sendBufTo,+    recvBufFrom,++    -- * Advanced IO+    sendBufMsg,+    recvBufMsg,+) where++import Network.Socket.Buffer+import Network.Socket.ByteString.IO+import Network.Socket.Name+import Network.Socket.Syscall+import Network.Socket.Types
+ Network/Socket/Buffer.hsc view
@@ -0,0 +1,324 @@+{-# LANGUAGE CPP #-}++##include "HsNetDef.h"+#if defined(mingw32_HOST_OS)+#  include "windows.h"+#endif++module Network.Socket.Buffer (+    sendBufTo+  , sendBuf+  , recvBufFrom+  , recvBuf+  , recvBufNoWait+  , sendBufMsg+  , recvBufMsg+  ) 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)+import GHC.IO.Exception (IOErrorType(InvalidArgument))+import System.IO.Error (mkIOError, ioeSetErrorString, catchIOError)++#if defined(mingw32_HOST_OS)+import GHC.IO.FD (FD(..), readRawBufferPtr, writeRawBufferPtr)+import Network.Socket.Win32.CmsgHdr+import Network.Socket.Win32.MsgHdr+import Network.Socket.Win32.WSABuf+#else+import Network.Socket.Posix.CmsgHdr+import Network.Socket.Posix.MsgHdr+import Network.Socket.Posix.IOVec+#endif++import Network.Socket.Imports+import Network.Socket.Internal+import Network.Socket.Name+import Network.Socket.Types+import Network.Socket.Flag++#if defined(mingw32_HOST_OS)+type DWORD   = Word32+type LPDWORD = Ptr DWORD+#endif++-- | 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+-- ensuring that all data has been sent.+sendBufTo :: SocketAddress sa =>+             Socket -- (possibly) bound/connected Socket+          -> Ptr a+          -> Int         -- Data to send+          -> sa+          -> IO Int      -- Number of Bytes sent+sendBufTo 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)+socket2FD :: Socket -> IO FD+socket2FD s = do+  fd <- unsafeFdSocket s+  -- HACK, 1 means True+  return $ FD{ fdFD = fd, fdIsSocket_ = 1 }+#endif++-- | Send data to the socket. The socket must be connected to a remote+-- socket. Returns the number of bytes sent.  Applications are+-- responsible for ensuring that all data has been sent.+sendBuf :: Socket    -- Bound/Connected Socket+        -> 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+#if defined(mingw32_HOST_OS)+-- 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+-- bug is supported.+    fd <- socket2FD s+    let clen = fromIntegral len+    throwSocketErrorIfMinus1Retry "Network.Socket.sendBuf" $+      writeRawBufferPtr "Network.Socket.sendBuf" fd (castPtr str) 0 clen+#else+    withFdSocket s $ \fd -> do+        let flags = 0+            clen = fromIntegral len+        throwSocketErrorWaitWrite s "Network.Socket.sendBuf" $+          c_send fd str clen flags+#endif++-- | 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+-- bytes received and @address@ is a 'SockAddr' representing the+-- address of the sending socket.+--+-- If the first return value is zero, it means EOF.+--+-- For 'Stream' sockets, the second return value would be invalid.+--+-- 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+    | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvBufFrom")+    | otherwise = withNewSocketAddress $ \ptr_sa sz -> alloca $ \ptr_len ->+        withFdSocket s $ \fd -> do+            poke ptr_len (fromIntegral sz)+            let cnbytes = fromIntegral nbytes+                flags = 0+            len <- throwSocketErrorWaitRead s "Network.Socket.recvBufFrom" $+                     c_recvfrom fd ptr cnbytes flags ptr_sa ptr_len+            sockaddr <- peekSocketAddress ptr_sa+                `catchIOError` \_ -> getPeerName s+            return (fromIntegral len, sockaddr)++-- | Receive data from the socket.  The socket must be in a connected+-- state. This function may return fewer bytes than specified.  If the+-- message is longer than the specified length, it may be discarded+-- depending on the type of socket.  This function may block until a+-- message arrives.+--+-- Considering hardware and network realities, the maximum number of+-- bytes to receive should be a small power of 2, e.g., 4096.+--+-- The return value is the length of received data. Zero means+-- 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+ | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recvBuf")+ | otherwise   = do+#if defined(mingw32_HOST_OS)+-- see comment in sendBuf above.+    fd <- socket2FD s+    let cnbytes = fromIntegral nbytes+    len <- throwSocketErrorIfMinus1Retry "Network.Socket.recvBuf" $+             readRawBufferPtr "Network.Socket.recvBuf" fd ptr 0 cnbytes+#else+    len <- withFdSocket s $ \fd ->+        throwSocketErrorWaitRead s "Network.Socket.recvBuf" $+             c_recv fd (castPtr ptr) (fromIntegral nbytes) 0{-flags-}+#endif+    return $ fromIntegral len++-- | Receive data from the socket. This function returns immediately+--   even if data is not available. In other words, IO manager is NOT+--   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.+recvBufNoWait :: Socket -> Ptr Word8 -> Int -> IO Int+recvBufNoWait 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-}+           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)+      return $ fromIntegral r++#else+    r <- c_recv fd (castPtr ptr) (fromIntegral nbytes) 0{-flags-}+    if r >= 0 then+        return $ fromIntegral r+      else do+        err <- getErrno+        if err == eAGAIN || err == eWOULDBLOCK then+            return (-1)+          else+            return (-2)+#endif++mkInvalidRecvArgError :: String -> IOError+mkInvalidRecvArgError loc = ioeSetErrorString (mkIOError+                                    InvalidArgument+                                    loc Nothing Nothing) "non-positive length"++-- | Send data to the socket using sendmsg(2).+sendBufMsg :: SocketAddress sa+           => Socket            -- ^ Socket+           -> sa                -- ^ Destination address+           -> [(Ptr Word8,Int)] -- ^ Data to be sent+           -> [Cmsg]            -- ^ Control messages+           -> MsgFlag           -- ^ Message flags+           -> IO Int            -- ^ The length actually sent+sendBufMsg s sa bufsizs cmsgs flags = do+  sz <- withSocketAddress sa $ \addrPtr addrSize ->+#if !defined(mingw32_HOST_OS)+    withIOVec bufsizs $ \(iovsPtr, iovsLen) -> do+#else+    withWSABuf bufsizs $ \(wsaBPtr, wsaBLen) -> do+#endif+      withCmsgs cmsgs $ \ctrlPtr ctrlLen -> do+        let msgHdr = MsgHdr {+                msgName    = addrPtr+              , msgNameLen = fromIntegral addrSize+#if !defined(mingw32_HOST_OS)+              , msgIov     = iovsPtr+              , msgIovLen  = fromIntegral iovsLen+#else+              , msgBuffer    = wsaBPtr+              , msgBufferLen = fromIntegral wsaBLen+#endif+              , msgCtrl    = castPtr ctrlPtr+              , msgCtrlLen = fromIntegral ctrlLen+              , msgFlags   = 0+              }+            cflags = fromMsgFlag flags+        withFdSocket s $ \fd ->+          with msgHdr $ \msgHdrPtr ->+            throwSocketErrorWaitWrite s "Network.Socket.Buffer.sendMsg" $+#if !defined(mingw32_HOST_OS)+              c_sendmsg fd msgHdrPtr cflags+#else+              alloca $ \send_ptr ->+                c_sendmsg fd msgHdrPtr (fromIntegral cflags) send_ptr nullPtr nullPtr+#endif+  return $ fromIntegral sz++-- | Receive data from the socket using recvmsg(2). The supplied+--   buffers are filled in order, with subsequent buffers used only+--   after all the preceding buffers are full. If the message is short+--   enough some of the supplied buffers may remain unused.+recvBufMsg :: SocketAddress sa+           => Socket            -- ^ Socket+           -> [(Ptr Word8,Int)] -- ^ A list of (buffer, buffer-length) pairs.+                                --   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 (sa,Int,[Cmsg],MsgFlag) -- ^ Source address, total bytes received, control messages and message flags+recvBufMsg s bufsizs clen flags = do+  withNewSocketAddress $ \addrPtr addrSize ->+    allocaBytes clen $ \ctrlPtr ->+#if !defined(mingw32_HOST_OS)+      withIOVec bufsizs $ \(iovsPtr, iovsLen) -> do+        let msgHdr = MsgHdr {+                msgName    = addrPtr+              , msgNameLen = fromIntegral addrSize+              , msgIov     = iovsPtr+              , msgIovLen  = fromIntegral iovsLen+              , msgCtrl    = castPtr ctrlPtr+              , msgCtrlLen = fromIntegral clen+              , msgFlags   = 0+#else+      withWSABuf bufsizs $ \(wsaBPtr, wsaBLen) -> do+        let msgHdr = MsgHdr {+                msgName    = addrPtr+              , msgNameLen = fromIntegral addrSize+              , msgBuffer    = wsaBPtr+              , msgBufferLen = fromIntegral wsaBLen+              , msgCtrl    = if clen == 0 then nullPtr else castPtr ctrlPtr+              , msgCtrlLen = fromIntegral clen+              , msgFlags   = fromIntegral $ fromMsgFlag flags+#endif+              }+            _cflags = fromMsgFlag flags+        withFdSocket s $ \fd -> do+          with msgHdr $ \msgHdrPtr -> do+            len <- (fmap fromIntegral) <$>+#if !defined(mingw32_HOST_OS)+                throwSocketErrorWaitRead s "Network.Socket.Buffer.recvmsg" $+                      c_recvmsg fd msgHdrPtr _cflags+#else+                alloca $ \len_ptr -> do+                    _ <- throwSocketErrorWaitReadBut (== #{const WSAEMSGSIZE}) s "Network.Socket.Buffer.recvmsg" $+                            c_recvmsg fd msgHdrPtr len_ptr nullPtr nullPtr+                    peek len_ptr+#endif+            sockaddr <- peekSocketAddress addrPtr `catchIOError` \_ -> getPeerName s+            hdr <- peek msgHdrPtr+            cmsgs <- parseCmsgs msgHdrPtr+            let flags' = MsgFlag $ fromIntegral $ msgFlags hdr+            return (sockaddr, len, cmsgs, flags')++#if !defined(mingw32_HOST_OS)+foreign import ccall unsafe "send"+  c_send :: CInt -> Ptr a -> CSize -> CInt -> IO CInt+foreign import ccall unsafe "sendmsg"+  c_sendmsg :: CInt -> Ptr (MsgHdr sa) -> CInt -> IO CInt -- fixme CSsize+foreign import ccall unsafe "recvmsg"+  c_recvmsg :: CInt -> Ptr (MsgHdr sa) -> CInt -> IO CInt+#else+foreign import CALLCONV SAFE_ON_WIN "ioctlsocket"+  c_ioctlsocket :: CInt -> CLong -> Ptr CULong -> IO CInt+foreign import CALLCONV SAFE_ON_WIN "WSAGetLastError"+  c_WSAGetLastError :: IO CInt+foreign import CALLCONV SAFE_ON_WIN "WSASendMsg"+  -- fixme Handle for SOCKET, see #426+  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+#endif++foreign import ccall unsafe "recv"+  c_recv :: CInt -> Ptr CChar -> CSize -> CInt -> IO CInt+foreign import CALLCONV SAFE_ON_WIN "sendto"+  c_sendto :: CInt -> Ptr a -> CSize -> CInt -> Ptr sa -> CInt -> IO CInt+foreign import CALLCONV SAFE_ON_WIN "recvfrom"+  c_recvfrom :: CInt -> Ptr a -> CSize -> CInt -> Ptr sa -> Ptr CInt -> IO CInt+
+ Network/Socket/ByteString.hs view
@@ -0,0 +1,91 @@+-- |+-- Module      : Network.Socket.ByteString+-- Copyright   : (c) Johan Tibell 2007-2010+-- License     : BSD-style+--+-- Maintainer  : johan.tibell@gmail.com+-- Stability   : stable+-- Portability : portable+--+-- This module provides access to the BSD /socket/ interface. For detailed+-- documentation, consult your favorite POSIX socket reference. All functions+-- communicate failures by converting the error number to an+-- 'System.IO.Error.IOError'.+--+-- This module is made to be imported with "Network.Socket" like so:+--+-- > import Network.Socket+-- > import Network.Socket.ByteString+module Network.Socket.ByteString (+    -- * Send data to a socket+    send,+    sendAll,+    sendTo,+    sendAllTo,++    -- ** Vectored I/O+    -- $vectored+    sendMany,+    sendManyTo,+    sendManyWithFds,++    -- * Receive data from a socket+    recv,+    recvFrom,++    -- * Advanced send and recv+    sendMsg,+    recvMsg,+) where++import Data.ByteString (ByteString)++import Network.Socket.ByteString.IO hiding (recvFrom, sendAllTo, sendTo)+import qualified Network.Socket.ByteString.IO as G+import Network.Socket.Types++-- ----------------------------------------------------------------------------++-- ** Vectored I/O++-- $vectored+--+-- Vectored I\/O, also known as scatter\/gather I\/O, allows multiple+-- data segments to be sent using a single system call, without first+-- concatenating the segments.  For example, given a list of+-- @ByteString@s, @xs@,+--+-- > sendMany sock xs+--+-- is equivalent to+--+-- > sendAll sock (concat xs)+--+-- but potentially more efficient.+--+-- Vectored I\/O are often useful when implementing network protocols+-- that, for example, group data into segments consisting of one or+-- more fixed-length headers followed by a variable-length body.++-- | 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+-- ensuring that all data has been sent.+sendTo :: Socket -> ByteString -> SockAddr -> IO Int+sendTo = G.sendTo++-- | 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+-- data has been sent or an error occurs.  On error, an exception is+-- raised, and there is no way to determine how much data, if any, was+-- successfully sent.+sendAllTo :: Socket -> ByteString -> SockAddr -> IO ()+sendAllTo = G.sendAllTo++-- | 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+-- 'SockAddr' representing the address of the sending socket.+recvFrom :: Socket -> Int -> IO (ByteString, SockAddr)+recvFrom = G.recvFrom
− Network/Socket/ByteString.hsc
@@ -1,285 +0,0 @@-{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}-{-# LANGUAGE CPP, ForeignFunctionInterface #-}-{-# LANGUAGE OverloadedStrings #-}--#include "HsNet.h"---- |--- Module      : Network.Socket.ByteString--- Copyright   : (c) Johan Tibell 2007-2010--- License     : BSD-style------ Maintainer  : johan.tibell@gmail.com--- Stability   : stable--- Portability : portable------ This module provides access to the BSD /socket/ interface.  This--- module is generally more efficient than the 'String' based network--- functions in 'Network.Socket'.  For detailed documentation, consult--- your favorite POSIX socket reference. All functions communicate--- failures by converting the error number to 'System.IO.IOError'.------ This module is made to be imported with 'Network.Socket' like so:------ > import Network.Socket hiding (send, sendTo, recv, recvFrom)--- > import Network.Socket.ByteString----module Network.Socket.ByteString-    (-    -- * Send data to a socket-      send-    , sendAll-    , sendTo-    , sendAllTo--    -- ** Vectored I/O-    -- $vectored-    , sendMany-    , sendManyTo--    -- * Receive data from a socket-    , recv-    , recvFrom-    ) where--import Control.Exception as E (catch, throwIO)-import Control.Monad (when)-import Data.ByteString (ByteString)-import Data.ByteString.Internal (createAndTrim)-import Data.ByteString.Unsafe (unsafeUseAsCStringLen)-import Foreign.Marshal.Alloc (allocaBytes)-import Foreign.Ptr (castPtr)-import Network.Socket (sendBuf, sendBufTo, recvBuf, recvBufFrom)-import System.IO.Error (isEOFError)--import qualified Data.ByteString as B--import Network.Socket.ByteString.Internal-import Network.Socket.Internal-import Network.Socket.Types--#if !defined(mingw32_HOST_OS)-import Control.Monad (liftM, zipWithM_)-import Foreign.Marshal.Array (allocaArray)-import Foreign.Marshal.Utils (with)-import Foreign.Ptr (Ptr, plusPtr)-import Foreign.Storable (Storable(..))--import Network.Socket.ByteString.IOVec (IOVec(..))-import Network.Socket.ByteString.MsgHdr (MsgHdr(..))-#endif---- ------------------------------------------------------------------------------- Sending---- | Send data to the socket.  The socket must be connected to a--- remote socket.  Returns the number of bytes sent. Applications are--- responsible for ensuring that all data has been sent.------ Sending data to closed socket may lead to undefined behaviour.-send :: Socket      -- ^ Connected socket-     -> ByteString  -- ^ Data to send-     -> IO Int      -- ^ Number of bytes sent-send sock xs = unsafeUseAsCStringLen xs $ \(str, len) ->-    sendBuf sock (castPtr str) len---- | Send data to the socket.  The socket must be connected to a--- remote socket.  Unlike 'send', this function continues to send data--- until either all data has been sent or an error occurs.  On error,--- an exception is raised, and there is no way to determine how much--- data, if any, was successfully sent.------ Sending data to closed socket may lead to undefined behaviour.-sendAll :: Socket      -- ^ Connected socket-        -> ByteString  -- ^ Data to send-        -> IO ()-sendAll _    "" = return ()-sendAll sock bs = do-    sent <- send sock bs-    waitWhen0 sent sock-    when (sent >= 0) $ sendAll sock $ B.drop sent bs---- | 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--- ensuring that all data has been sent.------ Sending data to closed socket may lead to undefined behaviour.-sendTo :: Socket      -- ^ Socket-       -> ByteString  -- ^ Data to send-       -> SockAddr    -- ^ Recipient address-       -> IO Int      -- ^ Number of bytes sent-sendTo sock xs addr =-    unsafeUseAsCStringLen xs $ \(str, len) -> sendBufTo sock str len addr---- | 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--- data has been sent or an error occurs.  On error, an exception is--- raised, and there is no way to determine how much data, if any, was--- successfully sent.------ Sending data to closed socket may lead to undefined behaviour.-sendAllTo :: Socket      -- ^ Socket-          -> ByteString  -- ^ Data to send-          -> SockAddr    -- ^ Recipient address-          -> IO ()-sendAllTo _    "" _    = return ()-sendAllTo sock xs addr = do-    sent <- sendTo sock xs addr-    waitWhen0 sent sock-    when (sent >= 0) $ sendAllTo sock (B.drop sent xs) addr---- ------------------------------------------------------------------------------- ** Vectored I/O---- $vectored------ Vectored I\/O, also known as scatter\/gather I\/O, allows multiple--- data segments to be sent using a single system call, without first--- concatenating the segments.  For example, given a list of--- @ByteString@s, @xs@,------ > sendMany sock xs------ is equivalent to------ > sendAll sock (concat xs)------ but potentially more efficient.------ Vectored I\/O are often useful when implementing network protocols--- that, for example, group data into segments consisting of one or--- more fixed-length headers followed by a variable-length body.---- | Send data to the socket.  The socket must be in a connected--- state.  The data is sent as if the parts have been concatenated.--- This function continues to send data until either all data has been--- sent or an error occurs.  On error, an exception is raised, and--- there is no way to determine how much data, if any, was--- successfully sent.------ Sending data to closed socket may lead to undefined behaviour.-sendMany :: Socket        -- ^ Connected socket-         -> [ByteString]  -- ^ Data to send-         -> IO ()-#if !defined(mingw32_HOST_OS)-sendMany _                          [] = return ()-sendMany sock@(MkSocket fd _ _ _ _) cs = do-    sent <- sendManyInner-    waitWhen0 sent sock-    when (sent >= 0) $ sendMany sock (remainingChunks sent cs)-  where-    sendManyInner =-      liftM fromIntegral . withIOVec cs $ \(iovsPtr, iovsLen) ->-          throwSocketErrorWaitWrite sock "Network.Socket.ByteString.sendMany" $-              c_writev (fromIntegral fd) iovsPtr-              (fromIntegral (min iovsLen (#const IOV_MAX)))-#else-sendMany sock = sendAll sock . B.concat-#endif---- | 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--- continues to send data until either all data has been sent or an--- error occurs.  On error, an exception is raised, and there is no--- way to determine how much data, if any, was successfully sent.------ Sending data to closed socket may lead to undefined behaviour.-sendManyTo :: Socket        -- ^ Socket-           -> [ByteString]  -- ^ Data to send-           -> SockAddr      -- ^ Recipient address-           -> IO ()-#if !defined(mingw32_HOST_OS)-sendManyTo _                          [] _    = return ()-sendManyTo sock@(MkSocket fd _ _ _ _) cs addr = do-    sent <- liftM fromIntegral sendManyToInner-    waitWhen0 sent sock-    when (sent >= 0) $ sendManyTo sock (remainingChunks sent cs) addr-  where-    sendManyToInner =-      withSockAddr addr $ \addrPtr addrSize ->-        withIOVec cs $ \(iovsPtr, iovsLen) -> do-          let msgHdr = MsgHdr-                addrPtr (fromIntegral addrSize)-                iovsPtr (fromIntegral iovsLen)-          with msgHdr $ \msgHdrPtr ->-            throwSocketErrorWaitWrite sock "Network.Socket.ByteString.sendManyTo" $-              c_sendmsg (fromIntegral fd) msgHdrPtr 0-#else-sendManyTo sock cs = sendAllTo sock (B.concat cs)-#endif---- ------------------------------------------------------------------------------- Receiving---- | Receive data from the socket.  The socket must be in a connected--- state.  This function may return fewer bytes than specified.  If--- the message is longer than the specified length, it may be--- discarded depending on the type of socket.  This function may block--- until a message arrives.------ Considering hardware and network realities, the maximum number of bytes to--- receive should be a small power of 2, e.g., 4096.------ For TCP sockets, a zero length return value means the peer has--- closed its half side of the connection.------ Receiving data from closed socket may lead to undefined behaviour.-recv :: Socket         -- ^ Connected socket-     -> Int            -- ^ Maximum number of bytes to receive-     -> IO ByteString  -- ^ Data received-recv sock nbytes-    | nbytes < 0 = ioError (mkInvalidRecvArgError "Network.Socket.ByteString.recv")-    | otherwise  = createAndTrim nbytes $ \ptr ->-        E.catch-          (recvBuf sock ptr nbytes)-          (\e -> if isEOFError e then return 0 else throwIO e)---- | 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--- 'SockAddr' representing the address of the sending socket.------ Receiving data from closed socket may lead to undefined behaviour.-recvFrom :: Socket                     -- ^ Socket-         -> Int                        -- ^ Maximum number of bytes to receive-         -> IO (ByteString, SockAddr)  -- ^ Data received and sender address-recvFrom sock nbytes =-    allocaBytes nbytes $ \ptr -> do-        (len, sockaddr) <- recvBufFrom sock ptr nbytes-        str <- B.packCStringLen (ptr, len)-        return (str, sockaddr)---- ------------------------------------------------------------------------------- Not exported--#if !defined(mingw32_HOST_OS)--- | Suppose we try to transmit a list of chunks @cs@ via a gathering write--- operation and find that @n@ bytes were sent. Then @remainingChunks n cs@ is--- list of chunks remaining to be sent.-remainingChunks :: Int -> [ByteString] -> [ByteString]-remainingChunks _ [] = []-remainingChunks i (x:xs)-    | i < len        = B.drop i x : xs-    | otherwise      = let i' = i - len in i' `seq` remainingChunks i' xs-  where-    len = B.length x---- | @withIOVec cs f@ executes the computation @f@, passing as argument a pair--- consisting of a pointer to a temporarily allocated array of pointers to--- IOVec made from @cs@ and the number of pointers (@length cs@).--- /Unix only/.-withIOVec :: [ByteString] -> ((Ptr IOVec, Int) -> IO a) -> IO a-withIOVec cs f =-    allocaArray csLen $ \aPtr -> do-        zipWithM_ pokeIov (ptrs aPtr) cs-        f (aPtr, csLen)-  where-    csLen = length cs-    ptrs = iterate (`plusPtr` sizeOf (undefined :: IOVec))-    pokeIov ptr s =-        unsafeUseAsCStringLen s $ \(sPtr, sLen) ->-        poke ptr $ IOVec sPtr (fromIntegral sLen)-#endif
+ Network/Socket/ByteString/IO.hsc view
@@ -0,0 +1,345 @@+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE OverloadedStrings #-}++#include "HsNet.h"++-- |+-- Module      : Network.Socket.ByteString.IO+-- Copyright   : (c) Johan Tibell 2007-2010+-- License     : BSD-style+--+-- Maintainer  : johan.tibell@gmail.com+-- Stability   : stable+-- Portability : portable+--+module Network.Socket.ByteString.IO+    (+    -- * Send data to a socket+      send+    , sendAll+    , sendTo+    , sendAllTo++    -- ** Vectored I/O+    -- $vectored+    , sendMany+    , sendManyTo+    , sendManyWithFds++    -- * Receive data from a socket+    , recv+    , recvFrom+    , waitWhen0++    -- * Advanced send and recv+    , sendMsg+    , recvMsg+    , MsgFlag(..)+    , Cmsg(..)+    ) where++import Control.Concurrent (threadWaitWrite, rtsSupportsBoundThreads)+import Data.ByteString (ByteString)+import qualified Data.ByteString as B+import Data.ByteString.Internal (createAndTrim)+import Data.ByteString.Unsafe (unsafeUseAsCStringLen)+import Foreign.Marshal.Alloc (allocaBytes)++import Network.Socket.Buffer+import Network.Socket.ByteString.Internal+import Network.Socket.Imports+import Network.Socket.Types++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++#if !defined(mingw32_HOST_OS)+import Network.Socket.Posix.Cmsg+import Network.Socket.Posix.IOVec+import Network.Socket.Posix.MsgHdr (MsgHdr(..))+#else+import Foreign.Marshal.Alloc (alloca)+import Network.Socket.Win32.Cmsg+import Network.Socket.Win32.WSABuf+import Network.Socket.Win32.MsgHdr (MsgHdr(..))+#endif++-- ----------------------------------------------------------------------------+-- Sending++-- | Send data to the socket.  The socket must be connected to a+-- remote socket.  Returns the number of bytes sent. Applications are+-- responsible for ensuring that all data has been sent.+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++waitWhen0 :: Int -> Socket -> IO ()+waitWhen0 0 s = when rtsSupportsBoundThreads $+    withFdSocket s $ \fd -> threadWaitWrite $ fromIntegral fd+waitWhen0 _ _ = return ()++-- | Send data to the socket.  The socket must be connected to a+-- remote socket.  Unlike 'send', this function continues to send data+-- until either all data has been sent or an error occurs.  On error,+-- an exception is raised, and there is no way to determine how much+-- data, if any, was successfully sent.+sendAll :: Socket     -- ^ Connected socket+        -> ByteString  -- ^ Data to send+        -> IO ()+sendAll _ "" = return ()+sendAll s bs0 = loop bs0+  where+    loop bs = do+        -- "send" throws an exception.+        sent <- send s bs+        waitWhen0 sent s+        when (sent /= B.length bs) $ loop $ B.drop sent bs++-- | 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+-- ensuring that all data has been sent.+sendTo :: SocketAddress sa =>+          Socket     -- ^ Socket+       -> 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++-- | 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+-- data has been sent or an error occurs.  On error, an exception is+-- raised, and there is no way to determine how much data, if any, was+-- successfully sent.+sendAllTo :: SocketAddress sa =>+             Socket     -- ^ Socket+          -> ByteString  -- ^ Data to send+          -> sa    -- ^ Recipient address+          -> IO ()+sendAllTo _ "" _  = return ()+sendAllTo s bs0 sa = loop bs0+  where+    loop bs = do+        -- "send" throws an exception.+        sent <- sendTo s bs sa+        waitWhen0 sent s+        when (sent /= B.length bs) $ loop $ B.drop sent bs++-- | Send data to the socket.  The socket must be in a connected+-- state.  The data is sent as if the parts have been concatenated.+-- This function continues to send data until either all data has been+-- sent or an error occurs.  On error, an exception is raised, and+-- there is no way to determine how much data, if any, was+-- successfully sent.+sendMany :: Socket       -- ^ Connected socket+         -> [ByteString]  -- ^ Data to send+         -> IO ()+sendMany _ [] = return ()+sendMany s cs = do+    sent <- sendManyInner+    waitWhen0 sent s+    when (sent >= 0) $ sendMany s $ remainingChunks sent cs+  where+    sendManyInner =+#if !defined(mingw32_HOST_OS)+      fmap fromIntegral . withIOVecfromBS cs $ \(iovsPtr, iovsLen) ->+          withFdSocket s $ \fd -> do+              let len =  fromIntegral $ min iovsLen (#const IOV_MAX)+              throwSocketErrorWaitWrite s "Network.Socket.ByteString.sendMany" $+                  c_writev fd iovsPtr len+#else+      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+#endif++-- | 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+-- continues to send data until either all data has been sent or an+-- error occurs.  On error, an exception is raised, and there is no+-- way to determine how much data, if any, was successfully sent.+sendManyTo :: Socket       -- ^ Socket+           -> [ByteString]  -- ^ Data to send+           -> SockAddr      -- ^ Recipient address+           -> IO ()+sendManyTo _ [] _    = return ()+sendManyTo s cs addr = do+    sent <- fromIntegral <$> sendManyToInner+    waitWhen0 sent s+    when (sent >= 0) $ sendManyTo s (remainingChunks sent cs) addr+  where+    sendManyToInner =+      withSockAddr addr $ \addrPtr addrSize ->+#if !defined(mingw32_HOST_OS)+        withIOVecfromBS cs $ \(iovsPtr, iovsLen) -> do+          let msgHdr = MsgHdr {+                  msgName    = addrPtr+                , msgNameLen = fromIntegral addrSize+                , msgIov     = iovsPtr+                , msgIovLen  = fromIntegral iovsLen+                , msgCtrl    = nullPtr+                , msgCtrlLen = 0+                , msgFlags   = 0+                }+          withFdSocket s $ \fd ->+              with msgHdr $ \msgHdrPtr ->+                throwSocketErrorWaitWrite s "Network.Socket.ByteString.sendManyTo" $+                  c_sendmsg fd msgHdrPtr 0+#else+        withWSABuffromBS cs $ \(wsabsPtr, wsabsLen) -> do+          let msgHdr = MsgHdr {+                  msgName      = addrPtr+                , msgNameLen   = fromIntegral addrSize+                , msgBuffer    = wsabsPtr+                , msgBufferLen = fromIntegral wsabsLen+                , msgCtrl      = nullPtr+                , msgCtrlLen   = 0+                , msgFlags     = 0+                }+          withFdSocket s $ \fd ->+              with msgHdr $ \msgHdrPtr ->+                alloca $ \send_ptr -> do+                  _ <- throwSocketErrorWaitWrite s "Network.Socket.ByteString.sendManyTo" $+                          c_sendmsg fd msgHdrPtr 0 send_ptr nullPtr nullPtr+                  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++-- | Receive data from the socket.  The socket must be in a connected+-- state.  This function may return fewer bytes than specified.  If+-- the message is longer than the specified length, it may be+-- discarded depending on the type of socket.  This function may block+-- until a message arrives.+--+-- Considering hardware and network realities, the maximum number of bytes to+-- receive should be a small power of 2, e.g., 4096.+--+-- For TCP sockets, a zero length return value means the peer has+-- closed its half side of the connection.+--+-- Currently, the 'recv' family is blocked on Windows because a proper+-- IO manager is not implemented. To use with 'System.Timeout.timeout'+-- on Windows, use 'Network.Socket.setSocketOption' with+-- 'Network.Socket.RecvTimeOut' as well.+recv :: Socket        -- ^ Connected socket+     -> Int            -- ^ Maximum number of bytes to receive+     -> IO ByteString  -- ^ Data received+recv s nbytes+    | nbytes < 0 = ioError (mkInvalidRecvArgError "Network.Socket.ByteString.recv")+    | otherwise  = createAndTrim nbytes $ \ptr -> recvBuf 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+-- 'SockAddr' representing the address of the sending socket.+--+-- If the first return value is zero, it means EOF.+recvFrom :: SocketAddress sa =>+            Socket                     -- ^ Socket+         -> Int                        -- ^ Maximum number of bytes to receive+         -> IO (ByteString, sa)  -- ^ Data received and sender address+recvFrom sock nbytes =+    allocaBytes nbytes $ \ptr -> do+        (len, sockaddr) <- recvBufFrom sock ptr nbytes+        str <- B.packCStringLen (ptr, len)+        return (str, sockaddr)++-- ----------------------------------------------------------------------------+-- Not exported+++-- | Suppose we try to transmit a list of chunks @cs@ via a gathering write+-- operation and find that @n@ bytes were sent. Then @remainingChunks n cs@ is+-- list of chunks remaining to be sent.+remainingChunks :: Int -> [ByteString] -> [ByteString]+remainingChunks _ [] = []+remainingChunks i (x:xs)+    | i < len        = B.drop i x : xs+    | otherwise      = let i' = i - len in i' `seq` remainingChunks i' xs+  where+    len = B.length x++#if !defined(mingw32_HOST_OS)+-- | @withIOVecfromBS cs f@ executes the computation @f@, passing as argument a pair+-- consisting of a pointer to a temporarily allocated array of pointers to+-- IOVec made from @cs@ and the number of pointers (@length cs@).+-- /Unix only/.+withIOVecfromBS :: [ByteString] -> ((Ptr IOVec, Int) -> IO a) -> IO a+withIOVecfromBS cs f = withBufSizs cs $ \bufsizs -> withIOVec bufsizs f+#else+-- | @withWSABuffromBS cs f@ executes the computation @f@, passing as argument a pair+-- consisting of a pointer to a temporarily allocated array of pointers to+-- WSABuf made from @cs@ and the number of pointers (@length cs@).+-- /Windows only/.+withWSABuffromBS :: [ByteString] -> ((Ptr WSABuf, Int) -> IO a) -> IO a+withWSABuffromBS cs f = withBufSizs cs $ \bufsizs -> withWSABuf bufsizs f+#endif++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 bss (build . ((ptr',len) :))++-- | Send data to the socket using sendmsg(2).+sendMsg :: Socket       -- ^ Socket+        -> SockAddr     -- ^ Destination address+        -> [ByteString] -- ^ Data to be sent+        -> [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++-- | Receive data from the socket using recvmsg(2).+recvMsg :: Socket  -- ^ Socket+        -> Int     -- ^ The maximum length of data to be received+                   --   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, ByteString, [Cmsg], MsgFlag) -- ^ Source address, received data, control messages and message flags+recvMsg 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+        let bs' | len < siz = PS fptr 0 len+                | otherwise = bs+        return (addr, bs', cmsgs, flags')
− Network/Socket/ByteString/IOVec.hsc
@@ -1,31 +0,0 @@-{-# OPTIONS_GHC -funbox-strict-fields #-}---- | Support module for the POSIX writev system call.-module Network.Socket.ByteString.IOVec-    ( IOVec(..)-    ) where--import Foreign.C.Types (CChar, CInt, CSize)-import Foreign.Ptr (Ptr)-import Foreign.Storable (Storable(..))--#include <sys/types.h>-#include <sys/uio.h>--data IOVec = IOVec-    { iovBase :: !(Ptr CChar)-    , iovLen  :: !CSize-    }--instance Storable IOVec where-  sizeOf _    = (#const sizeof(struct iovec))-  alignment _ = alignment (undefined :: CInt)--  peek p = do-    base <- (#peek struct iovec, iov_base) p-    len  <- (#peek struct iovec, iov_len)  p-    return $ IOVec base len--  poke p iov = do-    (#poke struct iovec, iov_base) p (iovBase iov)-    (#poke struct iovec, iov_len)  p (iovLen  iov)
Network/Socket/ByteString/Internal.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, ForeignFunctionInterface #-}+{-# LANGUAGE CPP #-}  -- | -- Module      : Network.Socket.ByteString.Internal@@ -14,27 +14,38 @@       mkInvalidRecvArgError #if !defined(mingw32_HOST_OS)     , c_writev-    , c_sendmsg+#else+    , c_wsasend #endif-    , waitWhen0+    , c_sendmsg+    , c_recvmsg     ) where +#include "HsNetDef.h"++import GHC.IO.Exception (IOErrorType(..)) import System.IO.Error (ioeSetErrorString, mkIOError)  #if !defined(mingw32_HOST_OS)-import Foreign.C.Types (CInt(..)) import System.Posix.Types (CSsize(..))-import Foreign.Ptr (Ptr) -import Network.Socket.ByteString.IOVec (IOVec)-import Network.Socket.ByteString.MsgHdr (MsgHdr)-#endif+import Network.Socket.Imports+import Network.Socket.Posix.IOVec (IOVec)+import Network.Socket.Posix.MsgHdr (MsgHdr)+import Network.Socket.Types+#else+import Data.Word+import Foreign.C.Types+import Foreign.Ptr -import Control.Concurrent (threadWaitWrite, rtsSupportsBoundThreads)-import Control.Monad (when)-import GHC.IO.Exception (IOErrorType(..))+import Network.Socket.Win32.WSABuf (WSABuf)+import Network.Socket.Win32.MsgHdr (MsgHdr) import Network.Socket.Types +type DWORD   = Word32+type LPDWORD = Ptr DWORD+#endif+ mkInvalidRecvArgError :: String -> IOError mkInvalidRecvArgError loc = ioeSetErrorString (mkIOError                                     InvalidArgument@@ -45,11 +56,16 @@   c_writev :: CInt -> Ptr IOVec -> CInt -> IO CSsize  foreign import ccall unsafe "sendmsg"-  c_sendmsg :: CInt -> Ptr MsgHdr -> CInt -> IO CSsize-#endif+  c_sendmsg :: CInt -> Ptr (MsgHdr SockAddr) -> CInt -> IO CSsize -waitWhen0 :: Int -> Socket -> IO ()-waitWhen0 0 s = when rtsSupportsBoundThreads $ do-  let fd = fromIntegral $ fdSocket s-  threadWaitWrite fd-waitWhen0 _ _ = return ()+foreign import ccall unsafe "recvmsg"+  c_recvmsg :: CInt -> Ptr (MsgHdr SockAddr) -> CInt -> IO CSsize+#else+  -- 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+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"+  c_recvmsg :: CInt -> Ptr (MsgHdr SockAddr) -> LPDWORD -> Ptr () -> Ptr () -> IO CInt+#endif
Network/Socket/ByteString/Lazy.hs view
@@ -9,46 +9,61 @@ -- Stability   : experimental -- Portability : POSIX, GHC ----- This module provides access to the BSD /socket/ interface.  This--- module is generally more efficient than the 'String' based network--- functions in 'Network.Socket'.  For detailed documentation, consult--- your favorite POSIX socket reference. All functions communicate--- failures by converting the error number to 'System.IO.IOError'.+-- This module provides access to the BSD /socket/ interface.  For detailed+-- documentation, consult your favorite POSIX socket reference. All functions+-- communicate failures by converting the error number to an+-- 'System.IO.Error.IOError'. ----- This module is made to be imported with 'Network.Socket' like so:+-- This module is made to be imported with "Network.Socket" like so: ----- > import Network.Socket hiding (send, sendTo, recv, recvFrom)+-- > import Network.Socket -- > import Network.Socket.ByteString.Lazy -- > import Prelude hiding (getContents)----module Network.Socket.ByteString.Lazy-    (+module Network.Socket.ByteString.Lazy (     -- * Send data to a socket-      send-    , sendAll-    ,+    send,+    sendAll,+    sendWithFds,      -- * Receive data from a socket-      getContents-    , recv-    ) where+    getContents,+    recv,+) where -import Control.Monad (liftM)-import Data.ByteString.Lazy.Internal (ByteString(..), defaultChunkSize)-import Data.Int (Int64)-import Network.Socket (Socket(..), ShutdownCmd(..), shutdown)-import Prelude hiding (getContents)+import Data.ByteString.Lazy.Internal (+    ByteString (..),+    defaultChunkSize,+ )+import Network.Socket (ShutdownCmd (..), shutdown)+import System.IO.Error (catchIOError) import System.IO.Unsafe (unsafeInterleaveIO)--import qualified Data.ByteString as S-import qualified Network.Socket.ByteString as N+import System.Posix.Types (Fd (..))+import Prelude hiding (getContents)  #if defined(mingw32_HOST_OS)-import Network.Socket.ByteString.Lazy.Windows (send, sendAll)+import Network.Socket.ByteString.Lazy.Windows  (send, sendAll) #else-import Network.Socket.ByteString.Lazy.Posix (send, sendAll)+import Network.Socket.ByteString.Lazy.Posix    (send, sendAll) #endif +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++-- | 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+ -- ----------------------------------------------------------------------------- -- Receiving @@ -61,14 +76,20 @@ -- more data to be received, the receiving side of the socket is shut -- 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-getContents sock = loop where-  loop = unsafeInterleaveIO $ do-    s <- N.recv sock defaultChunkSize-    if S.null s-      then shutdown sock ShutdownReceive >> return Empty-      else Chunk s `liftM` loop+getContents+    :: 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+            else Chunk sbs <$> loop  -- | Receive data from the socket.  The socket must be in a connected -- state.  This function may return fewer bytes than specified.  If@@ -77,12 +98,15 @@ -- until a message arrives. -- -- If there is no more data to be received, returns an empty 'ByteString'.------ Receiving data from closed socket may lead to undefined behaviour.-recv :: Socket         -- ^ Connected socket-     -> Int64          -- ^ Maximum number of bytes to receive-     -> IO ByteString  -- ^ Data received-recv sock nbytes = chunk `liftM` N.recv sock (fromIntegral nbytes) where-  chunk k-    | S.null k  = Empty-    | otherwise = Chunk k Empty+recv+    :: 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
Network/Socket/ByteString/Lazy/Posix.hs view
@@ -1,59 +1,65 @@-{-# OPTIONS_GHC -fno-warn-warnings-deprecations #-}-{-# LANGUAGE BangPatterns #-} {-# LANGUAGE OverloadedStrings #-} -module Network.Socket.ByteString.Lazy.Posix-    (+module Network.Socket.ByteString.Lazy.Posix (     -- * Send data to a socket-      send-    , sendAll-    ) where+    send,+    sendAll,+) where -import Control.Monad (liftM, when) import qualified Data.ByteString.Lazy as L-import Data.ByteString.Lazy.Internal (ByteString(..)) import Data.ByteString.Unsafe (unsafeUseAsCStringLen)-import Data.Int (Int64) import Foreign.Marshal.Array (allocaArray)-import Foreign.Ptr (plusPtr)-import Foreign.Storable (Storable(..)) -import Network.Socket (Socket(..))-import Network.Socket.ByteString.IOVec (IOVec(IOVec))-import Network.Socket.ByteString.Internal (c_writev, waitWhen0)+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-     -> ByteString  -- ^ Data to send-     -> IO Int64    -- ^ Number of bytes sent-send sock@(MkSocket fd _ _ _ _) s = do-  let cs  = take maxNumChunks (L.toChunks s)-      len = length cs-  liftM fromIntegral . allocaArray len $ \ptr ->-    withPokes cs ptr $ \niovs ->-      throwSocketErrorWaitWrite sock "writev" $-        c_writev (fromIntegral fd) ptr niovs+send+    :: 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)+        len = length cs+    siz <- withFdSocket s $ \fd -> allocaArray len $ \ptr ->+        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-                | k < maxNumBytes =-                    unsafeUseAsCStringLen c $ \(ptr,len) -> do-                      poke q $ IOVec ptr (fromIntegral len)-                      loop cs (q `plusPtr` sizeOf (undefined :: IOVec))-                              (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-    maxNumChunks = 1024    :: Int  -- maximum number of chunks to transmit in one system call+      where+        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)+            | otherwise = f niovs+        loop _ _ _ niovs = f niovs+    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-        -> ByteString  -- ^ Data to send-        -> IO ()-sendAll _    "" = return ()-sendAll sock bs = do-  sent <- send sock bs-  waitWhen0 (fromIntegral sent) sock-  when (sent >= 0) $ sendAll sock $ L.drop sent bs+sendAll+    :: Socket+    -- ^ Connected socket+    -> L.ByteString+    -- ^ Data to send+    -> IO ()+sendAll _ "" = return ()+sendAll s bs0 = loop bs0+  where+    loop bs = do+        -- "send" throws an exception.+        sent <- send s bs+        waitWhen0 (fromIntegral sent) s+        when (sent /= L.length bs) $ loop $ L.drop sent bs
Network/Socket/ByteString/Lazy/Windows.hs view
@@ -1,40 +1,43 @@-{-# LANGUAGE BangPatterns #-} {-# LANGUAGE OverloadedStrings #-} -module Network.Socket.ByteString.Lazy.Windows-    (+module Network.Socket.ByteString.Lazy.Windows (     -- * Send data to a socket-      send-    , sendAll-    ) where+    send,+    sendAll,+) where -import Control.Applicative ((<$>))-import Control.Monad (when) import qualified Data.ByteString as S import qualified Data.ByteString.Lazy as L-import Data.Int (Int64)--import Network.Socket (Socket(..)) import qualified Network.Socket.ByteString as Socket-import Network.Socket.ByteString.Internal (waitWhen0)+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-send sock s = do-  fromIntegral <$> case L.toChunks s of-      -- TODO: Consider doing nothing if the string is empty.-      []    -> Socket.send sock S.empty-      (x:_) -> Socket.send sock x+send+    :: 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 -sendAll :: Socket        -- ^ Connected socket-        -> L.ByteString  -- ^ Data to send-        -> IO ()-sendAll _    "" = return ()-sendAll sock bs = do-  sent <- send sock bs-  waitWhen0 (fromIntegral sent) sock-  when (sent >= 0) $ sendAll sock $ L.drop sent bs+sendAll+    :: Socket+    -- ^ Connected socket+    -> L.ByteString+    -- ^ Data to send+    -> IO ()+sendAll _ "" = return ()+sendAll s bs0 = loop bs0+  where+    loop bs = do+        -- "send" throws an exception.+        sent <- send s bs+        waitWhen0 (fromIntegral sent) s+        when (sent /= L.length bs) $ loop $ L.drop sent bs
− Network/Socket/ByteString/MsgHdr.hsc
@@ -1,48 +0,0 @@-{-# LANGUAGE CPP #-}-{-# OPTIONS_GHC -funbox-strict-fields #-}---- | Support module for the POSIX 'sendmsg' system call.-module Network.Socket.ByteString.MsgHdr-    ( MsgHdr(..)-    ) where--#include <sys/types.h>-#include <sys/socket.h>--import Foreign.C.Types (CInt, CSize, CUInt)-import Foreign.Ptr (Ptr)-import Foreign.Storable (Storable(..))-import Network.Socket (SockAddr)-import Network.Socket.Internal (zeroMemory)--import Network.Socket.ByteString.IOVec (IOVec)---- We don't use msg_control, msg_controllen, and msg_flags as these--- don't exist on OpenSolaris.-data MsgHdr = MsgHdr-    { msgName    :: !(Ptr SockAddr)-    , msgNameLen :: !CUInt-    , msgIov     :: !(Ptr IOVec)-    , msgIovLen  :: !CSize-    }--instance Storable MsgHdr where-  sizeOf _    = (#const sizeof(struct msghdr))-  alignment _ = alignment (undefined :: CInt)--  peek p = do-    name       <- (#peek struct msghdr, msg_name)       p-    nameLen    <- (#peek struct msghdr, msg_namelen)    p-    iov        <- (#peek struct msghdr, msg_iov)        p-    iovLen     <- (#peek struct msghdr, msg_iovlen)     p-    return $ MsgHdr name nameLen iov iovLen--  poke p mh = do-    -- We need to zero the msg_control, msg_controllen, and msg_flags-    -- fields, but they only exist on some platforms (e.g. not on-    -- Solaris).  Instead of using CPP, we zero the entire struct.-    zeroMemory p (#const sizeof(struct msghdr))-    (#poke struct msghdr, msg_name)       p (msgName       mh)-    (#poke struct msghdr, msg_namelen)    p (msgNameLen    mh)-    (#poke struct msghdr, msg_iov)        p (msgIov        mh)-    (#poke struct msghdr, msg_iovlen)     p (msgIovLen     mh)
+ Network/Socket/Cbits.hsc view
@@ -0,0 +1,31 @@+module Network.Socket.Cbits where++#include "HsNet.h"++import Network.Socket.Imports++-- | This is the value of SOMAXCONN, typically 128.+-- 128 is good enough for normal network servers but+-- is too small for high performance servers.+maxListenQueue :: Int+maxListenQueue = #const SOMAXCONN++#if defined(mingw32_HOST_OS)+wsaNotInitialized :: CInt+wsaNotInitialized = #const WSANOTINITIALISED+#else+fGetFd :: CInt+fGetFd = #const F_GETFD+fGetFl :: CInt+fGetFl = #const F_GETFL+fdCloexec :: CInt+fdCloexec = #const FD_CLOEXEC+oNonBlock :: CInt+oNonBlock = #const O_NONBLOCK+# if defined(HAVE_ADVANCED_SOCKET_FLAGS)+sockNonBlock :: CInt+sockNonBlock = #const SOCK_NONBLOCK+sockCloexec :: CInt+sockCloexec = #const SOCK_CLOEXEC+# endif+#endif
+ Network/Socket/Fcntl.hs view
@@ -0,0 +1,60 @@+{-# LANGUAGE CPP #-}++module Network.Socket.Fcntl where++import qualified System.Posix.Internals++#if !defined(mingw32_HOST_OS)+import Network.Socket.Cbits+#endif+import Network.Socket.Imports++-- | Set the nonblocking flag on Unix.+--   On Windows, nothing is done.+setNonBlockIfNeeded :: CInt -> IO ()+setNonBlockIfNeeded fd =+    System.Posix.Internals.setNonBlockingFD fd True++-- | Set the close_on_exec flag on Unix.+--   On Windows, nothing is done.+--+--   Since 2.7.0.0.+setCloseOnExecIfNeeded :: CInt -> IO ()+#if defined(mingw32_HOST_OS) || defined(ghcjs_HOST_OS)+setCloseOnExecIfNeeded _ = return ()+#else+setCloseOnExecIfNeeded fd = System.Posix.Internals.setCloseOnExec fd+#endif++#if !defined(mingw32_HOST_OS)+foreign import ccall unsafe "fcntl"+  c_fcntl_read  :: CInt -> CInt -> CInt -> IO CInt+#endif++-- | Get the close_on_exec flag.+--   On Windows, this function always returns 'False'.+--+--   Since 2.7.0.0.+getCloseOnExec :: CInt -> IO Bool+#if defined(mingw32_HOST_OS) || defined(ghcjs_HOST_OS)+getCloseOnExec _ = return False+#else+getCloseOnExec fd = do+    flags <- c_fcntl_read fd fGetFd 0+    let ret = flags .&. fdCloexec+    return (ret /= 0)+#endif++-- | Get the nonblocking flag.+--   On Windows, this function always returns 'False'.+--+--   Since 2.7.0.0.+getNonBlock :: CInt -> IO Bool+#if defined(mingw32_HOST_OS)+getNonBlock _ = return False+#else+getNonBlock fd = do+    flags <- c_fcntl_read fd fGetFl 0+    let ret = flags .&. oNonBlock+    return (ret /= 0)+#endif
+ Network/Socket/Flag.hsc view
@@ -0,0 +1,99 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE PatternSynonyms #-}++#include "HsNet.h"++module Network.Socket.Flag where++import qualified Data.Semigroup as Sem++import Network.Socket.Imports++{-+import Network.Socket.ReadShow++import qualified Text.Read as P+-}++-- | Message flags. To combine flags, use '(<>)'.+newtype MsgFlag = MsgFlag { fromMsgFlag :: CInt }+                deriving (Show, Eq, Ord, Num, Bits)++instance Sem.Semigroup MsgFlag where+    (<>) = (.|.)++instance Monoid MsgFlag where+    mempty = MsgFlag 0+#if !(MIN_VERSION_base(4,11,0))+    mappend = (Sem.<>)+#endif++-- | Send or receive OOB(out-of-bound) data.+pattern MSG_OOB :: MsgFlag+#ifdef MSG_OOB+pattern MSG_OOB = MsgFlag (#const MSG_OOB)+#else+pattern MSG_OOB = MsgFlag 0+#endif++-- | Bypass routing table lookup.+pattern MSG_DONTROUTE :: MsgFlag+#ifdef MSG_DONTROUTE+pattern MSG_DONTROUTE = MsgFlag (#const MSG_DONTROUTE)+#else+pattern MSG_DONTROUTE = MsgFlag 0+#endif++-- | Peek at incoming message without removing it from the queue.+pattern MSG_PEEK :: MsgFlag+#ifdef MSG_PEEK+pattern MSG_PEEK = MsgFlag (#const MSG_PEEK)+#else+pattern MSG_PEEK = MsgFlag 0+#endif++-- | End of record.+pattern MSG_EOR :: MsgFlag+#ifdef MSG_EOR+pattern MSG_EOR = MsgFlag (#const MSG_EOR)+#else+pattern MSG_EOR = MsgFlag 0+#endif++-- | Received data is truncated. More data exist.+pattern MSG_TRUNC :: MsgFlag+#ifdef MSG_TRUNC+pattern MSG_TRUNC = MsgFlag (#const MSG_TRUNC)+#else+pattern MSG_TRUNC = MsgFlag 0+#endif++-- | Received control message is truncated. More control message exist.+pattern MSG_CTRUNC :: MsgFlag+#ifdef MSG_CTRUNC+pattern MSG_CTRUNC = MsgFlag (#const MSG_CTRUNC)+#else+pattern MSG_CTRUNC = MsgFlag 0+#endif++-- | Wait until the requested number of bytes have been read.+pattern MSG_WAITALL :: MsgFlag+#ifdef MSG_WAITALL+pattern MSG_WAITALL = MsgFlag (#const MSG_WAITALL)+#else+pattern MSG_WAITALL = MsgFlag 0+#endif++{-+msgFlagPairs :: [Pair MsgFlag String]+msgFlagPairs =+    [ (MSG_OOB, "MSG_OOB")+    , (MSG_DONTROUTE, "MSG_DONTROUTE")+    , (MSG_PEEK, "MSG_PEEK")+    , (MSG_EOR, "MSG_EOR")+    , (MSG_TRUNC, "MSG_TRUNC")+    , (MSG_CTRUNC, "MSG_CTRUNC")+    , (MSG_WAITALL, "MSG_WAITALL")+    ]+-}
+ Network/Socket/Handle.hs view
@@ -0,0 +1,28 @@+module Network.Socket.Handle where++import qualified GHC.IO.Device (IODeviceType (Stream))+import GHC.IO.Handle.FD (fdToHandle')+import System.IO (BufferMode (..), Handle, IOMode (..), hSetBuffering)++import Network.Socket.Types++-- | Turns a Socket into an 'Handle'. By default, the new handle is+-- unbuffered. Use 'System.IO.hSetBuffering' to change the buffering.+--+-- Note that since a 'Handle' is automatically closed by a finalizer+-- when it is no longer referenced, you should avoid doing any more+-- operations on the 'Socket' after calling 'socketToHandle'.  To+-- close the 'Socket' after 'socketToHandle', call 'System.IO.hClose'+-- on the 'Handle'.+--+-- 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-}+    hSetBuffering h NoBuffering+    return h+  where+    err _ = ioError $ userError $ "socketToHandle: socket is no longer valid"
+ Network/Socket/If.hs view
@@ -0,0 +1,38 @@+{-# LANGUAGE CPP #-}++#include "HsNetDef.h"++module Network.Socket.If (+    ifNameToIndex+  , ifIndexToName+  ) where++import Foreign.Marshal.Alloc (allocaBytes)++import Network.Socket.Imports++-- | Returns the index corresponding to the interface name.+--+--   Since 2.7.0.0.+ifNameToIndex :: String -> IO (Maybe Int)+ifNameToIndex ifname = do+  index <- withCString ifname c_if_nametoindex+  -- On failure zero is returned. We'll return Nothing.+  return $ if index == 0 then Nothing else Just $ fromIntegral index++-- | Returns the interface name corresponding to the index.+--+--   Since 2.7.0.0.+ifIndexToName :: Int -> IO (Maybe String)+ifIndexToName ifn = allocaBytes 16 $ \ptr -> do -- 16 == IFNAMSIZ+    r <- c_if_indextoname (fromIntegral ifn) ptr+    if r == nullPtr then+        return Nothing+      else+        Just <$> peekCString ptr++foreign import CALLCONV safe "if_nametoindex"+   c_if_nametoindex :: CString -> IO CUInt++foreign import CALLCONV safe "if_indextoname"+   c_if_indextoname :: CUInt -> CString -> IO CString
+ Network/Socket/Imports.hs view
@@ -0,0 +1,31 @@+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++import Control.Applicative+import Control.Monad+import Data.Bits+import Data.Int+import Data.List+import Data.Maybe+import Data.Monoid+import Data.Ord+import Data.Word+import Foreign.C.String+import Foreign.C.Types+import Foreign.Ptr+import Foreign.Storable+import Numeric
+ Network/Socket/Info.hsc view
@@ -0,0 +1,519 @@+{-# 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))+import System.IO.Error (ioeSetErrorString, mkIOError)++import Network.Socket.Imports+import Network.Socket.Internal+import Network.Socket.Syscall+import Network.Socket.Types++-----------------------------------------------------------------------------++-- | Either a host name e.g., @\"haskell.org\"@ or a numeric host+-- address string consisting of a dotted decimal IPv4 address or an+-- IPv6 address e.g., @\"192.168.0.1\"@.+type HostName       = String+-- | Either a service name e.g., @\"http\"@ or a numeric port number.+type ServiceName    = String++-----------------------------------------------------------------------------+-- Address and service lookups++-- | Flags that control the querying behaviour of 'getAddrInfo'.+--   For more information, see <https://tools.ietf.org/html/rfc3493#page-25>+data AddrInfoFlag =+    -- | The list of returned 'AddrInfo' values will+    --   only contain IPv4 addresses if the local system has at least+    --   one IPv4 interface configured, and likewise for IPv6.+    --   (Only some platforms support this.)+      AI_ADDRCONFIG+    -- | If 'AI_ALL' is specified, return all matching IPv6 and+    --   IPv4 addresses.  Otherwise, this flag has no effect.+    --   (Only some platforms support this.)+    | AI_ALL+    -- | The 'addrCanonName' field of the first returned+    --   'AddrInfo' will contain the "canonical name" of the host.+    | AI_CANONNAME+    -- | The 'HostName' argument /must/ be a numeric+    --   address in string form, and network name lookups will not be+    --   attempted.+    | AI_NUMERICHOST+    -- | The 'ServiceName' argument /must/ be a port+    --   number in string form, and service name lookups will not be+    --   attempted. (Only some platforms support this.)+    | AI_NUMERICSERV+    -- | If no 'HostName' value is provided, the network+    --   address in each 'SockAddr'+    --   will be left as a "wild card".+    --   This is useful for server applications that+    --   will accept connections from any client.+    | AI_PASSIVE+    -- | If an IPv6 lookup is performed, and no IPv6+    --   addresses are found, IPv6-mapped IPv4 addresses will be+    --   returned. (Only some platforms support this.)+    | AI_V4MAPPED+    deriving (Eq, Read, Show)++aiFlagMapping :: [(AddrInfoFlag, CInt)]++aiFlagMapping =+    [+#if HAVE_DECL_AI_ADDRCONFIG+     (AI_ADDRCONFIG, #const AI_ADDRCONFIG),+#else+     (AI_ADDRCONFIG, 0),+#endif+#if HAVE_DECL_AI_ALL+     (AI_ALL, #const AI_ALL),+#else+     (AI_ALL, 0),+#endif+     (AI_CANONNAME, #const AI_CANONNAME),+     (AI_NUMERICHOST, #const AI_NUMERICHOST),+#if HAVE_DECL_AI_NUMERICSERV+     (AI_NUMERICSERV, #const AI_NUMERICSERV),+#else+     (AI_NUMERICSERV, 0),+#endif+     (AI_PASSIVE, #const AI_PASSIVE),+#if HAVE_DECL_AI_V4MAPPED+     (AI_V4MAPPED, #const AI_V4MAPPED)+#else+     (AI_V4MAPPED, 0)+#endif+    ]++-- | Indicate whether the given 'AddrInfoFlag' will have any effect on+-- this system.+addrInfoFlagImplemented :: AddrInfoFlag -> Bool+addrInfoFlagImplemented f = packBits aiFlagMapping [f] /= 0++data AddrInfo = AddrInfo {+    addrFlags :: [AddrInfoFlag]+  , addrFamily :: Family+  , addrSocketType :: SocketType+  , addrProtocol :: ProtocolNumber+  , addrAddress :: SockAddr+  , addrCanonName :: Maybe String+  } deriving (Eq, Show)++instance Storable AddrInfo where+    sizeOf    ~_ = #const sizeof(struct addrinfo)+    alignment ~_ = alignment (0 :: CInt)++    peek p = do+        ai_flags <- (#peek struct addrinfo, ai_flags) p+        ai_family <- (#peek struct addrinfo, ai_family) p+        ai_socktype <- (#peek struct addrinfo, ai_socktype) p+        ai_protocol <- (#peek struct addrinfo, ai_protocol) p+        ai_addr <- (#peek struct addrinfo, ai_addr) p >>= peekSockAddr+        ai_canonname_ptr <- (#peek struct addrinfo, ai_canonname) p++        ai_canonname <- if ai_canonname_ptr == nullPtr+                        then return Nothing+                        else Just <$> peekCString ai_canonname_ptr++        return $ AddrInfo {+            addrFlags = unpackBits aiFlagMapping ai_flags+          , addrFamily = unpackFamily ai_family+          , addrSocketType = unpackSocketType ai_socktype+          , addrProtocol = ai_protocol+          , addrAddress = ai_addr+          , addrCanonName = ai_canonname+          }++    poke p (AddrInfo flags family sockType protocol _ _) = do+        let c_stype = packSocketType sockType++        (#poke struct addrinfo, ai_flags) p (packBits aiFlagMapping flags)+        (#poke struct addrinfo, ai_family) p (packFamily family)+        (#poke struct addrinfo, ai_socktype) p c_stype+        (#poke struct addrinfo, ai_protocol) p protocol++        -- stuff below is probably not needed, but let's zero it for safety++        (#poke struct addrinfo, ai_addrlen) p (0::CSize)+        (#poke struct addrinfo, ai_addr) p nullPtr+        (#poke struct addrinfo, ai_canonname) p nullPtr+        (#poke struct addrinfo, ai_next) p nullPtr++-- | Flags that control the querying behaviour of 'getNameInfo'.+--   For more information, see <https://tools.ietf.org/html/rfc3493#page-30>+data NameInfoFlag =+    -- | Resolve a datagram-based service name.  This is+    --   required only for the few protocols that have different port+    --   numbers for their datagram-based versions than for their+    --   stream-based versions.+      NI_DGRAM+    -- | If the hostname cannot be looked up, an IO error is thrown.+    | NI_NAMEREQD+    -- | If a host is local, return only the hostname part of the FQDN.+    | NI_NOFQDN+    -- | The name of the host is not looked up.+    --   Instead, a numeric representation of the host's+    --   address is returned.  For an IPv4 address, this will be a+    --   dotted-quad string.  For IPv6, it will be colon-separated+    --   hexadecimal.+    | NI_NUMERICHOST+    -- | The name of the service is not+    --   looked up.  Instead, a numeric representation of the+    --   service is returned.+    | NI_NUMERICSERV+    deriving (Eq, Read, Show)++niFlagMapping :: [(NameInfoFlag, CInt)]++niFlagMapping = [(NI_DGRAM, #const NI_DGRAM),+                 (NI_NAMEREQD, #const NI_NAMEREQD),+                 (NI_NOFQDN, #const NI_NOFQDN),+                 (NI_NUMERICHOST, #const NI_NUMERICHOST),+                 (NI_NUMERICSERV, #const NI_NUMERICSERV)]++-- | Default hints for address lookup with 'getAddrInfo'.+--+-- >>> addrFlags defaultHints+-- []+-- >>> addrFamily defaultHints+-- AF_UNSPEC+-- >>> addrSocketType defaultHints+-- NoSocketType+-- >>> addrProtocol defaultHints+-- 0++defaultHints :: AddrInfo+defaultHints = AddrInfo {+    addrFlags      = []+  , addrFamily     = AF_UNSPEC+  , addrSocketType = NoSocketType+  , addrProtocol   = defaultProtocol+  , addrAddress    = SockAddrInet 0 0+  , addrCanonName  = Nothing+  }++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++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 (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 = 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       <- release (followAddrInfo ptr_addrs) `onException` c_freeaddrinfo ptr_addrs+            c_freeaddrinfo ptr_addrs+            return ais+          else do+            err <- gai_strerror ret+            ioError $ ioeSetErrorString+                        (mkIOError NoSuchThing message Nothing Nothing)+                        err+    message = concat [+        "Network.Socket.getAddrInfo (called with preferred socket type/protocol: "+      , maybe "Nothing" show hints+      , ", host name: "+      , maybe "Nothing" show node+      , ", service name: "+      , maybe "Nothing" show service+      , ")"+      ]+#if defined(darwin_HOST_OS)+    -- Leaving out the service and using AI_NUMERICSERV causes a+    -- segfault on OS X 10.8.2. This code removes AI_NUMERICSERV+    -- (which has no effect) in that case.+    toHints h = h { addrFlags = delete AI_NUMERICSERV (addrFlags h) }+    filteredHints = case service of+        Nothing -> toHints <$> hints+        _       -> hints+#else+    filteredHints = hints+#endif++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+    -- 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+        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)+                  -> IO CInt++foreign import ccall safe "hsnet_freeaddrinfo"+    c_freeaddrinfo :: Ptr AddrInfo -> IO ()++gai_strerror :: CInt -> IO String++#ifdef HAVE_GAI_STRERROR+gai_strerror n = c_gai_strerror n >>= peekCString++foreign import ccall safe "gai_strerror"+    c_gai_strerror :: CInt -> IO CString+#else+gai_strerror n = ioError $ userError $ "Network.Socket.gai_strerror not supported: " ++ show n+#endif++-----------------------------------------------------------------------------++withCStringIf :: Bool -> Int -> (CSize -> CString -> IO a) -> IO a+withCStringIf False _ f = f 0 nullPtr+withCStringIf True  n f = allocaBytes n (f (fromIntegral n))++-- | Resolve an address to a host or service name.+-- This function is protocol independent.+-- The list of 'NameInfoFlag' values controls query behaviour.+--+-- If a host or service's name cannot be looked up, then the numeric+-- form of the address or service will be returned.+--+-- If the query fails, this function throws an IO exception.+--+-- >>> addr:_ <- getAddrInfo (Just defaultHints) (Just "127.0.0.1") (Just "http")+-- >>> getNameInfo [NI_NUMERICHOST, NI_NUMERICSERV] True True $ addrAddress addr+-- (Just "127.0.0.1",Just "80")+{-+-- >>> getNameInfo [] True True $ addrAddress addr+-- (Just "localhost",Just "http")+-}+getNameInfo+    :: [NameInfoFlag] -- ^ flags to control lookup behaviour+    -> Bool -- ^ whether to look up a hostname+    -> Bool -- ^ whether to look up a service name+    -> SockAddr -- ^ the address to look up+    -> IO (Maybe HostName, Maybe ServiceName)+getNameInfo flags doHost doService addr = alloc getnameinfo+  where+    alloc body = withSocketsDo $+        withCStringIf doHost (# const NI_MAXHOST)        $ \c_hostlen c_host ->+            withCStringIf doService (# const NI_MAXSERV) $ \c_servlen c_serv ->+                withSockAddr addr                        $ \ptr_addr sz ->+                  body c_hostlen c_host c_servlen c_serv ptr_addr sz+    getnameinfo c_hostlen c_host c_servlen c_serv ptr_addr sz = do+        ret <- c_getnameinfo ptr_addr+                             (fromIntegral sz)+                             c_host+                             c_hostlen+                             c_serv+                             c_servlen+                             (packBits niFlagMapping flags)+        if ret == 0 then do+            let peekIf doIf c_val =+                    if doIf then Just <$> peekCString c_val else return Nothing+            host <- peekIf doHost c_host+            serv <- peekIf doService c_serv+            return (host, serv)+          else do+            err <- gai_strerror ret+            ioError $ ioeSetErrorString+                        (mkIOError NoSuchThing message Nothing Nothing)+                        err+    message = concat [+        "Network.Socket.getNameInfo (called with flags: "+      , show flags+      , ", hostname lookup: "+      , show doHost+      , ", service name lookup: "+      , show doService+      , ", socket address: "+      , show addr+      , ")"+      ]++foreign import ccall safe "hsnet_getnameinfo"+    c_getnameinfo :: Ptr SockAddr -> CInt{-CSockLen???-} -> CString -> CSize -> CString+                  -> CSize -> CInt -> IO CInt++-- | Pack a list of values into a bitmask.  The possible mappings from+-- value to bit-to-set are given as the first argument.  We assume+-- that each value can cause exactly one bit to be set; unpackBits will+-- break if this property is not true.++-----------------------------------------------------------------------------++packBits :: (Eq a, Num b, Bits b) => [(a, b)] -> [a] -> b+packBits mapping xs = foldl' pack 0 mapping+  where+    pack acc (k, v) | k `elem` xs = acc .|. v+                    | otherwise   = acc++-- | Unpack a bitmask into a list of values.+unpackBits :: (Num b, Bits b) => [(a, b)] -> b -> [a]+-- Be permissive and ignore unknown bit values. At least on OS X,+-- getaddrinfo returns an ai_flags field with bits set that have no+-- entry in <netdb.h>.+unpackBits [] _    = []+unpackBits ((k,v):xs) r+    | r .&. v /= 0 = k : unpackBits xs (r .&. complement v)+    | otherwise    = unpackBits xs r++-----------------------------------------------------------------------------+-- SockAddr++-- |+--+-- >>> 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..]++-----------------------------------------------------------------------------++-- | A utility function to open a socket with `AddrInfo`.+-- This is a just wrapper for the following code:+--+-- > \addr -> socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+openSocket :: AddrInfo -> IO Socket+openSocket addr = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
+ Network/Socket/Internal.hs view
@@ -0,0 +1,290 @@+{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++#include "HsNetDef.h"++-----------------------------------------------------------------------------+-- |+-- Module      :  Network.Socket.Internal+-- Copyright   :  (c) The University of Glasgow 2001+-- License     :  BSD-style (see the file libraries/network/LICENSE)+--+-- Maintainer  :  libraries@haskell.org+-- Stability   :  provisional+-- Portability :  portable+--+-- A module containing semi-public "Network.Socket" internals.+-- Modules which extend the "Network.Socket" module will need to use+-- this module while ideally most users will be able to make do with+-- the public interface.+--+-----------------------------------------------------------------------------++module Network.Socket.Internal+    (+    -- * Socket error functions+      throwSocketError+    , throwSocketErrorCode+#if defined(mingw32_HOST_OS)+    , c_getLastError+#endif++    -- * Guards for socket operations that may fail+    , throwSocketErrorIfMinus1_+    , throwSocketErrorIfMinus1Retry+    , throwSocketErrorIfMinus1Retry_+    , throwSocketErrorIfMinus1RetryMayBlock+#if defined(mingw32_HOST_OS)+    , throwSocketErrorIfMinus1ButRetry+#endif+    -- ** Guards that wait and retry if the operation would block+    -- | These guards are based on 'throwSocketErrorIfMinus1RetryMayBlock'.+    -- They wait for socket readiness if the action fails with @EWOULDBLOCK@+    -- or similar.+    , throwSocketErrorWaitRead+    , throwSocketErrorWaitReadBut+    , throwSocketErrorWaitWrite++    -- * Initialization+    , withSocketsDo++    -- * Null socket address type+    , NullSockAddr (..)++    -- * Low-level helpers+    , zeroMemory+    ) where++import GHC.Conc (threadWaitRead, threadWaitWrite)++#if defined(mingw32_HOST_OS)+import Control.Exception (evaluate)+import System.IO.Unsafe (unsafePerformIO)+# if __GLASGOW_HASKELL__ >= 707+import GHC.IO.Exception (IOErrorType(..))+# else+import GHC.IOBase (IOErrorType(..))+# endif+import System.IO.Error (ioeSetErrorString, mkIOError)+#else+import Foreign.C.Error (throwErrno, throwErrnoIfMinus1Retry,+                        throwErrnoIfMinus1RetryMayBlock, throwErrnoIfMinus1_,+                        Errno(..), errnoToIOError)+#endif++#if defined(mingw32_HOST_OS)+import Network.Socket.Cbits+#endif+import Network.Socket.Imports+import Network.Socket.Types++-- ---------------------------------------------------------------------+-- Guards for socket operations that may fail++-- | Throw an 'IOError' corresponding to the current socket error.+throwSocketError :: String  -- ^ textual description of the error location+                 -> IO a++-- | Like 'throwSocketError', but the error code is supplied as an argument.+--+-- On Windows, do not use errno.  Use a system error code instead.+throwSocketErrorCode :: String -> CInt -> IO a++-- | Throw an 'IOError' corresponding to the current socket error if+-- the IO action returns a result of @-1@.  Discards the result of the+-- IO action after error handling.+throwSocketErrorIfMinus1_+    :: (Eq a, Num a)+    => String  -- ^ textual description of the location+    -> IO a    -- ^ the 'IO' operation to be executed+    -> IO ()++{-# SPECIALIZE throwSocketErrorIfMinus1_ :: String -> IO CInt -> IO () #-}++-- | Throw an 'IOError' corresponding to the current socket error if+-- the IO action returns a result of @-1@, but retries in case of an+-- interrupted operation.+throwSocketErrorIfMinus1Retry+    :: (Eq a, Num a)+    => String  -- ^ textual description of the location+    -> IO a    -- ^ the 'IO' operation to be executed+    -> IO a++{-# SPECIALIZE throwSocketErrorIfMinus1Retry :: String -> IO CInt -> IO CInt #-}++-- | Throw an 'IOError' corresponding to the current socket error if+-- the IO action returns a result of @-1@, but retries in case of an+-- interrupted operation. Discards the result of the IO action after+-- error handling.+throwSocketErrorIfMinus1Retry_+    :: (Eq a, Num a)+    => String  -- ^ textual description of the location+    -> IO a    -- ^ the 'IO' operation to be executed+    -> IO ()+throwSocketErrorIfMinus1Retry_ loc m =+    void $ throwSocketErrorIfMinus1Retry loc m+{-# SPECIALIZE throwSocketErrorIfMinus1Retry_ :: String -> IO CInt -> IO () #-}++-- | Throw an 'IOError' corresponding to the current socket error if+-- the IO action returns a result of @-1@, but retries in case of an+-- interrupted operation.  Checks for operations that would block and+-- executes an alternative action before retrying in that case.+throwSocketErrorIfMinus1RetryMayBlock+    :: (Eq a, Num a)+    => String  -- ^ textual description of the location+    -> IO b    -- ^ action to execute before retrying if an+               --   immediate retry would block+    -> IO a    -- ^ the 'IO' operation to be executed+    -> IO a++{-# SPECIALIZE throwSocketErrorIfMinus1RetryMayBlock+        :: String -> IO b -> IO CInt -> IO CInt #-}+++-- | Throw an 'IOError' corresponding to the current socket error if+-- the IO action returns a result of @-1@, but retries in case of an+-- interrupted operation.  Checks for operations that would block and+-- executes an alternative action before retrying in that case.  If the error+-- is one handled by the exempt filter then ignore it and return the error code.+throwSocketErrorIfMinus1RetryMayBlockBut+    :: (Eq a, Num a)+    => (CInt -> Bool) -- ^ exception exempt filter+    -> String         -- ^ textual description of the location+    -> IO b           -- ^ action to execute before retrying if an+                      --   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++throwSocketErrorIfMinus1_ name act = do+  _ <- throwSocketErrorIfMinus1Retry name act+  return ()++throwSocketErrorIfMinus1ButRetry :: (Eq a, Num a) =>+                                    (CInt -> Bool) -> String -> IO a -> IO a+throwSocketErrorIfMinus1ButRetry exempt name act = do+  r <- act+  if (r == -1)+   then do+    rc <- c_getLastError+    if rc == wsaNotInitialized then do+        withSocketsDo (return ())+        r' <- act+        if (r' == -1)+           then throwSocketError name+           else return r'+      else+        if (exempt rc)+          then return r+          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,+-- and try again.+throwSocketErrorWaitRead :: (Eq a, Num a) => Socket -> String -> IO a -> IO a+throwSocketErrorWaitRead s name io = withFdSocket s $ \fd ->+    throwSocketErrorIfMinus1RetryMayBlock name+      (threadWaitRead $ fromIntegral fd) io++-- | Like 'throwSocketErrorIfMinus1Retry', but if the action fails with+-- @EWOULDBLOCK@ or similar, wait for the socket to be read-ready,+-- and try again.  If it fails with the error the user was expecting then+-- ignore the error+throwSocketErrorWaitReadBut :: (Eq a, Num a) => (CInt -> Bool) -> Socket -> String -> IO a -> IO a+throwSocketErrorWaitReadBut exempt s name io = withFdSocket s $ \fd ->+    throwSocketErrorIfMinus1RetryMayBlockBut exempt name+      (threadWaitRead $ fromIntegral fd) io++-- | Like 'throwSocketErrorIfMinus1Retry', but if the action fails with+-- @EWOULDBLOCK@ or similar, wait for the socket to be write-ready,+-- and try again.+throwSocketErrorWaitWrite :: (Eq a, Num a) => Socket -> String -> IO a -> IO a+throwSocketErrorWaitWrite s name io = withFdSocket s $ \fd ->+    throwSocketErrorIfMinus1RetryMayBlock name+      (threadWaitWrite $ fromIntegral fd) io++-- ---------------------------------------------------------------------------+-- WinSock support++{-| With older versions of the @network@ library (version 2.6.0.2 or earlier)+on Windows operating systems,+the networking subsystem must be initialised using 'withSocketsDo' before+any networking operations can be used. eg.++> main = withSocketsDo $ do {...}++It is fine to nest calls to 'withSocketsDo', and to perform networking operations+after 'withSocketsDo' has returned.++'withSocketsDo' is not necessary for the current network library.+However, for compatibility with older versions on Windows, it is good practice+to always call 'withSocketsDo' (it's very cheap).+-}+{-# INLINE withSocketsDo #-}+withSocketsDo :: IO a -> IO a+#if defined(mingw32_HOST_OS)++withSocketsDo act = evaluate withSocketsInit >> act++{-# NOINLINE withSocketsInit #-}+withSocketsInit :: ()+-- Use a CAF to make forcing it do initialisation once, but subsequent forces will be cheap+withSocketsInit = unsafePerformIO $ do+    x <- initWinSock+    when (x /= 0) $ ioError $+      userError "Network.Socket.Internal.withSocketsDo: Failed to initialise WinSock"++foreign import ccall unsafe "initWinSock" initWinSock :: IO Int++#else++withSocketsDo x = x++#endif
− Network/Socket/Internal.hsc
@@ -1,277 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ForeignFunctionInterface #-}-{-# OPTIONS_GHC -fno-warn-orphans #-}--------------------------------------------------------------------------------- |--- Module      :  Network.Socket.Internal--- Copyright   :  (c) The University of Glasgow 2001--- License     :  BSD-style (see the file libraries/network/LICENSE)------ Maintainer  :  libraries@haskell.org--- Stability   :  provisional--- Portability :  portable------ A module containing semi-public 'Network.Socket' internals.--- Modules which extend the 'Network.Socket' module will need to use--- this module while ideally most users will be able to make do with--- the public interface.-----------------------------------------------------------------------------------#include "HsNet.h"-##include "HsNetDef.h"--module Network.Socket.Internal-    (-    -- * Socket addresses-      HostAddress-#if defined(IPV6_SOCKET_SUPPORT)-    , HostAddress6-    , FlowInfo-    , ScopeID-#endif-    , PortNumber(..)-    , SockAddr(..)--    , peekSockAddr-    , pokeSockAddr-    , sizeOfSockAddr-    , sizeOfSockAddrByFamily-    , withSockAddr-    , withNewSockAddr--    -- * Protocol families-    , Family(..)--    -- * Socket error functions-#if defined(HAVE_WINSOCK2_H)-    , c_getLastError-#endif-    , throwSocketError-    , throwSocketErrorCode--    -- * Guards for socket operations that may fail-    , throwSocketErrorIfMinus1_-    , throwSocketErrorIfMinus1Retry-    , throwSocketErrorIfMinus1Retry_-    , throwSocketErrorIfMinus1RetryMayBlock--    -- ** Guards that wait and retry if the operation would block-    -- | These guards are based on 'throwSocketErrorIfMinus1RetryMayBlock'.-    -- They wait for socket readiness if the action fails with @EWOULDBLOCK@-    -- or similar.-    , throwSocketErrorWaitRead-    , throwSocketErrorWaitWrite--    -- * Initialization-    , withSocketsDo--    -- * Low-level helpers-    , zeroMemory-    ) where--import Foreign.C.Error (throwErrno, throwErrnoIfMinus1Retry,-                        throwErrnoIfMinus1RetryMayBlock, throwErrnoIfMinus1_,-                        Errno(..), errnoToIOError)-#if defined(HAVE_WINSOCK2_H)-import Foreign.C.String (peekCString)-import Foreign.Ptr (Ptr)-#endif-import Foreign.C.Types (CInt(..))-import GHC.Conc (threadWaitRead, threadWaitWrite)--#if defined(HAVE_WINSOCK2_H)-import Control.Exception ( evaluate )-import System.IO.Unsafe ( unsafePerformIO )-import Control.Monad ( when )-#  if __GLASGOW_HASKELL__ >= 707-import GHC.IO.Exception ( IOErrorType(..) )-#  else-import GHC.IOBase ( IOErrorType(..) )-#  endif-import Foreign.C.Types ( CChar )-import System.IO.Error ( ioeSetErrorString, mkIOError )-#endif--import Network.Socket.Types---- ------------------------------------------------------------------------ Guards for socket operations that may fail---- | Throw an 'IOError' corresponding to the current socket error.-throwSocketError :: String  -- ^ textual description of the error location-                 -> IO a---- | Like 'throwSocketError', but the error code is supplied as an argument.------ On Windows, do not use errno.  Use a system error code instead.-throwSocketErrorCode :: String -> CInt -> IO a---- | Throw an 'IOError' corresponding to the current socket error if--- the IO action returns a result of @-1@.  Discards the result of the--- IO action after error handling.-throwSocketErrorIfMinus1_-    :: (Eq a, Num a)-    => String  -- ^ textual description of the location-    -> IO a    -- ^ the 'IO' operation to be executed-    -> IO ()--{-# SPECIALIZE throwSocketErrorIfMinus1_ :: String -> IO CInt -> IO () #-}---- | Throw an 'IOError' corresponding to the current socket error if--- the IO action returns a result of @-1@, but retries in case of an--- interrupted operation.-throwSocketErrorIfMinus1Retry-    :: (Eq a, Num a)-    => String  -- ^ textual description of the location-    -> IO a    -- ^ the 'IO' operation to be executed-    -> IO a--{-# SPECIALIZE throwSocketErrorIfMinus1Retry :: String -> IO CInt -> IO CInt #-}---- | Throw an 'IOError' corresponding to the current socket error if--- the IO action returns a result of @-1@, but retries in case of an--- interrupted operation. Discards the result of the IO action after--- error handling.-throwSocketErrorIfMinus1Retry_-    :: (Eq a, Num a)-    => String  -- ^ textual description of the location-    -> IO a    -- ^ the 'IO' operation to be executed-    -> IO ()-throwSocketErrorIfMinus1Retry_ loc m =-    throwSocketErrorIfMinus1Retry loc m >> return ()-{-# SPECIALIZE throwSocketErrorIfMinus1Retry_ :: String -> IO CInt -> IO () #-}---- | Throw an 'IOError' corresponding to the current socket error if--- the IO action returns a result of @-1@, but retries in case of an--- interrupted operation.  Checks for operations that would block and--- executes an alternative action before retrying in that case.-throwSocketErrorIfMinus1RetryMayBlock-    :: (Eq a, Num a)-    => String  -- ^ textual description of the location-    -> IO b    -- ^ action to execute before retrying if an-               --   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(HAVE_WINSOCK2_H))--throwSocketErrorIfMinus1RetryMayBlock 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)--#else--throwSocketErrorIfMinus1RetryMayBlock name _ act-  = throwSocketErrorIfMinus1Retry name act--throwSocketErrorIfMinus1_ name act = do-  throwSocketErrorIfMinus1Retry name act-  return ()--# if defined(HAVE_WINSOCK2_H)-throwSocketErrorIfMinus1Retry name act = do-  r <- act-  if (r == -1)-   then do-    rc   <- c_getLastError-    case rc of-      #{const WSANOTINITIALISED} -> do-        withSocketsDo (return ())-        r <- act-        if (r == -1)-           then throwSocketError name-           else return r-      _ -> throwSocketError name-   else return r--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-throwSocketErrorIfMinus1Retry = throwErrnoIfMinus1Retry-throwSocketError = throwErrno-throwSocketErrorCode loc errno =-    ioError (errnoToIOError loc (Errno errno) Nothing Nothing)-# endif-#endif---- | Like 'throwSocketErrorIfMinus1Retry', but if the action fails with--- @EWOULDBLOCK@ or similar, wait for the socket to be read-ready,--- and try again.-throwSocketErrorWaitRead :: (Eq a, Num a) => Socket -> String -> IO a -> IO a-throwSocketErrorWaitRead sock name io =-    throwSocketErrorIfMinus1RetryMayBlock name-        (threadWaitRead $ fromIntegral $ fdSocket sock)-        io---- | Like 'throwSocketErrorIfMinus1Retry', but if the action fails with--- @EWOULDBLOCK@ or similar, wait for the socket to be write-ready,--- and try again.-throwSocketErrorWaitWrite :: (Eq a, Num a) => Socket -> String -> IO a -> IO a-throwSocketErrorWaitWrite sock name io =-    throwSocketErrorIfMinus1RetryMayBlock name-        (threadWaitWrite $ fromIntegral $ fdSocket sock)-        io---- ------------------------------------------------------------------------------ WinSock support--{-| With older versions of the @network@ library (version 2.6.0.2 or earlier)-on Windows operating systems,-the networking subsystem must be initialised using 'withSocketsDo' before-any networking operations can be used. eg.--> main = withSocketsDo $ do {...}--It is fine to nest calls to 'withSocketsDo', and to perform networking operations-after 'withSocketsDo' has returned.--In newer versions of the @network@ library (version v2.6.1.0 or later)-it is only necessary to call-'withSocketsDo' if you are calling the 'MkSocket' constructor directly.-However, for compatibility with older versions on Windows, it is good practice-to always call 'withSocketsDo' (it's very cheap).--}-{-# INLINE withSocketsDo #-}-withSocketsDo :: IO a -> IO a-#if !defined(WITH_WINSOCK)-withSocketsDo x = x-#else-withSocketsDo act = evaluate withSocketsInit >> act---{-# NOINLINE withSocketsInit #-}-withSocketsInit :: ()--- Use a CAF to make forcing it do initialisation once, but subsequent forces will be cheap-withSocketsInit = unsafePerformIO $ do-    x <- initWinSock-    when (x /= 0) $ ioError $-      userError "Network.Socket.Internal.withSocketsDo: Failed to initialise WinSock"--foreign import ccall unsafe "initWinSock" initWinSock :: IO Int--#endif
+ Network/Socket/Name.hs view
@@ -0,0 +1,70 @@+{-# LANGUAGE CPP #-}++#include "HsNetDef.h"++module Network.Socket.Name (+    getPeerName+  , getSocketName+  , socketPort+  , socketPortSafe+  ) where++import Foreign.Marshal.Utils (with)++import Network.Socket.Imports+import Network.Socket.Internal+import Network.Socket.Types++-- | Getting peer's socket address.+getPeerName :: SocketAddress sa => Socket -> IO sa+getPeerName s =+ withNewSocketAddress $ \ptr sz ->+   with (fromIntegral sz) $ \int_star -> withFdSocket s $ \fd -> do+     throwSocketErrorIfMinus1Retry_ "Network.Socket.getPeerName" $+       c_getpeername fd ptr int_star+     _sz <- peek int_star+     peekSocketAddress ptr++-- | Getting my socket address.+getSocketName :: SocketAddress sa => Socket -> IO sa+getSocketName s =+ withNewSocketAddress $ \ptr sz ->+   with (fromIntegral sz) $ \int_star -> withFdSocket s $ \fd -> do+     throwSocketErrorIfMinus1Retry_ "Network.Socket.getSocketName" $+       c_getsockname fd ptr int_star+     peekSocketAddress ptr++foreign import CALLCONV unsafe "getpeername"+  c_getpeername :: CInt -> Ptr sa -> Ptr CInt -> IO CInt+foreign import CALLCONV unsafe "getsockname"+  c_getsockname :: CInt -> Ptr sa -> Ptr CInt -> IO CInt++-- ---------------------------------------------------------------------------+-- socketPort+--+-- The port number the given socket is currently connected to can be+-- determined by calling $port$, is generally only useful when bind+-- was given $aNY\_PORT$.++-- | Getting the port of socket.+--   `IOError` is thrown if a port is not available.+socketPort :: Socket            -- Connected & Bound Socket+           -> IO PortNumber     -- Port Number of Socket+socketPort s = do+    sa <- getSocketName s+    case sa of+      SockAddrInet port _      -> return port+      SockAddrInet6 port _ _ _ -> return port+      _                        -> ioError $ userError "Network.Socket.socketPort: AF_UNIX not supported."++-- ---------------------------------------------------------------------------+-- socketPortSafe+-- | Getting the port of socket.+socketPortSafe :: Socket                -- Connected & Bound Socket+               -> IO (Maybe PortNumber) -- Port Number of Socket+socketPortSafe s = do+    sa <- getSocketName s+    return $ case sa of+      SockAddrInet port _      -> Just port+      SockAddrInet6 port _ _ _ -> Just port+      _                        -> Nothing
+ Network/Socket/Options.hsc view
@@ -0,0 +1,564 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE GADTs #-}++#include "HsNet.h"+##include "HsNetDef.h"++module Network.Socket.Options (+    SocketOption(SockOpt+                ,UnsupportedSocketOption+                ,AcceptConn,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+                ,CustomSockOpt)+  , isSupportedSocketOption+  , whenSupported+  , getSocketType+  , getSocketOption+  , setSocketOption+  , getSockOpt+  , setSockOpt+  , SockOptValue (..)+  , setSockOptValue+  , StructLinger (..)+  , SocketTimeout (..)+  ) where++import qualified Text.Read as P++import Foreign.Marshal.Alloc (alloca)+import Foreign.Marshal.Utils (with)++import Network.Socket.Imports+import Network.Socket.Internal+import Network.Socket.Types+import Network.Socket.ReadShow++#include <sys/time.h>++----------------------------------------------------------------+-- Socket Properties++-- | Socket options for use with 'setSocketOption' and 'getSocketOption'.+--+-- The existence of a constructor does not imply that the relevant option+-- is supported on your system: see 'isSupportedSocketOption'+data SocketOption = SockOpt+#if __GLASGOW_HASKELL__ >= 806+    CInt -- ^ Option Level+    CInt -- ^ Option Name+#else+    CInt -- Option Level+    CInt -- Option Name+#endif+  deriving (Eq)++----------------------------------------------------------------++socketOptionBijection :: Bijection SocketOption String+socketOptionBijection =+    [ (UnsupportedSocketOption, "UnsupportedSocketOption")+    , (Debug, "Debug")+    , (ReuseAddr, "ReuseAddr")+    , (SoDomain, "SoDomain")+    , (Type, "Type")+    , (SoProtocol, "SoProtocol")+    , (SoError, "SoError")+    , (DontRoute, "DontRoute")+    , (Broadcast, "Broadcast")+    , (SendBuffer, "SendBuffer")+    , (RecvBuffer, "RecvBuffer")+    , (KeepAlive, "KeepAlive")+    , (KeepInit, "KeepInit")+    , (OOBInline, "OOBInline")+    , (Linger, "Linger")+    , (ReusePort, "ReusePort")+    , (RecvLowWater, "RecvLowWater")+    , (SendLowWater, "SendLowWater")+    , (RecvTimeOut, "RecvTimeOut")+    , (SendTimeOut, "SendTimeOut")+    , (UseLoopBack, "UseLoopBack")+    , (MaxSegment, "MaxSegment")+    , (NoDelay, "NoDelay")+    , (UserTimeout, "UserTimeout")+    , (Cork, "Cork")+    , (TimeToLive, "TimeToLive")+    , (RecvIPv4TTL, "RecvIPv4TTL")+    , (RecvIPv4TOS, "RecvIPv4TOS")+    , (RecvIPv4PktInfo, "RecvIPv4PktInfo")+    , (DontFragment, "DontFragment")+    , (IPv6Only, "IPv6Only")+    , (RecvIPv6HopLimit, "RecvIPv6HopLimit")+    , (RecvIPv6TClass, "RecvIPv6TClass")+    , (RecvIPv6PktInfo, "RecvIPv6PktInfo")+    ]++instance Show SocketOption where+    showsPrec = bijectiveShow socketOptionBijection def+      where+        defname = "SockOpt"+        unwrap = \(CustomSockOpt nm) -> nm+        def = defShow defname unwrap showIntInt+++instance Read SocketOption where+    readPrec = bijectiveRead socketOptionBijection def+      where+        defname = "SockOpt"+        def = defRead defname CustomSockOpt readIntInt++----------------------------------------------------------------++pattern UnsupportedSocketOption :: SocketOption+pattern UnsupportedSocketOption = SockOpt (-1) (-1)++-- | Does the 'SocketOption' exist on this system?+isSupportedSocketOption :: SocketOption -> Bool+isSupportedSocketOption opt = opt /= SockOpt (-1) (-1)++-- | Execute the given action only when the specified socket option is+--  supported. Any return value is ignored.+whenSupported :: SocketOption -> IO a -> IO ()+whenSupported s action+  | isSupportedSocketOption s = action >> return ()+  | otherwise                 = return ()++----------------------------------------------------------------++#ifdef SOL_SOCKET+-- | SO_ACCEPTCONN, read-only+pattern AcceptConn :: SocketOption+#ifdef SO_ACCEPTCONN+pattern AcceptConn     = SockOpt (#const SOL_SOCKET) (#const SO_ACCEPTCONN)+#else+pattern AcceptConn     = SockOpt (-1) (-1)+#endif+-- | SO_DEBUG+pattern Debug :: SocketOption+#ifdef SO_DEBUG+pattern Debug          = SockOpt (#const SOL_SOCKET) (#const SO_DEBUG)+#else+pattern Debug          = SockOpt (-1) (-1)+#endif+-- | SO_REUSEADDR+pattern ReuseAddr :: SocketOption+#ifdef SO_REUSEADDR+pattern ReuseAddr      = SockOpt (#const SOL_SOCKET) (#const SO_REUSEADDR)+#else+pattern ReuseAddr      = SockOpt (-1) (-1)+#endif++-- | SO_DOMAIN, read-only+pattern SoDomain :: SocketOption+#ifdef SO_DOMAIN+pattern SoDomain       = SockOpt (#const SOL_SOCKET) (#const SO_DOMAIN)+#else+pattern SoDomain       = SockOpt (-1) (-1)+#endif++-- | SO_TYPE, read-only+pattern Type :: SocketOption+#ifdef SO_TYPE+pattern Type           = SockOpt (#const SOL_SOCKET) (#const SO_TYPE)+#else+pattern Type           = SockOpt (-1) (-1)+#endif++-- | SO_PROTOCOL, read-only+pattern SoProtocol :: SocketOption+#ifdef SO_PROTOCOL+pattern SoProtocol     = SockOpt (#const SOL_SOCKET) (#const SO_PROTOCOL)+#else+pattern SoProtocol     = SockOpt (-1) (-1)+#endif++-- | SO_ERROR+pattern SoError :: SocketOption+#ifdef SO_ERROR+pattern SoError        = SockOpt (#const SOL_SOCKET) (#const SO_ERROR)+#else+pattern SoError        = SockOpt (-1) (-1)+#endif+-- | SO_DONTROUTE+pattern DontRoute :: SocketOption+#ifdef SO_DONTROUTE+pattern DontRoute      = SockOpt (#const SOL_SOCKET) (#const SO_DONTROUTE)+#else+pattern DontRoute      = SockOpt (-1) (-1)+#endif+-- | SO_BROADCAST+pattern Broadcast :: SocketOption+#ifdef SO_BROADCAST+pattern Broadcast      = SockOpt (#const SOL_SOCKET) (#const SO_BROADCAST)+#else+pattern Broadcast      = SockOpt (-1) (-1)+#endif+-- | SO_SNDBUF+pattern SendBuffer :: SocketOption+#ifdef SO_SNDBUF+pattern SendBuffer     = SockOpt (#const SOL_SOCKET) (#const SO_SNDBUF)+#else+pattern SendBuffer     = SockOpt (-1) (-1)+#endif+-- | SO_RCVBUF+pattern RecvBuffer :: SocketOption+#ifdef SO_RCVBUF+pattern RecvBuffer     = SockOpt (#const SOL_SOCKET) (#const SO_RCVBUF)+#else+pattern RecvBuffer     = SockOpt (-1) (-1)+#endif+-- | SO_KEEPALIVE+pattern KeepAlive :: SocketOption+#ifdef SO_KEEPALIVE+pattern KeepAlive      = SockOpt (#const SOL_SOCKET) (#const SO_KEEPALIVE)+#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+pattern OOBInline      = SockOpt (#const SOL_SOCKET) (#const SO_OOBINLINE)+#else+pattern OOBInline      = SockOpt (-1) (-1)+#endif+-- | SO_LINGER: timeout in seconds, 0 means disabling/disabled.+pattern Linger :: SocketOption+#ifdef SO_LINGER+pattern Linger         = SockOpt (#const SOL_SOCKET) (#const SO_LINGER)+#else+pattern Linger         = SockOpt (-1) (-1)+#endif+-- | SO_REUSEPORT+pattern ReusePort :: SocketOption+#ifdef SO_REUSEPORT+pattern ReusePort      = SockOpt (#const SOL_SOCKET) (#const SO_REUSEPORT)+#else+pattern ReusePort      = SockOpt (-1) (-1)+#endif+-- | SO_RCVLOWAT+pattern RecvLowWater :: SocketOption+#ifdef SO_RCVLOWAT+pattern RecvLowWater   = SockOpt (#const SOL_SOCKET) (#const SO_RCVLOWAT)+#else+pattern RecvLowWater   = SockOpt (-1) (-1)+#endif+-- | SO_SNDLOWAT+pattern SendLowWater :: SocketOption+#ifdef SO_SNDLOWAT+pattern SendLowWater   = SockOpt (#const SOL_SOCKET) (#const SO_SNDLOWAT)+#else+pattern SendLowWater   = SockOpt (-1) (-1)+#endif+-- | 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. 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)+#else+pattern SendTimeOut    = SockOpt (-1) (-1)+#endif+-- | SO_USELOOPBACK+pattern UseLoopBack :: SocketOption+#ifdef SO_USELOOPBACK+pattern UseLoopBack    = SockOpt (#const SOL_SOCKET) (#const SO_USELOOPBACK)+#else+pattern UseLoopBack    = SockOpt (-1) (-1)+#endif+#endif // SOL_SOCKET++#if HAVE_DECL_IPPROTO_TCP+-- | TCP_MAXSEG+pattern MaxSegment :: SocketOption+#ifdef TCP_MAXSEG+pattern MaxSegment     = SockOpt (#const IPPROTO_TCP) (#const TCP_MAXSEG)+#else+pattern MaxSegment     = SockOpt (-1) (-1)+#endif+-- | TCP_NODELAY+pattern NoDelay :: SocketOption+#ifdef TCP_NODELAY+pattern NoDelay        = SockOpt (#const IPPROTO_TCP) (#const TCP_NODELAY)+#else+pattern NoDelay        = SockOpt (-1) (-1)+#endif+-- | TCP_USER_TIMEOUT+pattern UserTimeout :: SocketOption+#ifdef TCP_USER_TIMEOUT+pattern UserTimeout    = SockOpt (#const IPPROTO_TCP) (#const TCP_USER_TIMEOUT)+#else+pattern UserTimeout    = SockOpt (-1) (-1)+#endif+-- | TCP_CORK+pattern Cork :: SocketOption+#ifdef TCP_CORK+pattern Cork           = SockOpt (#const IPPROTO_TCP) (#const TCP_CORK)+#else+pattern Cork           = SockOpt (-1) (-1)+#endif+#endif // HAVE_DECL_IPPROTO_TCP++#if HAVE_DECL_IPPROTO_IP+-- | IP_TTL+pattern TimeToLive :: SocketOption+#ifdef IP_TTL+pattern TimeToLive     = SockOpt (#const IPPROTO_IP) (#const IP_TTL)+#else+pattern TimeToLive     = SockOpt (-1) (-1)+#endif+-- | Receiving IPv4 TTL.+pattern RecvIPv4TTL :: SocketOption+#ifdef IP_RECVTTL+pattern RecvIPv4TTL    = SockOpt (#const IPPROTO_IP) (#const IP_RECVTTL)+#else+pattern RecvIPv4TTL    = SockOpt (-1) (-1)+#endif+-- | Receiving IPv4 TOS.+pattern RecvIPv4TOS :: SocketOption+#ifdef IP_RECVTOS+pattern RecvIPv4TOS    = SockOpt (#const IPPROTO_IP) (#const IP_RECVTOS)+#else+pattern RecvIPv4TOS    = SockOpt (-1) (-1)+#endif+-- | Receiving IP_PKTINFO (struct in_pktinfo).+pattern RecvIPv4PktInfo :: SocketOption+#ifdef IP_RECVPKTINFO+pattern RecvIPv4PktInfo  = SockOpt (#const IPPROTO_IP) (#const IP_RECVPKTINFO)+#elif defined(IP_PKTINFO)+pattern RecvIPv4PktInfo  = SockOpt (#const IPPROTO_IP) (#const IP_PKTINFO)+#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+-- | IPV6_V6ONLY: don't use this on OpenBSD.+pattern IPv6Only :: SocketOption+#if HAVE_DECL_IPV6_V6ONLY+pattern IPv6Only       = SockOpt (#const IPPROTO_IPV6) (#const IPV6_V6ONLY)+#else+pattern IPv6Only       = SockOpt (-1) (-1)+#endif+-- | Receiving IPv6 hop limit.+pattern RecvIPv6HopLimit :: SocketOption+#ifdef IPV6_RECVHOPLIMIT+pattern RecvIPv6HopLimit = SockOpt (#const IPPROTO_IPV6) (#const IPV6_RECVHOPLIMIT)+#else+pattern RecvIPv6HopLimit = SockOpt (-1) (-1)+#endif+-- | Receiving IPv6 traffic class.+pattern RecvIPv6TClass :: SocketOption+#ifdef IPV6_RECVTCLASS+pattern RecvIPv6TClass  = SockOpt (#const IPPROTO_IPV6) (#const IPV6_RECVTCLASS)+#else+pattern RecvIPv6TClass  = SockOpt (-1) (-1)+#endif+-- | Receiving IPV6_PKTINFO (struct in6_pktinfo).+pattern RecvIPv6PktInfo :: SocketOption+#ifdef IPV6_RECVPKTINFO+pattern RecvIPv6PktInfo = SockOpt (#const IPPROTO_IPV6) (#const IPV6_RECVPKTINFO)+#elif defined(IPV6_PKTINFO)+pattern RecvIPv6PktInfo = SockOpt (#const IPPROTO_IPV6) (#const IPV6_PKTINFO)+#else+pattern RecvIPv6PktInfo = SockOpt (-1) (-1)+#endif+#endif // HAVE_DECL_IPPROTO_IPV6++pattern CustomSockOpt :: (CInt, CInt) -> SocketOption+pattern CustomSockOpt xy <- ((\(SockOpt x y) -> (x, y)) -> xy)+  where+    CustomSockOpt (x, y) = SockOpt x y++----------------------------------------------------------------++-- | Set a socket option that expects an 'Int' value.+setSocketOption :: Socket+                -> SocketOption -- Option Name+                -> Int          -- Option Value+                -> IO ()+#ifdef SO_LINGER+setSocketOption s so@Linger v = do+    let arg = if v == 0 then StructLinger 0 0 else StructLinger 1 (fromIntegral v)+    setSockOpt s so arg+#endif+setSocketOption s so@RecvTimeOut v = setSockOpt s so $ SocketTimeout $ fromIntegral v+setSocketOption s so@SendTimeOut v = setSockOpt s so $ SocketTimeout $ fromIntegral v+setSocketOption s sa v = setSockOpt s sa (fromIntegral v :: CInt)++-- | Set a socket option.+setSockOpt :: Storable a+           => Socket+           -> SocketOption+           -> a+           -> IO ()+setSockOpt s (SockOpt level opt) v = do+    with v $ \ptr -> void $ do+        let sz = fromIntegral $ sizeOf v+        withFdSocket s $ \fd ->+          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.+getSocketOption :: Socket+                -> SocketOption  -- Option Name+                -> IO Int        -- Option Value+#ifdef SO_LINGER+getSocketOption s so@Linger = do+    StructLinger onoff linger <- getSockOpt s so+    return $ fromIntegral $ if onoff == 0 then 0 else linger+#endif+getSocketOption s so@RecvTimeOut = do+    SocketTimeout to <- getSockOpt s so+    return $ fromIntegral to+getSocketOption s so@SendTimeOut = do+    SocketTimeout to <- getSockOpt s so+    return $ fromIntegral to+getSocketOption s so = do+    n :: CInt <- getSockOpt s so+    return $ fromIntegral n++-- | Get a socket option.+getSockOpt :: forall a . Storable a+           => Socket+           -> SocketOption -- Option Name+           -> IO a         -- Option Value+getSockOpt s (SockOpt level opt) = do+    alloca $ \ptr -> do+        let sz = fromIntegral $ sizeOf (undefined :: a)+        withFdSocket s $ \fd -> with sz $ \ptr_sz -> do+            throwSocketErrorIfMinus1Retry_ "Network.Socket.getSockOpt" $+                c_getsockopt fd level opt ptr ptr_sz+        peek ptr++----------------------------------------------------------------++-- | Get the 'SocketType' of an active socket.+--+--   Since: 3.0.1.0+getSocketType :: Socket -> IO SocketType+getSocketType s = unpackSocketType <$> getSockOpt s Type++----------------------------------------------------------------++#if __GLASGOW_HASKELL__ >= 806+{-# COMPLETE CustomSockOpt #-}+#endif+#ifdef SO_LINGER+-- | 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,++    -- | Linger timeout.+    sl_linger :: CInt+  }+  deriving (Eq, Ord, Show)++instance Storable StructLinger where+    sizeOf    ~_ = (#const sizeof(struct linger))+    alignment ~_ = alignment (0 :: CInt)++    peek p = do+        onoff  <- (#peek struct linger, l_onoff) p+        linger <- (#peek struct linger, l_linger) p+        return $ StructLinger onoff linger++    poke p (StructLinger onoff linger) = do+        (#poke struct linger, l_onoff)  p onoff+        (#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.+--   This will be converted into struct timeval on Unix and+--   DWORD (as milliseconds) on Windows.+newtype SocketTimeout = SocketTimeout Word32 deriving (Eq, Ord, Show)++#if defined(mingw32_HOST_OS)+instance Storable SocketTimeout where+    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__))+    peek ptr    = do+            sec  <- (#peek struct timeval, tv_sec)  ptr+            usec <- (#peek struct timeval, tv_usec) ptr+            return $ SocketTimeout (sec * 1000000 + usec)+    poke ptr (SocketTimeout to) = do+            let (sec, usec) = to `divMod` 1000000+            (#poke struct timeval, tv_sec)  ptr sec+            (#poke struct timeval, tv_usec) ptr usec+#endif++----------------------------------------------------------------++foreign import CALLCONV unsafe "getsockopt"+  c_getsockopt :: CInt -> CInt -> CInt -> Ptr a -> Ptr CInt -> IO CInt+foreign import CALLCONV unsafe "setsockopt"+  c_setsockopt :: CInt -> CInt -> CInt -> Ptr a -> CInt -> IO CInt
+ Network/Socket/Posix/Cmsg.hsc view
@@ -0,0 +1,289 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}++module Network.Socket.Posix.Cmsg where++#include "HsNet.h"++#include <sys/types.h>+#include <sys/socket.h>++import Data.ByteString.Internal+import Foreign.ForeignPtr+import Foreign.Marshal.Array (peekArray, pokeArray)+import System.IO.Unsafe (unsafeDupablePerformIO)+import System.Posix.Types (Fd(..))++import Network.Socket.Imports+import Network.Socket.Types+import Network.Socket.ReadShow++import qualified Text.Read as P++-- | Control message (ancillary data) including a pair of level and type.+data Cmsg = Cmsg {+    cmsgId   :: CmsgId+  , cmsgData :: ByteString+  } deriving (Eq, Show)++----------------------------------------------------------------++-- | Identifier of control message (ancillary data).+data CmsgId = CmsgId {+    cmsgLevel :: CInt+  , cmsgType  :: CInt+  } deriving (Eq)++-- | Unsupported identifier+pattern UnsupportedCmsgId :: CmsgId+pattern UnsupportedCmsgId = CmsgId (-1) (-1)++-- | The identifier for 'IPv4TTL'.+pattern CmsgIdIPv4TTL :: CmsgId+#if defined(darwin_HOST_OS) || defined(freebsd_HOST_OS) || defined(openbsd_HOST_OS)+pattern CmsgIdIPv4TTL = CmsgId (#const IPPROTO_IP) (#const IP_RECVTTL)+#else+pattern CmsgIdIPv4TTL = CmsgId (#const IPPROTO_IP) (#const IP_TTL)+#endif++-- | The identifier for 'IPv6HopLimit'.+pattern CmsgIdIPv6HopLimit :: CmsgId+pattern CmsgIdIPv6HopLimit = CmsgId (#const IPPROTO_IPV6) (#const IPV6_HOPLIMIT)++-- | The identifier for 'IPv4TOS'.+pattern CmsgIdIPv4TOS :: CmsgId+#if defined(darwin_HOST_OS) || defined(freebsd_HOST_OS)+pattern CmsgIdIPv4TOS = CmsgId (#const IPPROTO_IP) (#const IP_RECVTOS)+#else+pattern CmsgIdIPv4TOS = CmsgId (#const IPPROTO_IP) (#const IP_TOS)+#endif++-- | The identifier for 'IPv6TClass'.+pattern CmsgIdIPv6TClass :: CmsgId+pattern CmsgIdIPv6TClass = CmsgId (#const IPPROTO_IPV6) (#const IPV6_TCLASS)++-- | The identifier for 'IPv4PktInfo'.+pattern CmsgIdIPv4PktInfo :: CmsgId+#if defined(IP_PKTINFO)+pattern CmsgIdIPv4PktInfo = CmsgId (#const IPPROTO_IP) (#const IP_PKTINFO)+#else+pattern CmsgIdIPv4PktInfo = CmsgId (-1) (-1)+#endif++-- | The identifier for 'IPv6PktInfo'.+pattern CmsgIdIPv6PktInfo :: CmsgId+#if defined(IPV6_PKTINFO)+pattern CmsgIdIPv6PktInfo = CmsgId (#const IPPROTO_IPV6) (#const IPV6_PKTINFO)+#else+pattern CmsgIdIPv6PktInfo = CmsgId (-1) (-1)+#endif++-- | The identifier for 'Fds'.+pattern CmsgIdFds :: CmsgId+pattern CmsgIdFds = CmsgId (#const SOL_SOCKET) (#const SCM_RIGHTS)++----------------------------------------------------------------++-- | Locate a control message of the given type in a list of control+--   messages. The following shows an example usage:+--+-- > (lookupCmsg CmsgIdIPv4TOS cmsgs >>= decodeCmsg) :: Maybe IPv4TOS+lookupCmsg :: CmsgId -> [Cmsg] -> Maybe Cmsg+lookupCmsg cid cmsgs = find (\cmsg -> cmsgId cmsg == cid) cmsgs++-- | Filtering control message.+filterCmsg :: CmsgId -> [Cmsg] -> [Cmsg]+filterCmsg cid cmsgs = filter (\cmsg -> cmsgId cmsg == cid) cmsgs++----------------------------------------------------------------++-- | Control message type class.+--   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++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+    let cmsid = controlMessageId @a+    return $ Cmsg cmsid bs+  where+    siz = sizeOf x++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+        let p = castPtr (p0 `plusPtr` off)+        Just <$> peek p+  where+    cid = controlMessageId @a+    siz = sizeOf (undefined :: a)++----------------------------------------------------------------++-- | Time to live of IPv4.+#if defined(darwin_HOST_OS) || defined(freebsd_HOST_OS) || defined(openbsd_HOST_OS)+newtype IPv4TTL = IPv4TTL CChar deriving (Eq, Show, Storable)+#else+newtype IPv4TTL = IPv4TTL CInt deriving (Eq, Show, Storable)+#endif++instance ControlMessage IPv4TTL where+    controlMessageId = CmsgIdIPv4TTL+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg++----------------------------------------------------------------++-- | Hop limit of IPv6.+newtype IPv6HopLimit = IPv6HopLimit CInt deriving (Eq, Show, Storable)++instance ControlMessage IPv6HopLimit where+    controlMessageId = CmsgIdIPv6HopLimit+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg++----------------------------------------------------------------++-- | TOS of IPv4.+newtype IPv4TOS = IPv4TOS CChar deriving (Eq, Show, Storable)++instance ControlMessage IPv4TOS where+    controlMessageId = CmsgIdIPv4TOS+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg++----------------------------------------------------------------++-- | Traffic class of IPv6.+newtype IPv6TClass = IPv6TClass CInt deriving (Eq, Show, Storable)++instance ControlMessage IPv6TClass where+    controlMessageId = CmsgIdIPv6TClass+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg++----------------------------------------------------------------++-- | Network interface ID and local IPv4 address.+data IPv4PktInfo = IPv4PktInfo Int HostAddress HostAddress deriving (Eq)++instance Show IPv4PktInfo where+    show (IPv4PktInfo n sa ha) = "IPv4PktInfo " ++ show n ++ " " ++ show (hostAddressToTuple sa) ++ " " ++ show (hostAddressToTuple ha)++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)+    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+        (#poke struct in_pktinfo, ipi_addr)     p ha+    peek p = do+        n  <- (#peek struct in_pktinfo, ipi_ifindex)  p+        sa <- (#peek struct in_pktinfo, ipi_spec_dst) p+        ha <- (#peek struct in_pktinfo, ipi_addr)     p+        return $ IPv4PktInfo n sa ha+#else+    sizeOf    ~_ = 0+    alignment ~_ = 1+    poke _ _ = error "Unsupported control message type"+    peek _   = error "Unsupported control message type"+#endif++----------------------------------------------------------------++-- | Network interface ID and local IPv4 address.+data IPv6PktInfo = IPv6PktInfo Int HostAddress6 deriving (Eq)++instance Show IPv6PktInfo where+    show (IPv6PktInfo n ha6) = "IPv6PktInfo " ++ show n ++ " " ++ show (hostAddress6ToTuple ha6)++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)+    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)+    peek p = do+        In6Addr ha6 <- (#peek struct in6_pktinfo, ipi6_addr)    p+        n :: CInt   <- (#peek struct in6_pktinfo, ipi6_ifindex) p+        return $ IPv6PktInfo (fromIntegral n) ha6+#else+    sizeOf    ~_ = 0+    alignment ~_ = 1+    poke _ _ = error "Unsupported control message type"+    peek _   = error "Unsupported control message type"+#endif++----------------------------------------------------------------++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")+    , (CmsgIdIPv4TTL, "CmsgIdIPv4TTL")+    , (CmsgIdIPv6HopLimit, "CmsgIdIPv6HopLimit")+    , (CmsgIdIPv4TOS, "CmsgIdIPv4TOS")+    , (CmsgIdIPv6TClass, "CmsgIdIPv6TClass")+    , (CmsgIdIPv4PktInfo, "CmsgIdIPv4PktInfo")+    , (CmsgIdIPv6PktInfo, "CmsgIdIPv6PktInfo")+    , (CmsgIdFds, "CmsgIdFds")+    ]++instance Show CmsgId where+    showsPrec = bijectiveShow cmsgIdBijection def+      where+        defname = "CmsgId"+        unId = \(CmsgId l t) -> (l,t)+        def = defShow defname unId showIntInt++instance Read CmsgId where+    readPrec = bijectiveRead cmsgIdBijection def+      where+        defname = "CmsgId"+        def = defRead defname (uncurry CmsgId) readIntInt
+ Network/Socket/Posix/CmsgHdr.hsc view
@@ -0,0 +1,107 @@+{-# OPTIONS_GHC -funbox-strict-fields #-}++#include "HsNet.h"++module Network.Socket.Posix.CmsgHdr (+    Cmsg(..)+  , withCmsgs+  , parseCmsgs+  ) where++#include <sys/types.h>+#include <sys/socket.h>++import Foreign.ForeignPtr+import Foreign.Marshal.Alloc (allocaBytes)+import Foreign.Marshal.Utils (copyBytes)+import qualified Data.ByteString as B+import Data.ByteString.Internal++import Network.Socket.Imports+import Network.Socket.Posix.Cmsg+import Network.Socket.Posix.MsgHdr+import Network.Socket.Types++data CmsgHdr = CmsgHdr {+#ifdef __linux__+    cmsgHdrLen   :: CSize+#else+    cmsgHdrLen   :: #type socklen_t+#endif+  , cmsgHdrLevel :: CInt+  , cmsgHdrType  :: CInt+  } deriving (Eq, Show)++instance Storable CmsgHdr where+  sizeOf    ~_ = (#size struct cmsghdr)+  alignment ~_ = alignment (0 :: CInt)++  peek p = do+    len <- (#peek struct cmsghdr, cmsg_len)   p+    lvl <- (#peek struct cmsghdr, cmsg_level) p+    typ <- (#peek struct cmsghdr, cmsg_type)  p+    return $ CmsgHdr len lvl typ++  poke p (CmsgHdr len lvl typ) = do+    zeroMemory p (#size struct cmsghdr)+    (#poke struct cmsghdr, cmsg_len)   p len+    (#poke struct cmsghdr, cmsg_level) p lvl+    (#poke struct cmsghdr, cmsg_type)  p typ++withCmsgs :: [Cmsg] -> (Ptr CmsgHdr -> Int -> IO a) -> IO a+withCmsgs cmsgs0 action+  | total == 0 = action nullPtr 0+  | otherwise  = allocaBytes total $ \ctrlPtr -> do+        loop ctrlPtr cmsgs0 spaces+        action ctrlPtr total+  where+    loop ctrlPtr (cmsg:cmsgs) (s:ss) = do+        toCmsgHdr cmsg ctrlPtr+        let nextPtr = ctrlPtr `plusPtr` s+        loop nextPtr cmsgs ss+    loop _ _ _ = return ()+    cmsg_space = fromIntegral . c_cmsg_space . fromIntegral+    spaces = map (cmsg_space . B.length . cmsgData) cmsgs0+    total = sum spaces++toCmsgHdr :: Cmsg -> Ptr CmsgHdr -> IO ()+toCmsgHdr (Cmsg (CmsgId lvl typ) (PS fptr off len)) ctrlPtr = do+    poke ctrlPtr $ CmsgHdr (fromIntegral $ c_cmsg_len (fromIntegral len)) lvl typ+    withForeignPtr fptr $ \src0 -> do+        let src = src0 `plusPtr` off+        dst <- c_cmsg_data ctrlPtr+        copyBytes dst src len++parseCmsgs :: SocketAddress sa => Ptr (MsgHdr sa) -> IO [Cmsg]+parseCmsgs msgptr = do+    ptr <- c_cmsg_firsthdr msgptr+    loop ptr id+  where+    loop ptr build+      | ptr == nullPtr = return $ build []+      | otherwise = do+            cmsg <- fromCmsgHdr ptr+            nextPtr <- c_cmsg_nxthdr msgptr ptr+            loop nextPtr (build . (cmsg :))++fromCmsgHdr :: Ptr CmsgHdr -> IO Cmsg+fromCmsgHdr ptr = do+    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 -> copyBytes dst src siz)++foreign import ccall unsafe "cmsg_firsthdr"+  c_cmsg_firsthdr :: Ptr (MsgHdr sa) -> IO (Ptr CmsgHdr)++foreign import ccall unsafe "cmsg_nxthdr"+  c_cmsg_nxthdr :: Ptr (MsgHdr sa) -> Ptr CmsgHdr -> IO (Ptr CmsgHdr)++foreign import ccall unsafe "cmsg_data"+  c_cmsg_data :: Ptr CmsgHdr -> IO (Ptr Word8)++foreign import ccall unsafe "cmsg_space"+  c_cmsg_space :: CSize -> CSize++foreign import ccall unsafe "cmsg_len"+  c_cmsg_len :: CSize -> CSize
+ Network/Socket/Posix/IOVec.hsc view
@@ -0,0 +1,47 @@+{-# OPTIONS_GHC -funbox-strict-fields #-}++-- | Support module for the POSIX writev system call.+module Network.Socket.Posix.IOVec+    ( IOVec(..)+    , withIOVec+    ) where++import Foreign.Marshal.Array (allocaArray)++import Network.Socket.Imports++#include <sys/types.h>+#include <sys/uio.h>++data IOVec = IOVec+    { iovBase :: Ptr Word8+    , iovLen  :: CSize+    }++instance Storable IOVec where+  sizeOf    ~_ = (#const sizeof(struct iovec))+  alignment ~_ = alignment (0 :: CInt)++  peek p = do+    base <- (#peek struct iovec, iov_base) p+    len  <- (#peek struct iovec, iov_len)  p+    return $ IOVec base len++  poke p iov = do+    (#poke struct iovec, iov_base) p (iovBase iov)+    (#poke struct iovec, iov_len)  p (iovLen  iov)++-- | @withIOVec cs f@ executes the computation @f@, passing as argument a pair+-- consisting of a pointer to a temporarily allocated array of pointers to+-- IOVec made from @cs@ and the number of pointers (@length cs@).+-- /Unix only/.+withIOVec :: [(Ptr Word8, Int)] -> ((Ptr IOVec, Int) -> IO a) -> IO a+withIOVec [] f = f (nullPtr, 0)+withIOVec cs f =+    allocaArray csLen $ \aPtr -> do+        zipWithM_ pokeIov (ptrs aPtr) cs+        f (aPtr, csLen)+  where+    csLen = length cs+    ptrs = iterate (`plusPtr` sizeOf (IOVec nullPtr 0))+    pokeIov ptr (sPtr, sLen) = poke ptr $ IOVec sPtr (fromIntegral sLen)
+ Network/Socket/Posix/MsgHdr.hsc view
@@ -0,0 +1,59 @@+{-# OPTIONS_GHC -funbox-strict-fields #-}++-- | Support module for the POSIX 'sendmsg' system call.+module Network.Socket.Posix.MsgHdr+    ( MsgHdr(..)+    ) where++#include <sys/types.h>+#include <sys/socket.h>++import Network.Socket.Imports+import Network.Socket.Internal (zeroMemory)++import Network.Socket.Posix.IOVec (IOVec)++data MsgHdr sa = MsgHdr+    { msgName    :: Ptr sa+    , msgNameLen :: #type socklen_t+    , msgIov     :: Ptr IOVec+#ifdef __linux__+    , msgIovLen  :: CSize+#else+    , msgIovLen  :: CInt+#endif+    , msgCtrl    :: Ptr Word8+#ifdef __linux__+    , msgCtrlLen :: CSize+#else+    , msgCtrlLen :: #type socklen_t+#endif+    , msgFlags   :: CInt+    }++instance Storable (MsgHdr sa) where+  sizeOf    ~_ = (#const sizeof(struct msghdr))+  alignment ~_ = alignment (0 :: CInt)++  peek p = do+    name       <- (#peek struct msghdr, msg_name)       p+    nameLen    <- (#peek struct msghdr, msg_namelen)    p+    iov        <- (#peek struct msghdr, msg_iov)        p+    iovLen     <- (#peek struct msghdr, msg_iovlen)     p+    ctrl       <- (#peek struct msghdr, msg_control)    p+    ctrlLen    <- (#peek struct msghdr, msg_controllen) p+    flags      <- (#peek struct msghdr, msg_flags)      p+    return $ MsgHdr name nameLen iov iovLen ctrl ctrlLen flags++  poke p mh = do+    -- We need to zero the msg_control, msg_controllen, and msg_flags+    -- fields, but they only exist on some platforms (e.g. not on+    -- Solaris).  Instead of using CPP, we zero the entire struct.+    zeroMemory p (#const sizeof(struct msghdr))+    (#poke struct msghdr, msg_name)       p (msgName       mh)+    (#poke struct msghdr, msg_namelen)    p (msgNameLen    mh)+    (#poke struct msghdr, msg_iov)        p (msgIov        mh)+    (#poke struct msghdr, msg_iovlen)     p (msgIovLen     mh)+    (#poke struct msghdr, msg_control)    p (msgCtrl       mh)+    (#poke struct msghdr, msg_controllen) p (msgCtrlLen    mh)+    (#poke struct msghdr, msg_flags)      p (msgFlags      mh)
+ Network/Socket/ReadShow.hs view
@@ -0,0 +1,138 @@+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE PatternGuards #-}+{-# 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++-- type alias for individual correspondences of a (possibly partial) bijection+type Pair a b = (a, b)++-- | helper function for equality on first tuple element+{-# INLINE eqFst #-}+eqFst :: Eq a => a -> (a, b) -> Bool+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++-- | 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+--   function if no matching pair is found+--+--   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++-- Type alias for partial bijections between two types, consisting of a list+-- of individual correspondences that are checked in order and short-circuit+-- on first match+--+-- Depending on how this is used, may not actually be a true bijection over+-- the partial types, as no overlap-checking is currently implemented. If+-- overlaps are unavoidable, the canonical short-circuit pair should appear+-- first to avoid round-trip inconsistencies.+type Bijection a b = [Pair a b]++-- | Helper function for prefixing an optional constructor name before arbitrary values,+-- which only enforces high precedence on subsequent output if the constructor name is not+-- blank and space-separates for non-blank constructor names+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+{-# 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 name unwrap shoPrec = \i x -> namePrefix i name shoPrec (unwrap x)+{-# INLINE defShow #-}++-- Helper function for stripping an optional constructor-name prefix before parsing+-- an arbitrary value, which only consumes an extra token and increases precedence+-- if the provided name prefix is non-blank+expectPrefix :: String -> P.ReadPrec a -> P.ReadPrec a+expectPrefix name pars+    | null name = pars+    | otherwise = do+        P.lift $ P.expect $ P.Ident name+        P.step pars+{-# INLINE expectPrefix #-}++-- | Helper function for defining bijective Read instances that represent a+-- common use case where a constructor (or constructor-like pattern) name+-- (optionally) precedes an internal value with a separate parse function+defRead :: Eq a => String -> (b -> a) -> P.ReadPrec b -> P.ReadPrec a+defRead name wrap redPrec = expectPrefix name $ wrap <$> redPrec+{-# INLINE defRead #-}++-- | Alias for showsPrec that pairs well with `_readInt`+_showInt :: Show a => Int -> a -> ShowS+_showInt = showsPrec+{-# INLINE _showInt #-}++-- | More descriptive alias for `safeInt`+_readInt :: (Bounded a, Integral a) => P.ReadPrec a+_readInt = safeInt+{-# INLINE _readInt #-}++-- | show two elements of a tuple separated by a space character+-- inverse function to readIntInt when used on integer-like values+showIntInt :: (Show a, Show b) => Int -> (a, b) -> ShowS+showIntInt i (x, y) = _showInt i x . showChar ' ' . _showInt i y+{-# 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 = do+    x <- _readInt+    y <- _readInt+    return (x, y)+{-# INLINE readIntInt #-}++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 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++app_prec :: Int+app_prec = 10+{-# INLINE app_prec #-}++-- Parse integral values with type-specific overflow and underflow bounds-checks+safeInt :: forall a. (Bounded a, Integral a) => P.ReadPrec a+safeInt = do+    i <- signed+    if (i >= fromIntegral (minBound :: a) && i <= fromIntegral (maxBound :: a))+        then return $ fromIntegral i+        else mzero+  where+    signed :: P.ReadPrec Integer+    signed = P.readPrec
+ Network/Socket/STM.hs view
@@ -0,0 +1,24 @@+module Network.Socket.STM where++import Control.Concurrent+import Control.Concurrent.STM+import Network.Socket.Types+import System.Posix.Types++-- | STM action to wait until the socket is ready for reading.+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.+waitAndCancelReadSocketSTM :: Socket -> IO (STM (), IO ())+waitAndCancelReadSocketSTM s = withFdSocket s $ threadWaitReadSTM . Fd++-- | STM action to wait until the socket is ready for writing.+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.+waitAndCancelWriteSocketSTM :: Socket -> IO (STM (), IO ())+waitAndCancelWriteSocketSTM s = withFdSocket s $ threadWaitWriteSTM . Fd
+ Network/Socket/Shutdown.hs view
@@ -0,0 +1,120 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE ScopedTypeVariables #-}++#include "HsNetDef.h"++module Network.Socket.Shutdown (+    ShutdownCmd(..)+  , shutdown+  , gracefulClose+  ) where++import Control.Concurrent (yield)+import qualified Control.Exception as E+import Foreign.Marshal.Alloc (mallocBytes, free)+import System.Timeout++#if !defined(mingw32_HOST_OS)+import Control.Concurrent.STM+import qualified GHC.Event as Ev+#endif++import Network.Socket.Buffer+import Network.Socket.Imports+import Network.Socket.Internal+import Network.Socket.STM+import Network.Socket.Types++data ShutdownCmd = ShutdownReceive+                 | ShutdownSend+                 | ShutdownBoth++sdownCmdToInt :: ShutdownCmd -> CInt+sdownCmdToInt ShutdownReceive = 0+sdownCmdToInt ShutdownSend    = 1+sdownCmdToInt ShutdownBoth    = 2++-- | Shut down one or both halves of the connection, depending on the+-- second argument to the function.  If the second argument is+-- 'ShutdownReceive', further receives are disallowed.  If it is+-- 'ShutdownSend', further sends are disallowed.  If it is+-- 'ShutdownBoth', further sends and receives are disallowed.+shutdown :: Socket -> ShutdownCmd -> IO ()+shutdown s stype = void $ withFdSocket s $ \fd ->+  throwSocketErrorIfMinus1Retry_ "Network.Socket.shutdown" $+    c_shutdown fd $ sdownCmdToInt stype++foreign import CALLCONV unsafe "shutdown"+  c_shutdown :: CInt -> CInt -> IO CInt++-- | Closing a socket gracefully.+--   This sends TCP FIN and check if TCP FIN is received from the peer.+--   The second argument is time out to receive TCP FIN in millisecond.+--   In both normal cases and error cases, socket is deallocated finally.+--+--   Since: 3.1.1.0+gracefulClose :: Socket -> Int -> IO ()+gracefulClose s tmout0 = sendRecvFIN `E.finally` close s+  where+    sendRecvFIN = do+        -- Sending TCP FIN.+        ex <- E.try $ shutdown s ShutdownSend+        case ex of+          -- 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 (recvEOF s tmout0)++recvEOF :: Socket -> Int -> Ptr Word8 -> IO ()+#if !defined(mingw32_HOST_OS)+recvEOF s tmout0 buf = do+    mevmgr <- Ev.getSystemEventManager+    case mevmgr of+      Nothing -> recvEOFtimeout s tmout0 buf+      Just _ -> recvEOFevent s tmout0 buf+#else+recvEOF = recvEOFtimeout+#endif++-- 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++recvEOFtimeout :: Socket -> Int -> Ptr Word8 -> IO ()+recvEOFtimeout s tmout0 buf = void $ timeout tmout0 $ recvBuf s buf bufSize++#if !defined(mingw32_HOST_OS)+data Wait = MoreData | TimeoutTripped++recvEOFevent :: Socket -> Int -> Ptr Word8 -> IO ()+recvEOFevent s tmout0 buf = do+    tmmgr <- Ev.getSystemTimerManager+    tvar <- newTVarIO False+    E.bracket (setupTimeout tmmgr tvar) (cancelTimeout tmmgr) $ \_ -> do+        E.bracket (setupRead s) cancelRead $ \(rxWait,_) -> do+            let toWait = readTVar tvar >>= check+                wait = atomically ((toWait >> return TimeoutTripped)+                               <|> (rxWait >> return MoreData))+            waitRes <- wait+            case waitRes of+              TimeoutTripped -> return ()+              -- 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.+              MoreData       -> void $ recvBufNoWait s buf bufSize+  where+    -- millisecond to microsecond+    tmout = tmout0 * 1000+    setupTimeout tmmgr tvar =+        Ev.registerTimeout tmmgr tmout $ atomically $ writeTVar tvar True+    cancelTimeout = Ev.unregisterTimeout+    setupRead = waitAndCancelReadSocketSTM+    cancelRead (_,cancel) = cancel+#endif
+ Network/Socket/SockAddr.hs view
@@ -0,0 +1,132 @@+{-# LANGUAGE CPP #-}++module Network.Socket.SockAddr (+    getPeerName,+    getSocketName,+    connect,+    bind,+    accept,+    sendBufTo,+    recvBufFrom,+    sendBufMsg,+    recvBufMsg,+) where++import Control.Exception (IOException, throwIO, try)+import System.Directory (removeFile)+import System.IO.Error (isAlreadyInUseError, isDoesNotExistError)++import qualified Network.Socket.Buffer as G+import Network.Socket.Flag+import Network.Socket.Imports+import qualified Network.Socket.Name as G+import qualified Network.Socket.Syscall as G+#if !defined(mingw32_HOST_OS)+import Network.Socket.Posix.Cmsg+#else+import Network.Socket.Win32.Cmsg+#endif+import Network.Socket.Types++-- | Getting peer's 'SockAddr'.+getPeerName :: Socket -> IO SockAddr+getPeerName = G.getPeerName++-- | Getting my 'SockAddr'.+getSocketName :: Socket -> IO SockAddr+getSocketName = G.getSocketName++-- | Connect to a remote socket at address.+connect :: Socket -> SockAddr -> IO ()+connect = G.connect++-- | 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++-- | Accept a connection.  The socket must be bound to an address and+-- listening for connections.  The return value is a pair @(conn,+-- address)@ where @conn@ is a new socket object usable to send and+-- receive data on the connection, and @address@ is the address bound+-- to the socket on the other end of the connection.+-- On Unix, FD_CLOEXEC is set to the new 'Socket'.+accept :: Socket -> IO (Socket, SockAddr)+accept = G.accept++-- | 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+-- ensuring that all data has been sent.+sendBufTo :: Socket -> Ptr a -> Int -> SockAddr -> IO Int+sendBufTo = G.sendBufTo++-- | 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+-- bytes received and @address@ is a 'SockAddr' representing the+-- address of the sending socket.+--+-- If the first return value is zero, it means EOF.+--+-- For 'Stream' sockets, the second return value would be invalid.+--+-- NOTE: blocking on Windows unless you compile with -threaded (see+-- GHC ticket #1129)+recvBufFrom :: Socket -> Ptr a -> Int -> IO (Int, SockAddr)+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 = 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 = G.recvBufMsg
+ Network/Socket/Syscall.hs view
@@ -0,0 +1,266 @@+{-# LANGUAGE CPP #-}++#include "HsNetDef.h"++module Network.Socket.Syscall where++import Foreign.Marshal.Utils (with)+import qualified Control.Exception as E+# if defined(mingw32_HOST_OS)+import System.IO.Error (catchIOError)+#endif++#if defined(mingw32_HOST_OS)+import Control.Exception (bracket)+import Foreign (FunPtr)+import GHC.Conc (asyncDoProc)+#else+import Foreign.C.Error (getErrno, eINTR, eINPROGRESS)+import GHC.Conc (threadWaitWrite)+#endif++#ifdef HAVE_ADVANCED_SOCKET_FLAGS+import Network.Socket.Cbits+#else+import Network.Socket.Fcntl+#endif++import Network.Socket.Imports+import Network.Socket.Internal+import Network.Socket.Options+import Network.Socket.Types++-- ----------------------------------------------------------------------------+-- On Windows, our sockets are not put in non-blocking mode (non-blocking+-- is not supported for regular file descriptors on Windows, and it would+-- be a pain to support it only for sockets).  So there are two cases:+--+--  - the threaded RTS uses safe calls for socket operations to get+--    non-blocking I/O, just like the rest of the I/O library+--+--  - with the non-threaded RTS, only some operations on sockets will be+--    non-blocking.  Reads and writes go through the normal async I/O+--    system.  accept() uses asyncDoProc so is non-blocking.  A handful+--    of others (recvFrom, sendFd, recvFd) will block all threads - if this+--    is a problem, -threaded is the workaround.+--++-----------------------------------------------------------------------------+-- Connection Functions++-- In the following connection and binding primitives.  The names of+-- the equivalent C functions have been preserved where possible. It+-- should be noted that some of these names used in the C library,+-- \tr{bind} in particular, have a different meaning to many Haskell+-- programmers and have thus been renamed by appending the prefix+-- Socket.++-- | Create a new socket using the given address family, socket type+-- and protocol number.  The address family is usually 'AF_INET',+-- 'AF_INET6', or 'AF_UNIX'.  The socket type is usually 'Stream' or+-- 'Datagram'.  The protocol number is usually 'defaultProtocol'.+-- If 'AF_INET6' is used and the socket type is 'Stream' or 'Datagram',+-- the 'IPv6Only' socket option is set to 0 so that both IPv4 and IPv6+-- 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 <- 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+-- 127.0.0.1:5000+socket :: Family         -- Family Name (usually AF_INET)+       -> SocketType     -- Socket Type (usually Stream)+       -> ProtocolNumber -- Protocol Number (getProtocolByName to find value)+       -> IO Socket      -- Unconnected Socket+socket family stype protocol = E.bracketOnError create c_close $ \fd -> do+    -- Let's ensure that the socket (file descriptor) is closed even on+    -- asynchronous exceptions.+    setNonBlock fd+    s <- mkSocket fd+    -- 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+    return s+  where+    create = do+        let c_stype = modifyFlag $ packSocketType stype+        throwSocketErrorIfMinus1Retry "Network.Socket.socket" $+            c_socket (packFamily family) c_stype protocol++#ifdef HAVE_ADVANCED_SOCKET_FLAGS+    modifyFlag c_stype = c_stype .|. sockNonBlock+#else+    modifyFlag c_stype = c_stype+#endif++#ifdef HAVE_ADVANCED_SOCKET_FLAGS+    setNonBlock _ = return ()+#else+    setNonBlock fd = setNonBlockIfNeeded fd+#endif++#if HAVE_DECL_IPV6_V6ONLY+    unsetIPv6Only s = when (family == AF_INET6 && stype `elem` [Stream, Datagram]) $+# if defined(mingw32_HOST_OS)+      -- The IPv6Only option is only supported on Windows Vista and later,+      -- so trying to change it might throw an error.+      setSocketOption s IPv6Only 0 `catchIOError` \_ -> return ()+# elif defined(openbsd_HOST_OS)+      -- don't change IPv6Only+      return ()+# else+      -- The default value of the IPv6Only option is platform specific,+      -- so we explicitly set it to 0 to provide a common default.+      setSocketOption s IPv6Only 0+# endif+#else+    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+++-----------------------------------------------------------------------------+-- Binding a socket++-- | 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 :: SocketAddress sa => Socket -> sa -> IO ()+bind s sa = withSocketAddress sa $ \p_sa siz -> void $ withFdSocket s $ \fd -> do+  let sz = fromIntegral siz+  throwSocketErrorIfMinus1Retry "Network.Socket.bind" $ c_bind fd p_sa sz++-----------------------------------------------------------------------------+-- Connecting a socket++-- | 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)++connectLoop :: SocketAddress sa => Socket -> Ptr sa -> CInt -> IO ()+connectLoop s p_sa sz = withFdSocket s $ \fd -> loop fd+  where+    errLoc = "Network.Socket.connect: " ++ show s+    loop fd = do+       r <- c_connect fd p_sa sz+       when (r == -1) $ do+#if defined(mingw32_HOST_OS)+           throwSocketError errLoc+#else+           err <- getErrno+           case () of+             _ | err == eINTR       -> loop fd+             _ | err == eINPROGRESS -> connectBlocked+--           _ | err == eAGAIN      -> connectBlocked+             _otherwise             -> throwSocketError errLoc++    connectBlocked = do+       withFdSocket s $ threadWaitWrite . fromIntegral+       err <- getSocketOption s SoError+       when (err /= 0) $ throwSocketErrorCode errLoc (fromIntegral err)+#endif++-----------------------------------------------------------------------------+-- Listen++-- | Listen for connections made to the socket.  The second argument+-- specifies the maximum number of queued connections and should be at+-- least 1; the maximum value is system-dependent (usually 5).+listen :: Socket -> Int -> IO ()+listen s backlog = withFdSocket s $ \fd -> do+    throwSocketErrorIfMinus1Retry_ "Network.Socket.listen" $+        c_listen fd $ fromIntegral backlog++-----------------------------------------------------------------------------+-- Accept+--+-- A call to `accept' only returns when data is available on the given+-- socket, unless the socket has been set to non-blocking.  It will+-- return a new socket which should be used to read the incoming data and+-- should then be closed. Using the socket returned by `accept' allows+-- incoming requests to be queued on the original socket.++-- | Accept a connection.  The socket must be bound to an address and+-- listening for connections.  The return value is a pair @(conn,+-- address)@ where @conn@ is a new socket object usable to send and+-- receive data on the connection, and @address@ is the address bound+-- to the socket on the other end of the connection.+-- On Unix, FD_CLOEXEC is set to the new 'Socket'.+accept :: SocketAddress sa => Socket -> IO (Socket, sa)+accept listing_sock = withNewSocketAddress $ \new_sa sz ->+    withFdSocket listing_sock $ \listing_fd -> do+ new_sock <- E.bracketOnError (callAccept listing_fd new_sa sz) c_close mkSocket+ new_addr <- peekSocketAddress new_sa+ return (new_sock, new_addr)+  where+#if defined(mingw32_HOST_OS)+     callAccept fd sa sz+       | threaded  = with (fromIntegral sz) $ \ ptr_len ->+                       throwSocketErrorIfMinus1Retry "Network.Socket.accept" $+                         c_accept_safe fd sa ptr_len+       | otherwise = do+             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+       throwSocketErrorWaitRead listing_sock "Network.Socket.accept"+                        (c_accept4 fd sa ptr_len (sockNonBlock .|. sockCloexec))+# else+       new_fd <- throwSocketErrorWaitRead listing_sock "Network.Socket.accept"+                        (c_accept fd sa ptr_len)+       setNonBlockIfNeeded new_fd+       setCloseOnExecIfNeeded new_fd+       return new_fd+# endif /* HAVE_ADVANCED_SOCKET_FLAGS */+#endif++foreign import CALLCONV unsafe "socket"+  c_socket :: CInt -> CInt -> CInt -> IO CInt+foreign import CALLCONV unsafe "bind"+  c_bind :: CInt -> Ptr sa -> CInt{-CSockLen???-} -> IO CInt+foreign import CALLCONV SAFE_ON_WIN "connect"+  c_connect :: CInt -> Ptr sa -> CInt{-CSockLen???-} -> IO CInt+foreign import CALLCONV unsafe "listen"+  c_listen :: CInt -> CInt -> IO CInt++#ifdef HAVE_ADVANCED_SOCKET_FLAGS+foreign import CALLCONV unsafe "accept4"+  c_accept4 :: CInt -> Ptr sa -> Ptr CInt{-CSockLen???-} -> CInt -> IO CInt+#else+foreign import CALLCONV unsafe "accept"+  c_accept :: CInt -> Ptr sa -> Ptr CInt{-CSockLen???-} -> IO CInt+#endif++#if defined(mingw32_HOST_OS)+foreign import CALLCONV safe "accept"+  c_accept_safe :: CInt -> Ptr sa -> Ptr CInt{-CSockLen???-} -> IO CInt+foreign import ccall unsafe "rtsSupportsBoundThreads"+  threaded :: Bool+foreign import ccall unsafe "HsNet.h acceptNewSock"+  c_acceptNewSock :: Ptr () -> IO CInt+foreign import ccall unsafe "HsNet.h newAcceptParams"+  c_newAcceptParams :: CInt -> CInt -> Ptr a -> IO (Ptr ())+foreign import ccall unsafe "HsNet.h &acceptDoProc"+  c_acceptDoProc :: FunPtr (Ptr () -> IO Int)+foreign import ccall unsafe "free"+  c_free:: Ptr a -> IO ()+#endif
Network/Socket/Types.hsc view
@@ -1,1129 +1,1441 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE ForeignFunctionInterface #-}--#include "HsNet.h"-##include "HsNetDef.h"--module Network.Socket.Types-    (-    -- * Socket-      Socket(..)-    , fdSocket-    , sockFamily-    , sockType-    , sockProtocol-    , sockStatus-    , SocketStatus(..)--    -- * Socket types-    , SocketType(..)-    , isSupportedSocketType-    , packSocketType-    , packSocketType'-    , packSocketTypeOrThrow-    , unpackSocketType-    , unpackSocketType'--    -- * Family-    , Family(..)-    , isSupportedFamily-    , packFamily-    , unpackFamily--    -- * Socket addresses-    , SockAddr(..)-    , isSupportedSockAddr-    , HostAddress-    , hostAddressToTuple-    , tupleToHostAddress-#if defined(IPV6_SOCKET_SUPPORT)-    , HostAddress6-    , hostAddress6ToTuple-    , tupleToHostAddress6-    , FlowInfo-    , ScopeID-#endif-    , peekSockAddr-    , pokeSockAddr-    , sizeOfSockAddr-    , sizeOfSockAddrByFamily-    , withSockAddr-    , withNewSockAddr--    -- * Unsorted-    , ProtocolNumber-    , PortNumber(..)--    -- * Low-level helpers-    , zeroMemory-    ) where--import Control.Concurrent.MVar-import Control.Monad-import Data.Bits-import Data.Maybe-import Data.Ratio-import Data.Typeable-import Data.Word-import Data.Int-import Foreign.C-import Foreign.Marshal.Alloc-import Foreign.Marshal.Array-import Foreign.Ptr-import Foreign.Storable---- | A socket data type.---  'Socket's are not GCed unless they are closed by 'close'.-data Socket-  = MkSocket-            CInt                 -- File Descriptor-            Family-            SocketType-            ProtocolNumber       -- Protocol Number-            (MVar SocketStatus)  -- Status Flag-  deriving Typeable--{-# DEPRECATED MkSocket "'MkSocket' will not be available in version 3.0.0.0 or later. Use fdSocket instead" #-}---- | Obtaining the file descriptor from a socket.------   If a 'Socket' is shared with multiple threads and---   one uses 'fdSocket', unexpected issues may happen.---   Consider the following scenario:------   1) Thread A acquires a 'Fd' from 'Socket' by 'fdSocket'.------   2) Thread B close the 'Socket'.------   3) Thread C opens a new 'Socket'. Unfortunately it gets the same 'Fd'---      number which thread A is holding.------   In this case, it is safer for Thread A to clone 'Fd' by---   'System.Posix.IO.dup'. But this would still suffer from---   a rase condition between 'fdSocket' and 'close'.-fdSocket :: Socket -> CInt-fdSocket (MkSocket fd _ _ _ _) = fd--sockFamily :: Socket -> Family-sockFamily   (MkSocket _ f _ _ _) = f--sockType :: Socket -> SocketType-sockType     (MkSocket _ _ t _ _) = t--sockProtocol :: Socket -> ProtocolNumber-sockProtocol (MkSocket _ _ _ p _) = p--sockStatus :: Socket -> MVar SocketStatus-sockStatus   (MkSocket _ _ _ _ s) = s--instance Eq Socket where-  (MkSocket _ _ _ _ m1) == (MkSocket _ _ _ _ m2) = m1 == m2--instance Show Socket where-  showsPrec _n (MkSocket fd _ _ _ _) =-        showString "<socket: " . shows fd . showString ">"--type ProtocolNumber = CInt---- | The status of the socket as /determined by this library/, not--- necessarily reflecting the state of the connection itself.------ For example, the 'Closed' status is applied when the 'close'--- function is called.-data SocketStatus-  -- Returned Status    Function called-  = NotConnected        -- ^ Newly created, unconnected socket-  | Bound               -- ^ Bound, via 'bind'-  | Listening           -- ^ Listening, via 'listen'-  | Connected           -- ^ Connected or accepted, via 'connect' or 'accept'-  | ConvertedToHandle   -- ^ Is now a 'Handle' (via 'socketToHandle'), don't touch-  | Closed              -- ^ Closed was closed by 'close'-    deriving (Eq, Show, Typeable)--{-# DEPRECATED SocketStatus "SocketStatus will be removed" #-}---------------------------------------------------------------------------------- Socket types---- There are a few possible ways to do this.  The first is convert the--- structs used in the C library into an equivalent Haskell type. An--- other possible implementation is to keep all the internals in the C--- code and use an Int## and a status flag. The second method is used--- here since a lot of the C structures are not required to be--- manipulated.---- Originally the status was non-mutable so we had to return a new--- socket each time we changed the status.  This version now uses--- mutable variables to avoid the need to do this.  The result is a--- cleaner interface and better security since the application--- programmer now can't circumvent the status information to perform--- invalid operations on sockets.---- | Socket Types.------ The existence of a constructor does not necessarily imply that that--- socket type is supported on your system: see 'isSupportedSocketType'.-data SocketType-        = NoSocketType -- ^ 0, used in getAddrInfo hints, for example-        | Stream -- ^ SOCK_STREAM-        | Datagram -- ^ SOCK_DGRAM-        | Raw -- ^ SOCK_RAW-        | RDM -- ^ SOCK_RDM-        | SeqPacket -- ^ SOCK_SEQPACKET-        deriving (Eq, Ord, Read, Show, Typeable)---- | Does the SOCK_ constant corresponding to the given SocketType exist on--- this system?-isSupportedSocketType :: SocketType -> Bool-isSupportedSocketType = isJust . packSocketType'---- | Find the SOCK_ constant corresponding to the SocketType value.-packSocketType' :: SocketType -> Maybe CInt-packSocketType' stype = case Just stype of-    -- the Just above is to disable GHC's overlapping pattern-    -- detection: see comments for packSocketOption-    Just NoSocketType -> Just 0-#ifdef SOCK_STREAM-    Just Stream -> Just #const SOCK_STREAM-#endif-#ifdef SOCK_DGRAM-    Just Datagram -> Just #const SOCK_DGRAM-#endif-#ifdef SOCK_RAW-    Just Raw -> Just #const SOCK_RAW-#endif-#ifdef SOCK_RDM-    Just RDM -> Just #const SOCK_RDM-#endif-#ifdef SOCK_SEQPACKET-    Just SeqPacket -> Just #const SOCK_SEQPACKET-#endif-    _ -> Nothing--{-# DEPRECATED packSocketType "packSocketType will not be available in version 3.0.0.0 or later." #-}--packSocketType :: SocketType -> CInt-packSocketType stype = fromMaybe (error errMsg) (packSocketType' stype)-  where-    errMsg = concat ["Network.Socket.packSocketType: ",-                     "socket type ", show stype, " unsupported on this system"]---- | Try packSocketType' on the SocketType, if it fails throw an error with--- message starting "Network.Socket." ++ the String parameter-packSocketTypeOrThrow :: String -> SocketType -> IO CInt-packSocketTypeOrThrow caller stype = maybe err return (packSocketType' stype)- where-  err = ioError . userError . concat $ ["Network.Socket.", caller, ": ",-    "socket type ", show stype, " unsupported on this system"]---unpackSocketType:: CInt -> Maybe SocketType-unpackSocketType t = case t of-        0 -> Just NoSocketType-#ifdef SOCK_STREAM-        (#const SOCK_STREAM) -> Just Stream-#endif-#ifdef SOCK_DGRAM-        (#const SOCK_DGRAM) -> Just Datagram-#endif-#ifdef SOCK_RAW-        (#const SOCK_RAW) -> Just Raw-#endif-#ifdef SOCK_RDM-        (#const SOCK_RDM) -> Just RDM-#endif-#ifdef SOCK_SEQPACKET-        (#const SOCK_SEQPACKET) -> Just SeqPacket-#endif-        _ -> Nothing---- | Try unpackSocketType on the CInt, if it fails throw an error with--- message starting "Network.Socket." ++ the String parameter-unpackSocketType' :: String -> CInt -> IO SocketType-unpackSocketType' caller ty = maybe err return (unpackSocketType ty)- where-  err = ioError . userError . concat $ ["Network.Socket.", caller, ": ",-    "socket type ", show ty, " unsupported on this system"]----------------------------------------------------------------------------- Protocol Families.---- | Address families.------ A constructor being present here does not mean it is supported by the--- operating system: see 'isSupportedFamily'.-data Family-    = AF_UNSPEC           -- unspecified-    | AF_UNIX             -- local to host (pipes, portals-    | AF_INET             -- internetwork: UDP, TCP, etc-    | AF_INET6            -- Internet Protocol version 6-    | AF_IMPLINK          -- arpanet imp addresses-    | AF_PUP              -- pup protocols: e.g. BSP-    | AF_CHAOS            -- mit CHAOS protocols-    | AF_NS               -- XEROX NS protocols-    | AF_NBS              -- nbs protocols-    | AF_ECMA             -- european computer manufacturers-    | AF_DATAKIT          -- datakit protocols-    | AF_CCITT            -- CCITT protocols, X.25 etc-    | AF_SNA              -- IBM SNA-    | AF_DECnet           -- DECnet-    | AF_DLI              -- Direct data link interface-    | AF_LAT              -- LAT-    | AF_HYLINK           -- NSC Hyperchannel-    | AF_APPLETALK        -- Apple Talk-    | AF_ROUTE            -- Internal Routing Protocol (aka AF_NETLINK)-    | AF_NETBIOS          -- NetBios-style addresses-    | AF_NIT              -- Network Interface Tap-    | AF_802              -- IEEE 802.2, also ISO 8802-    | AF_ISO              -- ISO protocols-    | AF_OSI              -- umbrella of all families used by OSI-    | AF_NETMAN           -- DNA Network Management-    | AF_X25              -- CCITT X.25-    | AF_AX25-    | AF_OSINET           -- AFI-    | AF_GOSSIP           -- US Government OSI-    | AF_IPX              -- Novell Internet Protocol-    | Pseudo_AF_XTP       -- eXpress Transfer Protocol (no AF)-    | AF_CTF              -- Common Trace Facility-    | AF_WAN              -- Wide Area Network protocols-    | AF_SDL              -- SGI Data Link for DLPI-    | AF_NETWARE-    | AF_NDD-    | AF_INTF             -- Debugging use only-    | AF_COIP             -- connection-oriented IP, aka ST II-    | AF_CNT              -- Computer Network Technology-    | Pseudo_AF_RTIP      -- Help Identify RTIP packets-    | Pseudo_AF_PIP       -- Help Identify PIP packets-    | AF_SIP              -- Simple Internet Protocol-    | AF_ISDN             -- Integrated Services Digital Network-    | Pseudo_AF_KEY       -- Internal key-management function-    | AF_NATM             -- native ATM access-    | AF_ARP              -- (rev.) addr. res. prot. (RFC 826)-    | Pseudo_AF_HDRCMPLT  -- Used by BPF to not rewrite hdrs in iface output-    | AF_ENCAP-    | AF_LINK             -- Link layer interface-    | AF_RAW              -- Link layer interface-    | AF_RIF              -- raw interface-    | AF_NETROM           -- Amateur radio NetROM-    | AF_BRIDGE           -- multiprotocol bridge-    | AF_ATMPVC           -- ATM PVCs-    | AF_ROSE             -- Amateur Radio X.25 PLP-    | AF_NETBEUI          -- 802.2LLC-    | AF_SECURITY         -- Security callback pseudo AF-    | AF_PACKET           -- Packet family-    | AF_ASH              -- Ash-    | AF_ECONET           -- Acorn Econet-    | AF_ATMSVC           -- ATM SVCs-    | AF_IRDA             -- IRDA sockets-    | AF_PPPOX            -- PPPoX sockets-    | AF_WANPIPE          -- Wanpipe API sockets-    | AF_BLUETOOTH        -- bluetooth sockets-    | AF_CAN              -- Controller Area Network-      deriving (Eq, Ord, Read, Show)--packFamily :: Family -> CInt-packFamily f = case packFamily' f of-    Just fam -> fam-    Nothing -> error $-               "Network.Socket.packFamily: unsupported address family: " ++-               show f---- | Does the AF_ constant corresponding to the given family exist on this--- system?-isSupportedFamily :: Family -> Bool-isSupportedFamily = isJust . packFamily'--packFamily' :: Family -> Maybe CInt-packFamily' f = case Just f of-    -- the Just above is to disable GHC's overlapping pattern-    -- detection: see comments for packSocketOption-    Just AF_UNSPEC -> Just #const AF_UNSPEC-#ifdef AF_UNIX-    Just AF_UNIX -> Just #const AF_UNIX-#endif-#ifdef AF_INET-    Just AF_INET -> Just #const AF_INET-#endif-#ifdef AF_INET6-    Just AF_INET6 -> Just #const AF_INET6-#endif-#ifdef AF_IMPLINK-    Just AF_IMPLINK -> Just #const AF_IMPLINK-#endif-#ifdef AF_PUP-    Just AF_PUP -> Just #const AF_PUP-#endif-#ifdef AF_CHAOS-    Just AF_CHAOS -> Just #const AF_CHAOS-#endif-#ifdef AF_NS-    Just AF_NS -> Just #const AF_NS-#endif-#ifdef AF_NBS-    Just AF_NBS -> Just #const AF_NBS-#endif-#ifdef AF_ECMA-    Just AF_ECMA -> Just #const AF_ECMA-#endif-#ifdef AF_DATAKIT-    Just AF_DATAKIT -> Just #const AF_DATAKIT-#endif-#ifdef AF_CCITT-    Just AF_CCITT -> Just #const AF_CCITT-#endif-#ifdef AF_SNA-    Just AF_SNA -> Just #const AF_SNA-#endif-#ifdef AF_DECnet-    Just AF_DECnet -> Just #const AF_DECnet-#endif-#ifdef AF_DLI-    Just AF_DLI -> Just #const AF_DLI-#endif-#ifdef AF_LAT-    Just AF_LAT -> Just #const AF_LAT-#endif-#ifdef AF_HYLINK-    Just AF_HYLINK -> Just #const AF_HYLINK-#endif-#ifdef AF_APPLETALK-    Just AF_APPLETALK -> Just #const AF_APPLETALK-#endif-#ifdef AF_ROUTE-    Just AF_ROUTE -> Just #const AF_ROUTE-#endif-#ifdef AF_NETBIOS-    Just AF_NETBIOS -> Just #const AF_NETBIOS-#endif-#ifdef AF_NIT-    Just AF_NIT -> Just #const AF_NIT-#endif-#ifdef AF_802-    Just AF_802 -> Just #const AF_802-#endif-#ifdef AF_ISO-    Just AF_ISO -> Just #const AF_ISO-#endif-#ifdef AF_OSI-    Just AF_OSI -> Just #const AF_OSI-#endif-#ifdef AF_NETMAN-    Just AF_NETMAN -> Just #const AF_NETMAN-#endif-#ifdef AF_X25-    Just AF_X25 -> Just #const AF_X25-#endif-#ifdef AF_AX25-    Just AF_AX25 -> Just #const AF_AX25-#endif-#ifdef AF_OSINET-    Just AF_OSINET -> Just #const AF_OSINET-#endif-#ifdef AF_GOSSIP-    Just AF_GOSSIP -> Just #const AF_GOSSIP-#endif-#ifdef AF_IPX-    Just AF_IPX -> Just #const AF_IPX-#endif-#ifdef Pseudo_AF_XTP-    Just Pseudo_AF_XTP -> Just #const Pseudo_AF_XTP-#endif-#ifdef AF_CTF-    Just AF_CTF -> Just #const AF_CTF-#endif-#ifdef AF_WAN-    Just AF_WAN -> Just #const AF_WAN-#endif-#ifdef AF_SDL-    Just AF_SDL -> Just #const AF_SDL-#endif-#ifdef AF_NETWARE-    Just AF_NETWARE -> Just #const AF_NETWARE-#endif-#ifdef AF_NDD-    Just AF_NDD -> Just #const AF_NDD-#endif-#ifdef AF_INTF-    Just AF_INTF -> Just #const AF_INTF-#endif-#ifdef AF_COIP-    Just AF_COIP -> Just #const AF_COIP-#endif-#ifdef AF_CNT-    Just AF_CNT -> Just #const AF_CNT-#endif-#ifdef Pseudo_AF_RTIP-    Just Pseudo_AF_RTIP -> Just #const Pseudo_AF_RTIP-#endif-#ifdef Pseudo_AF_PIP-    Just Pseudo_AF_PIP -> Just #const Pseudo_AF_PIP-#endif-#ifdef AF_SIP-    Just AF_SIP -> Just #const AF_SIP-#endif-#ifdef AF_ISDN-    Just AF_ISDN -> Just #const AF_ISDN-#endif-#ifdef Pseudo_AF_KEY-    Just Pseudo_AF_KEY -> Just #const Pseudo_AF_KEY-#endif-#ifdef AF_NATM-    Just AF_NATM -> Just #const AF_NATM-#endif-#ifdef AF_ARP-    Just AF_ARP -> Just #const AF_ARP-#endif-#ifdef Pseudo_AF_HDRCMPLT-    Just Pseudo_AF_HDRCMPLT -> Just #const Pseudo_AF_HDRCMPLT-#endif-#ifdef AF_ENCAP-    Just AF_ENCAP -> Just #const AF_ENCAP-#endif-#ifdef AF_LINK-    Just AF_LINK -> Just #const AF_LINK-#endif-#ifdef AF_RAW-    Just AF_RAW -> Just #const AF_RAW-#endif-#ifdef AF_RIF-    Just AF_RIF -> Just #const AF_RIF-#endif-#ifdef AF_NETROM-    Just AF_NETROM -> Just #const AF_NETROM-#endif-#ifdef AF_BRIDGE-    Just AF_BRIDGE -> Just #const AF_BRIDGE-#endif-#ifdef AF_ATMPVC-    Just AF_ATMPVC -> Just #const AF_ATMPVC-#endif-#ifdef AF_ROSE-    Just AF_ROSE -> Just #const AF_ROSE-#endif-#ifdef AF_NETBEUI-    Just AF_NETBEUI -> Just #const AF_NETBEUI-#endif-#ifdef AF_SECURITY-    Just AF_SECURITY -> Just #const AF_SECURITY-#endif-#ifdef AF_PACKET-    Just AF_PACKET -> Just #const AF_PACKET-#endif-#ifdef AF_ASH-    Just AF_ASH -> Just #const AF_ASH-#endif-#ifdef AF_ECONET-    Just AF_ECONET -> Just #const AF_ECONET-#endif-#ifdef AF_ATMSVC-    Just AF_ATMSVC -> Just #const AF_ATMSVC-#endif-#ifdef AF_IRDA-    Just AF_IRDA -> Just #const AF_IRDA-#endif-#ifdef AF_PPPOX-    Just AF_PPPOX -> Just #const AF_PPPOX-#endif-#ifdef AF_WANPIPE-    Just AF_WANPIPE -> Just #const AF_WANPIPE-#endif-#ifdef AF_BLUETOOTH-    Just AF_BLUETOOTH -> Just #const AF_BLUETOOTH-#endif-#ifdef AF_CAN-    Just AF_CAN -> Just #const AF_CAN-#endif-    _ -> Nothing----------- ------------unpackFamily :: CInt -> Family-unpackFamily f = case f of-        (#const AF_UNSPEC) -> AF_UNSPEC-#ifdef AF_UNIX-        (#const AF_UNIX) -> AF_UNIX-#endif-#ifdef AF_INET-        (#const AF_INET) -> AF_INET-#endif-#ifdef AF_INET6-        (#const AF_INET6) -> AF_INET6-#endif-#ifdef AF_IMPLINK-        (#const AF_IMPLINK) -> AF_IMPLINK-#endif-#ifdef AF_PUP-        (#const AF_PUP) -> AF_PUP-#endif-#ifdef AF_CHAOS-        (#const AF_CHAOS) -> AF_CHAOS-#endif-#ifdef AF_NS-        (#const AF_NS) -> AF_NS-#endif-#ifdef AF_NBS-        (#const AF_NBS) -> AF_NBS-#endif-#ifdef AF_ECMA-        (#const AF_ECMA) -> AF_ECMA-#endif-#ifdef AF_DATAKIT-        (#const AF_DATAKIT) -> AF_DATAKIT-#endif-#ifdef AF_CCITT-        (#const AF_CCITT) -> AF_CCITT-#endif-#ifdef AF_SNA-        (#const AF_SNA) -> AF_SNA-#endif-#ifdef AF_DECnet-        (#const AF_DECnet) -> AF_DECnet-#endif-#ifdef AF_DLI-        (#const AF_DLI) -> AF_DLI-#endif-#ifdef AF_LAT-        (#const AF_LAT) -> AF_LAT-#endif-#ifdef AF_HYLINK-        (#const AF_HYLINK) -> AF_HYLINK-#endif-#ifdef AF_APPLETALK-        (#const AF_APPLETALK) -> AF_APPLETALK-#endif-#ifdef AF_ROUTE-        (#const AF_ROUTE) -> AF_ROUTE-#endif-#ifdef AF_NETBIOS-        (#const AF_NETBIOS) -> AF_NETBIOS-#endif-#ifdef AF_NIT-        (#const AF_NIT) -> AF_NIT-#endif-#ifdef AF_802-        (#const AF_802) -> AF_802-#endif-#ifdef AF_ISO-        (#const AF_ISO) -> AF_ISO-#endif-#ifdef AF_OSI-# if (!defined(AF_ISO)) || (defined(AF_ISO) && (AF_ISO != AF_OSI))-        (#const AF_OSI) -> AF_OSI-# endif-#endif-#ifdef AF_NETMAN-        (#const AF_NETMAN) -> AF_NETMAN-#endif-#ifdef AF_X25-        (#const AF_X25) -> AF_X25-#endif-#ifdef AF_AX25-        (#const AF_AX25) -> AF_AX25-#endif-#ifdef AF_OSINET-        (#const AF_OSINET) -> AF_OSINET-#endif-#ifdef AF_GOSSIP-        (#const AF_GOSSIP) -> AF_GOSSIP-#endif-#if defined(AF_IPX) && (!defined(AF_NS) || AF_NS != AF_IPX)-        (#const AF_IPX) -> AF_IPX-#endif-#ifdef Pseudo_AF_XTP-        (#const Pseudo_AF_XTP) -> Pseudo_AF_XTP-#endif-#ifdef AF_CTF-        (#const AF_CTF) -> AF_CTF-#endif-#ifdef AF_WAN-        (#const AF_WAN) -> AF_WAN-#endif-#ifdef AF_SDL-        (#const AF_SDL) -> AF_SDL-#endif-#ifdef AF_NETWARE-        (#const AF_NETWARE) -> AF_NETWARE-#endif-#ifdef AF_NDD-        (#const AF_NDD) -> AF_NDD-#endif-#ifdef AF_INTF-        (#const AF_INTF) -> AF_INTF-#endif-#ifdef AF_COIP-        (#const AF_COIP) -> AF_COIP-#endif-#ifdef AF_CNT-        (#const AF_CNT) -> AF_CNT-#endif-#ifdef Pseudo_AF_RTIP-        (#const Pseudo_AF_RTIP) -> Pseudo_AF_RTIP-#endif-#ifdef Pseudo_AF_PIP-        (#const Pseudo_AF_PIP) -> Pseudo_AF_PIP-#endif-#ifdef AF_SIP-        (#const AF_SIP) -> AF_SIP-#endif-#ifdef AF_ISDN-        (#const AF_ISDN) -> AF_ISDN-#endif-#ifdef Pseudo_AF_KEY-        (#const Pseudo_AF_KEY) -> Pseudo_AF_KEY-#endif-#ifdef AF_NATM-        (#const AF_NATM) -> AF_NATM-#endif-#ifdef AF_ARP-        (#const AF_ARP) -> AF_ARP-#endif-#ifdef Pseudo_AF_HDRCMPLT-        (#const Pseudo_AF_HDRCMPLT) -> Pseudo_AF_HDRCMPLT-#endif-#ifdef AF_ENCAP-        (#const AF_ENCAP) -> AF_ENCAP-#endif-#ifdef AF_LINK-        (#const AF_LINK) -> AF_LINK-#endif-#ifdef AF_RAW-        (#const AF_RAW) -> AF_RAW-#endif-#ifdef AF_RIF-        (#const AF_RIF) -> AF_RIF-#endif-#ifdef AF_NETROM-        (#const AF_NETROM) -> AF_NETROM-#endif-#ifdef AF_BRIDGE-        (#const AF_BRIDGE) -> AF_BRIDGE-#endif-#ifdef AF_ATMPVC-        (#const AF_ATMPVC) -> AF_ATMPVC-#endif-#ifdef AF_ROSE-        (#const AF_ROSE) -> AF_ROSE-#endif-#ifdef AF_NETBEUI-        (#const AF_NETBEUI) -> AF_NETBEUI-#endif-#ifdef AF_SECURITY-        (#const AF_SECURITY) -> AF_SECURITY-#endif-#ifdef AF_PACKET-        (#const AF_PACKET) -> AF_PACKET-#endif-#ifdef AF_ASH-        (#const AF_ASH) -> AF_ASH-#endif-#ifdef AF_ECONET-        (#const AF_ECONET) -> AF_ECONET-#endif-#ifdef AF_ATMSVC-        (#const AF_ATMSVC) -> AF_ATMSVC-#endif-#ifdef AF_IRDA-        (#const AF_IRDA) -> AF_IRDA-#endif-#ifdef AF_PPPOX-        (#const AF_PPPOX) -> AF_PPPOX-#endif-#ifdef AF_WANPIPE-        (#const AF_WANPIPE) -> AF_WANPIPE-#endif-#ifdef AF_BLUETOOTH-        (#const AF_BLUETOOTH) -> AF_BLUETOOTH-#endif-#ifdef AF_CAN-        (#const AF_CAN) -> AF_CAN-#endif-        unknown -> error $-          "Network.Socket.Types.unpackFamily: unknown address family: " ++-          show unknown----------------------------------------------------------------------------- Port Numbers---- | Use the @Num@ instance (i.e. use a literal) to create a--- @PortNumber@ value with the correct network-byte-ordering. You--- should not use the PortNum constructor. It will be removed in the--- next release.------ >>> 1 :: PortNumber--- 1--- >>> read "1" :: PortNumber--- 1-newtype PortNumber = PortNum Word16 deriving (Eq, Ord, Typeable)--- newtyped to prevent accidental use of sane-looking--- port numbers that haven't actually been converted to--- network-byte-order first.--{-# DEPRECATED PortNum "Do not use the PortNum constructor. Use the Num instance. PortNum will be removed in the next release." #-}--instance Show PortNumber where-  showsPrec p pn = showsPrec p (portNumberToInt pn)--instance Read PortNumber where-  readsPrec n = map (\(x,y) -> (intToPortNumber x, y)) . readsPrec n--intToPortNumber :: Int -> PortNumber-intToPortNumber v = PortNum (htons (fromIntegral v))--portNumberToInt :: PortNumber -> Int-portNumberToInt (PortNum po) = fromIntegral (ntohs po)--foreign import CALLCONV unsafe "ntohs" ntohs :: Word16 -> Word16-foreign import CALLCONV unsafe "htons" htons :: Word16 -> Word16-foreign import CALLCONV unsafe "ntohl" ntohl :: Word32 -> Word32-foreign import CALLCONV unsafe "htonl" htonl :: Word32 -> Word32--instance Enum PortNumber where-    toEnum   = intToPortNumber-    fromEnum = portNumberToInt--instance Num PortNumber where-   fromInteger i = intToPortNumber (fromInteger i)-    -- for completeness.-   (+) x y   = intToPortNumber (portNumberToInt x + portNumberToInt y)-   (-) x y   = intToPortNumber (portNumberToInt x - portNumberToInt y)-   negate x  = intToPortNumber (-portNumberToInt x)-   (*) x y   = intToPortNumber (portNumberToInt x * portNumberToInt y)-   abs n     = intToPortNumber (abs (portNumberToInt n))-   signum n  = intToPortNumber (signum (portNumberToInt n))--instance Real PortNumber where-    toRational x = toInteger x % 1--instance Integral PortNumber where-    quotRem a b = let (c,d) = quotRem (portNumberToInt a) (portNumberToInt b) in-                  (intToPortNumber c, intToPortNumber d)-    toInteger a = toInteger (portNumberToInt a)--instance Storable PortNumber where-   sizeOf    _ = sizeOf    (undefined :: Word16)-   alignment _ = alignment (undefined :: Word16)-   poke p (PortNum po) = poke (castPtr p) po-   peek p = PortNum `liftM` peek (castPtr p)----------------------------------------------------------------------------- Socket addresses---- The scheme used for addressing sockets is somewhat quirky. The--- calls in the BSD socket API that need to know the socket address--- all operate in terms of struct sockaddr, a `virtual' type of--- socket address.---- The Internet family of sockets are addressed as struct sockaddr_in,--- so when calling functions that operate on struct sockaddr, we have--- to type cast the Internet socket address into a struct sockaddr.--- Instances of the structure for different families might *not* be--- the same size. Same casting is required of other families of--- sockets such as Xerox NS. Similarly for UNIX-domain sockets.---- To represent these socket addresses in Haskell-land, we do what BSD--- didn't do, and use a union/algebraic type for the different--- families. Currently only UNIX-domain sockets and the Internet--- families are supported.--#if defined(IPV6_SOCKET_SUPPORT)-type FlowInfo = Word32-type ScopeID = Word32-#endif---- | The existence of a constructor does not necessarily imply that--- that socket address type is supported on your system: see--- 'isSupportedSockAddr'.-data SockAddr       -- C Names-  = SockAddrInet-    PortNumber  -- sin_port  (network byte order)-    HostAddress -- sin_addr  (ditto)-  | SockAddrInet6-        PortNumber      -- sin6_port (network byte order)-        FlowInfo        -- sin6_flowinfo (ditto)-        HostAddress6    -- sin6_addr (ditto)-        ScopeID         -- sin6_scope_id (ditto)-  | SockAddrUnix-        String          -- sun_path-  | SockAddrCan-        Int32           -- can_ifindex (can be get by Network.BSD.ifNameToIndex "can0")-        -- TODO: Extend this to include transport protocol information-  deriving (Eq, Ord, Typeable)---- | Is the socket address type supported on this system?-isSupportedSockAddr :: SockAddr -> Bool-isSupportedSockAddr addr = case addr of-  SockAddrInet {} -> True-#if defined(IPV6_SOCKET_SUPPORT)-  SockAddrInet6 {} -> True-#endif-#if defined(DOMAIN_SOCKET_SUPPORT)-  SockAddrUnix{} -> True-#endif-#if defined(CAN_SOCKET_SUPPORT)-  SockAddrCan{} -> True-#endif-#if !(defined(IPV6_SOCKET_SUPPORT) \-      && defined(DOMAIN_SOCKET_SUPPORT) && defined(CAN_SOCKET_SUPPORT))-  _ -> False-#endif--{-# DEPRECATED SockAddrCan "This will be removed in 3.0" #-}--#if defined(WITH_WINSOCK)-type CSaFamily = (#type unsigned short)-#elif defined(darwin_HOST_OS)-type CSaFamily = (#type u_char)-#else-type CSaFamily = (#type sa_family_t)-#endif---- | Computes the storage requirements (in bytes) of the given--- 'SockAddr'.  This function differs from 'Foreign.Storable.sizeOf'--- in that the value of the argument /is/ used.-sizeOfSockAddr :: SockAddr -> Int-#if defined(DOMAIN_SOCKET_SUPPORT)-sizeOfSockAddr (SockAddrUnix path) =-    case path of-        '\0':_ -> (#const sizeof(sa_family_t)) + length path-        _      -> #const sizeof(struct sockaddr_un)-#endif-sizeOfSockAddr (SockAddrInet _ _) = #const sizeof(struct sockaddr_in)-#if defined(IPV6_SOCKET_SUPPORT)-sizeOfSockAddr (SockAddrInet6 _ _ _ _) = #const sizeof(struct sockaddr_in6)-#endif-#if defined(CAN_SOCKET_SUPPORT)-sizeOfSockAddr (SockAddrCan _) = #const sizeof(struct sockaddr_can)-#endif-#if !(defined(IPV6_SOCKET_SUPPORT) \-      && defined(DOMAIN_SOCKET_SUPPORT) && defined(CAN_SOCKET_SUPPORT))-sizeOfSockAddr _ = error "sizeOfSockAddr: not supported"-#endif---- | Computes the storage requirements (in bytes) required for a--- 'SockAddr' with the given 'Family'.-sizeOfSockAddrByFamily :: Family -> Int-#if defined(DOMAIN_SOCKET_SUPPORT)-sizeOfSockAddrByFamily AF_UNIX  = #const sizeof(struct sockaddr_un)-#endif-#if defined(IPV6_SOCKET_SUPPORT)-sizeOfSockAddrByFamily AF_INET6 = #const sizeof(struct sockaddr_in6)-#endif-sizeOfSockAddrByFamily AF_INET  = #const sizeof(struct sockaddr_in)-#if defined(CAN_SOCKET_SUPPORT)-sizeOfSockAddrByFamily AF_CAN   = #const sizeof(struct sockaddr_can)-#endif-sizeOfSockAddrByFamily family = error $-    "Network.Socket.Types.sizeOfSockAddrByFamily: address family '" ++-    show family ++ "' not supported."---- | 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-withSockAddr addr f = do-    let sz = sizeOfSockAddr addr-    allocaBytes sz $ \p -> pokeSockAddr p addr >> f (castPtr p) sz---- | Create a new 'SockAddr' for use with a function requiring a--- pointer to a 'SockAddr' and the length of that 'SockAddr'.-withNewSockAddr :: Family -> (Ptr SockAddr -> Int -> IO a) -> IO a-withNewSockAddr family f = do-    let sz = sizeOfSockAddrByFamily family-    allocaBytes sz $ \ptr -> f ptr sz---- We can't write an instance of 'Storable' for 'SockAddr' because--- @sockaddr@ is a sum type of variable size but--- 'Foreign.Storable.sizeOf' is required to be constant.---- Note that on Darwin, the sockaddr structure must be zeroed before--- use.---- | Write the given 'SockAddr' to the given memory location.-pokeSockAddr :: Ptr a -> SockAddr -> IO ()-#if defined(DOMAIN_SOCKET_SUPPORT)-pokeSockAddr p (SockAddrUnix path) = do-#if defined(darwin_HOST_OS)-    zeroMemory p (#const sizeof(struct sockaddr_un))-#else-    case path of-      ('\0':_) -> zeroMemory p (#const sizeof(struct sockaddr_un))-      _        -> return ()-#endif-#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-        poker = case path of ('\0':_) -> pokeArray; _ -> pokeArray0 0-    poker ((#ptr struct sockaddr_un, sun_path) p) pathC-#endif-pokeSockAddr p (SockAddrInet (PortNum port) addr) = do-#if defined(darwin_HOST_OS)-    zeroMemory p (#const sizeof(struct sockaddr_in))-#endif-#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)-    (#poke struct sockaddr_in, sin_len) p ((#const sizeof(struct sockaddr_in)) :: Word8)-#endif-    (#poke struct sockaddr_in, sin_family) p ((#const AF_INET) :: CSaFamily)-    (#poke struct sockaddr_in, sin_port) p port-    (#poke struct sockaddr_in, sin_addr) p addr-#if defined(IPV6_SOCKET_SUPPORT)-pokeSockAddr p (SockAddrInet6 (PortNum port) flow addr scope) = do-#if defined(darwin_HOST_OS)-    zeroMemory p (#const sizeof(struct sockaddr_in6))-#endif-#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)-    (#poke struct sockaddr_in6, sin6_len) p ((#const sizeof(struct sockaddr_in6)) :: Word8)-#endif-    (#poke struct sockaddr_in6, sin6_family) p ((#const AF_INET6) :: CSaFamily)-    (#poke struct sockaddr_in6, sin6_port) p port-    (#poke struct sockaddr_in6, sin6_flowinfo) p flow-    (#poke struct sockaddr_in6, sin6_addr) p (In6Addr addr)-    (#poke struct sockaddr_in6, sin6_scope_id) p scope-#endif-#if defined(CAN_SOCKET_SUPPORT)-pokeSockAddr p (SockAddrCan ifIndex) = do-#if defined(darwin_HOST_OS)-    zeroMemory p (#const sizeof(struct sockaddr_can))-#endif-    (#poke struct sockaddr_can, can_ifindex) p ifIndex-#endif-#if !(defined(IPV6_SOCKET_SUPPORT) \-      && defined(DOMAIN_SOCKET_SUPPORT) && defined(CAN_SOCKET_SUPPORT))-pokeSockAddr _ _ = error "pokeSockAddr: not supported"-#endif---- | Read a 'SockAddr' from the given memory location.-peekSockAddr :: Ptr SockAddr -> IO SockAddr-peekSockAddr p = do-  family <- (#peek struct sockaddr, sa_family) p-  case family :: CSaFamily of-#if defined(DOMAIN_SOCKET_SUPPORT)-    (#const AF_UNIX) -> do-        str <- peekCString ((#ptr struct sockaddr_un, sun_path) p)-        return (SockAddrUnix str)-#endif-    (#const AF_INET) -> do-        addr <- (#peek struct sockaddr_in, sin_addr) p-        port <- (#peek struct sockaddr_in, sin_port) p-        return (SockAddrInet (PortNum port) addr)-#if defined(IPV6_SOCKET_SUPPORT)-    (#const AF_INET6) -> do-        port <- (#peek struct sockaddr_in6, sin6_port) p-        flow <- (#peek struct sockaddr_in6, sin6_flowinfo) p-        In6Addr addr <- (#peek struct sockaddr_in6, sin6_addr) p-        scope <- (#peek struct sockaddr_in6, sin6_scope_id) p-        return (SockAddrInet6 (PortNum port) flow addr scope)-#endif-#if defined(CAN_SOCKET_SUPPORT)-    (#const AF_CAN) -> do-        ifidx <- (#peek struct sockaddr_can, can_ifindex) p-        return (SockAddrCan ifidx)-#endif-    _ -> ioError $ userError $-      "Network.Socket.Types.peekSockAddr: address family '" ++-      show family ++ "' not supported."------------------------------------------------------------------------------ | The raw network byte order number is read using host byte order.--- Therefore on little-endian architectures the byte order is swapped. For--- example @127.0.0.1@ is represented as @0x0100007f@ on little-endian hosts--- and as @0x7f000001@ on big-endian hosts.------ For direct manipulation prefer 'hostAddressToTuple' and--- 'tupleToHostAddress'.-type HostAddress = Word32---- | Converts 'HostAddress' to representation-independent IPv4 quadruple.--- For example for @127.0.0.1@ the function will return @(0x7f, 0, 0, 1)@--- regardless of host endianness.-hostAddressToTuple :: HostAddress -> (Word8, Word8, Word8, Word8)-hostAddressToTuple ha' =-    let ha = htonl ha'-        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) =-    let x `sl` i = fromIntegral x `shiftL` i :: Word32-    in ntohl $ (b3 `sl` 24) .|. (b2 `sl` 16) .|. (b1 `sl` 8) .|. (b0 `sl` 0)--#if defined(IPV6_SOCKET_SUPPORT)--- | Independent of endianness. For example @::1@ is stored as @(0, 0, 0, 1)@.------ For direct manipulation prefer 'hostAddress6ToTuple' and--- 'tupleToHostAddress6'.-type HostAddress6 = (Word32, Word32, Word32, Word32)--hostAddress6ToTuple :: HostAddress6 -> (Word16, Word16, Word16, Word16,-                                        Word16, Word16, Word16, Word16)-hostAddress6ToTuple (w3, w2, w1, w0) =-    let high, low :: Word32 -> Word16-        high w = fromIntegral (w `shiftR` 16)-        low w = fromIntegral w-    in (high w3, low w3, high w2, low w2, high w1, low w1, high w0, low w0)--tupleToHostAddress6 :: (Word16, Word16, Word16, Word16,-                        Word16, Word16, Word16, Word16) -> HostAddress6-tupleToHostAddress6 (w7, w6, w5, w4, w3, w2, w1, w0) =-    let add :: Word16 -> Word16 -> Word32-        high `add` low = (fromIntegral high `shiftL` 16) .|. (fromIntegral low)-    in (w7 `add` w6, w5 `add` w4, w3 `add` w2, w1 `add` w0)---- The peek32 and poke32 functions work around the fact that the RFCs--- don't require 32-bit-wide address fields to be present.  We can--- only portably rely on an 8-bit field, s6_addr.--s6_addr_offset :: Int-s6_addr_offset = (#offset struct in6_addr, s6_addr)--peek32 :: Ptr a -> Int -> IO Word32-peek32 p i0 = do-    let i' = i0 * 4-        peekByte n = peekByteOff p (s6_addr_offset + i' + n) :: IO Word8-        a `sl` i = fromIntegral a `shiftL` i-    a0 <- peekByte 0-    a1 <- peekByte 1-    a2 <- peekByte 2-    a3 <- peekByte 3-    return ((a0 `sl` 24) .|. (a1 `sl` 16) .|. (a2 `sl` 8) .|. (a3 `sl` 0))--poke32 :: Ptr a -> Int -> Word32 -> IO ()-poke32 p i0 a = do-    let i' = i0 * 4-        pokeByte n = pokeByteOff p (s6_addr_offset + i' + n)-        x `sr` i = fromIntegral (x `shiftR` i) :: Word8-    pokeByte 0 (a `sr` 24)-    pokeByte 1 (a `sr` 16)-    pokeByte 2 (a `sr`  8)-    pokeByte 3 (a `sr`  0)---- | Private newtype proxy for the Storable instance. To avoid orphan instances.-newtype In6Addr = In6Addr HostAddress6--#if __GLASGOW_HASKELL__ < 800-#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)-#endif--instance Storable In6Addr where-    sizeOf _    = #const sizeof(struct in6_addr)-    alignment _ = #alignment struct in6_addr--    peek p = do-        a <- peek32 p 0-        b <- peek32 p 1-        c <- peek32 p 2-        d <- peek32 p 3-        return $ In6Addr (a, b, c, d)--    poke p (In6Addr (a, b, c, d)) = do-        poke32 p 0 a-        poke32 p 1 b-        poke32 p 2 c-        poke32 p 3 d-#endif+{-# LANGUAGE CPP #-}+{-# LANGUAGE MagicHash, UnboxedTuples #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++#include "HsNet.h"+##include "HsNetDef.h"++module Network.Socket.Types (+    -- * Socket type+      Socket+    , withFdSocket+    , unsafeFdSocket+    , touchSocket+    , socketToFd+    , fdSocket+    , mkSocket+    , invalidateSocket+    , close+    , close'+    , c_close+    -- * Types of socket+    , SocketType(GeneralSocketType, UnsupportedSocketType, NoSocketType+                , Stream, Datagram, Raw, RDM, SeqPacket)+    , isSupportedSocketType+    , packSocketType+    , unpackSocketType++    -- * 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++    -- * Socket address typeclass+    , SocketAddress(..)+    , withSocketAddress+    , withNewSocketAddress++    -- * Socket address type+    , SockAddr(..)+    , isSupportedSockAddr+    , HostAddress+    , hostAddressToTuple+    , hostAddressToTuple'+    , tupleToHostAddress+    , HostAddress6+    , hostAddress6ToTuple+    , tupleToHostAddress6+    , FlowInfo+    , ScopeID+    , peekSockAddr+    , pokeSockAddr+    , withSockAddr++    -- * Null socket address type+    , NullSockAddr(..)++    -- * Unsorted+    , ProtocolNumber+    , defaultProtocol+    , PortNumber+    , defaultPort++    -- * Low-level helpers+    , zeroMemory+    , htonl+    , ntohl+    , In6Addr(..)+    ) where++import Data.IORef (IORef, newIORef, readIORef, atomicModifyIORef', mkWeakIORef)+import Foreign.C.Error (throwErrno)+import Foreign.Marshal.Alloc+import GHC.Conc (closeFdWith)+import System.Posix.Types (Fd)+import Control.DeepSeq (NFData (..))+import GHC.Exts (touch##)+import GHC.IORef (IORef (..))+import GHC.STRef (STRef (..))+import GHC.IO (IO (..))++import qualified Text.Read as P++import Foreign.Marshal.Array++import Network.Socket.Imports++----- readshow module import+import Network.Socket.ReadShow+++-----------------------------------------------------------------------------++-- | Basic type for a socket.+data Socket = Socket (IORef CInt) CInt {- for Show -}++instance Show Socket where+    show (Socket _ ofd) = "<socket: " ++ show ofd ++ ">"++instance Eq Socket where+    Socket ref1 _ == Socket ref2 _ = ref1 == ref2++{-# DEPRECATED fdSocket "Use withFdSocket or unsafeFdSocket instead" #-}+-- | Currently, this is an alias of `unsafeFdSocket`.+fdSocket :: Socket -> IO CInt+fdSocket = unsafeFdSocket++-- | Getting a file descriptor from a socket.+--+--   If a 'Socket' is shared with multiple threads and+--   one uses 'unsafeFdSocket', unexpected issues may happen.+--   Consider the following scenario:+--+--   1) Thread A acquires a 'Fd' from 'Socket' by 'unsafeFdSocket'.+--+--   2) Thread B close the 'Socket'.+--+--   3) Thread C opens a new 'Socket'. Unfortunately it gets the same 'Fd'+--      number which thread A is holding.+--+--   In this case, it is safer for Thread A to clone 'Fd' by+--   'System.Posix.IO.dup'. But this would still suffer from+--   a race condition between 'unsafeFdSocket' and 'close'.+--+--   If you use this function, you need to guarantee that the 'Socket' does not+--   get garbage-collected until after you finish using the file descriptor.+--   'touchSocket' can be used for this purpose.+--+--   A safer option is to use 'withFdSocket' instead.+unsafeFdSocket :: Socket -> IO CInt+unsafeFdSocket (Socket ref _) = readIORef ref++-- | Ensure that the given 'Socket' stays alive (i.e. not garbage-collected)+--   at the given place in the sequence of IO actions. This function can be+--   used in conjunction with 'unsafeFdSocket' to guarantee that the file+--   descriptor is not prematurely freed.+--+-- > fd <- unsafeFdSocket sock+-- > -- using fd with blocking operations such as accept(2)+-- > touchSocket sock+touchSocket :: Socket -> IO ()+touchSocket (Socket ref _) = touch ref++touch :: IORef a -> IO ()+touch (IORef (STRef mutVar)) =+  -- Thanks to a GHC issue, this touch# may not be quite guaranteed+  -- to work. There's talk of replacing the touch# primop with one+  -- that works better with the optimizer. But this seems to be the+  -- "right" way to do it for now.+  IO $ \s -> (## touch## mutVar s, () ##)++-- | Get a file descriptor from a 'Socket'. The socket will never+-- be closed automatically before @withFdSocket@ completes, but+-- it may still be closed by an explicit call to 'close' or `close'`,+-- either before or during the call.+--+-- The file descriptor must not be used after @withFdSocket@ returns, because+-- the 'Socket' may have been garbage-collected, invalidating the file+-- descriptor.+--+-- Since: 3.1.0.0+withFdSocket :: Socket -> (CInt -> IO r) -> IO r+withFdSocket (Socket ref _) f = do+  fd <- readIORef ref+  -- Should we throw an exception if the socket is already invalid?+  -- That will catch some mistakes but certainly not all.++  r <- f fd++  touch ref+  return r++-- | Socket is closed and a duplicated file descriptor is returned.+--   The duplicated descriptor is no longer subject to the possibility+--   of unexpectedly being closed if the socket is finalized. It is+--   now the caller's responsibility to ultimately close the+--   duplicated file descriptor.+socketToFd :: Socket -> IO CInt+socketToFd s = do+#if defined(mingw32_HOST_OS)+    fd <- unsafeFdSocket s+    fd2 <- c_wsaDuplicate fd+    -- FIXME: throw error no if -1+    close s+    return fd2++foreign import ccall unsafe "wsaDuplicate"+   c_wsaDuplicate :: CInt -> IO CInt+#else+    fd <- unsafeFdSocket s+    -- FIXME: throw error no if -1+    fd2 <- c_dup fd+    close s+    return fd2++foreign import ccall unsafe "dup"+   c_dup :: CInt -> IO CInt+#endif++-- | Creating a socket from a file descriptor.+mkSocket :: CInt -> IO Socket+mkSocket fd = do+    ref <- newIORef fd+    let s = Socket ref fd+    void $ mkWeakIORef ref $ close s+    return s++invalidSocket :: CInt+#if defined(mingw32_HOST_OS)+invalidSocket = #const INVALID_SOCKET+#else+invalidSocket = -1+#endif++invalidateSocket ::+      Socket+   -> (CInt -> IO a)+   -> (CInt -> IO a)+   -> IO a+invalidateSocket (Socket ref _) errorAction normalAction = do+    oldfd <- atomicModifyIORef' ref $ \cur -> (invalidSocket, cur)+    if oldfd == invalidSocket then errorAction oldfd else normalAction oldfd++-----------------------------------------------------------------------------++-- | Close the socket. This function does not throw exceptions even if+--   the underlying system call returns errors.+--+--   If multiple threads use the same socket and one uses 'unsafeFdSocket' and+--   the other use 'close', unexpected behavior may happen.+--   For more information, please refer to the documentation of 'unsafeFdSocket'.+close :: Socket -> IO ()+close s = invalidateSocket s (\_ -> return ()) $ \oldfd -> do+    -- closeFdWith avoids the deadlock of IO manager.+    closeFdWith closeFd (toFd oldfd)+  where+    toFd :: CInt -> Fd+    toFd = fromIntegral+    -- closeFd ignores the return value of c_close and+    -- does not throw exceptions+    closeFd :: Fd -> IO ()+    closeFd = void . c_close . fromIntegral++-- | Close the socket. This function throws exceptions if+--   the underlying system call returns errors.+close' :: Socket -> IO ()+close' s = invalidateSocket s (\_ -> return ()) $ \oldfd -> do+    -- closeFdWith avoids the deadlock of IO manager.+    closeFdWith closeFd (toFd oldfd)+  where+    toFd :: CInt -> Fd+    toFd = fromIntegral+    closeFd :: Fd -> IO ()+    closeFd fd = do+        ret <- c_close $ fromIntegral fd+        when (ret == -1) $ throwErrno "Network.Socket.close'"++#if defined(mingw32_HOST_OS)+foreign import CALLCONV unsafe "closesocket"+  c_close :: CInt -> IO CInt+#else+foreign import ccall unsafe "close"+  c_close :: CInt -> IO CInt+#endif++-----------------------------------------------------------------------------++-- | Protocol number.+type ProtocolNumber = CInt++-- | This is the default protocol for a given service.+--+-- >>> defaultProtocol+-- 0+defaultProtocol :: ProtocolNumber+defaultProtocol = 0++-----------------------------------------------------------------------------+-- Socket types++-- There are a few possible ways to do this.  The first is convert the+-- structs used in the C library into an equivalent Haskell type. An+-- other possible implementation is to keep all the internals in the C+-- code and use an Int## and a status flag. The second method is used+-- here since a lot of the C structures are not required to be+-- manipulated.++-- Originally the status was non-mutable so we had to return a new+-- socket each time we changed the status.  This version now uses+-- mutable variables to avoid the need to do this.  The result is a+-- cleaner interface and better security since the application+-- programmer now can't circumvent the status information to perform+-- invalid operations on sockets.++-- | Socket Types.+--+-- Some of the defined patterns may be unsupported on some systems:+-- see 'isSupportedSocketType'.+newtype SocketType = SocketType { packSocketType :: CInt }+        deriving (Eq, Ord)++unpackSocketType :: CInt -> SocketType+unpackSocketType = SocketType+{-# INLINE unpackSocketType #-}++-- | Is the @SOCK_xxxxx@ constant corresponding to the given SocketType known+-- on this system?  'GeneralSocketType' values, not equal to any of the named+-- patterns or 'UnsupportedSocketType', will return 'True' even when not+-- known on this system.+isSupportedSocketType :: SocketType -> Bool+isSupportedSocketType = (/= UnsupportedSocketType)++-- | Pattern for a general socket type.+pattern GeneralSocketType    :: CInt -> SocketType+pattern GeneralSocketType n  =  SocketType n+#if __GLASGOW_HASKELL__ >= 806+{-# COMPLETE GeneralSocketType #-}+#endif+-- The actual constructor is not exported, which keeps the internal+-- representation private, but for all purposes other than 'coerce' the+-- above pattern is just as good.++-- | Unsupported socket type, equal to any other types not supported on this+-- system.+pattern UnsupportedSocketType :: SocketType+pattern UnsupportedSocketType  = SocketType (-1)++-- | Used in getAddrInfo hints, for example.+pattern NoSocketType        :: SocketType+pattern NoSocketType         = SocketType 0++pattern Stream              :: SocketType+#ifdef SOCK_STREAM+pattern Stream               = SocketType (#const SOCK_STREAM)+#else+pattern Stream               = UnsupportedSocketType+#endif++pattern Datagram            :: SocketType+#ifdef SOCK_DGRAM+pattern Datagram             = SocketType (#const SOCK_DGRAM)+#else+pattern Datagram             = UnsupportedSocketType+#endif++pattern Raw                 :: SocketType+#ifdef SOCK_RAW+pattern Raw                  = SocketType (#const SOCK_RAW)+#else+pattern Raw                  = UnsupportedSocketType+#endif++pattern RDM                 :: SocketType+#ifdef SOCK_RDM+pattern RDM                  = SocketType (#const SOCK_RDM)+#else+pattern RDM                  = UnsupportedSocketType+#endif++pattern SeqPacket           :: SocketType+#ifdef SOCK_SEQPACKET+pattern SeqPacket            = SocketType (#const SOCK_SEQPACKET)+#else+pattern SeqPacket            = UnsupportedSocketType+#endif++------------------------------------------------------------------------+-- Protocol Families.+++-- | Address families.  The @AF_xxxxx@ constants are widely used as synonyms+-- for the corresponding @PF_xxxxx@ protocol family values, to which they are+-- numerically equal in mainstream socket API implementations.+--+-- Strictly correct usage would be to pass the @PF_xxxxx@ constants as the first+-- argument when creating a 'Socket', while the @AF_xxxxx@ constants should be+-- used as @addrFamily@ values with 'getAddrInfo'.  For now only the @AF_xxxxx@+-- constants are provided.+--+-- Some of the defined patterns may be unsupported on some systems:+-- see 'isSupportedFamily'.+newtype Family = Family { packFamily :: CInt } deriving (Eq, Ord)+++-- | Does one of the AF_ constants correspond to a known address family on this+-- system.  'GeneralFamily' values, not equal to any of the named @AF_xxxxx@+-- patterns or 'UnsupportedFamily', will return 'True' even when not known on+-- this system.+isSupportedFamily :: Family -> Bool+isSupportedFamily f = case f of+    UnsupportedFamily -> False+    GeneralFamily _   -> True++-- | Convert 'CInt' to 'Family'.+unpackFamily :: CInt -> Family+unpackFamily = Family+{-# INLINE unpackFamily #-}++-- | Pattern for a general protocol family (a.k.a. address family).+--+-- @since 3.2.0.0+pattern GeneralFamily      :: CInt -> Family+pattern GeneralFamily n     = Family n+#if __GLASGOW_HASKELL__ >= 806+{-# COMPLETE GeneralFamily #-}+#endif+-- The actual constructor is not exported, which keeps the internal+-- representation private, but for all purposes other than 'coerce' the+-- above pattern is just as good.++-- | Unsupported address family, equal to any other families that are not+-- supported on the system.+--+-- @since 3.2.0.0+pattern UnsupportedFamily  :: Family+pattern UnsupportedFamily   = Family (-1)++-- | unspecified+pattern AF_UNSPEC          :: Family+pattern AF_UNSPEC           = Family (#const AF_UNSPEC)++-- | UNIX-domain+pattern AF_UNIX            :: Family+#ifdef AF_UNIX+pattern AF_UNIX             = Family (#const AF_UNIX)+#else+pattern AF_UNIX             = Family (-1)+#endif++-- | Internet Protocol version 4+pattern AF_INET            :: Family+#ifdef AF_INET+pattern AF_INET             = Family (#const AF_INET)+#else+pattern AF_INET             = Family (-1)+#endif++-- | Internet Protocol version 6+pattern AF_INET6           :: Family+#ifdef AF_INET6+pattern AF_INET6            = Family (#const AF_INET6)+#else+pattern AF_INET6            = Family (-1)+#endif++-- | Arpanet imp addresses+pattern AF_IMPLINK         :: Family+#ifdef AF_IMPLINK+pattern AF_IMPLINK          = Family (#const AF_IMPLINK)+#else+pattern AF_IMPLINK          = Family (-1)+#endif++-- | pup protocols: e.g. BSP+pattern AF_PUP             :: Family+#ifdef AF_PUP+pattern AF_PUP              = Family (#const AF_PUP)+#else+pattern AF_PUP              = Family (-1)+#endif++-- | mit CHAOS protocols+pattern AF_CHAOS           :: Family+#ifdef AF_CHAOS+pattern AF_CHAOS            = Family (#const AF_CHAOS)+#else+pattern AF_CHAOS            = Family (-1)+#endif++-- | XEROX NS protocols+pattern AF_NS              :: Family+#ifdef AF_NS+pattern AF_NS               = Family (#const AF_NS)+#else+pattern AF_NS               = Family (-1)+#endif++-- | nbs protocols+pattern AF_NBS             :: Family+#ifdef AF_NBS+pattern AF_NBS              = Family (#const AF_NBS)+#else+pattern AF_NBS              = Family (-1)+#endif++-- | european computer manufacturers+pattern AF_ECMA            :: Family+#ifdef AF_ECMA+pattern AF_ECMA             = Family (#const AF_ECMA)+#else+pattern AF_ECMA             = Family (-1)+#endif++-- | datakit protocols+pattern AF_DATAKIT         :: Family+#ifdef AF_DATAKIT+pattern AF_DATAKIT          = Family (#const AF_DATAKIT)+#else+pattern AF_DATAKIT          = Family (-1)+#endif++-- | CCITT protocols, X.25 etc+pattern AF_CCITT           :: Family+#ifdef AF_CCITT+pattern AF_CCITT            = Family (#const AF_CCITT)+#else+pattern AF_CCITT            = Family (-1)+#endif++-- | IBM SNA+pattern AF_SNA             :: Family+#ifdef AF_SNA+pattern AF_SNA              = Family (#const AF_SNA)+#else+pattern AF_SNA              = Family (-1)+#endif++-- | DECnet+pattern AF_DECnet          :: Family+#ifdef AF_DECnet+pattern AF_DECnet           = Family (#const AF_DECnet)+#else+pattern AF_DECnet           = Family (-1)+#endif++-- | Direct data link interface+pattern AF_DLI             :: Family+#ifdef AF_DLI+pattern AF_DLI              = Family (#const AF_DLI)+#else+pattern AF_DLI              = Family (-1)+#endif++-- | LAT+pattern AF_LAT             :: Family+#ifdef AF_LAT+pattern AF_LAT              = Family (#const AF_LAT)+#else+pattern AF_LAT              = Family (-1)+#endif++-- | NSC Hyperchannel+pattern AF_HYLINK          :: Family+#ifdef AF_HYLINK+pattern AF_HYLINK           = Family (#const AF_HYLINK)+#else+pattern AF_HYLINK           = Family (-1)+#endif++-- | Apple Talk+pattern AF_APPLETALK       :: Family+#ifdef AF_APPLETALK+pattern AF_APPLETALK        = Family (#const AF_APPLETALK)+#else+pattern AF_APPLETALK        = Family (-1)+#endif++-- | Internal Routing Protocol (aka AF_NETLINK)+pattern AF_ROUTE           :: Family+#ifdef AF_ROUTE+pattern AF_ROUTE            = Family (#const AF_ROUTE)+#else+pattern AF_ROUTE            = Family (-1)+#endif++-- | NetBios-style addresses+pattern AF_NETBIOS         :: Family+#ifdef AF_NETBIOS+pattern AF_NETBIOS          = Family (#const AF_NETBIOS)+#else+pattern AF_NETBIOS          = Family (-1)+#endif++-- | Network Interface Tap+pattern AF_NIT             :: Family+#ifdef AF_NIT+pattern AF_NIT              = Family (#const AF_NIT)+#else+pattern AF_NIT              = Family (-1)+#endif++-- | IEEE 802.2, also ISO 8802+pattern AF_802             :: Family+#ifdef AF_802+pattern AF_802              = Family (#const AF_802)+#else+pattern AF_802              = Family (-1)+#endif++-- | ISO protocols+pattern AF_ISO             :: Family+#ifdef AF_ISO+pattern AF_ISO              = Family (#const AF_ISO)+#else+pattern AF_ISO              = Family (-1)+#endif++-- | umbrella of all families used by OSI+pattern AF_OSI             :: Family+#ifdef AF_OSI+pattern AF_OSI              = Family (#const AF_OSI)+#else+pattern AF_OSI              = Family (-1)+#endif++-- | DNA Network Management+pattern AF_NETMAN          :: Family+#ifdef AF_NETMAN+pattern AF_NETMAN           = Family (#const AF_NETMAN)+#else+pattern AF_NETMAN           = Family (-1)+#endif++-- | CCITT X.25+pattern AF_X25             :: Family+#ifdef AF_X25+pattern AF_X25              = Family (#const AF_X25)+#else+pattern AF_X25              = Family (-1)+#endif++-- | AX25+pattern AF_AX25            :: Family+#ifdef AF_AX25+pattern AF_AX25             = Family (#const AF_AX25)+#else+pattern AF_AX25             = Family (-1)+#endif++-- | AFI+pattern AF_OSINET          :: Family+#ifdef AF_OSINET+pattern AF_OSINET           = Family (#const AF_OSINET)+#else+pattern AF_OSINET           = Family (-1)+#endif++-- | US Government OSI+pattern AF_GOSSIP          :: Family+#ifdef AF_GOSSIP+pattern AF_GOSSIP           = Family (#const AF_GOSSIP)+#else+pattern AF_GOSSIP           = Family (-1)+#endif++-- | Novell Internet Protocol+pattern AF_IPX             :: Family+#ifdef AF_IPX+pattern AF_IPX              = Family (#const AF_IPX)+#else+pattern AF_IPX              = Family (-1)+#endif++-- | eXpress Transfer Protocol (no AF)+pattern Pseudo_AF_XTP      :: Family+#ifdef Pseudo_AF_XTP+pattern Pseudo_AF_XTP       = Family (#const Pseudo_AF_XTP)+#else+pattern Pseudo_AF_XTP       = Family (-1)+#endif++-- | Common Trace Facility+pattern AF_CTF             :: Family+#ifdef AF_CTF+pattern AF_CTF              = Family (#const AF_CTF)+#else+pattern AF_CTF              = Family (-1)+#endif++-- | Wide Area Network protocols+pattern AF_WAN             :: Family+#ifdef AF_WAN+pattern AF_WAN              = Family (#const AF_WAN)+#else+pattern AF_WAN              = Family (-1)+#endif++-- | SGI Data Link for DLPI+pattern AF_SDL             :: Family+#ifdef AF_SDL+pattern AF_SDL              = Family (#const AF_SDL)+#else+pattern AF_SDL              = Family (-1)+#endif++-- | Netware+pattern AF_NETWARE         :: Family+#ifdef AF_NETWARE+pattern AF_NETWARE          = Family (#const AF_NETWARE)+#else+pattern AF_NETWARE          = Family (-1)+#endif++-- | NDD+pattern AF_NDD             :: Family+#ifdef AF_NDD+pattern AF_NDD              = Family (#const AF_NDD)+#else+pattern AF_NDD              = Family (-1)+#endif++-- | Debugging use only+pattern AF_INTF            :: Family+#ifdef AF_INTF+pattern AF_INTF             = Family (#const AF_INTF)+#else+pattern AF_INTF             = Family (-1)+#endif++-- | connection-oriented IP, aka ST II+pattern AF_COIP            :: Family+#ifdef AF_COIP+pattern AF_COIP             = Family (#const AF_COIP)+#else+pattern AF_COIP             = Family (-1)+#endif++-- | Computer Network Technology+pattern AF_CNT             :: Family+#ifdef AF_CNT+pattern AF_CNT              = Family (#const AF_CNT)+#else+pattern AF_CNT              = Family (-1)+#endif++-- | Help Identify RTIP packets+pattern Pseudo_AF_RTIP     :: Family+#ifdef Pseudo_AF_RTIP+pattern Pseudo_AF_RTIP      = Family (#const Pseudo_AF_RTIP)+#else+pattern Pseudo_AF_RTIP      = Family (-1)+#endif++-- | Help Identify PIP packets+pattern Pseudo_AF_PIP      :: Family+#ifdef Pseudo_AF_PIP+pattern Pseudo_AF_PIP       = Family (#const Pseudo_AF_PIP)+#else+pattern Pseudo_AF_PIP       = Family (-1)+#endif++-- | Simple Internet Protocol+pattern AF_SIP             :: Family+#ifdef AF_SIP+pattern AF_SIP              = Family (#const AF_SIP)+#else+pattern AF_SIP              = Family (-1)+#endif++-- | Integrated Services Digital Network+pattern AF_ISDN            :: Family+#ifdef AF_ISDN+pattern AF_ISDN             = Family (#const AF_ISDN)+#else+pattern AF_ISDN             = Family (-1)+#endif++-- | Internal key-management function+pattern Pseudo_AF_KEY      :: Family+#ifdef Pseudo_AF_KEY+pattern Pseudo_AF_KEY       = Family (#const Pseudo_AF_KEY)+#else+pattern Pseudo_AF_KEY       = Family (-1)+#endif++-- | native ATM access+pattern AF_NATM            :: Family+#ifdef AF_NATM+pattern AF_NATM             = Family (#const AF_NATM)+#else+pattern AF_NATM             = Family (-1)+#endif++-- | ARP (RFC 826)+pattern AF_ARP             :: Family+#ifdef AF_ARP+pattern AF_ARP              = Family (#const AF_ARP)+#else+pattern AF_ARP              = Family (-1)+#endif++-- | Used by BPF to not rewrite hdrs in iface output+pattern Pseudo_AF_HDRCMPLT :: Family+#ifdef Pseudo_AF_HDRCMPLT+pattern Pseudo_AF_HDRCMPLT  = Family (#const Pseudo_AF_HDRCMPLT)+#else+pattern Pseudo_AF_HDRCMPLT  = Family (-1)+#endif++-- | ENCAP+pattern AF_ENCAP           :: Family+#ifdef AF_ENCAP+pattern AF_ENCAP            = Family (#const AF_ENCAP)+#else+pattern AF_ENCAP            = Family (-1)+#endif++-- | Link layer interface+pattern AF_LINK            :: Family+#ifdef AF_LINK+pattern AF_LINK             = Family (#const AF_LINK)+#else+pattern AF_LINK             = Family (-1)+#endif++-- | Link layer interface+pattern AF_RAW             :: Family+#ifdef AF_RAW+pattern AF_RAW              = Family (#const AF_RAW)+#else+pattern AF_RAW              = Family (-1)+#endif++-- | raw interface+pattern AF_RIF             :: Family+#ifdef AF_RIF+pattern AF_RIF              = Family (#const AF_RIF)+#else+pattern AF_RIF              = Family (-1)+#endif++-- | Amateur radio NetROM+pattern AF_NETROM          :: Family+#ifdef AF_NETROM+pattern AF_NETROM           = Family (#const AF_NETROM)+#else+pattern AF_NETROM           = Family (-1)+#endif++-- | multiprotocol bridge+pattern AF_BRIDGE          :: Family+#ifdef AF_BRIDGE+pattern AF_BRIDGE           = Family (#const AF_BRIDGE)+#else+pattern AF_BRIDGE           = Family (-1)+#endif++-- | ATM PVCs+pattern AF_ATMPVC          :: Family+#ifdef AF_ATMPVC+pattern AF_ATMPVC           = Family (#const AF_ATMPVC)+#else+pattern AF_ATMPVC           = Family (-1)+#endif++-- | Amateur Radio X.25 PLP+pattern AF_ROSE            :: Family+#ifdef AF_ROSE+pattern AF_ROSE             = Family (#const AF_ROSE)+#else+pattern AF_ROSE             = Family (-1)+#endif++-- | Netbeui 802.2LLC+pattern AF_NETBEUI         :: Family+#ifdef AF_NETBEUI+pattern AF_NETBEUI          = Family (#const AF_NETBEUI)+#else+pattern AF_NETBEUI          = Family (-1)+#endif++-- | Security callback pseudo AF+pattern AF_SECURITY        :: Family+#ifdef AF_SECURITY+pattern AF_SECURITY         = Family (#const AF_SECURITY)+#else+pattern AF_SECURITY         = Family (-1)+#endif++-- | Packet family+pattern AF_PACKET          :: Family+#ifdef AF_PACKET+pattern AF_PACKET           = Family (#const AF_PACKET)+#else+pattern AF_PACKET           = Family (-1)+#endif++-- | Ash+pattern AF_ASH             :: Family+#ifdef AF_ASH+pattern AF_ASH              = Family (#const AF_ASH)+#else+pattern AF_ASH              = Family (-1)+#endif++-- | Acorn Econet+pattern AF_ECONET          :: Family+#ifdef AF_ECONET+pattern AF_ECONET           = Family (#const AF_ECONET)+#else+pattern AF_ECONET           = Family (-1)+#endif++-- | ATM SVCs+pattern AF_ATMSVC          :: Family+#ifdef AF_ATMSVC+pattern AF_ATMSVC           = Family (#const AF_ATMSVC)+#else+pattern AF_ATMSVC           = Family (-1)+#endif++-- | IRDA sockets+pattern AF_IRDA            :: Family+#ifdef AF_IRDA+pattern AF_IRDA             = Family (#const AF_IRDA)+#else+pattern AF_IRDA             = Family (-1)+#endif++-- | PPPoX sockets+pattern AF_PPPOX           :: Family+#ifdef AF_PPPOX+pattern AF_PPPOX            = Family (#const AF_PPPOX)+#else+pattern AF_PPPOX            = Family (-1)+#endif++-- | Wanpipe API sockets+pattern AF_WANPIPE         :: Family+#ifdef AF_WANPIPE+pattern AF_WANPIPE          = Family (#const AF_WANPIPE)+#else+pattern AF_WANPIPE          = Family (-1)+#endif++-- | bluetooth sockets+pattern AF_BLUETOOTH       :: Family+#ifdef AF_BLUETOOTH+pattern AF_BLUETOOTH        = Family (#const AF_BLUETOOTH)+#else+pattern AF_BLUETOOTH        = Family (-1)+#endif++-- | Controller Area Network+pattern AF_CAN             :: Family+#ifdef AF_CAN+pattern AF_CAN              = Family (#const AF_CAN)+#else+pattern AF_CAN              = Family (-1)+#endif++------------------------------------------------------------------------+-- Port Numbers++-- | Port number.+--   Use the @Num@ instance (i.e. use a literal) to create a+--   @PortNumber@ value.+--+-- >>> 1 :: PortNumber+-- 1+-- >>> read "1" :: PortNumber+-- 1+-- >>> show (12345 :: PortNumber)+-- "12345"+-- >>> 50000 < (51000 :: PortNumber)+-- True+-- >>> 50000 < (52000 :: PortNumber)+-- True+-- >>> 50000 + (10000 :: PortNumber)+-- 60000+newtype PortNumber = PortNum Word16 deriving (Eq, Ord, Num, Enum, Bounded, Real, Integral)++foreign import CALLCONV unsafe "ntohs" ntohs :: Word16 -> Word16+foreign import CALLCONV unsafe "htons" htons :: Word16 -> Word16+-- | Converts the from host byte order to network byte order.+foreign import CALLCONV unsafe "htonl" htonl :: Word32 -> Word32+-- | Converts the from network byte order to host byte order.+foreign import CALLCONV unsafe "ntohl" ntohl :: Word32 -> Word32+{-# DEPRECATED htonl "Use getAddrInfo instead" #-}+{-# DEPRECATED ntohl "Use getAddrInfo instead" #-}++instance Storable PortNumber where+   sizeOf    ~_ = sizeOf    (0 :: Word16)+   alignment ~_ = alignment (0 :: Word16)+   poke p (PortNum po) = poke (castPtr p) (htons po)+   peek p = PortNum . ntohs <$> peek (castPtr p)++-- | Default port number.+--+-- >>> defaultPort+-- 0+defaultPort :: PortNumber+defaultPort = 0++------------------------------------------------------------------------++-- | The core typeclass to unify socket addresses.+class SocketAddress sa where+    sizeOfSocketAddress :: sa -> Int+    peekSocketAddress :: Ptr sa -> IO sa+    pokeSocketAddress  :: Ptr a -> sa -> IO ()++-- sizeof(struct sockaddr_storage) which has enough space to contain+-- sockaddr_in, sockaddr_in6 and sockaddr_un.+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+    if sz == 0 then+        f nullPtr 0+      else+        allocaBytes sz $ \p -> pokeSocketAddress p addr >> f (castPtr p) sz++withNewSocketAddress :: SocketAddress sa => (Ptr sa -> Int -> IO a) -> IO a+withNewSocketAddress f = allocaBytes sockaddrStorageLen $ \ptr -> do+    zeroMemory ptr $ fromIntegral sockaddrStorageLen+    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+-- calls in the BSD socket API that need to know the socket address+-- all operate in terms of struct sockaddr, a `virtual' type of+-- socket address.++-- The Internet family of sockets are addressed as struct sockaddr_in,+-- so when calling functions that operate on struct sockaddr, we have+-- to type cast the Internet socket address into a struct sockaddr.+-- Instances of the structure for different families might *not* be+-- the same size. Same casting is required of other families of+-- sockets such as Xerox NS. Similarly for UNIX-domain sockets.++-- To represent these socket addresses in Haskell-land, we do what BSD+-- didn't do, and use a union/algebraic type for the different+-- families. Currently only UNIX-domain sockets and the Internet+-- families are supported.++-- | Flow information.+type FlowInfo = Word32+-- | Scope identifier.+type ScopeID = Word32++-- | Socket addresses.+--  The existence of a constructor does not necessarily imply that+--  that socket address type is supported on your system: see+-- 'isSupportedSockAddr'.+data SockAddr+  = SockAddrInet+        PortNumber      -- sin_port+        HostAddress     -- sin_addr  (ditto)+  | SockAddrInet6+        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+  deriving (Eq, Ord)++instance NFData SockAddr where+  rnf (SockAddrInet _ _) = ()+  rnf (SockAddrInet6 _ _ _ _) = ()+  rnf (SockAddrUnix str) = rnf str++-- | Is the socket address type supported on this system?+isSupportedSockAddr :: SockAddr -> Bool+isSupportedSockAddr addr = case addr of+  SockAddrInet{}  -> True+  SockAddrInet6{} -> True+  SockAddrUnix{}  -> True++instance SocketAddress SockAddr where+    sizeOfSocketAddress = sizeOfSockAddr+    peekSocketAddress   = peekSockAddr+    pokeSocketAddress   = pokeSockAddr++#if defined(mingw32_HOST_OS)+type CSaFamily = (#type unsigned short)+#elif defined(darwin_HOST_OS)+type CSaFamily = (#type u_char)+#else+type CSaFamily = (#type sa_family_t)+#endif++-- | Computes the storage requirements (in bytes) of the given+-- 'SockAddr'.  This function differs from 'Foreign.Storable.sizeOf'+-- in that the value of the argument /is/ used.+sizeOfSockAddr :: SockAddr -> Int+# ifdef linux_HOST_OS+-- http://man7.org/linux/man-pages/man7/unix.7.html says:+-- "an abstract socket address is distinguished (from a+-- pathname socket) by the fact that sun_path[0] is a null byte+-- ('\0').  The socket's address in this namespace is given by the+-- additional bytes in sun_path that are covered by the specified+-- length of the address structure.  (Null bytes in the name have no+-- special significance.)  The name has no connection with filesystem+-- pathnames.  When the address of an abstract socket is returned,+-- the returned addrlen is greater than sizeof(sa_family_t) (i.e.,+-- greater than 2), and the name of the socket is contained in the+-- first (addrlen - sizeof(sa_family_t)) bytes of sun_path."+sizeOfSockAddr (SockAddrUnix path) =+    case path of+        '\0':_ -> (#const sizeof(sa_family_t)) + length path+        _      -> #const sizeof(struct sockaddr_un)+# else+sizeOfSockAddr SockAddrUnix{}  = #const sizeof(struct sockaddr_un)+# endif+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+withSockAddr addr f = do+    let sz = sizeOfSockAddr addr+    allocaBytes sz $ \p -> pokeSockAddr p addr >> f (castPtr p) sz++-- We cannot bind sun_paths longer than than the space in the sockaddr_un+-- structure, and attempting to do so could overflow the allocated storage+-- space.  This constant holds the maximum allowable path length.+--+unixPathMax :: Int+unixPathMax = #const sizeof(((struct sockaddr_un *)NULL)->sun_path)++-- We can't write an instance of 'Storable' for 'SockAddr' because+-- @sockaddr@ is a sum type of variable size but+-- 'Foreign.Storable.sizeOf' is required to be constant.++-- Note that on Darwin, the sockaddr structure must be zeroed before+-- use.++-- | Write the given 'SockAddr' to the given memory location.+pokeSockAddr :: Ptr a -> SockAddr -> IO ()+pokeSockAddr p sa@(SockAddrUnix path) = do+    let pathC = map castCharToCChar path+        len = length pathC+    when (len >= unixPathMax) $ error+      $ "pokeSockAddr: path is too long in SockAddrUnix " <> show path+      <> ", 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)+    -- the buffer is already filled with nulls.+    pokeArray ((#ptr struct sockaddr_un, sun_path) p) pathC+pokeSockAddr p (SockAddrInet port addr) = do+    zeroMemory p (#const sizeof(struct sockaddr_in))+#if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)+    (#poke struct sockaddr_in, sin_len) p ((#const sizeof(struct sockaddr_in)) :: Word8)+#endif+    (#poke struct sockaddr_in, sin_family) p ((#const AF_INET) :: CSaFamily)+    (#poke struct sockaddr_in, sin_port) p port+    (#poke struct sockaddr_in, sin_addr) p addr+pokeSockAddr p (SockAddrInet6 port flow addr scope) = do+    zeroMemory p (#const sizeof(struct sockaddr_in6))+# if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)+    (#poke struct sockaddr_in6, sin6_len) p ((#const sizeof(struct sockaddr_in6)) :: Word8)+# endif+    (#poke struct sockaddr_in6, sin6_family) p ((#const AF_INET6) :: CSaFamily)+    (#poke struct sockaddr_in6, sin6_port) p port+    (#poke struct sockaddr_in6, sin6_flowinfo) p flow+    (#poke struct sockaddr_in6, sin6_addr) p (In6Addr addr)+    (#poke struct sockaddr_in6, sin6_scope_id) p scope++-- | Read a 'SockAddr' from the given memory location.+peekSockAddr :: Ptr SockAddr -> IO SockAddr+peekSockAddr p = do+  family <- (#peek struct sockaddr, sa_family) p+  case family :: CSaFamily of+    (#const AF_UNIX) -> do+        str <- peekCAString ((#ptr struct sockaddr_un, sun_path) p)+        return (SockAddrUnix str)+    (#const AF_INET) -> do+        addr <- (#peek struct sockaddr_in, sin_addr) p+        port <- (#peek struct sockaddr_in, sin_port) p+        return (SockAddrInet port addr)+    (#const AF_INET6) -> do+        port <- (#peek struct sockaddr_in6, sin6_port) p+        flow <- (#peek struct sockaddr_in6, sin6_flowinfo) p+        In6Addr addr <- (#peek struct sockaddr_in6, sin6_addr) p+        scope <- (#peek struct sockaddr_in6, sin6_scope_id) p+        return (SockAddrInet6 port flow addr scope)+    _ -> ioError $ userError $+      "Network.Socket.Types.peekSockAddr: address family '" +++      show family ++ "' not supported."++------------------------------------------------------------------------++-- | The raw network byte order number is read using host byte order.+-- Therefore on little-endian architectures the byte order is swapped. For+-- example @127.0.0.1@ is represented as @0x0100007f@ on little-endian hosts+-- and as @0x7f000001@ on big-endian hosts.+--+-- For direct manipulation prefer 'hostAddressToTuple' and+-- 'tupleToHostAddress'.+type HostAddress = Word32++-- | Converts 'HostAddress' to representation-independent IPv4 quadruple.+-- For example for @127.0.0.1@ the function will return @(0x7f, 0, 0, 1)@+-- regardless of host endianness.+--+{- -- prop> tow == hostAddressToTuple (tupleToHostAddress tow) -}+hostAddressToTuple :: HostAddress -> (Word8, Word8, Word8, Word8)+hostAddressToTuple ha' =+    let ha = htonl ha'+        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) =+    let x `sl` i = fromIntegral x `shiftL` i :: Word32+    in ntohl $ (b3 `sl` 24) .|. (b2 `sl` 16) .|. (b1 `sl` 8) .|. (b0 `sl` 0)++-- | Independent of endianness. For example @::1@ is stored as @(0, 0, 0, 1)@.+--+-- For direct manipulation prefer 'hostAddress6ToTuple' and+-- 'tupleToHostAddress6'.+type HostAddress6 = (Word32, Word32, Word32, Word32)++-- | Converts 'HostAddress6' to representation-independent IPv6 octuple.+--+{- -- prop> (w1,w2,w3,w4,w5,w6,w7,w8) == hostAddress6ToTuple (tupleToHostAddress6 (w1,w2,w3,w4,w5,w6,w7,w8)) -}+hostAddress6ToTuple :: HostAddress6 -> (Word16, Word16, Word16, Word16,+                                        Word16, Word16, Word16, Word16)+hostAddress6ToTuple (w3, w2, w1, w0) =+    let high, low :: Word32 -> Word16+        high w = fromIntegral (w `shiftR` 16)+        low w = fromIntegral w+    in (high w3, low w3, high w2, low w2, high w1, low w1, high w0, low w0)++-- | Converts IPv6 octuple to 'HostAddress6'.+tupleToHostAddress6 :: (Word16, Word16, Word16, Word16,+                        Word16, Word16, Word16, Word16) -> HostAddress6+tupleToHostAddress6 (w7, w6, w5, w4, w3, w2, w1, w0) =+    let add :: Word16 -> Word16 -> Word32+        high `add` low = (fromIntegral high `shiftL` 16) .|. (fromIntegral low)+    in (w7 `add` w6, w5 `add` w4, w3 `add` w2, w1 `add` w0)++-- The peek32 and poke32 functions work around the fact that the RFCs+-- don't require 32-bit-wide address fields to be present.  We can+-- only portably rely on an 8-bit field, s6_addr.++s6_addr_offset :: Int+s6_addr_offset = (#offset struct in6_addr, s6_addr)++peek32 :: Ptr a -> Int -> IO Word32+peek32 p i0 = do+    let i' = i0 * 4+        peekByte n = peekByteOff p (s6_addr_offset + i' + n) :: IO Word8+        a `sl` i = fromIntegral a `shiftL` i+    a0 <- peekByte 0+    a1 <- peekByte 1+    a2 <- peekByte 2+    a3 <- peekByte 3+    return ((a0 `sl` 24) .|. (a1 `sl` 16) .|. (a2 `sl` 8) .|. (a3 `sl` 0))++poke32 :: Ptr a -> Int -> Word32 -> IO ()+poke32 p i0 a = do+    let i' = i0 * 4+        pokeByte n = pokeByteOff p (s6_addr_offset + i' + n)+        x `sr` i = fromIntegral (x `shiftR` i) :: Word8+    pokeByte 0 (a `sr` 24)+    pokeByte 1 (a `sr` 16)+    pokeByte 2 (a `sr`  8)+    pokeByte 3 (a `sr`  0)++-- | Private newtype proxy for the Storable instance. To avoid orphan instances.+newtype In6Addr = In6Addr HostAddress6++#if __GLASGOW_HASKELL__ < 800+#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)+#endif++instance Storable In6Addr where+    sizeOf    ~_ = #const sizeof(struct in6_addr)+    alignment ~_ = #alignment struct in6_addr++    peek p = do+        a <- peek32 p 0+        b <- peek32 p 1+        c <- peek32 p 2+        d <- peek32 p 3+        return $ In6Addr (a, b, c, d)++    poke p (In6Addr (a, b, c, d)) = do+        poke32 p 0 a+        poke32 p 1 b+        poke32 p 2 c+        poke32 p 3 d++------------------------------------------------------------------------+-- Read and Show instance for pattern-based integral newtypes++socktypeBijection :: Bijection SocketType String+socktypeBijection =+    [ (UnsupportedSocketType, "UnsupportedSocketType")+    , (Stream, "Stream")+    , (Datagram, "Datagram")+    , (Raw, "Raw")+    , (RDM, "RDM")+    , (SeqPacket, "SeqPacket")+    , (NoSocketType, "NoSocketType")+    ]++instance Show SocketType where+    showsPrec = bijectiveShow socktypeBijection def+      where+        gst = "GeneralSocketType"+        def = defShow gst packSocketType _showInt++instance Read SocketType where+    readPrec = bijectiveRead socktypeBijection def+      where+        gst = "GeneralSocketType"+        def = defRead gst unpackSocketType _readInt++familyBijection :: Bijection Family String+familyBijection =+    [ (UnsupportedFamily, "UnsupportedFamily")+    , (AF_UNSPEC, "AF_UNSPEC")+    , (AF_UNIX, "AF_UNIX")+    , (AF_INET, "AF_INET")+    , (AF_INET6, "AF_INET6")+    , (AF_IMPLINK, "AF_IMPLINK")+    , (AF_PUP, "AF_PUP")+    , (AF_CHAOS, "AF_CHAOS")+    , (AF_NS, "AF_NS")+    , (AF_NBS, "AF_NBS")+    , (AF_ECMA, "AF_ECMA")+    , (AF_DATAKIT, "AF_DATAKIT")+    , (AF_CCITT, "AF_CCITT")+    , (AF_SNA, "AF_SNA")+    , (AF_DECnet, "AF_DECnet")+    , (AF_DLI, "AF_DLI")+    , (AF_LAT, "AF_LAT")+    , (AF_HYLINK, "AF_HYLINK")+    , (AF_APPLETALK, "AF_APPLETALK")+    , (AF_ROUTE, "AF_ROUTE")+    , (AF_NETBIOS, "AF_NETBIOS")+    , (AF_NIT, "AF_NIT")+    , (AF_802, "AF_802")+    , (AF_ISO, "AF_ISO")+    , (AF_OSI, "AF_OSI")+    , (AF_NETMAN, "AF_NETMAN")+    , (AF_X25, "AF_X25")+    , (AF_AX25, "AF_AX25")+    , (AF_OSINET, "AF_OSINET")+    , (AF_GOSSIP, "AF_GOSSIP")+    , (AF_IPX, "AF_IPX")+    , (Pseudo_AF_XTP, "Pseudo_AF_XTP")+    , (AF_CTF, "AF_CTF")+    , (AF_WAN, "AF_WAN")+    , (AF_SDL, "AF_SDL")+    , (AF_NETWARE, "AF_NETWARE")+    , (AF_NDD, "AF_NDD")+    , (AF_INTF, "AF_INTF")+    , (AF_COIP, "AF_COIP")+    , (AF_CNT, "AF_CNT")+    , (Pseudo_AF_RTIP, "Pseudo_AF_RTIP")+    , (Pseudo_AF_PIP, "Pseudo_AF_PIP")+    , (AF_SIP, "AF_SIP")+    , (AF_ISDN, "AF_ISDN")+    , (Pseudo_AF_KEY, "Pseudo_AF_KEY")+    , (AF_NATM, "AF_NATM")+    , (AF_ARP, "AF_ARP")+    , (Pseudo_AF_HDRCMPLT, "Pseudo_AF_HDRCMPLT")+    , (AF_ENCAP, "AF_ENCAP")+    , (AF_LINK, "AF_LINK")+    , (AF_RAW, "AF_RAW")+    , (AF_RIF, "AF_RIF")+    , (AF_NETROM, "AF_NETROM")+    , (AF_BRIDGE, "AF_BRIDGE")+    , (AF_ATMPVC, "AF_ATMPVC")+    , (AF_ROSE, "AF_ROSE")+    , (AF_NETBEUI, "AF_NETBEUI")+    , (AF_SECURITY, "AF_SECURITY")+    , (AF_PACKET, "AF_PACKET")+    , (AF_ASH, "AF_ASH")+    , (AF_ECONET, "AF_ECONET")+    , (AF_ATMSVC, "AF_ATMSVC")+    , (AF_IRDA, "AF_IRDA")+    , (AF_PPPOX, "AF_PPPOX")+    , (AF_WANPIPE, "AF_WANPIPE")+    , (AF_BLUETOOTH, "AF_BLUETOOTH")+    , (AF_CAN, "AF_CAN")+    ]++instance Show Family where+    showsPrec = bijectiveShow familyBijection def+      where+        gf = "GeneralFamily"+        def = defShow gf packFamily _showInt++instance Read Family where+    readPrec = bijectiveRead familyBijection def+      where+        gf = "GeneralFamily"+        def = defRead gf unpackFamily _readInt++-- Print "n" instead of "PortNum n".+instance Show PortNumber where+  showsPrec p (PortNum pn) = showsPrec p pn++-- Read "n" instead of "PortNum n".+instance Read PortNumber where+  readPrec = safeInt  ------------------------------------------------------------------------ -- Helper functions
+ Network/Socket/Unix.hsc view
@@ -0,0 +1,194 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE ScopedTypeVariables #-}++#include "HsNet.h"+##include "HsNetDef.h"++module Network.Socket.Unix (+    isUnixDomainSocketAvailable+  , socketPair+  , sendFd+  , recvFd+  , getPeerCredential+  , getPeerCred+  , getPeerEid+  ) where++import Foreign.Marshal.Alloc (allocaBytes)+import Network.Socket.Buffer+import Network.Socket.Fcntl+import Network.Socket.Imports+import Network.Socket.Types+import System.Posix.Types (Fd(..))++#if defined(mingw32_HOST_OS)+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+import Network.Socket.Posix.Cmsg+#endif++#if defined(HAVE_GETPEEREID)+import System.IO.Error (catchIOError)+#endif+#ifdef HAVE_GETPEEREID+import Foreign.Marshal.Alloc (alloca)+#endif++#ifdef HAVE_STRUCT_UCRED_SO_PEERCRED+import Network.Socket.Options+#endif++-- | Getting process ID, user ID and group ID for UNIX-domain sockets.+--+--   This is implemented with SO_PEERCRED on Linux and getpeereid()+--   on BSD variants. Unfortunately, on some BSD variants+--   getpeereid() returns unexpected results, rather than an error,+--   for AF_INET sockets. It is the user's responsibility to make sure+--   that the socket is a UNIX-domain socket.+--   Also, on some BSD variants, getpeereid() does not return credentials+--   for sockets created via 'socketPair', only separately created and then+--   explicitly connected UNIX-domain sockets work on such systems.+--+--   Since 2.7.0.0.+getPeerCredential :: Socket -> IO (Maybe CUInt, Maybe CUInt, Maybe CUInt)+#ifdef HAVE_STRUCT_UCRED_SO_PEERCRED+getPeerCredential sock = do+    (pid, uid, gid) <- getPeerCred sock+    if uid == maxBound then+        return (Nothing, Nothing, Nothing)+      else+        return (Just pid, Just uid, Just gid)+#elif defined(HAVE_GETPEEREID)+getPeerCredential sock =+    go `catchIOError` \_ -> return (Nothing,Nothing,Nothing)+  where+    go = do+        (uid, gid) <- getPeerEid sock+        return (Nothing, Just uid, Just gid)+#else+getPeerCredential _ = return (Nothing, Nothing, Nothing)+#endif++-- | Returns the processID, userID and groupID of the peer of+--   a UNIX-domain socket.+--+-- Only available on platforms that support SO_PEERCRED.+getPeerCred :: Socket -> IO (CUInt, CUInt, CUInt)+#ifdef HAVE_STRUCT_UCRED_SO_PEERCRED+getPeerCred s = do+    let opt = SockOpt (#const SOL_SOCKET) (#const SO_PEERCRED)+    PeerCred cred <- getSockOpt s opt+    return cred++newtype PeerCred = PeerCred (CUInt, CUInt, CUInt)+instance Storable PeerCred where+    sizeOf    ~_ = (#const sizeof(struct ucred))+    alignment ~_ = alignment (0 :: CInt)+    poke _ _ = return ()+    peek p = do+        pid <- (#peek struct ucred, pid) p+        uid <- (#peek struct ucred, uid) p+        gid <- (#peek struct ucred, gid) p+        return $ PeerCred (pid, uid, gid)+#else+getPeerCred _ = return (0, 0, 0)+#endif+{-# Deprecated getPeerCred "Use getPeerCredential instead" #-}++-- | Returns the userID and groupID of the peer of+--   a UNIX-domain socket.+--+--  Only available on platforms that support getpeereid().+getPeerEid :: Socket -> IO (CUInt, CUInt)+#ifdef HAVE_GETPEEREID+getPeerEid s = do+  alloca $ \ ptr_uid ->+    alloca $ \ ptr_gid -> do+      withFdSocket s $ \fd ->+        throwSocketErrorIfMinus1Retry_ "Network.Socket.getPeerEid" $+          c_getpeereid fd ptr_uid ptr_gid+      uid <- peek ptr_uid+      gid <- peek ptr_gid+      return (uid, gid)++foreign import CALLCONV unsafe "getpeereid"+  c_getpeereid :: CInt -> Ptr CUInt -> Ptr CUInt -> IO CInt+#else+getPeerEid _ = return (0, 0)+#endif++{-# Deprecated getPeerEid "Use getPeerCredential instead" #-}++-- | Whether or not UNIX-domain sockets are available.+--   'AF_UNIX' is supported on Windows since 3.1.3.0.+--   So, this variable is 'True` on all platforms.+--+--   Since 2.7.0.0.+isUnixDomainSocketAvailable :: Bool+isUnixDomainSocketAvailable = True++-- | 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]+    sendBufMsg s NullSockAddr [(buf,dummyBufSize)] [cmsg] mempty+  where+    dummyBufSize = 1++-- | Receive a file descriptor over a UNIX-domain socket. Note that the resulting+--   file descriptor may have to be put into non-blocking mode in order to be+--   used safely. See 'setNonBlockIfNeeded'.+--   This function does not work on Windows.+recvFd :: Socket -> IO CInt+recvFd s = allocaBytes dummyBufSize $ \buf -> do+    (NullSockAddr, _, cmsgs, _) <- recvBufMsg s [(buf,dummyBufSize)] 32 mempty+    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.+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)+#else+socketPair family stype protocol =+    allocaBytes (2 * sizeOf (1 :: CInt)) $ \ fdArr -> do+      let c_stype = packSocketType stype+      _rc <- throwSocketErrorIfMinus1Retry "Network.Socket.socketpair" $+                  c_socketpair (packFamily family) c_stype protocol fdArr+      [fd1,fd2] <- peekArray 2 fdArr+      setNonBlockIfNeeded fd1+      setNonBlockIfNeeded fd2+      s1 <- mkSocket fd1+      s2 <- mkSocket fd2+      return (s1, s2)++foreign import ccall unsafe "socketpair"+  c_socketpair :: CInt -> CInt -> CInt -> Ptr CInt -> IO CInt+#endif
+ Network/Socket/Win32/Cmsg.hsc view
@@ -0,0 +1,242 @@+{-# LANGUAGE AllowAmbiguousTypes #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeApplications #-}++module Network.Socket.Win32.Cmsg where++#include "HsNet.h"++import Data.ByteString.Internal+import System.Posix.Types (Fd(..))+import Foreign.ForeignPtr+import System.IO.Unsafe (unsafeDupablePerformIO)++import Network.Socket.Imports+import Network.Socket.Types+import Network.Socket.ReadShow++import qualified Text.Read as P++type DWORD = Word32+type ULONG = Word32++-- | Control message (ancillary data) including a pair of level and type.+data Cmsg = Cmsg {+    cmsgId   :: CmsgId+  , cmsgData :: ByteString+  } deriving (Eq, Show)++----------------------------------------------------------------++-- | Identifier of control message (ancillary data).+data CmsgId = CmsgId {+    cmsgLevel :: CInt+  , cmsgType  :: CInt+  } deriving (Eq)++-- | Unsupported identifier+pattern UnsupportedCmsgId :: CmsgId+pattern UnsupportedCmsgId = CmsgId (-1) (-1)++-- | The identifier for 'IPv4TTL'.+pattern CmsgIdIPv4TTL :: CmsgId+pattern CmsgIdIPv4TTL = CmsgId (#const IPPROTO_IP) (#const IP_TTL)++-- | The identifier for 'IPv6HopLimit'.+pattern CmsgIdIPv6HopLimit :: CmsgId+pattern CmsgIdIPv6HopLimit = CmsgId (#const IPPROTO_IPV6) (#const IPV6_HOPLIMIT)++-- | The identifier for 'IPv4TOS'.+pattern CmsgIdIPv4TOS :: CmsgId+pattern CmsgIdIPv4TOS = CmsgId (#const IPPROTO_IP) (#const IP_TOS)++-- | The identifier for 'IPv6TClass'.+pattern CmsgIdIPv6TClass :: CmsgId+pattern CmsgIdIPv6TClass = CmsgId (#const IPPROTO_IPV6) (#const IPV6_TCLASS)++-- | The identifier for 'IPv4PktInfo'.+pattern CmsgIdIPv4PktInfo :: CmsgId+pattern CmsgIdIPv4PktInfo = CmsgId (#const IPPROTO_IP) (#const IP_PKTINFO)++-- | The identifier for 'IPv6PktInfo'.+pattern CmsgIdIPv6PktInfo :: CmsgId+pattern CmsgIdIPv6PktInfo = CmsgId (#const IPPROTO_IPV6) (#const IPV6_PKTINFO)++-- | Control message ID for POSIX file-descriptor passing.+--+--  Not supported on Windows; use WSADuplicateSocket instead+pattern CmsgIdFds :: CmsgId+pattern CmsgIdFds = CmsgId (-1) (-1)++----------------------------------------------------------------++-- | Looking up control message. The following shows an example usage:+--+-- > (lookupCmsg CmsgIdIPv4TOS cmsgs >>= decodeCmsg) :: Maybe IPv4TOS+lookupCmsg :: CmsgId -> [Cmsg] -> Maybe Cmsg+lookupCmsg _   [] = Nothing+lookupCmsg cid (cmsg:cmsgs)+  | cmsgId cmsg == cid = Just cmsg+  | otherwise          = lookupCmsg cid cmsgs++-- | Filtering control message.+filterCmsg :: CmsgId -> [Cmsg] -> [Cmsg]+filterCmsg cid cmsgs = filter (\cmsg -> cmsgId cmsg == cid) cmsgs++----------------------------------------------------------------++-- | A class to encode and decode control message.+class ControlMessage a where+    controlMessageId :: CmsgId+    encodeCmsg :: a -> Cmsg+    decodeCmsg :: Cmsg -> Maybe a++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+    let cmsid = controlMessageId @a+    return $ Cmsg cmsid bs+  where+    siz = sizeOf x++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+        let p = castPtr (p0 `plusPtr` off)+        Just <$> peek p+  where+    cid = controlMessageId @a+    siz = sizeOf (undefined :: a)++----------------------------------------------------------------++-- | Time to live of IPv4.+newtype IPv4TTL = IPv4TTL DWORD deriving (Eq, Show, Storable)++instance ControlMessage IPv4TTL where+    controlMessageId = CmsgIdIPv4TTL+    decodeCmsg = decodeStorableCmsg+    encodeCmsg = encodeStorableCmsg++----------------------------------------------------------------++-- | Hop limit of IPv6.+newtype IPv6HopLimit = IPv6HopLimit DWORD deriving (Eq, Show, Storable)++instance ControlMessage IPv6HopLimit where+    controlMessageId = CmsgIdIPv6HopLimit+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg++----------------------------------------------------------------++-- | TOS of IPv4.+newtype IPv4TOS = IPv4TOS DWORD deriving (Eq, Show, Storable)++instance ControlMessage IPv4TOS where+    controlMessageId = CmsgIdIPv4TOS+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg++----------------------------------------------------------------++-- | Traffic class of IPv6.+newtype IPv6TClass = IPv6TClass DWORD deriving (Eq, Show, Storable)++instance ControlMessage IPv6TClass where+    controlMessageId = CmsgIdIPv6TClass+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg++----------------------------------------------------------------++-- | Network interface ID and local IPv4 address. The second member is+--   redundant to be the same as Unix's one and is always 0.0.0.0.+data IPv4PktInfo = IPv4PktInfo Int HostAddress HostAddress deriving (Eq)++instance Show IPv4PktInfo where+    show (IPv4PktInfo n sa ha) = "IPv4PktInfo " ++ show n ++ " " ++ show (hostAddressToTuple sa) ++ " " ++ show (hostAddressToTuple ha)++instance ControlMessage IPv4PktInfo where+    controlMessageId = CmsgIdIPv4PktInfo+    encodeCmsg = encodeStorableCmsg+    decodeCmsg = decodeStorableCmsg++instance Storable IPv4PktInfo where+    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+    peek p = do+        n  <- (#peek IN_PKTINFO, ipi_ifindex)  p+        ha <- (#peek IN_PKTINFO, ipi_addr)     p+        return $ IPv4PktInfo n 0 ha++----------------------------------------------------------------++-- | Network interface ID and local IPv4 address.+data IPv6PktInfo = IPv6PktInfo Int HostAddress6 deriving (Eq)++instance Show IPv6PktInfo where+    show (IPv6PktInfo n ha6) = "IPv6PktInfo " ++ show n ++ " " ++ show (hostAddress6ToTuple ha6)++instance ControlMessage IPv6PktInfo where+    controlMessageId = CmsgIdIPv6PktInfo+    decodeCmsg = decodeStorableCmsg+    encodeCmsg = encodeStorableCmsg++instance Storable IPv6PktInfo where+    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)+    peek p = do+        In6Addr ha6 <- (#peek IN6_PKTINFO, ipi6_addr)    p+        n :: ULONG  <- (#peek IN6_PKTINFO, ipi6_ifindex) p+        return $ IPv6PktInfo (fromIntegral n) ha6++----------------------------------------------------------------++instance ControlMessage [Fd] where+    controlMessageId = CmsgIdFds+    encodeCmsg = \_ -> Cmsg CmsgIdFds ""+    decodeCmsg = \_ -> Just []++----------------------------------------------------------------++cmsgIdBijection :: Bijection CmsgId String+cmsgIdBijection =+    [ (UnsupportedCmsgId, "UnsupportedCmsgId")+    , (CmsgIdIPv4TTL, "CmsgIdIPv4TTL")+    , (CmsgIdIPv6HopLimit, "CmsgIdIPv6HopLimit")+    , (CmsgIdIPv4TOS, "CmsgIdIPv4TOS")+    , (CmsgIdIPv6TClass, "CmsgIdIPv6TClass")+    , (CmsgIdIPv4PktInfo, "CmsgIdIPv4PktInfo")+    , (CmsgIdIPv6PktInfo, "CmsgIdIPv6PktInfo")+    , (CmsgIdFds, "CmsgIdFds")+    ]++instance Show CmsgId where+    showsPrec = bijectiveShow cmsgIdBijection def+      where+        defname = "CmsgId"+        unId = \(CmsgId l t) -> (l,t)+        def = defShow defname unId showIntInt++instance Read CmsgId where+    readPrec = bijectiveRead cmsgIdBijection def+      where+        defname = "CmsgId"+        def = defRead defname (uncurry CmsgId) readIntInt
+ Network/Socket/Win32/CmsgHdr.hsc view
@@ -0,0 +1,104 @@+{-# OPTIONS_GHC -funbox-strict-fields #-}++#include "HsNet.h"++module Network.Socket.Win32.CmsgHdr (+    Cmsg(..)+  , withCmsgs+  , parseCmsgs+  ) where++import Foreign.Marshal.Alloc (allocaBytes)+import Foreign.ForeignPtr+import qualified Data.ByteString as B+import Data.ByteString.Internal++import Network.Socket.Imports+import Network.Socket.Win32.Cmsg+import Network.Socket.Win32.MsgHdr+import Network.Socket.Types++data CmsgHdr = CmsgHdr {+    cmsgHdrLen   :: CUInt+  , cmsgHdrLevel :: CInt+  , cmsgHdrType  :: CInt+  } deriving (Eq, Show)++instance Storable CmsgHdr where+  sizeOf    ~_ = #{size WSACMSGHDR}+  alignment ~_ = #alignment WSACMSGHDR++  peek p = do+    len <- (#peek WSACMSGHDR, cmsg_len)   p+    lvl <- (#peek WSACMSGHDR, cmsg_level) p+    typ <- (#peek WSACMSGHDR, cmsg_type)  p+    return $ CmsgHdr len lvl typ++  poke p (CmsgHdr len lvl typ) = do+    zeroMemory p (#size WSACMSGHDR)+    (#poke WSACMSGHDR, cmsg_len)   p len+    (#poke WSACMSGHDR, cmsg_level) p lvl+    (#poke WSACMSGHDR, cmsg_type)  p typ++withCmsgs :: [Cmsg] -> (Ptr CmsgHdr -> Int -> IO a) -> IO a+withCmsgs cmsgs0 action+  | total == 0 = action nullPtr 0+  | otherwise  = allocaBytes total $ \ctrlPtr -> do+        loop ctrlPtr cmsgs0 spaces+        action ctrlPtr total+  where+    loop ctrlPtr (cmsg:cmsgs) (s:ss) = do+        toCmsgHdr cmsg ctrlPtr+        let nextPtr = ctrlPtr `plusPtr` s+        loop nextPtr cmsgs ss+    loop _ _ _ = return ()+    cmsg_space = fromIntegral . c_cmsg_space . fromIntegral+    spaces = map (cmsg_space . B.length . cmsgData) cmsgs0+    total = sum spaces++toCmsgHdr :: Cmsg -> Ptr CmsgHdr -> IO ()+toCmsgHdr (Cmsg (CmsgId lvl typ) (PS fptr off len)) ctrlPtr = do+    poke ctrlPtr $ CmsgHdr (c_cmsg_len (fromIntegral len)) lvl typ+    withForeignPtr fptr $ \src0 -> do+        let src = src0 `plusPtr` off+        dst <- c_cmsg_data ctrlPtr+        memcpy dst src len++parseCmsgs :: SocketAddress sa => Ptr (MsgHdr sa) -> IO [Cmsg]+parseCmsgs msgptr = do+    ptr <- c_cmsg_firsthdr msgptr+    loop ptr id+  where+    loop ptr build+      | ptr == nullPtr = return $ build []+      | otherwise = do+            val <- fromCmsgHdr ptr+            case val of+              Nothing -> return $ build []+              Just cmsg -> do+                nextPtr <- c_cmsg_nxthdr msgptr ptr+                loop nextPtr (build . (cmsg :))++fromCmsgHdr :: Ptr CmsgHdr -> IO (Maybe Cmsg)+fromCmsgHdr ptr = do+    CmsgHdr len lvl typ <- peek ptr+    src <- c_cmsg_data ptr+    let siz = fromIntegral len - (src `minusPtr` ptr)+    if siz < 0+      then return Nothing+      else Just . Cmsg (CmsgId lvl typ) <$> create (fromIntegral siz) (\dst -> memcpy dst src siz)++foreign import ccall unsafe "cmsg_firsthdr"+  c_cmsg_firsthdr :: Ptr (MsgHdr sa) -> IO (Ptr CmsgHdr)++foreign import ccall unsafe "cmsg_nxthdr"+  c_cmsg_nxthdr :: Ptr (MsgHdr sa) -> Ptr CmsgHdr -> IO (Ptr CmsgHdr)++foreign import ccall unsafe "cmsg_data"+  c_cmsg_data :: Ptr CmsgHdr -> IO (Ptr Word8)++foreign import ccall unsafe "cmsg_space"+  c_cmsg_space :: CUInt -> CUInt++foreign import ccall unsafe "cmsg_len"+  c_cmsg_len :: CUInt -> CUInt
+ Network/Socket/Win32/MsgHdr.hsc view
@@ -0,0 +1,55 @@+{-# OPTIONS_GHC -funbox-strict-fields #-}+{-# LANGUAGE CPP #-}++-- | Support module for the Windows 'WSASendMsg' system call.+module Network.Socket.Win32.MsgHdr+    ( MsgHdr(..)+    ) where++#include "HsNet.h"++import Network.Socket.Imports+import Network.Socket.Internal (zeroMemory)+import Network.Socket.Win32.WSABuf++type DWORD = Word32+type ULONG = Word32++-- 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+    } deriving Show++instance Storable (MsgHdr sa) where+  sizeOf    ~_ = #{size WSAMSG}+  alignment ~_ = #alignment WSAMSG++  peek p = do+    name       <- (#peek WSAMSG, name)          p+    nameLen    <- (#peek WSAMSG, namelen)       p+    buffer     <- (#peek WSAMSG, lpBuffers)     p+    bufferLen  <- (#peek WSAMSG, dwBufferCount) p+    ctrl       <- (#peek WSAMSG, Control.buf)   p+    ctrlLen    <- (#peek WSAMSG, Control.len)   p+    flags      <- (#peek WSAMSG, dwFlags)       p+    return $ MsgHdr name nameLen buffer bufferLen ctrl ctrlLen flags++  poke p mh = do+    -- We need to zero the msg_control, msg_controllen, and msg_flags+    -- fields, but they only exist on some platforms (e.g. not on+    -- Solaris).  Instead of using CPP, we zero the entire struct.+    zeroMemory p (#const sizeof(WSAMSG))+    (#poke WSAMSG, name)           p (msgName       mh)+    (#poke WSAMSG, namelen)        p (msgNameLen    mh)+    (#poke WSAMSG, lpBuffers)      p (msgBuffer     mh)+    (#poke WSAMSG, dwBufferCount)  p (msgBufferLen  mh)+    (#poke WSAMSG, Control.buf)    p (msgCtrl       mh)+    (#poke WSAMSG, Control.len)    p (msgCtrlLen    mh)+    (#poke WSAMSG, dwFlags)        p (msgFlags      mh)
+ Network/Socket/Win32/WSABuf.hsc view
@@ -0,0 +1,48 @@+{-# OPTIONS_GHC -funbox-strict-fields #-}++-- | Support module for the Windows winsock system calls.+module Network.Socket.Win32.WSABuf+    ( WSABuf(..)+    , withWSABuf+    ) where++#include "HsNet.h"++import Foreign.Marshal.Array (allocaArray)++import Network.Socket.Imports++type ULONG = Word32++data WSABuf = WSABuf+    { wsaBufPtr :: Ptr Word8+    , wsaBufLen :: ULONG+    }++instance Storable WSABuf where+  sizeOf    ~_ = #{size WSABUF}+  alignment ~_ = #alignment WSABUF++  peek p = do+    base <- (#peek WSABUF, buf) p+    len  <- (#peek WSABUF, len)  p+    return $ WSABuf base len++  poke p iov = do+    (#poke WSABUF, buf) p (wsaBufPtr iov)+    (#poke WSABUF, len) p (wsaBufLen iov)++-- | @withWSABuf cs f@ executes the computation @f@, passing as argument a pair+-- consisting of a pointer to a temporarily allocated array of pointers to+-- WSABBUF made from @cs@ and the number of pointers (@length cs@).+-- /Windows only/.+withWSABuf :: [(Ptr Word8, Int)] -> ((Ptr WSABuf, Int) -> IO a) -> IO a+withWSABuf [] f = f (nullPtr, 0)+withWSABuf cs f =+    allocaArray csLen $ \aPtr -> do+        zipWithM_ pokeWsaBuf (ptrs aPtr) cs+        f (aPtr, csLen)+  where+    csLen = length cs+    ptrs = iterate (`plusPtr` sizeOf (WSABuf nullPtr 0))+    pokeWsaBuf ptr (sPtr, sLen) = poke ptr $ WSABuf sPtr (fromIntegral sLen)
README.md view
@@ -1,19 +1,45 @@-# [`network`](http://hackage.haskell.org/package/network) [![Build Status](https://travis-ci.org/haskell/network.svg?branch=master)](https://travis-ci.org/haskell/network) [![Build status](https://ci.appveyor.com/api/projects/status/5erq63o4m29bhl57/branch/master?svg=true)](https://ci.appveyor.com/project/eborden/network/branch/master)+![GitHub Actions status](https://github.com/haskell/network/workflows/Haskell%20CI/badge.svg)+# [`network`](http://hackage.haskell.org/package/network) -To build this package using Cabal directly from git, you must run-`autoreconf` before the usual Cabal build steps-(configure/build/install).  `autoreconf` is included in the-[GNU Autoconf](http://www.gnu.org/software/autoconf/) tools.  There is-no need to run the `configure` script: the `setup configure` step will-do this for you.+To build this package directly from git, you must run `autoreconf -i`.+And then use `cabal configure; cabal build` or `stack build`.  ## Support Policy  ### GHC -`network`'s GHC policy supports 3 [stable](https://downloads.haskell.org/~ghc/8.0.2/docs/html/users_guide/intro.html#ghc-version-numbering-policy) versions. The current stable-version and two previous stable versions are supported.+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. -### Hugs, JHC, UHC+### Windows -`network` does not officially support these compilers.+We use MSYS to build this package on Windows.+To use the `network` package on Cygwin, use `stack`.++## Coding++### .hs files++If you need C macros created by "configure" or `CALLCONV`/`SAFE_ON_WIN`, put++```+#include "HsNetDef.h"+```++"HsNet.h" does now work well since Mac's cpp sucks.++### .hsc files++If you need `#peek`, `#poke` and others, create a `.hsc` file with++```+#include "HsNet.h"+```++`HsNet.h` includes `HsNefDef.h` and necessary C structures.+Unfortunately, `hsc2hs` does not convert C macros.+So, if you use `CALLCONV`/`SAFE_ON_WIN`, the following is also necessary:++```+##include "HsNetDef.h"+```
− cbits/ancilData.c
@@ -1,132 +0,0 @@-/*- *  Copyright(c), 2002 The GHC Team.- */--#ifdef aix_HOST_OS-#define _LINUX_SOURCE_COMPAT -// Required to get CMSG_SPACE/CMSG_LEN macros.  See #265.-// Alternative is to #define COMPAT_43 and use the -// HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS code instead, but that means-// fiddling with the configure script too.-#endif--#include "HsNet.h"-#include <string.h>--#if HAVE_STRUCT_MSGHDR_MSG_CONTROL || HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS /* until end */--/* - *  Support for transmitting file descriptors.- *- *  - */- --/*- * sendmsg() and recvmsg() wrappers for transmitting- * ancillary socket data.- *- * Doesn't provide the full generality of either, specifically:- *- *  - no support for scattered read/writes.- *  - only possible to send one ancillary chunk of data at a time.- */--int-sendFd(int sock,-       int outfd)-{-  struct msghdr msg = {0};-  struct iovec iov[1];-  char  buf[2];-#if HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS-  msg.msg_accrights = (void*)&outfd;-  msg.msg_accrightslen = sizeof(int);-#else-  struct cmsghdr *cmsg;-  char ancBuffer[CMSG_SPACE(sizeof(int))];-  char* dPtr;-  -  msg.msg_control = ancBuffer;-  msg.msg_controllen = sizeof(ancBuffer);--  cmsg = CMSG_FIRSTHDR(&msg);-  cmsg->cmsg_level = SOL_SOCKET;-  cmsg->cmsg_type = SCM_RIGHTS;-  cmsg->cmsg_len = CMSG_LEN(sizeof(int));-  dPtr = (char*)CMSG_DATA(cmsg);-  -  *(int*)dPtr = outfd;-  msg.msg_controllen = cmsg->cmsg_len;-#endif--  buf[0] = 0; buf[1] = '\0';-  iov[0].iov_base = buf;-  iov[0].iov_len  = 2;--  msg.msg_iov = iov;-  msg.msg_iovlen = 1;-  -  return sendmsg(sock,&msg,0);-}--int-recvFd(int sock)-{-  struct msghdr msg = {0};-  char  duffBuf[10];-  int rc;-  int len = sizeof(int);-  struct iovec iov[1];-#if HAVE_STRUCT_MSGHDR_MSG_CONTROL-  struct cmsghdr *cmsg = NULL;-  struct cmsghdr *cptr;-#else-  int* fdBuffer;-#endif-  int fd;--  iov[0].iov_base = duffBuf;-  iov[0].iov_len  = sizeof(duffBuf);-  msg.msg_iov = iov;-  msg.msg_iovlen = 1;--#if HAVE_STRUCT_MSGHDR_MSG_CONTROL-  cmsg = (struct cmsghdr*)malloc(CMSG_SPACE(len));-  if (cmsg==NULL) {-    return -1;-  }-  -  msg.msg_control = (void *)cmsg;-  msg.msg_controllen = CMSG_LEN(len);-#else-  fdBuffer = (int*)malloc(len);-  if (fdBuffer) {-    msg.msg_accrights    = (void *)fdBuffer;-  } else {-    return -1;-  }-  msg.msg_accrightslen = len;-#endif--  if ((rc = recvmsg(sock,&msg,0)) < 0) {-#if HAVE_STRUCT_MSGHDR_MSG_CONTROL-    free(cmsg);-#else-    free(fdBuffer);-#endif-    return rc;-  }-  -#if HAVE_STRUCT_MSGHDR_MSG_CONTROL-  cptr = (struct cmsghdr*)CMSG_FIRSTHDR(&msg);-  fd = *(int*)CMSG_DATA(cptr);-  free(cmsg);-#else-  fd = *(int*)fdBuffer;-  free(fdBuffer);-#endif-  return fd;-}--#endif
cbits/asyncAccept.c view
@@ -5,14 +5,14 @@ #include "HsNet.h" #include "HsFFI.h" -#if defined(HAVE_WINSOCK2_H)+#if defined(_WIN32)  /* all the way to the end */  /*  * To support non-blocking accept()s with WinSock, we use the asyncDoProc#  * primop, which lets a Haskell thread call an external routine without- * blocking the progress of other threads. + * blocking the progress of other threads.  *  * As can readily be seen, this is a low-level mechanism.  *@@ -26,7 +26,7 @@ } AcceptData;  /*- * Fill in parameter block that's passed along when the RTS invokes the + * Fill in parameter block that's passed along when the RTS invokes the  * accept()-calling proc below (acceptDoProc())  */ void*@@ -40,7 +40,7 @@     data->newSock  = 0;     data->sockAddr = sockaddr;     data->size     = sz;-    +     return data; } 
+ cbits/cmsg.c view
@@ -0,0 +1,97 @@+#include "HsNet.h"+#include <string.h>++#ifdef _WIN32++LPWSACMSGHDR cmsg_firsthdr(LPWSAMSG mhdr) {+  return (WSA_CMSG_FIRSTHDR(mhdr));+}++LPWSACMSGHDR cmsg_nxthdr(LPWSAMSG mhdr, LPWSACMSGHDR cmsg) {+  return (WSA_CMSG_NXTHDR(mhdr, cmsg));+}++unsigned char *cmsg_data(LPWSACMSGHDR cmsg) {+  return (WSA_CMSG_DATA(cmsg));+}++unsigned int cmsg_space(unsigned int l) {+  return (WSA_CMSG_SPACE(l));+}++unsigned int cmsg_len(unsigned int l) {+  return (WSA_CMSG_LEN(l));+}++static LPFN_WSASENDMSG ptr_SendMsg;+static LPFN_WSARECVMSG ptr_RecvMsg;+/* GUIDS to lookup WSASend/RecvMsg */+static GUID WSARecvMsgGUID = WSAID_WSARECVMSG;+static GUID WSASendMsgGUID = WSAID_WSASENDMSG;++int WINAPI+WSASendMsg (SOCKET s, LPWSAMSG lpMsg, DWORD flags,+            LPDWORD lpdwNumberOfBytesRecvd, LPWSAOVERLAPPED lpOverlapped,+            LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) {++  if (!ptr_SendMsg) {+    DWORD len;+    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER,+        &WSASendMsgGUID, sizeof(WSASendMsgGUID), &ptr_SendMsg,+        sizeof(ptr_SendMsg), &len, NULL, NULL) != 0)+      return -1;+  }++  return ptr_SendMsg (s, lpMsg, flags, lpdwNumberOfBytesRecvd, lpOverlapped,+                      lpCompletionRoutine);+}++/**+ * WSARecvMsg function+ */+int WINAPI+WSARecvMsg (SOCKET s, LPWSAMSG lpMsg, LPDWORD lpdwNumberOfBytesRecvd,+            LPWSAOVERLAPPED lpOverlapped,+            LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) {++  if (!ptr_RecvMsg) {+    DWORD len;+    if (WSAIoctl(s, SIO_GET_EXTENSION_FUNCTION_POINTER,+        &WSARecvMsgGUID, sizeof(WSARecvMsgGUID), &ptr_RecvMsg,+        sizeof(ptr_RecvMsg), &len, NULL, NULL) != 0)+      return -1;+  }++  int res = ptr_RecvMsg (s, lpMsg, lpdwNumberOfBytesRecvd, lpOverlapped,+                         lpCompletionRoutine);++  /*  If the msg was truncated then this pointer can be garbage.  */+  if (res == SOCKET_ERROR && GetLastError () == WSAEMSGSIZE)+     {+        lpMsg->Control.len = 0;+        lpMsg->Control.buf = NULL;+     }++  return res;+}+#else+struct cmsghdr *cmsg_firsthdr(struct msghdr *mhdr) {+  return (CMSG_FIRSTHDR(mhdr));+}++struct cmsghdr *cmsg_nxthdr(struct msghdr *mhdr, struct cmsghdr *cmsg) {+  return (CMSG_NXTHDR(mhdr, cmsg));+}++unsigned char *cmsg_data(struct cmsghdr *cmsg) {+  return (CMSG_DATA(cmsg));+}++size_t cmsg_space(size_t l) {+  return (CMSG_SPACE(l));+}++size_t cmsg_len(size_t l) {+  return (CMSG_LEN(l));+}+#endif /* _WIN32 */
cbits/initWinSock.c view
@@ -1,7 +1,7 @@ #include "HsNet.h" #include "HsFFI.h" -#if defined(HAVE_WINSOCK2_H)+#if defined(_WIN32)  static int winsock_inited = 0; @@ -16,14 +16,14 @@ initWinSock () {   WORD wVersionRequested;-  WSADATA wsaData;  +  WSADATA wsaData;   int err;    if (!winsock_inited) {     wVersionRequested = MAKEWORD( 2, 2 );      err = WSAStartup ( wVersionRequested, &wsaData );-    +     if ( err != 0 ) {        return err;     }@@ -38,6 +38,21 @@     winsock_inited = 1;   }   return 0;+}++SOCKET+wsaDuplicate (SOCKET s)+{+  WSAPROTOCOL_INFOW protocolInfo;+  if (WSADuplicateSocketW (s, GetCurrentProcessId (), &protocolInfo) != 0)+    return -1;++  SOCKET res = WSASocketW(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO,+                          FROM_PROTOCOL_INFO, &protocolInfo, 0, 0);+  if (res == SOCKET_ERROR)+    return -1;++  return res; }  #endif
cbits/winSockErr.c view
@@ -1,7 +1,7 @@ #include "HsNet.h" #include "HsFFI.h" -#if defined(HAVE_WINSOCK2_H)+#if defined(_WIN32) #include <stdio.h>  /* to the end */
config.guess view
@@ -1,1465 +1,1811 @@ #! /bin/sh # Attempt to guess a canonical system name.-#   Copyright 1992-2017 Free Software Foundation, Inc.--timestamp='2017-03-05'--# 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-# (at your option) any later version.-#-# This program is distributed in the hope that it will be useful, but-# WITHOUT ANY WARRANTY; without even the implied warranty of-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU-# General Public License for more details.-#-# You should have received a copy of the GNU General Public License-# along with this program; if not, see <http://www.gnu.org/licenses/>.-#-# As a special exception to the GNU General Public License, if you-# distribute this file as part of a program that contains a-# configuration script generated by Autoconf, you may include it under-# the same distribution terms that you use for the rest of that-# program.  This Exception is an additional permission under section 7-# of the GNU General Public License, version 3 ("GPLv3").-#-# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.-#-# You can get the latest version of this script from:-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess-#-# Please send patches to <config-patches@gnu.org>.---me=`echo "$0" | sed -e 's,.*/,,'`--usage="\-Usage: $0 [OPTION]--Output the configuration name of the system \`$me' is run on.--Operation modes:-  -h, --help         print this help, then exit-  -t, --time-stamp   print date of last modification, then exit-  -v, --version      print version number, then exit--Report bugs and patches to <config-patches@gnu.org>."--version="\-GNU config.guess ($timestamp)--Originally written by Per Bothner.-Copyright 1992-2017 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."--# Parse command line-while test $# -gt 0 ; do-  case $1 in-    --time-stamp | --time* | -t )-       echo "$timestamp" ; exit ;;-    --version | -v )-       echo "$version" ; exit ;;-    --help | --h* | -h )-       echo "$usage"; exit ;;-    -- )     # Stop option processing-       shift; break ;;-    - )	# Use stdin as input.-       break ;;-    -* )-       echo "$me: invalid option $1$help" >&2-       exit 1 ;;-    * )-       break ;;-  esac-done--if test $# != 0; then-  echo "$me: too many arguments$help" >&2-  exit 1-fi--trap 'exit 1' 1 2 15--# CC_FOR_BUILD -- compiler used by this script. Note that the use of a-# compiler to aid in system detection is discouraged as it requires-# 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.--# Portable tmp directory creation inspired by the Autoconf team.--set_cc_for_build='-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;-: ${TMPDIR=/tmp} ;- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;-dummy=$tmp/dummy ;-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;-case $CC_FOR_BUILD,$HOST_CC,$CC in- ,,)    echo "int x;" > $dummy.c ;-	for c in cc gcc c89 c99 ; do-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then-	     CC_FOR_BUILD="$c"; break ;-	  fi ;-	done ;-	if test x"$CC_FOR_BUILD" = x ; then-	  CC_FOR_BUILD=no_compiler_found ;-	fi-	;;- ,,*)   CC_FOR_BUILD=$CC ;;- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;-esac ; set_cc_for_build= ;'--# This is needed to find uname on a Pyramid OSx when run in the BSD universe.-# (ghazi@noc.rutgers.edu 1994-08-24)-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then-	PATH=$PATH:/.attbin ; export PATH-fi--UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown--case "${UNAME_SYSTEM}" in-Linux|GNU|GNU/*)-	# If the system lacks a compiler, then just pick glibc.-	# We could probably try harder.-	LIBC=gnu--	eval $set_cc_for_build-	cat <<-EOF > $dummy.c-	#include <features.h>-	#if defined(__UCLIBC__)-	LIBC=uclibc-	#elif defined(__dietlibc__)-	LIBC=dietlibc-	#else-	LIBC=gnu-	#endif-	EOF-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`-	;;-esac--# Note: order is significant - the case branches are not exclusive.--case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in-    *:NetBSD:*:*)-	# NetBSD (nbsd) targets should (where applicable) match one or-	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently-	# switched to ELF, *-*-netbsd* would select the old-	# object file format.  This provides both forward-	# compatibility and a consistent mechanism for selecting the-	# object file format.-	#-	# Note: NetBSD doesn't particularly care about the vendor-	# portion of the name.  We always set it to "unknown".-	sysctl="sysctl -n hw.machine_arch"-	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \-	    /sbin/$sysctl 2>/dev/null || \-	    /usr/sbin/$sysctl 2>/dev/null || \-	    echo unknown)`-	case "${UNAME_MACHINE_ARCH}" in-	    armeb) machine=armeb-unknown ;;-	    arm*) machine=arm-unknown ;;-	    sh3el) machine=shl-unknown ;;-	    sh3eb) machine=sh-unknown ;;-	    sh5el) machine=sh5le-unknown ;;-	    earmv*)-		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`-		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`-		machine=${arch}${endian}-unknown-		;;-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;-	esac-	# The Operating System including object format, if it has switched-	# to ELF recently (or will in the future) and ABI.-	case "${UNAME_MACHINE_ARCH}" in-	    earm*)-		os=netbsdelf-		;;-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)-		eval $set_cc_for_build-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \-			| grep -q __ELF__-		then-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).-		    # Return netbsd for either.  FIX?-		    os=netbsd-		else-		    os=netbsdelf-		fi-		;;-	    *)-		os=netbsd-		;;-	esac-	# Determine ABI tags.-	case "${UNAME_MACHINE_ARCH}" in-	    earm*)-		expr='s/^earmv[0-9]/-eabi/;s/eb$//'-		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`-		;;-	esac-	# The OS release-	# Debian GNU/NetBSD machines have a different userland, and-	# thus, need a distinct triplet. However, they do not need-	# kernel version information, so it can be replaced with a-	# suitable tag, in the style of linux-gnu.-	case "${UNAME_VERSION}" in-	    Debian*)-		release='-gnu'-		;;-	    *)-		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`-		;;-	esac-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:-	# contains redundant information, the shorter form:-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.-	echo "${machine}-${os}${release}${abi}"-	exit ;;-    *:Bitrig:*:*)-	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`-	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}-	exit ;;-    *:OpenBSD:*:*)-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}-	exit ;;-    *:LibertyBSD:*:*)-	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`-	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}-	exit ;;-    *:ekkoBSD:*:*)-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}-	exit ;;-    *:SolidBSD:*:*)-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}-	exit ;;-    macppc:MirBSD:*:*)-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}-	exit ;;-    *:MirBSD:*:*)-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}-	exit ;;-    *:Sortix:*:*)-	echo ${UNAME_MACHINE}-unknown-sortix-	exit ;;-    alpha:OSF1:*:*)-	case $UNAME_RELEASE in-	*4.0)-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`-		;;-	*5.*)-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`-		;;-	esac-	# According to Compaq, /usr/sbin/psrinfo has been available on-	# OSF/1 and Tru64 systems produced since 1995.  I hope that-	# covers most systems running today.  This code pipes the CPU-	# types through head -n 1, so we only detect the type of CPU 0.-	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`-	case "$ALPHA_CPU_TYPE" in-	    "EV4 (21064)")-		UNAME_MACHINE=alpha ;;-	    "EV4.5 (21064)")-		UNAME_MACHINE=alpha ;;-	    "LCA4 (21066/21068)")-		UNAME_MACHINE=alpha ;;-	    "EV5 (21164)")-		UNAME_MACHINE=alphaev5 ;;-	    "EV5.6 (21164A)")-		UNAME_MACHINE=alphaev56 ;;-	    "EV5.6 (21164PC)")-		UNAME_MACHINE=alphapca56 ;;-	    "EV5.7 (21164PC)")-		UNAME_MACHINE=alphapca57 ;;-	    "EV6 (21264)")-		UNAME_MACHINE=alphaev6 ;;-	    "EV6.7 (21264A)")-		UNAME_MACHINE=alphaev67 ;;-	    "EV6.8CB (21264C)")-		UNAME_MACHINE=alphaev68 ;;-	    "EV6.8AL (21264B)")-		UNAME_MACHINE=alphaev68 ;;-	    "EV6.8CX (21264D)")-		UNAME_MACHINE=alphaev68 ;;-	    "EV6.9A (21264/EV69A)")-		UNAME_MACHINE=alphaev69 ;;-	    "EV7 (21364)")-		UNAME_MACHINE=alphaev7 ;;-	    "EV7.9 (21364A)")-		UNAME_MACHINE=alphaev79 ;;-	esac-	# A Pn.n version is a patched version.-	# A Vn.n version is a released version.-	# A Tn.n version is a released field test version.-	# A Xn.n version is an unreleased experimental baselevel.-	# 1.2 uses "1.2" for uname -r.-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`-	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.-	exitcode=$?-	trap '' 0-	exit $exitcode ;;-    Alpha\ *:Windows_NT*:*)-	# How do we know it's Interix rather than the generic POSIX subsystem?-	# Should we change UNAME_MACHINE based on the output of uname instead-	# of the specific Alpha model?-	echo alpha-pc-interix-	exit ;;-    21064:Windows_NT:50:3)-	echo alpha-dec-winnt3.5-	exit ;;-    Amiga*:UNIX_System_V:4.0:*)-	echo m68k-unknown-sysv4-	exit ;;-    *:[Aa]miga[Oo][Ss]:*:*)-	echo ${UNAME_MACHINE}-unknown-amigaos-	exit ;;-    *:[Mm]orph[Oo][Ss]:*:*)-	echo ${UNAME_MACHINE}-unknown-morphos-	exit ;;-    *:OS/390:*:*)-	echo i370-ibm-openedition-	exit ;;-    *:z/VM:*:*)-	echo s390-ibm-zvmoe-	exit ;;-    *:OS400:*:*)-	echo powerpc-ibm-os400-	exit ;;-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)-	echo arm-acorn-riscix${UNAME_RELEASE}-	exit ;;-    arm*:riscos:*:*|arm*:RISCOS:*:*)-	echo arm-unknown-riscos-	exit ;;-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)-	echo hppa1.1-hitachi-hiuxmpp-	exit ;;-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.-	if test "`(/bin/universe) 2>/dev/null`" = att ; then-		echo pyramid-pyramid-sysv3-	else-		echo pyramid-pyramid-bsd-	fi-	exit ;;-    NILE*:*:*:dcosx)-	echo pyramid-pyramid-svr4-	exit ;;-    DRS?6000:unix:4.0:6*)-	echo sparc-icl-nx6-	exit ;;-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)-	case `/usr/bin/uname -p` in-	    sparc) echo sparc-icl-nx7; exit ;;-	esac ;;-    s390x:SunOS:*:*)-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`-	exit ;;-    sun4H:SunOS:5.*:*)-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`-	exit ;;-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`-	exit ;;-    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)-	echo i386-pc-auroraux${UNAME_RELEASE}-	exit ;;-    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)-	eval $set_cc_for_build-	SUN_ARCH=i386-	# If there is a compiler, see if it is configured for 64-bit objects.-	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.-	# This test works for both compilers.-	if [ "$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) | \-		grep IS_64BIT_ARCH >/dev/null-	    then-		SUN_ARCH=x86_64-	    fi-	fi-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`-	exit ;;-    sun4*:SunOS:6*:*)-	# According to config.sub, this is the proper way to canonicalize-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but-	# it's likely to be more like Solaris than SunOS4.-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`-	exit ;;-    sun4*:SunOS:*:*)-	case "`/usr/bin/arch -k`" in-	    Series*|S4*)-		UNAME_RELEASE=`uname -v`-		;;-	esac-	# Japanese Language versions have a version number like `4.1.3-JL'.-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`-	exit ;;-    sun3*:SunOS:*:*)-	echo m68k-sun-sunos${UNAME_RELEASE}-	exit ;;-    sun*:*:4.2BSD:*)-	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`-	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3-	case "`/bin/arch`" in-	    sun3)-		echo m68k-sun-sunos${UNAME_RELEASE}-		;;-	    sun4)-		echo sparc-sun-sunos${UNAME_RELEASE}-		;;-	esac-	exit ;;-    aushp:SunOS:*:*)-	echo sparc-auspex-sunos${UNAME_RELEASE}-	exit ;;-    # The situation for MiNT is a little confusing.  The machine name-    # can be virtually everything (everything which is not-    # "atarist" or "atariste" at least should have a processor-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"-    # to the lowercase version "mint" (or "freemint").  Finally-    # the system name "TOS" denotes a system which is actually not-    # MiNT.  But MiNT is downward compatible to TOS, so this should-    # be no problem.-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)-	echo m68k-atari-mint${UNAME_RELEASE}-	exit ;;-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)-	echo m68k-atari-mint${UNAME_RELEASE}-	exit ;;-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)-	echo m68k-atari-mint${UNAME_RELEASE}-	exit ;;-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)-	echo m68k-milan-mint${UNAME_RELEASE}-	exit ;;-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)-	echo m68k-hades-mint${UNAME_RELEASE}-	exit ;;-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)-	echo m68k-unknown-mint${UNAME_RELEASE}-	exit ;;-    m68k:machten:*:*)-	echo m68k-apple-machten${UNAME_RELEASE}-	exit ;;-    powerpc:machten:*:*)-	echo powerpc-apple-machten${UNAME_RELEASE}-	exit ;;-    RISC*:Mach:*:*)-	echo mips-dec-mach_bsd4.3-	exit ;;-    RISC*:ULTRIX:*:*)-	echo mips-dec-ultrix${UNAME_RELEASE}-	exit ;;-    VAX*:ULTRIX*:*:*)-	echo vax-dec-ultrix${UNAME_RELEASE}-	exit ;;-    2020:CLIX:*:* | 2430:CLIX:*:*)-	echo clipper-intergraph-clix${UNAME_RELEASE}-	exit ;;-    mips:*:*:UMIPS | mips:*:*:RISCos)-	eval $set_cc_for_build-	sed 's/^	//' << EOF >$dummy.c-#ifdef __cplusplus-#include <stdio.h>  /* for printf() prototype */-	int main (int argc, char *argv[]) {-#else-	int main (argc, argv) int argc; char *argv[]; {-#endif-	#if defined (host_mips) && defined (MIPSEB)-	#if defined (SYSTYPE_SYSV)-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);-	#endif-	#if defined (SYSTYPE_SVR4)-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);-	#endif-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);-	#endif-	#endif-	  exit (-1);-	}-EOF-	$CC_FOR_BUILD -o $dummy $dummy.c &&-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&-	  SYSTEM_NAME=`$dummy $dummyarg` &&-	    { echo "$SYSTEM_NAME"; exit; }-	echo mips-mips-riscos${UNAME_RELEASE}-	exit ;;-    Motorola:PowerMAX_OS:*:*)-	echo powerpc-motorola-powermax-	exit ;;-    Motorola:*:4.3:PL8-*)-	echo powerpc-harris-powermax-	exit ;;-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)-	echo powerpc-harris-powermax-	exit ;;-    Night_Hawk:Power_UNIX:*:*)-	echo powerpc-harris-powerunix-	exit ;;-    m88k:CX/UX:7*:*)-	echo m88k-harris-cxux7-	exit ;;-    m88k:*:4*:R4*)-	echo m88k-motorola-sysv4-	exit ;;-    m88k:*:3*:R3*)-	echo m88k-motorola-sysv3-	exit ;;-    AViiON:dgux:*:*)-	# DG/UX returns AViiON for all architectures-	UNAME_PROCESSOR=`/usr/bin/uname -p`-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]-	then-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \-	       [ ${TARGET_BINARY_INTERFACE}x = x ]-	    then-		echo m88k-dg-dgux${UNAME_RELEASE}-	    else-		echo m88k-dg-dguxbcs${UNAME_RELEASE}-	    fi-	else-	    echo i586-dg-dgux${UNAME_RELEASE}-	fi-	exit ;;-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)-	echo m88k-dolphin-sysv3-	exit ;;-    M88*:*:R3*:*)-	# Delta 88k system running SVR3-	echo m88k-motorola-sysv3-	exit ;;-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)-	echo m88k-tektronix-sysv3-	exit ;;-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)-	echo m68k-tektronix-bsd-	exit ;;-    *:IRIX*:*:*)-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`-	exit ;;-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '-    i*86:AIX:*:*)-	echo i386-ibm-aix-	exit ;;-    ia64:AIX:*:*)-	if [ -x /usr/bin/oslevel ] ; then-		IBM_REV=`/usr/bin/oslevel`-	else-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}-	fi-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}-	exit ;;-    *:AIX:2:3)-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then-		eval $set_cc_for_build-		sed 's/^		//' << EOF >$dummy.c-		#include <sys/systemcfg.h>--		main()-			{-			if (!__power_pc())-				exit(1);-			puts("powerpc-ibm-aix3.2.5");-			exit(0);-			}-EOF-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`-		then-			echo "$SYSTEM_NAME"-		else-			echo rs6000-ibm-aix3.2.5-		fi-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then-		echo rs6000-ibm-aix3.2.4-	else-		echo rs6000-ibm-aix3.2-	fi-	exit ;;-    *:AIX:*:[4567])-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then-		IBM_ARCH=rs6000-	else-		IBM_ARCH=powerpc-	fi-	if [ -x /usr/bin/lslpp ] ; then-		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |-			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`-	else-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}-	fi-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}-	exit ;;-    *:AIX:*:*)-	echo rs6000-ibm-aix-	exit ;;-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)-	echo romp-ibm-bsd4.4-	exit ;;-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to-	exit ;;                             # report: romp-ibm BSD 4.3-    *:BOSX:*:*)-	echo rs6000-bull-bosx-	exit ;;-    DPX/2?00:B.O.S.:*:*)-	echo m68k-bull-sysv3-	exit ;;-    9000/[34]??:4.3bsd:1.*:*)-	echo m68k-hp-bsd-	exit ;;-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)-	echo m68k-hp-bsd4.4-	exit ;;-    9000/[34678]??:HP-UX:*:*)-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`-	case "${UNAME_MACHINE}" in-	    9000/31? )            HP_ARCH=m68000 ;;-	    9000/[34]?? )         HP_ARCH=m68k ;;-	    9000/[678][0-9][0-9])-		if [ -x /usr/bin/getconf ]; then-		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`-		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`-		    case "${sc_cpu_version}" in-		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0-		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1-		      532)                      # CPU_PA_RISC2_0-			case "${sc_kernel_bits}" in-			  32) HP_ARCH=hppa2.0n ;;-			  64) HP_ARCH=hppa2.0w ;;-			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20-			esac ;;-		    esac-		fi-		if [ "${HP_ARCH}" = "" ]; then-		    eval $set_cc_for_build-		    sed 's/^		//' << EOF >$dummy.c--		#define _HPUX_SOURCE-		#include <stdlib.h>-		#include <unistd.h>--		int main ()-		{-		#if defined(_SC_KERNEL_BITS)-		    long bits = sysconf(_SC_KERNEL_BITS);-		#endif-		    long cpu  = sysconf (_SC_CPU_VERSION);--		    switch (cpu)-			{-			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;-			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;-			case CPU_PA_RISC2_0:-		#if defined(_SC_KERNEL_BITS)-			    switch (bits)-				{-				case 64: puts ("hppa2.0w"); break;-				case 32: puts ("hppa2.0n"); break;-				default: puts ("hppa2.0"); break;-				} break;-		#else  /* !defined(_SC_KERNEL_BITS) */-			    puts ("hppa2.0"); break;-		#endif-			default: puts ("hppa1.0"); break;-			}-		    exit (0);-		}-EOF-		    (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`-		    test -z "$HP_ARCH" && HP_ARCH=hppa-		fi ;;-	esac-	if [ ${HP_ARCH} = hppa2.0w ]-	then-	    eval $set_cc_for_build--	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler-	    # generating 64-bit code.  GNU and HP use different nomenclature:-	    #-	    # $ CC_FOR_BUILD=cc ./config.guess-	    # => hppa2.0w-hp-hpux11.23-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess-	    # => hppa64-hp-hpux11.23--	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |-		grep -q __LP64__-	    then-		HP_ARCH=hppa2.0w-	    else-		HP_ARCH=hppa64-	    fi-	fi-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}-	exit ;;-    ia64:HP-UX:*:*)-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`-	echo ia64-hp-hpux${HPUX_REV}-	exit ;;-    3050*:HI-UX:*:*)-	eval $set_cc_for_build-	sed 's/^	//' << EOF >$dummy.c-	#include <unistd.h>-	int-	main ()-	{-	  long cpu = sysconf (_SC_CPU_VERSION);-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct-	     results, however.  */-	  if (CPU_IS_PA_RISC (cpu))-	    {-	      switch (cpu)-		{-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;-		  default: puts ("hppa-hitachi-hiuxwe2"); break;-		}-	    }-	  else if (CPU_IS_HP_MC68K (cpu))-	    puts ("m68k-hitachi-hiuxwe2");-	  else puts ("unknown-hitachi-hiuxwe2");-	  exit (0);-	}-EOF-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&-		{ echo "$SYSTEM_NAME"; exit; }-	echo unknown-hitachi-hiuxwe2-	exit ;;-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )-	echo hppa1.1-hp-bsd-	exit ;;-    9000/8??:4.3bsd:*:*)-	echo hppa1.0-hp-bsd-	exit ;;-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)-	echo hppa1.0-hp-mpeix-	exit ;;-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )-	echo hppa1.1-hp-osf-	exit ;;-    hp8??:OSF1:*:*)-	echo hppa1.0-hp-osf-	exit ;;-    i*86:OSF1:*:*)-	if [ -x /usr/sbin/sysversion ] ; then-	    echo ${UNAME_MACHINE}-unknown-osf1mk-	else-	    echo ${UNAME_MACHINE}-unknown-osf1-	fi-	exit ;;-    parisc*:Lites*:*:*)-	echo hppa1.1-hp-lites-	exit ;;-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)-	echo c1-convex-bsd-	exit ;;-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)-	if getsysinfo -f scalar_acc-	then echo c32-convex-bsd-	else echo c2-convex-bsd-	fi-	exit ;;-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)-	echo c34-convex-bsd-	exit ;;-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)-	echo c38-convex-bsd-	exit ;;-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)-	echo c4-convex-bsd-	exit ;;-    CRAY*Y-MP:*:*:*)-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    CRAY*[A-Z]90:*:*:*)-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \-	      -e 's/\.[^.]*$/.X/'-	exit ;;-    CRAY*TS:*:*:*)-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    CRAY*T3E:*:*:*)-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    CRAY*SV1:*:*:*)-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    *:UNICOS/mp:*:*)-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'-	exit ;;-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)-	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`-	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`-	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`-	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"-	exit ;;-    5000:UNIX_System_V:4.*:*)-	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`-	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"-	exit ;;-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}-	exit ;;-    sparc*:BSD/OS:*:*)-	echo sparc-unknown-bsdi${UNAME_RELEASE}-	exit ;;-    *:BSD/OS:*:*)-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}-	exit ;;-    *:FreeBSD:*:*)-	UNAME_PROCESSOR=`/usr/bin/uname -p`-	case ${UNAME_PROCESSOR} in-	    amd64)-		UNAME_PROCESSOR=x86_64 ;;-	    i386)-		UNAME_PROCESSOR=i586 ;;-	esac-	echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-	exit ;;-    i*:CYGWIN*:*)-	echo ${UNAME_MACHINE}-pc-cygwin-	exit ;;-    *:MINGW64*:*)-	echo ${UNAME_MACHINE}-pc-mingw64-	exit ;;-    *:MINGW*:*)-	echo ${UNAME_MACHINE}-pc-mingw32-	exit ;;-    *:MSYS*:*)-	echo ${UNAME_MACHINE}-pc-msys-	exit ;;-    i*:windows32*:*)-	# uname -m includes "-pc" on this system.-	echo ${UNAME_MACHINE}-mingw32-	exit ;;-    i*:PW*:*)-	echo ${UNAME_MACHINE}-pc-pw32-	exit ;;-    *:Interix*:*)-	case ${UNAME_MACHINE} in-	    x86)-		echo i586-pc-interix${UNAME_RELEASE}-		exit ;;-	    authenticamd | genuineintel | EM64T)-		echo x86_64-unknown-interix${UNAME_RELEASE}-		exit ;;-	    IA64)-		echo ia64-unknown-interix${UNAME_RELEASE}-		exit ;;-	esac ;;-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)-	echo i${UNAME_MACHINE}-pc-mks-	exit ;;-    8664:Windows_NT:*)-	echo x86_64-pc-mks-	exit ;;-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)-	# How do we know it's Interix rather than the generic POSIX subsystem?-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we-	# UNAME_MACHINE based on the output of uname instead of i386?-	echo i586-pc-interix-	exit ;;-    i*:UWIN*:*)-	echo ${UNAME_MACHINE}-pc-uwin-	exit ;;-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)-	echo x86_64-unknown-cygwin-	exit ;;-    p*:CYGWIN*:*)-	echo powerpcle-unknown-cygwin-	exit ;;-    prep*:SunOS:5.*:*)-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`-	exit ;;-    *:GNU:*:*)-	# the GNU system-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`-	exit ;;-    *:GNU/*:*:*)-	# other systems with GNU libc and userland-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}-	exit ;;-    i*86:Minix:*:*)-	echo ${UNAME_MACHINE}-pc-minix-	exit ;;-    aarch64:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    aarch64_be:Linux:*:*)-	UNAME_MACHINE=aarch64_be-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    alpha:Linux:*:*)-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in-	  EV5)   UNAME_MACHINE=alphaev5 ;;-	  EV56)  UNAME_MACHINE=alphaev56 ;;-	  PCA56) UNAME_MACHINE=alphapca56 ;;-	  PCA57) UNAME_MACHINE=alphapca56 ;;-	  EV6)   UNAME_MACHINE=alphaev6 ;;-	  EV67)  UNAME_MACHINE=alphaev67 ;;-	  EV68*) UNAME_MACHINE=alphaev68 ;;-	esac-	objdump --private-headers /bin/sh | grep -q ld.so.1-	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    arc:Linux:*:* | arceb:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    arm*:Linux:*:*)-	eval $set_cc_for_build-	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \-	    | grep -q __ARM_EABI__-	then-	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	else-	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \-		| grep -q __ARM_PCS_VFP-	    then-		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi-	    else-		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf-	    fi-	fi-	exit ;;-    avr32*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    cris:Linux:*:*)-	echo ${UNAME_MACHINE}-axis-linux-${LIBC}-	exit ;;-    crisv32:Linux:*:*)-	echo ${UNAME_MACHINE}-axis-linux-${LIBC}-	exit ;;-    e2k:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    frv:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    hexagon:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    i*86:Linux:*:*)-	echo ${UNAME_MACHINE}-pc-linux-${LIBC}-	exit ;;-    ia64:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    k1om:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    m32r*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    m68*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    mips:Linux:*:* | mips64:Linux:*:*)-	eval $set_cc_for_build-	sed 's/^	//' << EOF >$dummy.c-	#undef CPU-	#undef ${UNAME_MACHINE}-	#undef ${UNAME_MACHINE}el-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)-	CPU=${UNAME_MACHINE}el-	#else-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)-	CPU=${UNAME_MACHINE}-	#else-	CPU=-	#endif-	#endif-EOF-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }-	;;-    mips64el:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    openrisc*:Linux:*:*)-	echo or1k-unknown-linux-${LIBC}-	exit ;;-    or32:Linux:*:* | or1k*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    padre:Linux:*:*)-	echo sparc-unknown-linux-${LIBC}-	exit ;;-    parisc64:Linux:*:* | hppa64:Linux:*:*)-	echo hppa64-unknown-linux-${LIBC}-	exit ;;-    parisc:Linux:*:* | hppa:Linux:*:*)-	# Look for CPU level-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in-	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;-	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;-	  *)    echo hppa-unknown-linux-${LIBC} ;;-	esac-	exit ;;-    ppc64:Linux:*:*)-	echo powerpc64-unknown-linux-${LIBC}-	exit ;;-    ppc:Linux:*:*)-	echo powerpc-unknown-linux-${LIBC}-	exit ;;-    ppc64le:Linux:*:*)-	echo powerpc64le-unknown-linux-${LIBC}-	exit ;;-    ppcle:Linux:*:*)-	echo powerpcle-unknown-linux-${LIBC}-	exit ;;-    riscv32:Linux:*:* | riscv64:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    s390:Linux:*:* | s390x:Linux:*:*)-	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}-	exit ;;-    sh64*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    sh*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    sparc:Linux:*:* | sparc64:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    tile*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    vax:Linux:*:*)-	echo ${UNAME_MACHINE}-dec-linux-${LIBC}-	exit ;;-    x86_64:Linux:*:*)-	echo ${UNAME_MACHINE}-pc-linux-${LIBC}-	exit ;;-    xtensa*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}-	exit ;;-    i*86:DYNIX/ptx:4*:*)-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.-	# earlier versions are messed up and put the nodename in both-	# sysname and nodename.-	echo i386-sequent-sysv4-	exit ;;-    i*86:UNIX_SV:4.2MP:2.*)-	# Unixware is an offshoot of SVR4, but it has its own version-	# number series starting with 2...-	# I am not positive that other SVR4 systems won't match this,-	# I just have to hope.  -- rms.-	# Use sysv4.2uw... so that sysv4* matches it.-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}-	exit ;;-    i*86:OS/2:*:*)-	# If we were able to find `uname', then EMX Unix compatibility-	# is probably installed.-	echo ${UNAME_MACHINE}-pc-os2-emx-	exit ;;-    i*86:XTS-300:*:STOP)-	echo ${UNAME_MACHINE}-unknown-stop-	exit ;;-    i*86:atheos:*:*)-	echo ${UNAME_MACHINE}-unknown-atheos-	exit ;;-    i*86:syllable:*:*)-	echo ${UNAME_MACHINE}-pc-syllable-	exit ;;-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)-	echo i386-unknown-lynxos${UNAME_RELEASE}-	exit ;;-    i*86:*DOS:*:*)-	echo ${UNAME_MACHINE}-pc-msdosdjgpp-	exit ;;-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}-	else-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}-	fi-	exit ;;-    i*86:*:5:[678]*)-	# UnixWare 7.x, OpenUNIX and OpenServer 6.-	case `/bin/uname -X | grep "^Machine"` in-	    *486*)	     UNAME_MACHINE=i486 ;;-	    *Pentium)	     UNAME_MACHINE=i586 ;;-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;-	esac-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}-	exit ;;-    i*86:*:3.2:*)-	if test -f /usr/options/cb.name; then-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL-	elif /bin/uname -X 2>/dev/null >/dev/null ; then-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \-			&& UNAME_MACHINE=i586-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \-			&& UNAME_MACHINE=i686-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \-			&& UNAME_MACHINE=i686-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL-	else-		echo ${UNAME_MACHINE}-pc-sysv32-	fi-	exit ;;-    pc:*:*:*)-	# Left here for compatibility:-	# uname -m prints for DJGPP always 'pc', but it prints nothing about-	# the processor, so we play safe by assuming i586.-	# Note: whatever this is, it MUST be the same as what config.sub-	# prints for the "djgpp" host, or else GDB configure will decide that-	# this is a cross-build.-	echo i586-pc-msdosdjgpp-	exit ;;-    Intel:Mach:3*:*)-	echo i386-pc-mach3-	exit ;;-    paragon:*:*:*)-	echo i860-intel-osf1-	exit ;;-    i860:*:4.*:*) # i860-SVR4-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4-	else # Add other i860-SVR4 vendors below as they are discovered.-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4-	fi-	exit ;;-    mini*:CTIX:SYS*5:*)-	# "miniframe"-	echo m68010-convergent-sysv-	exit ;;-    mc68k:UNIX:SYSTEM5:3.51m)-	echo m68k-convergent-sysv-	exit ;;-    M680?0:D-NIX:5.3:*)-	echo m68k-diab-dnix-	exit ;;-    M68*:*:R3V[5678]*:*)-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)-	OS_REL=''-	test -r /etc/.relid \-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \-	  && { echo i486-ncr-sysv4; exit; } ;;-    NCR*:*:4.2:* | MPRAS*:*:4.2:*)-	OS_REL='.3'-	test -r /etc/.relid \-	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }-	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)-	echo m68k-unknown-lynxos${UNAME_RELEASE}-	exit ;;-    mc68030:UNIX_System_V:4.*:*)-	echo m68k-atari-sysv4-	exit ;;-    TSUNAMI:LynxOS:2.*:*)-	echo sparc-unknown-lynxos${UNAME_RELEASE}-	exit ;;-    rs6000:LynxOS:2.*:*)-	echo rs6000-unknown-lynxos${UNAME_RELEASE}-	exit ;;-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)-	echo powerpc-unknown-lynxos${UNAME_RELEASE}-	exit ;;-    SM[BE]S:UNIX_SV:*:*)-	echo mips-dde-sysv${UNAME_RELEASE}-	exit ;;-    RM*:ReliantUNIX-*:*:*)-	echo mips-sni-sysv4-	exit ;;-    RM*:SINIX-*:*:*)-	echo mips-sni-sysv4-	exit ;;-    *:SINIX-*:*:*)-	if uname -p 2>/dev/null >/dev/null ; then-		UNAME_MACHINE=`(uname -p) 2>/dev/null`-		echo ${UNAME_MACHINE}-sni-sysv4-	else-		echo ns32k-sni-sysv-	fi-	exit ;;-    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort-			# says <Richard.M.Bartel@ccMail.Census.GOV>-	echo i586-unisys-sysv4-	exit ;;-    *:UNIX_System_V:4*:FTX*)-	# From Gerald Hewes <hewes@openmarket.com>.-	# How about differentiating between stratus architectures? -djm-	echo hppa1.1-stratus-sysv4-	exit ;;-    *:*:*:FTX*)-	# From seanf@swdc.stratus.com.-	echo i860-stratus-sysv4-	exit ;;-    i*86:VOS:*:*)-	# From Paul.Green@stratus.com.-	echo ${UNAME_MACHINE}-stratus-vos-	exit ;;-    *:VOS:*:*)-	# From Paul.Green@stratus.com.-	echo hppa1.1-stratus-vos-	exit ;;-    mc68*:A/UX:*:*)-	echo m68k-apple-aux${UNAME_RELEASE}-	exit ;;-    news*:NEWS-OS:6*:*)-	echo mips-sony-newsos6-	exit ;;-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)-	if [ -d /usr/nec ]; then-		echo mips-nec-sysv${UNAME_RELEASE}-	else-		echo mips-unknown-sysv${UNAME_RELEASE}-	fi-	exit ;;-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.-	echo powerpc-be-beos-	exit ;;-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.-	echo powerpc-apple-beos-	exit ;;-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.-	echo i586-pc-beos-	exit ;;-    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.-	echo i586-pc-haiku-	exit ;;-    x86_64:Haiku:*:*)-	echo x86_64-unknown-haiku-	exit ;;-    SX-4:SUPER-UX:*:*)-	echo sx4-nec-superux${UNAME_RELEASE}-	exit ;;-    SX-5:SUPER-UX:*:*)-	echo sx5-nec-superux${UNAME_RELEASE}-	exit ;;-    SX-6:SUPER-UX:*:*)-	echo sx6-nec-superux${UNAME_RELEASE}-	exit ;;-    SX-7:SUPER-UX:*:*)-	echo sx7-nec-superux${UNAME_RELEASE}-	exit ;;-    SX-8:SUPER-UX:*:*)-	echo sx8-nec-superux${UNAME_RELEASE}-	exit ;;-    SX-8R:SUPER-UX:*:*)-	echo sx8r-nec-superux${UNAME_RELEASE}-	exit ;;-    SX-ACE:SUPER-UX:*:*)-	echo sxace-nec-superux${UNAME_RELEASE}-	exit ;;-    Power*:Rhapsody:*:*)-	echo powerpc-apple-rhapsody${UNAME_RELEASE}-	exit ;;-    *:Rhapsody:*:*)-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}-	exit ;;-    *:Darwin:*:*)-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown-	eval $set_cc_for_build-	if test "$UNAME_PROCESSOR" = unknown ; then-	    UNAME_PROCESSOR=powerpc-	fi-	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then-	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then-		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \-		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \-		    grep IS_64BIT_ARCH >/dev/null-		then-		    case $UNAME_PROCESSOR in-			i386) UNAME_PROCESSOR=x86_64 ;;-			powerpc) UNAME_PROCESSOR=powerpc64 ;;-		    esac-		fi-	    fi-	elif test "$UNAME_PROCESSOR" = i386 ; then-	    # Avoid executing cc on OS X 10.9, as it ships with a stub-	    # that puts up a graphical alert prompting to install-	    # developer tools.  Any system running Mac OS X 10.7 or-	    # later (Darwin 11 and later) is required to have a 64-bit-	    # processor. This is not true of the ARM version of Darwin-	    # that Apple uses in portable devices.-	    UNAME_PROCESSOR=x86_64-	fi-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}-	exit ;;-    *:procnto*:*:* | *:QNX:[0123456789]*:*)-	UNAME_PROCESSOR=`uname -p`-	if test "$UNAME_PROCESSOR" = x86; then-		UNAME_PROCESSOR=i386-		UNAME_MACHINE=pc-	fi-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}-	exit ;;-    *:QNX:*:4*)-	echo i386-pc-qnx-	exit ;;-    NEO-?:NONSTOP_KERNEL:*:*)-	echo neo-tandem-nsk${UNAME_RELEASE}-	exit ;;-    NSE-*:NONSTOP_KERNEL:*:*)-	echo nse-tandem-nsk${UNAME_RELEASE}-	exit ;;-    NSR-?:NONSTOP_KERNEL:*:*)-	echo nsr-tandem-nsk${UNAME_RELEASE}-	exit ;;-    NSX-?:NONSTOP_KERNEL:*:*)-	echo nsx-tandem-nsk${UNAME_RELEASE}-	exit ;;-    *:NonStop-UX:*:*)-	echo mips-compaq-nonstopux-	exit ;;-    BS2000:POSIX*:*:*)-	echo bs2000-siemens-sysv-	exit ;;-    DS/*:UNIX_System_V:*:*)-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}-	exit ;;-    *:Plan9:*:*)-	# "uname -m" is not consistent, so use $cputype instead. 386-	# is converted to i386 for consistency with other x86-	# operating systems.-	if test "$cputype" = 386; then-	    UNAME_MACHINE=i386-	else-	    UNAME_MACHINE="$cputype"-	fi-	echo ${UNAME_MACHINE}-unknown-plan9-	exit ;;-    *:TOPS-10:*:*)-	echo pdp10-unknown-tops10-	exit ;;-    *:TENEX:*:*)-	echo pdp10-unknown-tenex-	exit ;;-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)-	echo pdp10-dec-tops20-	exit ;;-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)-	echo pdp10-xkl-tops20-	exit ;;-    *:TOPS-20:*:*)-	echo pdp10-unknown-tops20-	exit ;;-    *:ITS:*:*)-	echo pdp10-unknown-its-	exit ;;-    SEI:*:*:SEIUX)-	echo mips-sei-seiux${UNAME_RELEASE}-	exit ;;-    *:DragonFly:*:*)-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-	exit ;;-    *:*VMS:*:*)-	UNAME_MACHINE=`(uname -p) 2>/dev/null`-	case "${UNAME_MACHINE}" in-	    A*) echo alpha-dec-vms ; exit ;;-	    I*) echo ia64-dec-vms ; exit ;;-	    V*) echo vax-dec-vms ; exit ;;-	esac ;;-    *:XENIX:*:SysV)-	echo i386-pc-xenix-	exit ;;-    i*86:skyos:*:*)-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`-	exit ;;-    i*86:rdos:*:*)-	echo ${UNAME_MACHINE}-pc-rdos-	exit ;;-    i*86:AROS:*:*)-	echo ${UNAME_MACHINE}-pc-aros-	exit ;;-    x86_64:VMkernel:*:*)-	echo ${UNAME_MACHINE}-unknown-esx-	exit ;;-    amd64:Isilon\ OneFS:*:*)-	echo x86_64-unknown-onefs-	exit ;;-esac--cat >&2 <<EOF-$0: unable to guess system type--This script (version $timestamp), has failed to recognize the-operating system you are using. If your script is old, overwrite-config.guess and config.sub with the latest versions from:--  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess-and-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub--If $0 has already been updated, send the following data and any-information you think might be pertinent to config-patches@gnu.org to-provide the necessary information to handle your system.--config.guess timestamp = $timestamp--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`-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`--hostinfo               = `(hostinfo) 2>/dev/null`-/bin/universe          = `(/bin/universe) 2>/dev/null`-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`-/bin/arch              = `(/bin/arch) 2>/dev/null`-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`--UNAME_MACHINE = ${UNAME_MACHINE}-UNAME_RELEASE = ${UNAME_RELEASE}-UNAME_SYSTEM  = ${UNAME_SYSTEM}-UNAME_VERSION = ${UNAME_VERSION}-EOF--exit 1--# Local variables:-# eval: (add-hook 'write-file-hooks 'time-stamp)+#   Copyright 1992-2024 Free Software Foundation, Inc.++# shellcheck disable=SC2006,SC2268 # see below for rationale++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+# (at your option) any later version.+#+# This program is distributed in the hope that it will be useful, but+# WITHOUT ANY WARRANTY; without even the implied warranty of+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU+# General Public License for more details.+#+# You should have received a copy of the GNU General Public License+# along with this program; if not, see <https://www.gnu.org/licenses/>.+#+# As a special exception to the GNU General Public License, if you+# distribute this file as part of a program that contains a+# configuration script generated by Autoconf, you may include it under+# the same distribution terms that you use for the rest of that+# program.  This Exception is an additional permission under section 7+# of the GNU General Public License, version 3 ("GPLv3").+#+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.+#+# You can get the latest version of this script from:+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess+#+# Please send patches to <config-patches@gnu.org>.+++# The "shellcheck disable" line above the timestamp inhibits complaints+# about features and limitations of the classic Bourne shell that were+# superseded or lifted in POSIX.  However, this script identifies a wide+# variety of pre-POSIX systems that do not have POSIX shells at all, and+# even some reasonably current systems (Solaris 10 as case-in-point) still+# have a pre-POSIX /bin/sh.+++me=`echo "$0" | sed -e 's,.*/,,'`++usage="\+Usage: $0 [OPTION]++Output the configuration name of the system '$me' is run on.++Options:+  -h, --help         print this help, then exit+  -t, --time-stamp   print date of last modification, then exit+  -v, --version      print version number, then exit++Report bugs and patches to <config-patches@gnu.org>."++version="\+GNU config.guess ($timestamp)++Originally written by Per Bothner.+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."++# Parse command line+while test $# -gt 0 ; do+  case $1 in+    --time-stamp | --time* | -t )+       echo "$timestamp" ; exit ;;+    --version | -v )+       echo "$version" ; exit ;;+    --help | --h* | -h )+       echo "$usage"; exit ;;+    -- )     # Stop option processing+       shift; break ;;+    - )	# Use stdin as input.+       break ;;+    -* )+       echo "$me: invalid option $1$help" >&2+       exit 1 ;;+    * )+       break ;;+  esac+done++if test $# != 0; then+  echo "$me: too many arguments$help" >&2+  exit 1+fi++# Just in case it came from the environment.+GUESS=++# CC_FOR_BUILD -- compiler used by this script. Note that the use of a+# compiler to aid in system detection is discouraged as it requires+# 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.++# Portable tmp directory creation inspired by the Autoconf team.++tmp=+# shellcheck disable=SC2172+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15++set_cc_for_build() {+    # prevent multiple calls if $tmp is already set+    test "$tmp" && return 0+    : "${TMPDIR=/tmp}"+    # shellcheck disable=SC2039,SC3028+    { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||+	{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||+	{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||+	{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }+    dummy=$tmp/dummy+    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in+	,,)    echo "int x;" > "$dummy.c"+	       for driver in cc gcc c89 c99 ; do+		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then+		       CC_FOR_BUILD=$driver+		       break+		   fi+	       done+	       if test x"$CC_FOR_BUILD" = x ; then+		   CC_FOR_BUILD=no_compiler_found+	       fi+	       ;;+	,,*)   CC_FOR_BUILD=$CC ;;+	,*,*)  CC_FOR_BUILD=$HOST_CC ;;+    esac+}++# This is needed to find uname on a Pyramid OSx when run in the BSD universe.+# (ghazi@noc.rutgers.edu 1994-08-24)+if test -f /.attbin/uname ; then+	PATH=$PATH:/.attbin ; export PATH+fi++UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown++case $UNAME_SYSTEM in+Linux|GNU|GNU/*)+	LIBC=unknown++	set_cc_for_build+	cat <<-EOF > "$dummy.c"+	#if defined(__ANDROID__)+	LIBC=android+	#else+	#include <features.h>+	#if defined(__UCLIBC__)+	LIBC=uclibc+	#elif defined(__dietlibc__)+	LIBC=dietlibc+	#elif defined(__GLIBC__)+	LIBC=gnu+	#elif defined(__LLVM_LIBC__)+	LIBC=llvm+	#else+	#include <stdarg.h>+	/* First heuristic to detect musl libc.  */+	#ifdef __DEFINED_va_list+	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"++	# Second heuristic to detect musl libc.+	if [ "$LIBC" = unknown ] &&+	   command -v ldd >/dev/null &&+	   ldd --version 2>&1 | grep -q ^musl; then+		LIBC=musl+	fi++	# If the system lacks a compiler, then just pick glibc.+	# We could probably try harder.+	if [ "$LIBC" = unknown ]; then+		LIBC=gnu+	fi+	;;+esac++# Note: order is significant - the case branches are not exclusive.++case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in+    *:NetBSD:*:*)+	# NetBSD (nbsd) targets should (where applicable) match one or+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently+	# switched to ELF, *-*-netbsd* would select the old+	# object file format.  This provides both forward+	# compatibility and a consistent mechanism for selecting the+	# object file format.+	#+	# Note: NetBSD doesn't particularly care about the vendor+	# portion of the name.  We always set it to "unknown".+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \+	    /sbin/sysctl -n hw.machine_arch 2>/dev/null || \+	    /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \+	    echo unknown)`+	case $UNAME_MACHINE_ARCH in+	    aarch64eb) machine=aarch64_be-unknown ;;+	    armeb) machine=armeb-unknown ;;+	    arm*) machine=arm-unknown ;;+	    sh3el) machine=shl-unknown ;;+	    sh3eb) machine=sh-unknown ;;+	    sh5el) machine=sh5le-unknown ;;+	    earmv*)+		arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`+		endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`+		machine=${arch}${endian}-unknown+		;;+	    *) machine=$UNAME_MACHINE_ARCH-unknown ;;+	esac+	# The Operating System including object format, if it has switched+	# to ELF recently (or will in the future) and ABI.+	case $UNAME_MACHINE_ARCH in+	    earm*)+		os=netbsdelf+		;;+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)+		set_cc_for_build+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \+			| grep -q __ELF__+		then+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).+		    # Return netbsd for either.  FIX?+		    os=netbsd+		else+		    os=netbsdelf+		fi+		;;+	    *)+		os=netbsd+		;;+	esac+	# Determine ABI tags.+	case $UNAME_MACHINE_ARCH in+	    earm*)+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'+		abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`+		;;+	esac+	# The OS release+	# Debian GNU/NetBSD machines have a different userland, and+	# thus, need a distinct triplet. However, they do not need+	# kernel version information, so it can be replaced with a+	# suitable tag, in the style of linux-gnu.+	case $UNAME_VERSION in+	    Debian*)+		release='-gnu'+		;;+	    *)+		release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`+		;;+	esac+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:+	# contains redundant information, the shorter form:+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.+	GUESS=$machine-${os}${release}${abi-}+	;;+    *:Bitrig:*:*)+	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`+	GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE+	;;+    *:OpenBSD:*:*)+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`+	GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE+	;;+    *:SecBSD:*:*)+	UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`+	GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE+	;;+    *:LibertyBSD:*:*)+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`+	GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE+	;;+    *:MidnightBSD:*:*)+	GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE+	;;+    *:ekkoBSD:*:*)+	GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE+	;;+    *:SolidBSD:*:*)+	GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE+	;;+    *:OS108:*:*)+	GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE+	;;+    macppc:MirBSD:*:*)+	GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE+	;;+    *:MirBSD:*:*)+	GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE+	;;+    *:Sortix:*:*)+	GUESS=$UNAME_MACHINE-unknown-sortix+	;;+    *:Twizzler:*:*)+	GUESS=$UNAME_MACHINE-unknown-twizzler+	;;+    *:Redox:*:*)+	GUESS=$UNAME_MACHINE-unknown-redox+	;;+    mips:OSF1:*.*)+	GUESS=mips-dec-osf1+	;;+    alpha:OSF1:*:*)+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.+	trap '' 0+	case $UNAME_RELEASE in+	*4.0)+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`+		;;+	*5.*)+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`+		;;+	esac+	# According to Compaq, /usr/sbin/psrinfo has been available on+	# OSF/1 and Tru64 systems produced since 1995.  I hope that+	# covers most systems running today.  This code pipes the CPU+	# types through head -n 1, so we only detect the type of CPU 0.+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`+	case $ALPHA_CPU_TYPE in+	    "EV4 (21064)")+		UNAME_MACHINE=alpha ;;+	    "EV4.5 (21064)")+		UNAME_MACHINE=alpha ;;+	    "LCA4 (21066/21068)")+		UNAME_MACHINE=alpha ;;+	    "EV5 (21164)")+		UNAME_MACHINE=alphaev5 ;;+	    "EV5.6 (21164A)")+		UNAME_MACHINE=alphaev56 ;;+	    "EV5.6 (21164PC)")+		UNAME_MACHINE=alphapca56 ;;+	    "EV5.7 (21164PC)")+		UNAME_MACHINE=alphapca57 ;;+	    "EV6 (21264)")+		UNAME_MACHINE=alphaev6 ;;+	    "EV6.7 (21264A)")+		UNAME_MACHINE=alphaev67 ;;+	    "EV6.8CB (21264C)")+		UNAME_MACHINE=alphaev68 ;;+	    "EV6.8AL (21264B)")+		UNAME_MACHINE=alphaev68 ;;+	    "EV6.8CX (21264D)")+		UNAME_MACHINE=alphaev68 ;;+	    "EV6.9A (21264/EV69A)")+		UNAME_MACHINE=alphaev69 ;;+	    "EV7 (21364)")+		UNAME_MACHINE=alphaev7 ;;+	    "EV7.9 (21364A)")+		UNAME_MACHINE=alphaev79 ;;+	esac+	# A Pn.n version is a patched version.+	# A Vn.n version is a released version.+	# A Tn.n version is a released field test version.+	# A Xn.n version is an unreleased experimental baselevel.+	# 1.2 uses "1.2" for uname -r.+	OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`+	GUESS=$UNAME_MACHINE-dec-osf$OSF_REL+	;;+    Amiga*:UNIX_System_V:4.0:*)+	GUESS=m68k-unknown-sysv4+	;;+    *:[Aa]miga[Oo][Ss]:*:*)+	GUESS=$UNAME_MACHINE-unknown-amigaos+	;;+    *:[Mm]orph[Oo][Ss]:*:*)+	GUESS=$UNAME_MACHINE-unknown-morphos+	;;+    *:OS/390:*:*)+	GUESS=i370-ibm-openedition+	;;+    *:z/VM:*:*)+	GUESS=s390-ibm-zvmoe+	;;+    *:OS400:*:*)+	GUESS=powerpc-ibm-os400+	;;+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)+	GUESS=arm-acorn-riscix$UNAME_RELEASE+	;;+    arm*:riscos:*:*|arm*:RISCOS:*:*)+	GUESS=arm-unknown-riscos+	;;+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)+	GUESS=hppa1.1-hitachi-hiuxmpp+	;;+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)+	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.+	case `(/bin/universe) 2>/dev/null` in+	    att) GUESS=pyramid-pyramid-sysv3 ;;+	    *)   GUESS=pyramid-pyramid-bsd   ;;+	esac+	;;+    NILE*:*:*:dcosx)+	GUESS=pyramid-pyramid-svr4+	;;+    DRS?6000:unix:4.0:6*)+	GUESS=sparc-icl-nx6+	;;+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)+	case `/usr/bin/uname -p` in+	    sparc) GUESS=sparc-icl-nx7 ;;+	esac+	;;+    s390x:SunOS:*:*)+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`+	GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL+	;;+    sun4H:SunOS:5.*:*)+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`+	GUESS=sparc-hal-solaris2$SUN_REL+	;;+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`+	GUESS=sparc-sun-solaris2$SUN_REL+	;;+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)+	GUESS=i386-pc-auroraux$UNAME_RELEASE+	;;+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)+	set_cc_for_build+	SUN_ARCH=i386+	# If there is a compiler, see if it is configured for 64-bit objects.+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.+	# 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 -m64 -E - 2>/dev/null) | \+		grep IS_64BIT_ARCH >/dev/null+	    then+		SUN_ARCH=x86_64+	    fi+	fi+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`+	GUESS=$SUN_ARCH-pc-solaris2$SUN_REL+	;;+    sun4*:SunOS:6*:*)+	# According to config.sub, this is the proper way to canonicalize+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but+	# it's likely to be more like Solaris than SunOS4.+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`+	GUESS=sparc-sun-solaris3$SUN_REL+	;;+    sun4*:SunOS:*:*)+	case `/usr/bin/arch -k` in+	    Series*|S4*)+		UNAME_RELEASE=`uname -v`+		;;+	esac+	# 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+	;;+    sun3*:SunOS:*:*)+	GUESS=m68k-sun-sunos$UNAME_RELEASE+	;;+    sun*:*:4.2BSD:*)+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`+	test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3+	case `/bin/arch` in+	    sun3)+		GUESS=m68k-sun-sunos$UNAME_RELEASE+		;;+	    sun4)+		GUESS=sparc-sun-sunos$UNAME_RELEASE+		;;+	esac+	;;+    aushp:SunOS:*:*)+	GUESS=sparc-auspex-sunos$UNAME_RELEASE+	;;+    # The situation for MiNT is a little confusing.  The machine name+    # can be virtually everything (everything which is not+    # "atarist" or "atariste" at least should have a processor+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"+    # to the lowercase version "mint" (or "freemint").  Finally+    # the system name "TOS" denotes a system which is actually not+    # MiNT.  But MiNT is downward compatible to TOS, so this should+    # be no problem.+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)+	GUESS=m68k-atari-mint$UNAME_RELEASE+	;;+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)+	GUESS=m68k-atari-mint$UNAME_RELEASE+	;;+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)+	GUESS=m68k-atari-mint$UNAME_RELEASE+	;;+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)+	GUESS=m68k-milan-mint$UNAME_RELEASE+	;;+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)+	GUESS=m68k-hades-mint$UNAME_RELEASE+	;;+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)+	GUESS=m68k-unknown-mint$UNAME_RELEASE+	;;+    m68k:machten:*:*)+	GUESS=m68k-apple-machten$UNAME_RELEASE+	;;+    powerpc:machten:*:*)+	GUESS=powerpc-apple-machten$UNAME_RELEASE+	;;+    RISC*:Mach:*:*)+	GUESS=mips-dec-mach_bsd4.3+	;;+    RISC*:ULTRIX:*:*)+	GUESS=mips-dec-ultrix$UNAME_RELEASE+	;;+    VAX*:ULTRIX*:*:*)+	GUESS=vax-dec-ultrix$UNAME_RELEASE+	;;+    2020:CLIX:*:* | 2430:CLIX:*:*)+	GUESS=clipper-intergraph-clix$UNAME_RELEASE+	;;+    mips:*:*:UMIPS | mips:*:*:RISCos)+	set_cc_for_build+	sed 's/^	//' << EOF > "$dummy.c"+#ifdef __cplusplus+#include <stdio.h>  /* for printf() prototype */+	int main (int argc, char *argv[]) {+#else+	int main (argc, argv) int argc; char *argv[]; {+#endif+	#if defined (host_mips) && defined (MIPSEB)+	#if defined (SYSTYPE_SYSV)+	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);+	#endif+	#if defined (SYSTYPE_SVR4)+	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);+	#endif+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)+	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);+	#endif+	#endif+	  exit (-1);+	}+EOF+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" &&+	  dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&+	  SYSTEM_NAME=`"$dummy" "$dummyarg"` &&+	    { echo "$SYSTEM_NAME"; exit; }+	GUESS=mips-mips-riscos$UNAME_RELEASE+	;;+    Motorola:PowerMAX_OS:*:*)+	GUESS=powerpc-motorola-powermax+	;;+    Motorola:*:4.3:PL8-*)+	GUESS=powerpc-harris-powermax+	;;+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)+	GUESS=powerpc-harris-powermax+	;;+    Night_Hawk:Power_UNIX:*:*)+	GUESS=powerpc-harris-powerunix+	;;+    m88k:CX/UX:7*:*)+	GUESS=m88k-harris-cxux7+	;;+    m88k:*:4*:R4*)+	GUESS=m88k-motorola-sysv4+	;;+    m88k:*:3*:R3*)+	GUESS=m88k-motorola-sysv3+	;;+    AViiON:dgux:*:*)+	# DG/UX returns AViiON for all architectures+	UNAME_PROCESSOR=`/usr/bin/uname -p`+	if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110+	then+	    if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \+	       test "$TARGET_BINARY_INTERFACE"x = x+	    then+		GUESS=m88k-dg-dgux$UNAME_RELEASE+	    else+		GUESS=m88k-dg-dguxbcs$UNAME_RELEASE+	    fi+	else+	    GUESS=i586-dg-dgux$UNAME_RELEASE+	fi+	;;+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)+	GUESS=m88k-dolphin-sysv3+	;;+    M88*:*:R3*:*)+	# Delta 88k system running SVR3+	GUESS=m88k-motorola-sysv3+	;;+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)+	GUESS=m88k-tektronix-sysv3+	;;+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)+	GUESS=m68k-tektronix-bsd+	;;+    *:IRIX*:*:*)+	IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`+	GUESS=mips-sgi-irix$IRIX_REL+	;;+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.+	GUESS=romp-ibm-aix    # uname -m gives an 8 hex-code CPU id+	;;                    # Note that: echo "'`uname -s`'" gives 'AIX '+    i*86:AIX:*:*)+	GUESS=i386-ibm-aix+	;;+    ia64:AIX:*:*)+	if test -x /usr/bin/oslevel ; then+		IBM_REV=`/usr/bin/oslevel`+	else+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE+	fi+	GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV+	;;+    *:AIX:2:3)+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then+		set_cc_for_build+		sed 's/^		//' << EOF > "$dummy.c"+		#include <sys/systemcfg.h>++		main()+			{+			if (!__power_pc())+				exit(1);+			puts("powerpc-ibm-aix3.2.5");+			exit(0);+			}+EOF+		if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`+		then+			GUESS=$SYSTEM_NAME+		else+			GUESS=rs6000-ibm-aix3.2.5+		fi+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then+		GUESS=rs6000-ibm-aix3.2.4+	else+		GUESS=rs6000-ibm-aix3.2+	fi+	;;+    *:AIX:*:[4567])+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`+	if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then+		IBM_ARCH=rs6000+	else+		IBM_ARCH=powerpc+	fi+	if test -x /usr/bin/lslpp ; then+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`+	else+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE+	fi+	GUESS=$IBM_ARCH-ibm-aix$IBM_REV+	;;+    *:AIX:*:*)+	GUESS=rs6000-ibm-aix+	;;+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)+	GUESS=romp-ibm-bsd4.4+	;;+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and+	GUESS=romp-ibm-bsd$UNAME_RELEASE    # 4.3 with uname added to+	;;                                  # report: romp-ibm BSD 4.3+    *:BOSX:*:*)+	GUESS=rs6000-bull-bosx+	;;+    DPX/2?00:B.O.S.:*:*)+	GUESS=m68k-bull-sysv3+	;;+    9000/[34]??:4.3bsd:1.*:*)+	GUESS=m68k-hp-bsd+	;;+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)+	GUESS=m68k-hp-bsd4.4+	;;+    9000/[34678]??:HP-UX:*:*)+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`+	case $UNAME_MACHINE in+	    9000/31?)            HP_ARCH=m68000 ;;+	    9000/[34]??)         HP_ARCH=m68k ;;+	    9000/[678][0-9][0-9])+		if test -x /usr/bin/getconf; then+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`+		    case $sc_cpu_version in+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1+		      532)                      # CPU_PA_RISC2_0+			case $sc_kernel_bits in+			  32) HP_ARCH=hppa2.0n ;;+			  64) HP_ARCH=hppa2.0w ;;+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20+			esac ;;+		    esac+		fi+		if test "$HP_ARCH" = ""; then+		    set_cc_for_build+		    sed 's/^		//' << EOF > "$dummy.c"++		#define _HPUX_SOURCE+		#include <stdlib.h>+		#include <unistd.h>++		int main ()+		{+		#if defined(_SC_KERNEL_BITS)+		    long bits = sysconf(_SC_KERNEL_BITS);+		#endif+		    long cpu  = sysconf (_SC_CPU_VERSION);++		    switch (cpu)+			{+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;+			case CPU_PA_RISC2_0:+		#if defined(_SC_KERNEL_BITS)+			    switch (bits)+				{+				case 64: puts ("hppa2.0w"); break;+				case 32: puts ("hppa2.0n"); break;+				default: puts ("hppa2.0"); break;+				} break;+		#else  /* !defined(_SC_KERNEL_BITS) */+			    puts ("hppa2.0"); break;+		#endif+			default: puts ("hppa1.0"); break;+			}+		    exit (0);+		}+EOF+		    (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`+		    test -z "$HP_ARCH" && HP_ARCH=hppa+		fi ;;+	esac+	if test "$HP_ARCH" = hppa2.0w+	then+	    set_cc_for_build++	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler+	    # generating 64-bit code.  GNU and HP use different nomenclature:+	    #+	    # $ CC_FOR_BUILD=cc ./config.guess+	    # => hppa2.0w-hp-hpux11.23+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess+	    # => hppa64-hp-hpux11.23++	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |+		grep -q __LP64__+	    then+		HP_ARCH=hppa2.0w+	    else+		HP_ARCH=hppa64+	    fi+	fi+	GUESS=$HP_ARCH-hp-hpux$HPUX_REV+	;;+    ia64:HP-UX:*:*)+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`+	GUESS=ia64-hp-hpux$HPUX_REV+	;;+    3050*:HI-UX:*:*)+	set_cc_for_build+	sed 's/^	//' << EOF > "$dummy.c"+	#include <unistd.h>+	int+	main ()+	{+	  long cpu = sysconf (_SC_CPU_VERSION);+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct+	     results, however.  */+	  if (CPU_IS_PA_RISC (cpu))+	    {+	      switch (cpu)+		{+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;+		  default: puts ("hppa-hitachi-hiuxwe2"); break;+		}+	    }+	  else if (CPU_IS_HP_MC68K (cpu))+	    puts ("m68k-hitachi-hiuxwe2");+	  else puts ("unknown-hitachi-hiuxwe2");+	  exit (0);+	}+EOF+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&+		{ echo "$SYSTEM_NAME"; exit; }+	GUESS=unknown-hitachi-hiuxwe2+	;;+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)+	GUESS=hppa1.1-hp-bsd+	;;+    9000/8??:4.3bsd:*:*)+	GUESS=hppa1.0-hp-bsd+	;;+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)+	GUESS=hppa1.0-hp-mpeix+	;;+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)+	GUESS=hppa1.1-hp-osf+	;;+    hp8??:OSF1:*:*)+	GUESS=hppa1.0-hp-osf+	;;+    i*86:OSF1:*:*)+	if test -x /usr/sbin/sysversion ; then+	    GUESS=$UNAME_MACHINE-unknown-osf1mk+	else+	    GUESS=$UNAME_MACHINE-unknown-osf1+	fi+	;;+    parisc*:Lites*:*:*)+	GUESS=hppa1.1-hp-lites+	;;+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)+	GUESS=c1-convex-bsd+	;;+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)+	if getsysinfo -f scalar_acc+	then echo c32-convex-bsd+	else echo c2-convex-bsd+	fi+	exit ;;+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)+	GUESS=c34-convex-bsd+	;;+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)+	GUESS=c38-convex-bsd+	;;+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)+	GUESS=c4-convex-bsd+	;;+    CRAY*Y-MP:*:*:*)+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`+	GUESS=ymp-cray-unicos$CRAY_REL+	;;+    CRAY*[A-Z]90:*:*:*)+	echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \+	      -e 's/\.[^.]*$/.X/'+	exit ;;+    CRAY*TS:*:*:*)+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`+	GUESS=t90-cray-unicos$CRAY_REL+	;;+    CRAY*T3E:*:*:*)+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`+	GUESS=alphaev5-cray-unicosmk$CRAY_REL+	;;+    CRAY*SV1:*:*:*)+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`+	GUESS=sv1-cray-unicos$CRAY_REL+	;;+    *:UNICOS/mp:*:*)+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`+	GUESS=craynv-cray-unicosmp$CRAY_REL+	;;+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`+	FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`+	GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}+	;;+    5000:UNIX_System_V:4.*:*)+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`+	FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`+	GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}+	;;+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)+	GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE+	;;+    sparc*:BSD/OS:*:*)+	GUESS=sparc-unknown-bsdi$UNAME_RELEASE+	;;+    *:BSD/OS:*:*)+	GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE+	;;+    arm:FreeBSD:*:*)+	UNAME_PROCESSOR=`uname -p`+	set_cc_for_build+	if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \+	    | grep -q __ARM_PCS_VFP+	then+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi+	else+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf+	fi+	;;+    *:FreeBSD:*:*)+	UNAME_PROCESSOR=`uname -p`+	case $UNAME_PROCESSOR in+	    amd64)+		UNAME_PROCESSOR=x86_64 ;;+	    i386)+		UNAME_PROCESSOR=i586 ;;+	esac+	FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`+	GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL+	;;+    i*:CYGWIN*:*)+	GUESS=$UNAME_MACHINE-pc-cygwin+	;;+    *:MINGW64*:*)+	GUESS=$UNAME_MACHINE-pc-mingw64+	;;+    *:MINGW*:*)+	GUESS=$UNAME_MACHINE-pc-mingw32+	;;+    *:MSYS*:*)+	GUESS=$UNAME_MACHINE-pc-msys+	;;+    i*:PW*:*)+	GUESS=$UNAME_MACHINE-pc-pw32+	;;+    *:SerenityOS:*:*)+        GUESS=$UNAME_MACHINE-pc-serenity+        ;;+    *:Interix*:*)+	case $UNAME_MACHINE in+	    x86)+		GUESS=i586-pc-interix$UNAME_RELEASE+		;;+	    authenticamd | genuineintel | EM64T)+		GUESS=x86_64-unknown-interix$UNAME_RELEASE+		;;+	    IA64)+		GUESS=ia64-unknown-interix$UNAME_RELEASE+		;;+	esac ;;+    i*:UWIN*:*)+	GUESS=$UNAME_MACHINE-pc-uwin+	;;+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)+	GUESS=x86_64-pc-cygwin+	;;+    prep*:SunOS:5.*:*)+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`+	GUESS=powerpcle-unknown-solaris2$SUN_REL+	;;+    *:GNU:*:*)+	# the GNU system+	GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`+	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`+	GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL+	;;+    *:GNU/*:*:*)+	# other systems with GNU libc and userland+	GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`+	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:*:*)+	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+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    alpha:Linux:*:*)+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in+	  EV5)   UNAME_MACHINE=alphaev5 ;;+	  EV56)  UNAME_MACHINE=alphaev56 ;;+	  PCA56) UNAME_MACHINE=alphapca56 ;;+	  PCA57) UNAME_MACHINE=alphapca56 ;;+	  EV6)   UNAME_MACHINE=alphaev6 ;;+	  EV67)  UNAME_MACHINE=alphaev67 ;;+	  EV68*) UNAME_MACHINE=alphaev68 ;;+	esac+	objdump --private-headers /bin/sh | grep -q ld.so.1+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    arm*:Linux:*:*)+	set_cc_for_build+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \+	    | grep -q __ARM_EABI__+	then+	    GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	else+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \+		| grep -q __ARM_PCS_VFP+	    then+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi+	    else+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf+	    fi+	fi+	;;+    avr32*:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    cris:Linux:*:*)+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC+	;;+    crisv32:Linux:*:*)+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC+	;;+    e2k:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    frv:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    hexagon:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    i*86:Linux:*:*)+	GUESS=$UNAME_MACHINE-pc-linux-$LIBC+	;;+    ia64:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    k1om:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    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+	;;+    m68*:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    mips:Linux:*:* | mips64:Linux:*:*)+	set_cc_for_build+	IS_GLIBC=0+	test x"${LIBC}" = xgnu && IS_GLIBC=1+	sed 's/^	//' << EOF > "$dummy.c"+	#undef CPU+	#undef mips+	#undef mipsel+	#undef mips64+	#undef mips64el+	#if ${IS_GLIBC} && defined(_ABI64)+	LIBCABI=gnuabi64+	#else+	#if ${IS_GLIBC} && defined(_ABIN32)+	LIBCABI=gnuabin32+	#else+	LIBCABI=${LIBC}+	#endif+	#endif++	#if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6+	CPU=mipsisa64r6+	#else+	#if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6+	CPU=mipsisa32r6+	#else+	#if defined(__mips64)+	CPU=mips64+	#else+	CPU=mips+	#endif+	#endif+	#endif++	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)+	MIPS_ENDIAN=el+	#else+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)+	MIPS_ENDIAN=+	#else+	MIPS_ENDIAN=+	#endif+	#endif+EOF+	cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`+	eval "$cc_set_vars"+	test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }+	;;+    mips64el:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    openrisc*:Linux:*:*)+	GUESS=or1k-unknown-linux-$LIBC+	;;+    or32:Linux:*:* | or1k*:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    padre:Linux:*:*)+	GUESS=sparc-unknown-linux-$LIBC+	;;+    parisc64:Linux:*:* | hppa64:Linux:*:*)+	GUESS=hppa64-unknown-linux-$LIBC+	;;+    parisc:Linux:*:* | hppa:Linux:*:*)+	# Look for CPU level+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in+	  PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;+	  PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;+	  *)    GUESS=hppa-unknown-linux-$LIBC ;;+	esac+	;;+    ppc64:Linux:*:*)+	GUESS=powerpc64-unknown-linux-$LIBC+	;;+    ppc:Linux:*:*)+	GUESS=powerpc-unknown-linux-$LIBC+	;;+    ppc64le:Linux:*:*)+	GUESS=powerpc64le-unknown-linux-$LIBC+	;;+    ppcle:Linux:*:*)+	GUESS=powerpcle-unknown-linux-$LIBC+	;;+    riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    s390:Linux:*:* | s390x:Linux:*:*)+	GUESS=$UNAME_MACHINE-ibm-linux-$LIBC+	;;+    sh64*:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    sh*:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    sparc:Linux:*:* | sparc64:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    tile*:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    vax:Linux:*:*)+	GUESS=$UNAME_MACHINE-dec-linux-$LIBC+	;;+    x86_64:Linux:*:*)+	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 __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=$CPU-pc-linux-$LIBCABI+	;;+    xtensa*:Linux:*:*)+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC+	;;+    i*86:DYNIX/ptx:4*:*)+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.+	# earlier versions are messed up and put the nodename in both+	# sysname and nodename.+	GUESS=i386-sequent-sysv4+	;;+    i*86:UNIX_SV:4.2MP:2.*)+	# Unixware is an offshoot of SVR4, but it has its own version+	# number series starting with 2...+	# I am not positive that other SVR4 systems won't match this,+	# I just have to hope.  -- rms.+	# Use sysv4.2uw... so that sysv4* matches it.+	GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION+	;;+    i*86:OS/2:*:*)+	# If we were able to find 'uname', then EMX Unix compatibility+	# is probably installed.+	GUESS=$UNAME_MACHINE-pc-os2-emx+	;;+    i*86:XTS-300:*:STOP)+	GUESS=$UNAME_MACHINE-unknown-stop+	;;+    i*86:atheos:*:*)+	GUESS=$UNAME_MACHINE-unknown-atheos+	;;+    i*86:syllable:*:*)+	GUESS=$UNAME_MACHINE-pc-syllable+	;;+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)+	GUESS=i386-unknown-lynxos$UNAME_RELEASE+	;;+    i*86:*DOS:*:*)+	GUESS=$UNAME_MACHINE-pc-msdosdjgpp+	;;+    i*86:*:4.*:*)+	UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then+		GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL+	else+		GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL+	fi+	;;+    i*86:*:5:[678]*)+	# UnixWare 7.x, OpenUNIX and OpenServer 6.+	case `/bin/uname -X | grep "^Machine"` in+	    *486*)	     UNAME_MACHINE=i486 ;;+	    *Pentium)	     UNAME_MACHINE=i586 ;;+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;+	esac+	GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}+	;;+    i*86:*:3.2:*)+	if test -f /usr/options/cb.name; then+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`+		GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL+	elif /bin/uname -X 2>/dev/null >/dev/null ; then+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \+			&& UNAME_MACHINE=i586+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \+			&& UNAME_MACHINE=i686+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \+			&& UNAME_MACHINE=i686+		GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL+	else+		GUESS=$UNAME_MACHINE-pc-sysv32+	fi+	;;+    pc:*:*:*)+	# Left here for compatibility:+	# uname -m prints for DJGPP always 'pc', but it prints nothing about+	# the processor, so we play safe by assuming i586.+	# Note: whatever this is, it MUST be the same as what config.sub+	# prints for the "djgpp" host, or else GDB configure will decide that+	# this is a cross-build.+	GUESS=i586-pc-msdosdjgpp+	;;+    Intel:Mach:3*:*)+	GUESS=i386-pc-mach3+	;;+    paragon:*:*:*)+	GUESS=i860-intel-osf1+	;;+    i860:*:4.*:*) # i860-SVR4+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then+	  GUESS=i860-stardent-sysv$UNAME_RELEASE    # Stardent Vistra i860-SVR4+	else # Add other i860-SVR4 vendors below as they are discovered.+	  GUESS=i860-unknown-sysv$UNAME_RELEASE     # Unknown i860-SVR4+	fi+	;;+    mini*:CTIX:SYS*5:*)+	# "miniframe"+	GUESS=m68010-convergent-sysv+	;;+    mc68k:UNIX:SYSTEM5:3.51m)+	GUESS=m68k-convergent-sysv+	;;+    M680?0:D-NIX:5.3:*)+	GUESS=m68k-diab-dnix+	;;+    M68*:*:R3V[5678]*:*)+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)+	OS_REL=''+	test -r /etc/.relid \+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \+	  && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \+	  && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \+	  && { echo i486-ncr-sysv4; exit; } ;;+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)+	OS_REL='.3'+	test -r /etc/.relid \+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \+	    && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)+	GUESS=m68k-unknown-lynxos$UNAME_RELEASE+	;;+    mc68030:UNIX_System_V:4.*:*)+	GUESS=m68k-atari-sysv4+	;;+    TSUNAMI:LynxOS:2.*:*)+	GUESS=sparc-unknown-lynxos$UNAME_RELEASE+	;;+    rs6000:LynxOS:2.*:*)+	GUESS=rs6000-unknown-lynxos$UNAME_RELEASE+	;;+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)+	GUESS=powerpc-unknown-lynxos$UNAME_RELEASE+	;;+    SM[BE]S:UNIX_SV:*:*)+	GUESS=mips-dde-sysv$UNAME_RELEASE+	;;+    RM*:ReliantUNIX-*:*:*)+	GUESS=mips-sni-sysv4+	;;+    RM*:SINIX-*:*:*)+	GUESS=mips-sni-sysv4+	;;+    *:SINIX-*:*:*)+	if uname -p 2>/dev/null >/dev/null ; then+		UNAME_MACHINE=`(uname -p) 2>/dev/null`+		GUESS=$UNAME_MACHINE-sni-sysv4+	else+		GUESS=ns32k-sni-sysv+	fi+	;;+    PENTIUM:*:4.0*:*)	# Unisys 'ClearPath HMP IX 4000' SVR4/MP effort+			# says <Richard.M.Bartel@ccMail.Census.GOV>+	GUESS=i586-unisys-sysv4+	;;+    *:UNIX_System_V:4*:FTX*)+	# From Gerald Hewes <hewes@openmarket.com>.+	# How about differentiating between stratus architectures? -djm+	GUESS=hppa1.1-stratus-sysv4+	;;+    *:*:*:FTX*)+	# From seanf@swdc.stratus.com.+	GUESS=i860-stratus-sysv4+	;;+    i*86:VOS:*:*)+	# From Paul.Green@stratus.com.+	GUESS=$UNAME_MACHINE-stratus-vos+	;;+    *:VOS:*:*)+	# From Paul.Green@stratus.com.+	GUESS=hppa1.1-stratus-vos+	;;+    mc68*:A/UX:*:*)+	GUESS=m68k-apple-aux$UNAME_RELEASE+	;;+    news*:NEWS-OS:6*:*)+	GUESS=mips-sony-newsos6+	;;+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)+	if test -d /usr/nec; then+		GUESS=mips-nec-sysv$UNAME_RELEASE+	else+		GUESS=mips-unknown-sysv$UNAME_RELEASE+	fi+	;;+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.+	GUESS=powerpc-be-beos+	;;+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.+	GUESS=powerpc-apple-beos+	;;+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.+	GUESS=i586-pc-beos+	;;+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.+	GUESS=i586-pc-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+	;;+    SX-5:SUPER-UX:*:*)+	GUESS=sx5-nec-superux$UNAME_RELEASE+	;;+    SX-6:SUPER-UX:*:*)+	GUESS=sx6-nec-superux$UNAME_RELEASE+	;;+    SX-7:SUPER-UX:*:*)+	GUESS=sx7-nec-superux$UNAME_RELEASE+	;;+    SX-8:SUPER-UX:*:*)+	GUESS=sx8-nec-superux$UNAME_RELEASE+	;;+    SX-8R:SUPER-UX:*:*)+	GUESS=sx8r-nec-superux$UNAME_RELEASE+	;;+    SX-ACE:SUPER-UX:*:*)+	GUESS=sxace-nec-superux$UNAME_RELEASE+	;;+    Power*:Rhapsody:*:*)+	GUESS=powerpc-apple-rhapsody$UNAME_RELEASE+	;;+    *:Rhapsody:*:*)+	GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE+	;;+    arm64:Darwin:*:*)+	GUESS=aarch64-apple-darwin$UNAME_RELEASE+	;;+    *:Darwin:*:*)+	UNAME_PROCESSOR=`uname -p`+	case $UNAME_PROCESSOR in+	    unknown) UNAME_PROCESSOR=powerpc ;;+	esac+	if command -v xcode-select > /dev/null 2> /dev/null && \+		! xcode-select --print-path > /dev/null 2> /dev/null ; then+	    # Avoid executing cc if there is no toolchain installed as+	    # cc will be a stub that puts up a graphical alert+	    # prompting the user to install developer tools.+	    CC_FOR_BUILD=no_compiler_found+	else+	    set_cc_for_build+	fi+	if test "$CC_FOR_BUILD" != no_compiler_found; then+	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \+		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \+		   grep IS_64BIT_ARCH >/dev/null+	    then+		case $UNAME_PROCESSOR in+		    i386) UNAME_PROCESSOR=x86_64 ;;+		    powerpc) UNAME_PROCESSOR=powerpc64 ;;+		esac+	    fi+	    # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc+	    if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \+		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \+		   grep IS_PPC >/dev/null+	    then+		UNAME_PROCESSOR=powerpc+	    fi+	elif test "$UNAME_PROCESSOR" = i386 ; then+	    # uname -m returns i386 or x86_64+	    UNAME_PROCESSOR=$UNAME_MACHINE+	fi+	GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE+	;;+    *:procnto*:*:* | *:QNX:[0123456789]*:*)+	UNAME_PROCESSOR=`uname -p`+	if test "$UNAME_PROCESSOR" = x86; then+		UNAME_PROCESSOR=i386+		UNAME_MACHINE=pc+	fi+	GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE+	;;+    *:QNX:*:4*)+	GUESS=i386-pc-qnx+	;;+    NEO-*:NONSTOP_KERNEL:*:*)+	GUESS=neo-tandem-nsk$UNAME_RELEASE+	;;+    NSE-*:NONSTOP_KERNEL:*:*)+	GUESS=nse-tandem-nsk$UNAME_RELEASE+	;;+    NSR-*:NONSTOP_KERNEL:*:*)+	GUESS=nsr-tandem-nsk$UNAME_RELEASE+	;;+    NSV-*:NONSTOP_KERNEL:*:*)+	GUESS=nsv-tandem-nsk$UNAME_RELEASE+	;;+    NSX-*:NONSTOP_KERNEL:*:*)+	GUESS=nsx-tandem-nsk$UNAME_RELEASE+	;;+    *:NonStop-UX:*:*)+	GUESS=mips-compaq-nonstopux+	;;+    BS2000:POSIX*:*:*)+	GUESS=bs2000-siemens-sysv+	;;+    DS/*:UNIX_System_V:*:*)+	GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE+	;;+    *:Plan9:*:*)+	# "uname -m" is not consistent, so use $cputype instead. 386+	# is converted to i386 for consistency with other x86+	# operating systems.+	if test "${cputype-}" = 386; then+	    UNAME_MACHINE=i386+	elif test "x${cputype-}" != x; then+	    UNAME_MACHINE=$cputype+	fi+	GUESS=$UNAME_MACHINE-unknown-plan9+	;;+    *:TOPS-10:*:*)+	GUESS=pdp10-unknown-tops10+	;;+    *:TENEX:*:*)+	GUESS=pdp10-unknown-tenex+	;;+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)+	GUESS=pdp10-dec-tops20+	;;+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)+	GUESS=pdp10-xkl-tops20+	;;+    *:TOPS-20:*:*)+	GUESS=pdp10-unknown-tops20+	;;+    *:ITS:*:*)+	GUESS=pdp10-unknown-its+	;;+    SEI:*:*:SEIUX)+	GUESS=mips-sei-seiux$UNAME_RELEASE+	;;+    *:DragonFly:*:*)+	DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`+	GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL+	;;+    *:*VMS:*:*)+	UNAME_MACHINE=`(uname -p) 2>/dev/null`+	case $UNAME_MACHINE in+	    A*) GUESS=alpha-dec-vms ;;+	    I*) GUESS=ia64-dec-vms ;;+	    V*) GUESS=vax-dec-vms ;;+	esac ;;+    *:XENIX:*:SysV)+	GUESS=i386-pc-xenix+	;;+    i*86:skyos:*:*)+	SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`+	GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL+	;;+    i*86:rdos:*:*)+	GUESS=$UNAME_MACHINE-pc-rdos+	;;+    i*86:Fiwix:*:*)+	GUESS=$UNAME_MACHINE-pc-fiwix+	;;+    *:AROS:*:*)+	GUESS=$UNAME_MACHINE-unknown-aros+	;;+    x86_64:VMkernel:*:*)+	GUESS=$UNAME_MACHINE-unknown-esx+	;;+    amd64:Isilon\ OneFS:*:*)+	GUESS=x86_64-unknown-onefs+	;;+    *:Unleashed:*:*)+	GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE+	;;+    *:Ironclad:*:*)+	GUESS=$UNAME_MACHINE-unknown-ironclad+	;;+esac++# Do we have a guess based on uname results?+if test "x$GUESS" != x; then+    echo "$GUESS"+    exit+fi++# No uname command or uname output not recognized.+set_cc_for_build+cat > "$dummy.c" <<EOF+#ifdef _SEQUENT_+#include <sys/types.h>+#include <sys/utsname.h>+#endif+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)+#include <signal.h>+#if defined(_SIZE_T_) || defined(SIGLOST)+#include <sys/utsname.h>+#endif+#endif+#endif+main ()+{+#if defined (sony)+#if defined (MIPSEB)+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,+     I don't know....  */+  printf ("mips-sony-bsd\n"); exit (0);+#else+#include <sys/param.h>+  printf ("m68k-sony-newsos%s\n",+#ifdef NEWSOS4+  "4"+#else+  ""+#endif+  ); exit (0);+#endif+#endif++#if defined (NeXT)+#if !defined (__ARCHITECTURE__)+#define __ARCHITECTURE__ "m68k"+#endif+  int version;+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;+  if (version < 4)+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);+  else+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);+  exit (0);+#endif++#if defined (MULTIMAX) || defined (n16)+#if defined (UMAXV)+  printf ("ns32k-encore-sysv\n"); exit (0);+#else+#if defined (CMU)+  printf ("ns32k-encore-mach\n"); exit (0);+#else+  printf ("ns32k-encore-bsd\n"); exit (0);+#endif+#endif+#endif++#if defined (__386BSD__)+  printf ("i386-pc-bsd\n"); exit (0);+#endif++#if defined (sequent)+#if defined (i386)+  printf ("i386-sequent-dynix\n"); exit (0);+#endif+#if defined (ns32000)+  printf ("ns32k-sequent-dynix\n"); exit (0);+#endif+#endif++#if defined (_SEQUENT_)+  struct utsname un;++  uname(&un);+  if (strncmp(un.version, "V2", 2) == 0) {+    printf ("i386-sequent-ptx2\n"); exit (0);+  }+  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */+    printf ("i386-sequent-ptx1\n"); exit (0);+  }+  printf ("i386-sequent-ptx\n"); exit (0);+#endif++#if defined (vax)+#if !defined (ultrix)+#include <sys/param.h>+#if defined (BSD)+#if BSD == 43+  printf ("vax-dec-bsd4.3\n"); exit (0);+#else+#if BSD == 199006+  printf ("vax-dec-bsd4.3reno\n"); exit (0);+#else+  printf ("vax-dec-bsd\n"); exit (0);+#endif+#endif+#else+  printf ("vax-dec-bsd\n"); exit (0);+#endif+#else+#if defined(_SIZE_T_) || defined(SIGLOST)+  struct utsname un;+  uname (&un);+  printf ("vax-dec-ultrix%s\n", un.release); exit (0);+#else+  printf ("vax-dec-ultrix\n"); exit (0);+#endif+#endif+#endif+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)+#if defined(_SIZE_T_) || defined(SIGLOST)+  struct utsname *un;+  uname (&un);+  printf ("mips-dec-ultrix%s\n", un.release); exit (0);+#else+  printf ("mips-dec-ultrix\n"); exit (0);+#endif+#endif+#endif++#if defined (alliant) && defined (i860)+  printf ("i860-alliant-bsd\n"); exit (0);+#endif++  exit (1);+}+EOF++$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&+	{ echo "$SYSTEM_NAME"; exit; }++# Apollos put the system type in the environment.+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }++echo "$0: unable to guess system type" >&2++case $UNAME_MACHINE:$UNAME_SYSTEM in+    mips:Linux | mips64:Linux)+	# If we got here on MIPS GNU/Linux, output extra information.+	cat >&2 <<EOF++NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize+the system type. Please install a C compiler and try again.+EOF+	;;+esac++cat >&2 <<EOF++This script (version $timestamp), has failed to recognize the+operating system you are using. If your script is old, overwrite *all*+copies of config.guess and config.sub with the latest versions from:++  https://git.savannah.gnu.org/cgit/config.git/plain/config.guess+and+  https://git.savannah.gnu.org/cgit/config.git/plain/config.sub+EOF++our_year=`echo $timestamp | sed 's,-.*,,'`+thisyear=`date +%Y`+# shellcheck disable=SC2003+script_age=`expr "$thisyear" - "$our_year"`+if test "$script_age" -lt 3 ; then+   cat >&2 <<EOF++If $0 has already been updated, send the following data and any+information you think might be pertinent to config-patches@gnu.org to+provide the necessary information to handle your system.++config.guess timestamp = $timestamp++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`+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`++hostinfo               = `(hostinfo) 2>/dev/null`+/bin/universe          = `(/bin/universe) 2>/dev/null`+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`+/bin/arch              = `(/bin/arch) 2>/dev/null`+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`++UNAME_MACHINE = "$UNAME_MACHINE"+UNAME_RELEASE = "$UNAME_RELEASE"+UNAME_SYSTEM  = "$UNAME_SYSTEM"+UNAME_VERSION = "$UNAME_VERSION"+EOF+fi++exit 1++# Local variables:+# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'"
config.sub view
@@ -1,1835 +1,1970 @@ #! /bin/sh # Configuration validation subroutine script.-#   Copyright 1992-2017 Free Software Foundation, Inc.--timestamp='2017-04-02'--# 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-# (at your option) any later version.-#-# This program is distributed in the hope that it will be useful, but-# WITHOUT ANY WARRANTY; without even the implied warranty of-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU-# General Public License for more details.-#-# You should have received a copy of the GNU General Public License-# along with this program; if not, see <http://www.gnu.org/licenses/>.-#-# As a special exception to the GNU General Public License, if you-# distribute this file as part of a program that contains a-# configuration script generated by Autoconf, you may include it under-# the same distribution terms that you use for the rest of that-# program.  This Exception is an additional permission under section 7-# of the GNU General Public License, version 3 ("GPLv3").---# Please send patches to <config-patches@gnu.org>.-#-# Configuration subroutine to validate and canonicalize a configuration type.-# Supply the specified configuration type as an argument.-# If it is invalid, we print an error message on stderr and exit with code 1.-# Otherwise, we print the canonical config type on stdout and succeed.--# You can get the latest version of this script from:-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub--# This file is supposed to be the same for all GNU packages-# and recognize all the CPU types, system types and aliases-# that are meaningful with *any* GNU software.-# Each package is responsible for reporting which valid configurations-# it does not support.  The user should be able to distinguish-# a failure to support a valid configuration from a meaningless-# configuration.--# The goal of this file is to map all the various variations of a given-# machine specification into a single specification in the form:-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM-# or in some cases, the newer four-part form:-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM-# It is wrong to echo any other type of specification.--me=`echo "$0" | sed -e 's,.*/,,'`--usage="\-Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS--Canonicalize a configuration name.--Operation modes:-  -h, --help         print this help, then exit-  -t, --time-stamp   print date of last modification, then exit-  -v, --version      print version number, then exit--Report bugs and patches to <config-patches@gnu.org>."--version="\-GNU config.sub ($timestamp)--Copyright 1992-2017 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."--# Parse command line-while test $# -gt 0 ; do-  case $1 in-    --time-stamp | --time* | -t )-       echo "$timestamp" ; exit ;;-    --version | -v )-       echo "$version" ; exit ;;-    --help | --h* | -h )-       echo "$usage"; exit ;;-    -- )     # Stop option processing-       shift; break ;;-    - )	# Use stdin as input.-       break ;;-    -* )-       echo "$me: invalid option $1$help"-       exit 1 ;;--    *local*)-       # First pass through any local machine types.-       echo $1-       exit ;;--    * )-       break ;;-  esac-done--case $# in- 0) echo "$me: missing argument$help" >&2-    exit 1;;- 1) ;;- *) echo "$me: too many arguments$help" >&2-    exit 1;;-esac--# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).-# Here we must recognize all the valid KERNEL-OS combinations.-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`-case $maybe_os in-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \-  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \-  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \-  kopensolaris*-gnu* | cloudabi*-eabi* | \-  storm-chaos* | os2-emx* | rtmk-nova*)-    os=-$maybe_os-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-    ;;-  android-linux)-    os=-linux-android-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown-    ;;-  *)-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`-    if [ $basic_machine != $1 ]-    then os=`echo $1 | sed 's/.*-/-/'`-    else os=; fi-    ;;-esac--### Let's recognize common machines as not being operating systems so-### that things like config.sub decstation-3100 work.  We also-### recognize some manufacturers as not being operating systems, so we-### can provide default operating systems below.-case $os in-	-sun*os*)-		# Prevent following clause from handling this invalid input.-		;;-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \-	-apple | -axis | -knuth | -cray | -microblaze*)-		os=-		basic_machine=$1-		;;-	-bluegene*)-		os=-cnk-		;;-	-sim | -cisco | -oki | -wec | -winbond)-		os=-		basic_machine=$1-		;;-	-scout)-		;;-	-wrs)-		os=-vxworks-		basic_machine=$1-		;;-	-chorusos*)-		os=-chorusos-		basic_machine=$1-		;;-	-chorusrdb)-		os=-chorusrdb-		basic_machine=$1-		;;-	-hiux*)-		os=-hiuxwe2-		;;-	-sco6)-		os=-sco5v6-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-sco5)-		os=-sco3.2v5-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-sco4)-		os=-sco3.2v4-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-sco3.2.[4-9]*)-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-sco3.2v[4-9]*)-		# Don't forget version if it is 3.2v4 or newer.-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-sco5v6*)-		# Don't forget version if it is 3.2v4 or newer.-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-sco*)-		os=-sco3.2v2-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-udk*)-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-isc)-		os=-isc2.2-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-clix*)-		basic_machine=clipper-intergraph-		;;-	-isc*)-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`-		;;-	-lynx*178)-		os=-lynxos178-		;;-	-lynx*5)-		os=-lynxos5-		;;-	-lynx*)-		os=-lynxos-		;;-	-ptx*)-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`-		;;-	-windowsnt*)-		os=`echo $os | sed -e 's/windowsnt/winnt/'`-		;;-	-psos*)-		os=-psos-		;;-	-mint | -mint[0-9]*)-		basic_machine=m68k-atari-		os=-mint-		;;-esac--# Decode aliases for certain CPU-COMPANY combinations.-case $basic_machine in-	# Recognize the basic CPU types without company name.-	# Some are omitted here because they have special meanings below.-	1750a | 580 \-	| a29k \-	| aarch64 | aarch64_be \-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \-	| am33_2.0 \-	| arc | arceb \-	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \-	| avr | avr32 \-	| ba \-	| be32 | be64 \-	| bfin \-	| c4x | c8051 | clipper \-	| d10v | d30v | dlx | dsp16xx \-	| e2k | epiphany \-	| fido | fr30 | frv | ft32 \-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \-	| hexagon \-	| i370 | i860 | i960 | ia16 | ia64 \-	| ip2k | iq2000 \-	| k1om \-	| le32 | le64 \-	| lm32 \-	| m32c | m32r | m32rle | m68000 | m68k | m88k \-	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \-	| mips | mipsbe | mipseb | mipsel | mipsle \-	| mips16 \-	| mips64 | mips64el \-	| mips64octeon | mips64octeonel \-	| mips64orion | mips64orionel \-	| mips64r5900 | mips64r5900el \-	| mips64vr | mips64vrel \-	| mips64vr4100 | mips64vr4100el \-	| mips64vr4300 | mips64vr4300el \-	| mips64vr5000 | mips64vr5000el \-	| mips64vr5900 | mips64vr5900el \-	| mipsisa32 | mipsisa32el \-	| mipsisa32r2 | mipsisa32r2el \-	| mipsisa32r6 | mipsisa32r6el \-	| mipsisa64 | mipsisa64el \-	| mipsisa64r2 | mipsisa64r2el \-	| mipsisa64r6 | mipsisa64r6el \-	| mipsisa64sb1 | mipsisa64sb1el \-	| mipsisa64sr71k | mipsisa64sr71kel \-	| mipsr5900 | mipsr5900el \-	| mipstx39 | mipstx39el \-	| mn10200 | mn10300 \-	| moxie \-	| mt \-	| msp430 \-	| nds32 | nds32le | nds32be \-	| nios | nios2 | nios2eb | nios2el \-	| ns16k | ns32k \-	| open8 | or1k | or1knd | or32 \-	| pdp10 | pdp11 | pj | pjl \-	| powerpc | powerpc64 | powerpc64le | powerpcle \-	| pru \-	| pyramid \-	| riscv32 | riscv64 \-	| rl78 | rx \-	| score \-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \-	| sh64 | sh64le \-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \-	| spu \-	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \-	| ubicom32 \-	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \-	| visium \-	| wasm32 \-	| we32k \-	| x86 | xc16x | xstormy16 | xtensa \-	| z8k | z80)-		basic_machine=$basic_machine-unknown-		;;-	c54x)-		basic_machine=tic54x-unknown-		;;-	c55x)-		basic_machine=tic55x-unknown-		;;-	c6x)-		basic_machine=tic6x-unknown-		;;-	leon|leon[3-9])-		basic_machine=sparc-$basic_machine-		;;-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)-		basic_machine=$basic_machine-unknown-		os=-none-		;;-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)-		;;-	ms1)-		basic_machine=mt-unknown-		;;--	strongarm | thumb | xscale)-		basic_machine=arm-unknown-		;;-	xgate)-		basic_machine=$basic_machine-unknown-		os=-none-		;;-	xscaleeb)-		basic_machine=armeb-unknown-		;;--	xscaleel)-		basic_machine=armel-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)-	  basic_machine=$basic_machine-pc-	  ;;-	# Object if more than one company name word.-	*-*-*)-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2-		exit 1-		;;-	# Recognize the basic CPU types with company name.-	580-* \-	| a29k-* \-	| aarch64-* | aarch64_be-* \-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \-	| avr-* | avr32-* \-	| ba-* \-	| be32-* | be64-* \-	| bfin-* | bs2000-* \-	| c[123]* | c30-* | [cjt]90-* | c4x-* \-	| c8051-* | clipper-* | craynv-* | cydra-* \-	| d10v-* | d30v-* | dlx-* \-	| e2k-* | elxsi-* \-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \-	| h8300-* | h8500-* \-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \-	| hexagon-* \-	| i*86-* | i860-* | i960-* | ia16-* | ia64-* \-	| ip2k-* | iq2000-* \-	| k1om-* \-	| le32-* | le64-* \-	| lm32-* \-	| m32c-* | m32r-* | m32rle-* \-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \-	| microblaze-* | microblazeel-* \-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \-	| mips16-* \-	| mips64-* | mips64el-* \-	| mips64octeon-* | mips64octeonel-* \-	| mips64orion-* | mips64orionel-* \-	| mips64r5900-* | mips64r5900el-* \-	| mips64vr-* | mips64vrel-* \-	| mips64vr4100-* | mips64vr4100el-* \-	| mips64vr4300-* | mips64vr4300el-* \-	| mips64vr5000-* | mips64vr5000el-* \-	| mips64vr5900-* | mips64vr5900el-* \-	| mipsisa32-* | mipsisa32el-* \-	| mipsisa32r2-* | mipsisa32r2el-* \-	| mipsisa32r6-* | mipsisa32r6el-* \-	| mipsisa64-* | mipsisa64el-* \-	| mipsisa64r2-* | mipsisa64r2el-* \-	| mipsisa64r6-* | mipsisa64r6el-* \-	| mipsisa64sb1-* | mipsisa64sb1el-* \-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \-	| mipsr5900-* | mipsr5900el-* \-	| mipstx39-* | mipstx39el-* \-	| mmix-* \-	| mt-* \-	| msp430-* \-	| nds32-* | nds32le-* | nds32be-* \-	| nios-* | nios2-* | nios2eb-* | nios2el-* \-	| none-* | np1-* | ns16k-* | ns32k-* \-	| open8-* \-	| or1k*-* \-	| orion-* \-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \-	| pru-* \-	| pyramid-* \-	| riscv32-* | riscv64-* \-	| rl78-* | romp-* | rs6000-* | rx-* \-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \-	| sparclite-* \-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \-	| tahoe-* \-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \-	| tile*-* \-	| tron-* \-	| ubicom32-* \-	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \-	| vax-* \-	| visium-* \-	| wasm32-* \-	| we32k-* \-	| x86-* | x86_64-* | xc16x-* | xps100-* \-	| xstormy16-* | xtensa*-* \-	| ymp-* \-	| z8k-* | z80-*)-		;;-	# Recognize the basic CPU types without company name, with glob match.-	xtensa*)-		basic_machine=$basic_machine-unknown-		;;-	# Recognize the various machine names and aliases which stand-	# for a CPU type and a company and sometimes even an OS.-	386bsd)-		basic_machine=i386-unknown-		os=-bsd-		;;-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)-		basic_machine=m68000-att-		;;-	3b*)-		basic_machine=we32k-att-		;;-	a29khif)-		basic_machine=a29k-amd-		os=-udi-		;;-	abacus)-		basic_machine=abacus-unknown-		;;-	adobe68k)-		basic_machine=m68010-adobe-		os=-scout-		;;-	alliant | fx80)-		basic_machine=fx80-alliant-		;;-	altos | altos3068)-		basic_machine=m68k-altos-		;;-	am29k)-		basic_machine=a29k-none-		os=-bsd-		;;-	amd64)-		basic_machine=x86_64-pc-		;;-	amd64-*)-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	amdahl)-		basic_machine=580-amdahl-		os=-sysv-		;;-	amiga | amiga-*)-		basic_machine=m68k-unknown-		;;-	amigaos | amigados)-		basic_machine=m68k-unknown-		os=-amigaos-		;;-	amigaunix | amix)-		basic_machine=m68k-unknown-		os=-sysv4-		;;-	apollo68)-		basic_machine=m68k-apollo-		os=-sysv-		;;-	apollo68bsd)-		basic_machine=m68k-apollo-		os=-bsd-		;;-	aros)-		basic_machine=i386-pc-		os=-aros-		;;-	asmjs)-		basic_machine=asmjs-unknown-		;;-	aux)-		basic_machine=m68k-apple-		os=-aux-		;;-	balance)-		basic_machine=ns32k-sequent-		os=-dynix-		;;-	blackfin)-		basic_machine=bfin-unknown-		os=-linux-		;;-	blackfin-*)-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`-		os=-linux-		;;-	bluegene*)-		basic_machine=powerpc-ibm-		os=-cnk-		;;-	c54x-*)-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	c55x-*)-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	c6x-*)-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	c90)-		basic_machine=c90-cray-		os=-unicos-		;;-	cegcc)-		basic_machine=arm-unknown-		os=-cegcc-		;;-	convex-c1)-		basic_machine=c1-convex-		os=-bsd-		;;-	convex-c2)-		basic_machine=c2-convex-		os=-bsd-		;;-	convex-c32)-		basic_machine=c32-convex-		os=-bsd-		;;-	convex-c34)-		basic_machine=c34-convex-		os=-bsd-		;;-	convex-c38)-		basic_machine=c38-convex-		os=-bsd-		;;-	cray | j90)-		basic_machine=j90-cray-		os=-unicos-		;;-	craynv)-		basic_machine=craynv-cray-		os=-unicosmp-		;;-	cr16 | cr16-*)-		basic_machine=cr16-unknown-		os=-elf-		;;-	crds | unos)-		basic_machine=m68k-crds-		;;-	crisv32 | crisv32-* | etraxfs*)-		basic_machine=crisv32-axis-		;;-	cris | cris-* | etrax*)-		basic_machine=cris-axis-		;;-	crx)-		basic_machine=crx-unknown-		os=-elf-		;;-	da30 | da30-*)-		basic_machine=m68k-da30-		;;-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)-		basic_machine=mips-dec-		;;-	decsystem10* | dec10*)-		basic_machine=pdp10-dec-		os=-tops10-		;;-	decsystem20* | dec20*)-		basic_machine=pdp10-dec-		os=-tops20-		;;-	delta | 3300 | motorola-3300 | motorola-delta \-	      | 3300-motorola | delta-motorola)-		basic_machine=m68k-motorola-		;;-	delta88)-		basic_machine=m88k-motorola-		os=-sysv3-		;;-	dicos)-		basic_machine=i686-pc-		os=-dicos-		;;-	djgpp)-		basic_machine=i586-pc-		os=-msdosdjgpp-		;;-	dpx20 | dpx20-*)-		basic_machine=rs6000-bull-		os=-bosx-		;;-	dpx2* | dpx2*-bull)-		basic_machine=m68k-bull-		os=-sysv3-		;;-	e500v[12])-		basic_machine=powerpc-unknown-		os=$os"spe"-		;;-	e500v[12]-*)-		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`-		os=$os"spe"-		;;-	ebmon29k)-		basic_machine=a29k-amd-		os=-ebmon-		;;-	elxsi)-		basic_machine=elxsi-elxsi-		os=-bsd-		;;-	encore | umax | mmax)-		basic_machine=ns32k-encore-		;;-	es1800 | OSE68k | ose68k | ose | OSE)-		basic_machine=m68k-ericsson-		os=-ose-		;;-	fx2800)-		basic_machine=i860-alliant-		;;-	genix)-		basic_machine=ns32k-ns-		;;-	gmicro)-		basic_machine=tron-gmicro-		os=-sysv-		;;-	go32)-		basic_machine=i386-pc-		os=-go32-		;;-	h3050r* | hiux*)-		basic_machine=hppa1.1-hitachi-		os=-hiuxwe2-		;;-	h8300hms)-		basic_machine=h8300-hitachi-		os=-hms-		;;-	h8300xray)-		basic_machine=h8300-hitachi-		os=-xray-		;;-	h8500hms)-		basic_machine=h8500-hitachi-		os=-hms-		;;-	harris)-		basic_machine=m88k-harris-		os=-sysv3-		;;-	hp300-*)-		basic_machine=m68k-hp-		;;-	hp300bsd)-		basic_machine=m68k-hp-		os=-bsd-		;;-	hp300hpux)-		basic_machine=m68k-hp-		os=-hpux-		;;-	hp3k9[0-9][0-9] | hp9[0-9][0-9])-		basic_machine=hppa1.0-hp-		;;-	hp9k2[0-9][0-9] | hp9k31[0-9])-		basic_machine=m68000-hp-		;;-	hp9k3[2-9][0-9])-		basic_machine=m68k-hp-		;;-	hp9k6[0-9][0-9] | hp6[0-9][0-9])-		basic_machine=hppa1.0-hp-		;;-	hp9k7[0-79][0-9] | hp7[0-79][0-9])-		basic_machine=hppa1.1-hp-		;;-	hp9k78[0-9] | hp78[0-9])-		# FIXME: really hppa2.0-hp-		basic_machine=hppa1.1-hp-		;;-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)-		# FIXME: really hppa2.0-hp-		basic_machine=hppa1.1-hp-		;;-	hp9k8[0-9][13679] | hp8[0-9][13679])-		basic_machine=hppa1.1-hp-		;;-	hp9k8[0-9][0-9] | hp8[0-9][0-9])-		basic_machine=hppa1.0-hp-		;;-	hppa-next)-		os=-nextstep3-		;;-	hppaosf)-		basic_machine=hppa1.1-hp-		os=-osf-		;;-	hppro)-		basic_machine=hppa1.1-hp-		os=-proelf-		;;-	i370-ibm* | ibm*)-		basic_machine=i370-ibm-		;;-	i*86v32)-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`-		os=-sysv32-		;;-	i*86v4*)-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`-		os=-sysv4-		;;-	i*86v)-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`-		os=-sysv-		;;-	i*86sol2)-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`-		os=-solaris2-		;;-	i386mach)-		basic_machine=i386-mach-		os=-mach-		;;-	i386-vsta | vsta)-		basic_machine=i386-unknown-		os=-vsta-		;;-	iris | iris4d)-		basic_machine=mips-sgi-		case $os in-		    -irix*)-			;;-		    *)-			os=-irix4-			;;-		esac-		;;-	isi68 | isi)-		basic_machine=m68k-isi-		os=-sysv-		;;-	leon-*|leon[3-9]-*)-		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`-		;;-	m68knommu)-		basic_machine=m68k-unknown-		os=-linux-		;;-	m68knommu-*)-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`-		os=-linux-		;;-	m88k-omron*)-		basic_machine=m88k-omron-		;;-	magnum | m3230)-		basic_machine=mips-mips-		os=-sysv-		;;-	merlin)-		basic_machine=ns32k-utek-		os=-sysv-		;;-	microblaze*)-		basic_machine=microblaze-xilinx-		;;-	mingw64)-		basic_machine=x86_64-pc-		os=-mingw64-		;;-	mingw32)-		basic_machine=i686-pc-		os=-mingw32-		;;-	mingw32ce)-		basic_machine=arm-unknown-		os=-mingw32ce-		;;-	miniframe)-		basic_machine=m68000-convergent-		;;-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)-		basic_machine=m68k-atari-		os=-mint-		;;-	mips3*-*)-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-		;;-	mips3*)-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown-		;;-	monitor)-		basic_machine=m68k-rom68k-		os=-coff-		;;-	morphos)-		basic_machine=powerpc-unknown-		os=-morphos-		;;-	moxiebox)-		basic_machine=moxie-unknown-		os=-moxiebox-		;;-	msdos)-		basic_machine=i386-pc-		os=-msdos-		;;-	ms1-*)-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`-		;;-	msys)-		basic_machine=i686-pc-		os=-msys-		;;-	mvs)-		basic_machine=i370-ibm-		os=-mvs-		;;-	nacl)-		basic_machine=le32-unknown-		os=-nacl-		;;-	ncr3000)-		basic_machine=i486-ncr-		os=-sysv4-		;;-	netbsd386)-		basic_machine=i386-unknown-		os=-netbsd-		;;-	netwinder)-		basic_machine=armv4l-rebel-		os=-linux-		;;-	news | news700 | news800 | news900)-		basic_machine=m68k-sony-		os=-newsos-		;;-	news1000)-		basic_machine=m68030-sony-		os=-newsos-		;;-	news-3600 | risc-news)-		basic_machine=mips-sony-		os=-newsos-		;;-	necv70)-		basic_machine=v70-nec-		os=-sysv-		;;-	next | m*-next )-		basic_machine=m68k-next-		case $os in-		    -nextstep* )-			;;-		    -ns2*)-		      os=-nextstep2-			;;-		    *)-		      os=-nextstep3-			;;-		esac-		;;-	nh3000)-		basic_machine=m68k-harris-		os=-cxux-		;;-	nh[45]000)-		basic_machine=m88k-harris-		os=-cxux-		;;-	nindy960)-		basic_machine=i960-intel-		os=-nindy-		;;-	mon960)-		basic_machine=i960-intel-		os=-mon960-		;;-	nonstopux)-		basic_machine=mips-compaq-		os=-nonstopux-		;;-	np1)-		basic_machine=np1-gould-		;;-	neo-tandem)-		basic_machine=neo-tandem-		;;-	nse-tandem)-		basic_machine=nse-tandem-		;;-	nsr-tandem)-		basic_machine=nsr-tandem-		;;-	nsx-tandem)-		basic_machine=nsx-tandem-		;;-	op50n-* | op60c-*)-		basic_machine=hppa1.1-oki-		os=-proelf-		;;-	openrisc | openrisc-*)-		basic_machine=or32-unknown-		;;-	os400)-		basic_machine=powerpc-ibm-		os=-os400-		;;-	OSE68000 | ose68000)-		basic_machine=m68000-ericsson-		os=-ose-		;;-	os68k)-		basic_machine=m68k-none-		os=-os68k-		;;-	pa-hitachi)-		basic_machine=hppa1.1-hitachi-		os=-hiuxwe2-		;;-	paragon)-		basic_machine=i860-intel-		os=-osf-		;;-	parisc)-		basic_machine=hppa-unknown-		os=-linux-		;;-	parisc-*)-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`-		os=-linux-		;;-	pbd)-		basic_machine=sparc-tti-		;;-	pbb)-		basic_machine=m68k-tti-		;;-	pc532 | pc532-*)-		basic_machine=ns32k-pc532-		;;-	pc98)-		basic_machine=i386-pc-		;;-	pc98-*)-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	pentium | p5 | k5 | k6 | nexgen | viac3)-		basic_machine=i586-pc-		;;-	pentiumpro | p6 | 6x86 | athlon | athlon_*)-		basic_machine=i686-pc-		;;-	pentiumii | pentium2 | pentiumiii | pentium3)-		basic_machine=i686-pc-		;;-	pentium4)-		basic_machine=i786-pc-		;;-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	pentiumpro-* | p6-* | 6x86-* | athlon-*)-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	pentium4-*)-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	pn)-		basic_machine=pn-gould-		;;-	power)	basic_machine=power-ibm-		;;-	ppc | ppcbe)	basic_machine=powerpc-unknown-		;;-	ppc-* | ppcbe-*)-		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	ppcle | powerpclittle)-		basic_machine=powerpcle-unknown-		;;-	ppcle-* | powerpclittle-*)-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	ppc64)	basic_machine=powerpc64-unknown-		;;-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	ppc64le | powerpc64little)-		basic_machine=powerpc64le-unknown-		;;-	ppc64le-* | powerpc64little-*)-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	ps2)-		basic_machine=i386-ibm-		;;-	pw32)-		basic_machine=i586-unknown-		os=-pw32-		;;-	rdos | rdos64)-		basic_machine=x86_64-pc-		os=-rdos-		;;-	rdos32)-		basic_machine=i386-pc-		os=-rdos-		;;-	rom68k)-		basic_machine=m68k-rom68k-		os=-coff-		;;-	rm[46]00)-		basic_machine=mips-siemens-		;;-	rtpc | rtpc-*)-		basic_machine=romp-ibm-		;;-	s390 | s390-*)-		basic_machine=s390-ibm-		;;-	s390x | s390x-*)-		basic_machine=s390x-ibm-		;;-	sa29200)-		basic_machine=a29k-amd-		os=-udi-		;;-	sb1)-		basic_machine=mipsisa64sb1-unknown-		;;-	sb1el)-		basic_machine=mipsisa64sb1el-unknown-		;;-	sde)-		basic_machine=mipsisa32-sde-		os=-elf-		;;-	sei)-		basic_machine=mips-sei-		os=-seiux-		;;-	sequent)-		basic_machine=i386-sequent-		;;-	sh)-		basic_machine=sh-hitachi-		os=-hms-		;;-	sh5el)-		basic_machine=sh5le-unknown-		;;-	sh64)-		basic_machine=sh64-unknown-		;;-	sparclite-wrs | simso-wrs)-		basic_machine=sparclite-wrs-		os=-vxworks-		;;-	sps7)-		basic_machine=m68k-bull-		os=-sysv2-		;;-	spur)-		basic_machine=spur-unknown-		;;-	st2000)-		basic_machine=m68k-tandem-		;;-	stratus)-		basic_machine=i860-stratus-		os=-sysv4-		;;-	strongarm-* | thumb-*)-		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	sun2)-		basic_machine=m68000-sun-		;;-	sun2os3)-		basic_machine=m68000-sun-		os=-sunos3-		;;-	sun2os4)-		basic_machine=m68000-sun-		os=-sunos4-		;;-	sun3os3)-		basic_machine=m68k-sun-		os=-sunos3-		;;-	sun3os4)-		basic_machine=m68k-sun-		os=-sunos4-		;;-	sun4os3)-		basic_machine=sparc-sun-		os=-sunos3-		;;-	sun4os4)-		basic_machine=sparc-sun-		os=-sunos4-		;;-	sun4sol2)-		basic_machine=sparc-sun-		os=-solaris2-		;;-	sun3 | sun3-*)-		basic_machine=m68k-sun-		;;-	sun4)-		basic_machine=sparc-sun-		;;-	sun386 | sun386i | roadrunner)-		basic_machine=i386-sun-		;;-	sv1)-		basic_machine=sv1-cray-		os=-unicos-		;;-	symmetry)-		basic_machine=i386-sequent-		os=-dynix-		;;-	t3e)-		basic_machine=alphaev5-cray-		os=-unicos-		;;-	t90)-		basic_machine=t90-cray-		os=-unicos-		;;-	tile*)-		basic_machine=$basic_machine-unknown-		os=-linux-gnu-		;;-	tx39)-		basic_machine=mipstx39-unknown-		;;-	tx39el)-		basic_machine=mipstx39el-unknown-		;;-	toad1)-		basic_machine=pdp10-xkl-		os=-tops20-		;;-	tower | tower-32)-		basic_machine=m68k-ncr-		;;-	tpf)-		basic_machine=s390x-ibm-		os=-tpf-		;;-	udi29k)-		basic_machine=a29k-amd-		os=-udi-		;;-	ultra3)-		basic_machine=a29k-nyu-		os=-sym1-		;;-	v810 | necv810)-		basic_machine=v810-nec-		os=-none-		;;-	vaxv)-		basic_machine=vax-dec-		os=-sysv-		;;-	vms)-		basic_machine=vax-dec-		os=-vms-		;;-	vpp*|vx|vx-*)-		basic_machine=f301-fujitsu-		;;-	vxworks960)-		basic_machine=i960-wrs-		os=-vxworks-		;;-	vxworks68)-		basic_machine=m68k-wrs-		os=-vxworks-		;;-	vxworks29k)-		basic_machine=a29k-wrs-		os=-vxworks-		;;-	wasm32)-		basic_machine=wasm32-unknown-		;;-	w65*)-		basic_machine=w65-wdc-		os=-none-		;;-	w89k-*)-		basic_machine=hppa1.1-winbond-		os=-proelf-		;;-	xbox)-		basic_machine=i686-pc-		os=-mingw32-		;;-	xps | xps100)-		basic_machine=xps100-honeywell-		;;-	xscale-* | xscalee[bl]-*)-		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`-		;;-	ymp)-		basic_machine=ymp-cray-		os=-unicos-		;;-	z8k-*-coff)-		basic_machine=z8k-unknown-		os=-sim-		;;-	z80-*-coff)-		basic_machine=z80-unknown-		os=-sim-		;;-	none)-		basic_machine=none-none-		os=-none-		;;--# Here we handle the default manufacturer of certain CPU types.  It is in-# some cases the only manufacturer, in others, it is the most popular.-	w89k)-		basic_machine=hppa1.1-winbond-		;;-	op50n)-		basic_machine=hppa1.1-oki-		;;-	op60c)-		basic_machine=hppa1.1-oki-		;;-	romp)-		basic_machine=romp-ibm-		;;-	mmix)-		basic_machine=mmix-knuth-		;;-	rs6000)-		basic_machine=rs6000-ibm-		;;-	vax)-		basic_machine=vax-dec-		;;-	pdp10)-		# there are many clones, so DEC is not a safe bet-		basic_machine=pdp10-unknown-		;;-	pdp11)-		basic_machine=pdp11-dec-		;;-	we32k)-		basic_machine=we32k-att-		;;-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)-		basic_machine=sh-unknown-		;;-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)-		basic_machine=sparc-sun-		;;-	cydra)-		basic_machine=cydra-cydrome-		;;-	orion)-		basic_machine=orion-highlevel-		;;-	orion105)-		basic_machine=clipper-highlevel-		;;-	mac | mpw | mac-mpw)-		basic_machine=m68k-apple-		;;-	pmac | pmac-mpw)-		basic_machine=powerpc-apple-		;;-	*-unknown)-		# Make sure to match an already-canonicalized machine name.-		;;-	*)-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2-		exit 1-		;;-esac--# Here we canonicalize certain aliases for manufacturers.-case $basic_machine in-	*-digital*)-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`-		;;-	*-commodore*)-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`-		;;-	*)-		;;-esac--# Decode manufacturer-specific aliases for certain operating systems.--if [ x"$os" != x"" ]-then-case $os in-	# First match some system type aliases-	# that might get confused with valid system types.-	# -solaris* is a basic system type, with this one exception.-	-auroraux)-		os=-auroraux-		;;-	-solaris1 | -solaris1.*)-		os=`echo $os | sed -e 's|solaris1|sunos4|'`-		;;-	-solaris)-		os=-solaris2-		;;-	-svr4*)-		os=-sysv4-		;;-	-unixware*)-		os=-sysv4.2uw-		;;-	-gnu/linux*)-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`-		;;-	# First accept the basic system types.-	# The portable systems comes first.-	# Each alternative MUST END IN A *, to match a version number.-	# -sysv* is not here because it comes later, after sysvr4.-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \-	      | -sym* | -kopensolaris* | -plan9* \-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \-	      | -aos* | -aros* | -cloudabi* | -sortix* \-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \-	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \-	      | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \-	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \-	      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \-	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \-	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \-	      | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*)-	# Remember, each alternative MUST END IN *, to match a version number.-		;;-	-qnx*)-		case $basic_machine in-		    x86-* | i*86-*)-			;;-		    *)-			os=-nto$os-			;;-		esac-		;;-	-nto-qnx*)-		;;-	-nto*)-		os=`echo $os | sed -e 's|nto|nto-qnx|'`-		;;-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)-		;;-	-mac*)-		os=`echo $os | sed -e 's|mac|macos|'`-		;;-	-linux-dietlibc)-		os=-linux-dietlibc-		;;-	-linux*)-		os=`echo $os | sed -e 's|linux|linux-gnu|'`-		;;-	-sunos5*)-		os=`echo $os | sed -e 's|sunos5|solaris2|'`-		;;-	-sunos6*)-		os=`echo $os | sed -e 's|sunos6|solaris3|'`-		;;-	-opened*)-		os=-openedition-		;;-	-os400*)-		os=-os400-		;;-	-wince*)-		os=-wince-		;;-	-osfrose*)-		os=-osfrose-		;;-	-osf*)-		os=-osf-		;;-	-utek*)-		os=-bsd-		;;-	-dynix*)-		os=-bsd-		;;-	-acis*)-		os=-aos-		;;-	-atheos*)-		os=-atheos-		;;-	-syllable*)-		os=-syllable-		;;-	-386bsd)-		os=-bsd-		;;-	-ctix* | -uts*)-		os=-sysv-		;;-	-nova*)-		os=-rtmk-nova-		;;-	-ns2 )-		os=-nextstep2-		;;-	-nsk*)-		os=-nsk-		;;-	# Preserve the version number of sinix5.-	-sinix5.*)-		os=`echo $os | sed -e 's|sinix|sysv|'`-		;;-	-sinix*)-		os=-sysv4-		;;-	-tpf*)-		os=-tpf-		;;-	-triton*)-		os=-sysv3-		;;-	-oss*)-		os=-sysv3-		;;-	-svr4)-		os=-sysv4-		;;-	-svr3)-		os=-sysv3-		;;-	-sysvr4)-		os=-sysv4-		;;-	# This must come after -sysvr4.-	-sysv*)-		;;-	-ose*)-		os=-ose-		;;-	-es1800*)-		os=-ose-		;;-	-xenix)-		os=-xenix-		;;-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)-		os=-mint-		;;-	-aros*)-		os=-aros-		;;-	-zvmoe)-		os=-zvmoe-		;;-	-dicos*)-		os=-dicos-		;;-	-nacl*)-		;;-	-ios)-		;;-	-none)-		;;-	*)-		# Get rid of the `-' at the beginning of $os.-		os=`echo $os | sed 's/[^-]*-//'`-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2-		exit 1-		;;-esac-else--# Here we handle the default operating systems that come with various machines.-# The value should be what the vendor currently ships out the door with their-# machine or put another way, the most popular os provided with the machine.--# Note that if you're going to try to match "-MANUFACTURER" here (say,-# "-sun"), then you have to tell the case statement up towards the top-# that MANUFACTURER isn't an operating system.  Otherwise, code above-# will signal an error saying that MANUFACTURER isn't an operating-# system, and we'll never get to this point.--case $basic_machine in-	score-*)-		os=-elf-		;;-	spu-*)-		os=-elf-		;;-	*-acorn)-		os=-riscix1.2-		;;-	arm*-rebel)-		os=-linux-		;;-	arm*-semi)-		os=-aout-		;;-	c4x-* | tic4x-*)-		os=-coff-		;;-	c8051-*)-		os=-elf-		;;-	hexagon-*)-		os=-elf-		;;-	tic54x-*)-		os=-coff-		;;-	tic55x-*)-		os=-coff-		;;-	tic6x-*)-		os=-coff-		;;-	# This must come before the *-dec entry.-	pdp10-*)-		os=-tops20-		;;-	pdp11-*)-		os=-none-		;;-	*-dec | vax-*)-		os=-ultrix4.2-		;;-	m68*-apollo)-		os=-domain-		;;-	i386-sun)-		os=-sunos4.0.2-		;;-	m68000-sun)-		os=-sunos3-		;;-	m68*-cisco)-		os=-aout-		;;-	mep-*)-		os=-elf-		;;-	mips*-cisco)-		os=-elf-		;;-	mips*-*)-		os=-elf-		;;-	or32-*)-		os=-coff-		;;-	*-tti)	# must be before sparc entry or we get the wrong os.-		os=-sysv3-		;;-	sparc-* | *-sun)-		os=-sunos4.1.1-		;;-	pru-*)-		os=-elf-		;;-	*-be)-		os=-beos-		;;-	*-haiku)-		os=-haiku-		;;-	*-ibm)-		os=-aix-		;;-	*-knuth)-		os=-mmixware-		;;-	*-wec)-		os=-proelf-		;;-	*-winbond)-		os=-proelf-		;;-	*-oki)-		os=-proelf-		;;-	*-hp)-		os=-hpux-		;;-	*-hitachi)-		os=-hiux-		;;-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)-		os=-sysv-		;;-	*-cbm)-		os=-amigaos-		;;-	*-dg)-		os=-dgux-		;;-	*-dolphin)-		os=-sysv3-		;;-	m68k-ccur)-		os=-rtu-		;;-	m88k-omron*)-		os=-luna-		;;-	*-next )-		os=-nextstep-		;;-	*-sequent)-		os=-ptx-		;;-	*-crds)-		os=-unos-		;;-	*-ns)-		os=-genix-		;;-	i370-*)-		os=-mvs-		;;-	*-next)-		os=-nextstep3-		;;-	*-gould)-		os=-sysv-		;;-	*-highlevel)-		os=-bsd-		;;-	*-encore)-		os=-bsd-		;;-	*-sgi)-		os=-irix-		;;-	*-siemens)-		os=-sysv4-		;;-	*-masscomp)-		os=-rtu-		;;-	f30[01]-fujitsu | f700-fujitsu)-		os=-uxpv-		;;-	*-rom68k)-		os=-coff-		;;-	*-*bug)-		os=-coff-		;;-	*-apple)-		os=-macos-		;;-	*-atari*)-		os=-mint-		;;-	*)-		os=-none-		;;-esac-fi--# Here we handle the case where we know the os, and the CPU type, but not the-# manufacturer.  We pick the logical manufacturer.-vendor=unknown-case $basic_machine in-	*-unknown)-		case $os in-			-riscix*)-				vendor=acorn-				;;-			-sunos*)-				vendor=sun-				;;-			-cnk*|-aix*)-				vendor=ibm-				;;-			-beos*)-				vendor=be-				;;-			-hpux*)-				vendor=hp-				;;-			-mpeix*)-				vendor=hp-				;;-			-hiux*)-				vendor=hitachi-				;;-			-unos*)-				vendor=crds-				;;-			-dgux*)-				vendor=dg-				;;-			-luna*)-				vendor=omron-				;;-			-genix*)-				vendor=ns-				;;-			-mvs* | -opened*)-				vendor=ibm-				;;-			-os400*)-				vendor=ibm-				;;-			-ptx*)-				vendor=sequent-				;;-			-tpf*)-				vendor=ibm-				;;-			-vxsim* | -vxworks* | -windiss*)-				vendor=wrs-				;;-			-aux*)-				vendor=apple-				;;-			-hms*)-				vendor=hitachi-				;;-			-mpw* | -macos*)-				vendor=apple-				;;-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)-				vendor=atari-				;;-			-vos*)-				vendor=stratus-				;;-		esac-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`-		;;-esac--echo $basic_machine$os-exit--# Local variables:-# eval: (add-hook 'write-file-hooks 'time-stamp)+#   Copyright 1992-2024 Free Software Foundation, Inc.++# shellcheck disable=SC2006,SC2268 # see below for rationale++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+# (at your option) any later version.+#+# This program is distributed in the hope that it will be useful, but+# WITHOUT ANY WARRANTY; without even the implied warranty of+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU+# General Public License for more details.+#+# You should have received a copy of the GNU General Public License+# along with this program; if not, see <https://www.gnu.org/licenses/>.+#+# As a special exception to the GNU General Public License, if you+# distribute this file as part of a program that contains a+# configuration script generated by Autoconf, you may include it under+# the same distribution terms that you use for the rest of that+# program.  This Exception is an additional permission under section 7+# of the GNU General Public License, version 3 ("GPLv3").+++# Please send patches to <config-patches@gnu.org>.+#+# Configuration subroutine to validate and canonicalize a configuration type.+# Supply the specified configuration type as an argument.+# If it is invalid, we print an error message on stderr and exit with code 1.+# Otherwise, we print the canonical config type on stdout and succeed.++# You can get the latest version of this script from:+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub++# This file is supposed to be the same for all GNU packages+# and recognize all the CPU types, system types and aliases+# that are meaningful with *any* GNU software.+# Each package is responsible for reporting which valid configurations+# it does not support.  The user should be able to distinguish+# a failure to support a valid configuration from a meaningless+# configuration.++# The goal of this file is to map all the various variations of a given+# machine specification into a single specification in the form:+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM+# or in some cases, the newer four-part form:+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM+# It is wrong to echo any other type of specification.++# The "shellcheck disable" line above the timestamp inhibits complaints+# about features and limitations of the classic Bourne shell that were+# superseded or lifted in POSIX.  However, this script identifies a wide+# variety of pre-POSIX systems that do not have POSIX shells at all, and+# even some reasonably current systems (Solaris 10 as case-in-point) still+# have a pre-POSIX /bin/sh.++me=`echo "$0" | sed -e 's,.*/,,'`++usage="\+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS++Canonicalize a configuration name.++Options:+  -h, --help         print this help, then exit+  -t, --time-stamp   print date of last modification, then exit+  -v, --version      print version number, then exit++Report bugs and patches to <config-patches@gnu.org>."++version="\+GNU config.sub ($timestamp)++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."++# Parse command line+while test $# -gt 0 ; do+  case $1 in+    --time-stamp | --time* | -t )+       echo "$timestamp" ; exit ;;+    --version | -v )+       echo "$version" ; exit ;;+    --help | --h* | -h )+       echo "$usage"; exit ;;+    -- )     # Stop option processing+       shift; break ;;+    - )	# Use stdin as input.+       break ;;+    -* )+       echo "$me: invalid option $1$help" >&2+       exit 1 ;;++    *local*)+       # First pass through any local machine types.+       echo "$1"+       exit ;;++    * )+       break ;;+  esac+done++case $# in+ 0) echo "$me: missing argument$help" >&2+    exit 1;;+ 1) ;;+ *) echo "$me: too many arguments$help" >&2+    exit 1;;+esac++# Split fields of configuration type+# shellcheck disable=SC2162+saved_IFS=$IFS+IFS="-" read field1 field2 field3 field4 <<EOF+$1+EOF+IFS=$saved_IFS++# Separate into logical components for further validation+case $1 in+	*-*-*-*-*)+		echo "Invalid configuration '$1': more than four components" >&2+		exit 1+		;;+	*-*-*-*)+		basic_machine=$field1-$field2+		basic_os=$field3-$field4+		;;+	*-*-*)+		# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two+		# parts+		maybe_os=$field2-$field3+		case $maybe_os in+			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* | managarm-* \+			| windows-* )+				basic_machine=$field1+				basic_os=$maybe_os+				;;+			android-linux)+				basic_machine=$field1-unknown+				basic_os=linux-android+				;;+			*)+				basic_machine=$field1-$field2+				basic_os=$field3+				;;+		esac+		;;+	*-*)+		# A lone config we happen to match not fitting any pattern+		case $field1-$field2 in+			decstation-3100)+				basic_machine=mips-dec+				basic_os=+				;;+			*-*)+				# Second component is usually, but not always the OS+				case $field2 in+					# Prevent following clause from handling this valid os+					sun*os*)+						basic_machine=$field1+						basic_os=$field2+						;;+					zephyr*)+						basic_machine=$field1-unknown+						basic_os=$field2+						;;+					# Manufacturers+					dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \+					| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \+					| unicom* | ibm* | next | hp | isi* | apollo | altos* \+					| convergent* | ncr* | news | 32* | 3600* | 3100* \+					| hitachi* | c[123]* | convex* | sun | crds | omron* | dg \+					| ultra | tti* | harris | dolphin | highlevel | gould \+					| cbm | ns | masscomp | apple | axis | knuth | cray \+					| microblaze* | sim | cisco \+					| oki | wec | wrs | winbond)+						basic_machine=$field1-$field2+						basic_os=+						;;+					*)+						basic_machine=$field1+						basic_os=$field2+						;;+				esac+			;;+		esac+		;;+	*)+		# Convert single-component short-hands not valid as part of+		# multi-component configurations.+		case $field1 in+			386bsd)+				basic_machine=i386-pc+				basic_os=bsd+				;;+			a29khif)+				basic_machine=a29k-amd+				basic_os=udi+				;;+			adobe68k)+				basic_machine=m68010-adobe+				basic_os=scout+				;;+			alliant)+				basic_machine=fx80-alliant+				basic_os=+				;;+			altos | altos3068)+				basic_machine=m68k-altos+				basic_os=+				;;+			am29k)+				basic_machine=a29k-none+				basic_os=bsd+				;;+			amdahl)+				basic_machine=580-amdahl+				basic_os=sysv+				;;+			amiga)+				basic_machine=m68k-unknown+				basic_os=+				;;+			amigaos | amigados)+				basic_machine=m68k-unknown+				basic_os=amigaos+				;;+			amigaunix | amix)+				basic_machine=m68k-unknown+				basic_os=sysv4+				;;+			apollo68)+				basic_machine=m68k-apollo+				basic_os=sysv+				;;+			apollo68bsd)+				basic_machine=m68k-apollo+				basic_os=bsd+				;;+			aros)+				basic_machine=i386-pc+				basic_os=aros+				;;+			aux)+				basic_machine=m68k-apple+				basic_os=aux+				;;+			balance)+				basic_machine=ns32k-sequent+				basic_os=dynix+				;;+			blackfin)+				basic_machine=bfin-unknown+				basic_os=linux+				;;+			cegcc)+				basic_machine=arm-unknown+				basic_os=cegcc+				;;+			convex-c1)+				basic_machine=c1-convex+				basic_os=bsd+				;;+			convex-c2)+				basic_machine=c2-convex+				basic_os=bsd+				;;+			convex-c32)+				basic_machine=c32-convex+				basic_os=bsd+				;;+			convex-c34)+				basic_machine=c34-convex+				basic_os=bsd+				;;+			convex-c38)+				basic_machine=c38-convex+				basic_os=bsd+				;;+			cray)+				basic_machine=j90-cray+				basic_os=unicos+				;;+			crds | unos)+				basic_machine=m68k-crds+				basic_os=+				;;+			da30)+				basic_machine=m68k-da30+				basic_os=+				;;+			decstation | pmax | pmin | dec3100 | decstatn)+				basic_machine=mips-dec+				basic_os=+				;;+			delta88)+				basic_machine=m88k-motorola+				basic_os=sysv3+				;;+			dicos)+				basic_machine=i686-pc+				basic_os=dicos+				;;+			djgpp)+				basic_machine=i586-pc+				basic_os=msdosdjgpp+				;;+			ebmon29k)+				basic_machine=a29k-amd+				basic_os=ebmon+				;;+			es1800 | OSE68k | ose68k | ose | OSE)+				basic_machine=m68k-ericsson+				basic_os=ose+				;;+			gmicro)+				basic_machine=tron-gmicro+				basic_os=sysv+				;;+			go32)+				basic_machine=i386-pc+				basic_os=go32+				;;+			h8300hms)+				basic_machine=h8300-hitachi+				basic_os=hms+				;;+			h8300xray)+				basic_machine=h8300-hitachi+				basic_os=xray+				;;+			h8500hms)+				basic_machine=h8500-hitachi+				basic_os=hms+				;;+			harris)+				basic_machine=m88k-harris+				basic_os=sysv3+				;;+			hp300 | hp300hpux)+				basic_machine=m68k-hp+				basic_os=hpux+				;;+			hp300bsd)+				basic_machine=m68k-hp+				basic_os=bsd+				;;+			hppaosf)+				basic_machine=hppa1.1-hp+				basic_os=osf+				;;+			hppro)+				basic_machine=hppa1.1-hp+				basic_os=proelf+				;;+			i386mach)+				basic_machine=i386-mach+				basic_os=mach+				;;+			isi68 | isi)+				basic_machine=m68k-isi+				basic_os=sysv+				;;+			m68knommu)+				basic_machine=m68k-unknown+				basic_os=linux+				;;+			magnum | m3230)+				basic_machine=mips-mips+				basic_os=sysv+				;;+			merlin)+				basic_machine=ns32k-utek+				basic_os=sysv+				;;+			mingw64)+				basic_machine=x86_64-pc+				basic_os=mingw64+				;;+			mingw32)+				basic_machine=i686-pc+				basic_os=mingw32+				;;+			mingw32ce)+				basic_machine=arm-unknown+				basic_os=mingw32ce+				;;+			monitor)+				basic_machine=m68k-rom68k+				basic_os=coff+				;;+			morphos)+				basic_machine=powerpc-unknown+				basic_os=morphos+				;;+			moxiebox)+				basic_machine=moxie-unknown+				basic_os=moxiebox+				;;+			msdos)+				basic_machine=i386-pc+				basic_os=msdos+				;;+			msys)+				basic_machine=i686-pc+				basic_os=msys+				;;+			mvs)+				basic_machine=i370-ibm+				basic_os=mvs+				;;+			nacl)+				basic_machine=le32-unknown+				basic_os=nacl+				;;+			ncr3000)+				basic_machine=i486-ncr+				basic_os=sysv4+				;;+			netbsd386)+				basic_machine=i386-pc+				basic_os=netbsd+				;;+			netwinder)+				basic_machine=armv4l-rebel+				basic_os=linux+				;;+			news | news700 | news800 | news900)+				basic_machine=m68k-sony+				basic_os=newsos+				;;+			news1000)+				basic_machine=m68030-sony+				basic_os=newsos+				;;+			necv70)+				basic_machine=v70-nec+				basic_os=sysv+				;;+			nh3000)+				basic_machine=m68k-harris+				basic_os=cxux+				;;+			nh[45]000)+				basic_machine=m88k-harris+				basic_os=cxux+				;;+			nindy960)+				basic_machine=i960-intel+				basic_os=nindy+				;;+			mon960)+				basic_machine=i960-intel+				basic_os=mon960+				;;+			nonstopux)+				basic_machine=mips-compaq+				basic_os=nonstopux+				;;+			os400)+				basic_machine=powerpc-ibm+				basic_os=os400+				;;+			OSE68000 | ose68000)+				basic_machine=m68000-ericsson+				basic_os=ose+				;;+			os68k)+				basic_machine=m68k-none+				basic_os=os68k+				;;+			paragon)+				basic_machine=i860-intel+				basic_os=osf+				;;+			parisc)+				basic_machine=hppa-unknown+				basic_os=linux+				;;+			psp)+				basic_machine=mipsallegrexel-sony+				basic_os=psp+				;;+			pw32)+				basic_machine=i586-unknown+				basic_os=pw32+				;;+			rdos | rdos64)+				basic_machine=x86_64-pc+				basic_os=rdos+				;;+			rdos32)+				basic_machine=i386-pc+				basic_os=rdos+				;;+			rom68k)+				basic_machine=m68k-rom68k+				basic_os=coff+				;;+			sa29200)+				basic_machine=a29k-amd+				basic_os=udi+				;;+			sei)+				basic_machine=mips-sei+				basic_os=seiux+				;;+			sequent)+				basic_machine=i386-sequent+				basic_os=+				;;+			sps7)+				basic_machine=m68k-bull+				basic_os=sysv2+				;;+			st2000)+				basic_machine=m68k-tandem+				basic_os=+				;;+			stratus)+				basic_machine=i860-stratus+				basic_os=sysv4+				;;+			sun2)+				basic_machine=m68000-sun+				basic_os=+				;;+			sun2os3)+				basic_machine=m68000-sun+				basic_os=sunos3+				;;+			sun2os4)+				basic_machine=m68000-sun+				basic_os=sunos4+				;;+			sun3)+				basic_machine=m68k-sun+				basic_os=+				;;+			sun3os3)+				basic_machine=m68k-sun+				basic_os=sunos3+				;;+			sun3os4)+				basic_machine=m68k-sun+				basic_os=sunos4+				;;+			sun4)+				basic_machine=sparc-sun+				basic_os=+				;;+			sun4os3)+				basic_machine=sparc-sun+				basic_os=sunos3+				;;+			sun4os4)+				basic_machine=sparc-sun+				basic_os=sunos4+				;;+			sun4sol2)+				basic_machine=sparc-sun+				basic_os=solaris2+				;;+			sun386 | sun386i | roadrunner)+				basic_machine=i386-sun+				basic_os=+				;;+			sv1)+				basic_machine=sv1-cray+				basic_os=unicos+				;;+			symmetry)+				basic_machine=i386-sequent+				basic_os=dynix+				;;+			t3e)+				basic_machine=alphaev5-cray+				basic_os=unicos+				;;+			t90)+				basic_machine=t90-cray+				basic_os=unicos+				;;+			toad1)+				basic_machine=pdp10-xkl+				basic_os=tops20+				;;+			tpf)+				basic_machine=s390x-ibm+				basic_os=tpf+				;;+			udi29k)+				basic_machine=a29k-amd+				basic_os=udi+				;;+			ultra3)+				basic_machine=a29k-nyu+				basic_os=sym1+				;;+			v810 | necv810)+				basic_machine=v810-nec+				basic_os=none+				;;+			vaxv)+				basic_machine=vax-dec+				basic_os=sysv+				;;+			vms)+				basic_machine=vax-dec+				basic_os=vms+				;;+			vsta)+				basic_machine=i386-pc+				basic_os=vsta+				;;+			vxworks960)+				basic_machine=i960-wrs+				basic_os=vxworks+				;;+			vxworks68)+				basic_machine=m68k-wrs+				basic_os=vxworks+				;;+			vxworks29k)+				basic_machine=a29k-wrs+				basic_os=vxworks+				;;+			xbox)+				basic_machine=i686-pc+				basic_os=mingw32+				;;+			ymp)+				basic_machine=ymp-cray+				basic_os=unicos+				;;+			*)+				basic_machine=$1+				basic_os=+				;;+		esac+		;;+esac++# Decode 1-component or ad-hoc basic machines+case $basic_machine in+	# Here we handle the default manufacturer of certain CPU types.  It is in+	# some cases the only manufacturer, in others, it is the most popular.+	w89k)+		cpu=hppa1.1+		vendor=winbond+		;;+	op50n)+		cpu=hppa1.1+		vendor=oki+		;;+	op60c)+		cpu=hppa1.1+		vendor=oki+		;;+	ibm*)+		cpu=i370+		vendor=ibm+		;;+	orion105)+		cpu=clipper+		vendor=highlevel+		;;+	mac | mpw | mac-mpw)+		cpu=m68k+		vendor=apple+		;;+	pmac | pmac-mpw)+		cpu=powerpc+		vendor=apple+		;;++	# Recognize the various machine names and aliases which stand+	# for a CPU type and a company and sometimes even an OS.+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)+		cpu=m68000+		vendor=att+		;;+	3b*)+		cpu=we32k+		vendor=att+		;;+	bluegene*)+		cpu=powerpc+		vendor=ibm+		basic_os=cnk+		;;+	decsystem10* | dec10*)+		cpu=pdp10+		vendor=dec+		basic_os=tops10+		;;+	decsystem20* | dec20*)+		cpu=pdp10+		vendor=dec+		basic_os=tops20+		;;+	delta | 3300 | motorola-3300 | motorola-delta \+	      | 3300-motorola | delta-motorola)+		cpu=m68k+		vendor=motorola+		;;+	dpx2*)+		cpu=m68k+		vendor=bull+		basic_os=sysv3+		;;+	encore | umax | mmax)+		cpu=ns32k+		vendor=encore+		;;+	elxsi)+		cpu=elxsi+		vendor=elxsi+		basic_os=${basic_os:-bsd}+		;;+	fx2800)+		cpu=i860+		vendor=alliant+		;;+	genix)+		cpu=ns32k+		vendor=ns+		;;+	h3050r* | hiux*)+		cpu=hppa1.1+		vendor=hitachi+		basic_os=hiuxwe2+		;;+	hp3k9[0-9][0-9] | hp9[0-9][0-9])+		cpu=hppa1.0+		vendor=hp+		;;+	hp9k2[0-9][0-9] | hp9k31[0-9])+		cpu=m68000+		vendor=hp+		;;+	hp9k3[2-9][0-9])+		cpu=m68k+		vendor=hp+		;;+	hp9k6[0-9][0-9] | hp6[0-9][0-9])+		cpu=hppa1.0+		vendor=hp+		;;+	hp9k7[0-79][0-9] | hp7[0-79][0-9])+		cpu=hppa1.1+		vendor=hp+		;;+	hp9k78[0-9] | hp78[0-9])+		# FIXME: really hppa2.0-hp+		cpu=hppa1.1+		vendor=hp+		;;+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)+		# FIXME: really hppa2.0-hp+		cpu=hppa1.1+		vendor=hp+		;;+	hp9k8[0-9][13679] | hp8[0-9][13679])+		cpu=hppa1.1+		vendor=hp+		;;+	hp9k8[0-9][0-9] | hp8[0-9][0-9])+		cpu=hppa1.0+		vendor=hp+		;;+	i*86v32)+		cpu=`echo "$1" | sed -e 's/86.*/86/'`+		vendor=pc+		basic_os=sysv32+		;;+	i*86v4*)+		cpu=`echo "$1" | sed -e 's/86.*/86/'`+		vendor=pc+		basic_os=sysv4+		;;+	i*86v)+		cpu=`echo "$1" | sed -e 's/86.*/86/'`+		vendor=pc+		basic_os=sysv+		;;+	i*86sol2)+		cpu=`echo "$1" | sed -e 's/86.*/86/'`+		vendor=pc+		basic_os=solaris2+		;;+	j90 | j90-cray)+		cpu=j90+		vendor=cray+		basic_os=${basic_os:-unicos}+		;;+	iris | iris4d)+		cpu=mips+		vendor=sgi+		case $basic_os in+		    irix*)+			;;+		    *)+			basic_os=irix4+			;;+		esac+		;;+	miniframe)+		cpu=m68000+		vendor=convergent+		;;+	*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)+		cpu=m68k+		vendor=atari+		basic_os=mint+		;;+	news-3600 | risc-news)+		cpu=mips+		vendor=sony+		basic_os=newsos+		;;+	next | m*-next)+		cpu=m68k+		vendor=next+		case $basic_os in+		    openstep*)+		        ;;+		    nextstep*)+			;;+		    ns2*)+		      basic_os=nextstep2+			;;+		    *)+		      basic_os=nextstep3+			;;+		esac+		;;+	np1)+		cpu=np1+		vendor=gould+		;;+	op50n-* | op60c-*)+		cpu=hppa1.1+		vendor=oki+		basic_os=proelf+		;;+	pa-hitachi)+		cpu=hppa1.1+		vendor=hitachi+		basic_os=hiuxwe2+		;;+	pbd)+		cpu=sparc+		vendor=tti+		;;+	pbb)+		cpu=m68k+		vendor=tti+		;;+	pc532)+		cpu=ns32k+		vendor=pc532+		;;+	pn)+		cpu=pn+		vendor=gould+		;;+	power)+		cpu=power+		vendor=ibm+		;;+	ps2)+		cpu=i386+		vendor=ibm+		;;+	rm[46]00)+		cpu=mips+		vendor=siemens+		;;+	rtpc | rtpc-*)+		cpu=romp+		vendor=ibm+		;;+	sde)+		cpu=mipsisa32+		vendor=sde+		basic_os=${basic_os:-elf}+		;;+	simso-wrs)+		cpu=sparclite+		vendor=wrs+		basic_os=vxworks+		;;+	tower | tower-32)+		cpu=m68k+		vendor=ncr+		;;+	vpp*|vx|vx-*)+		cpu=f301+		vendor=fujitsu+		;;+	w65)+		cpu=w65+		vendor=wdc+		;;+	w89k-*)+		cpu=hppa1.1+		vendor=winbond+		basic_os=proelf+		;;+	none)+		cpu=none+		vendor=none+		;;+	leon|leon[3-9])+		cpu=sparc+		vendor=$basic_machine+		;;+	leon-*|leon[3-9]-*)+		cpu=sparc+		vendor=`echo "$basic_machine" | sed 's/-.*//'`+		;;++	*-*)+		# shellcheck disable=SC2162+		saved_IFS=$IFS+		IFS="-" read cpu vendor <<EOF+$basic_machine+EOF+		IFS=$saved_IFS+		;;+	# 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)+		cpu=$basic_machine+		vendor=pc+		;;+	# These rules are duplicated from below for sake of the special case above;+	# i.e. things that normalized to x86 arches should also default to "pc"+	pc98)+		cpu=i386+		vendor=pc+		;;+	x64 | amd64)+		cpu=x86_64+		vendor=pc+		;;+	# Recognize the basic CPU types without company name.+	*)+		cpu=$basic_machine+		vendor=unknown+		;;+esac++unset -v basic_machine++# Decode basic machines in the full and proper CPU-Company form.+case $cpu-$vendor in+	# Here we handle the default manufacturer of certain CPU types in canonical form. It is in+	# some cases the only manufacturer, in others, it is the most popular.+	craynv-unknown)+		vendor=cray+		basic_os=${basic_os:-unicosmp}+		;;+	c90-unknown | c90-cray)+		vendor=cray+		basic_os=${Basic_os:-unicos}+		;;+	fx80-unknown)+		vendor=alliant+		;;+	romp-unknown)+		vendor=ibm+		;;+	mmix-unknown)+		vendor=knuth+		;;+	microblaze-unknown | microblazeel-unknown)+		vendor=xilinx+		;;+	rs6000-unknown)+		vendor=ibm+		;;+	vax-unknown)+		vendor=dec+		;;+	pdp11-unknown)+		vendor=dec+		;;+	we32k-unknown)+		vendor=att+		;;+	cydra-unknown)+		vendor=cydrome+		;;+	i370-ibm*)+		vendor=ibm+		;;+	orion-unknown)+		vendor=highlevel+		;;+	xps-unknown | xps100-unknown)+		cpu=xps100+		vendor=honeywell+		;;++	# 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+		basic_os=${basic_os:-bosx}+		;;++	# Here we normalize CPU types irrespective of the vendor+	amd64-*)+		cpu=x86_64+		;;+	blackfin-*)+		cpu=bfin+		basic_os=linux+		;;+	c54x-*)+		cpu=tic54x+		;;+	c55x-*)+		cpu=tic55x+		;;+	c6x-*)+		cpu=tic6x+		;;+	e500v[12]-*)+		cpu=powerpc+		basic_os=${basic_os}"spe"+		;;+	mips3*-*)+		cpu=mips64+		;;+	ms1-*)+		cpu=mt+		;;+	m68knommu-*)+		cpu=m68k+		basic_os=linux+		;;+	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)+		cpu=s12z+		;;+	openrisc-*)+		cpu=or32+		;;+	parisc-*)+		cpu=hppa+		basic_os=linux+		;;+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)+		cpu=i586+		;;+	pentiumpro-* | p6-* | 6x86-* | athlon-* | athlon_*-*)+		cpu=i686+		;;+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)+		cpu=i686+		;;+	pentium4-*)+		cpu=i786+		;;+	pc98-*)+		cpu=i386+		;;+	ppc-* | ppcbe-*)+		cpu=powerpc+		;;+	ppcle-* | powerpclittle-*)+		cpu=powerpcle+		;;+	ppc64-*)+		cpu=powerpc64+		;;+	ppc64le-* | powerpc64little-*)+		cpu=powerpc64le+		;;+	sb1-*)+		cpu=mipsisa64sb1+		;;+	sb1el-*)+		cpu=mipsisa64sb1el+		;;+	sh5e[lb]-*)+		cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`+		;;+	spur-*)+		cpu=spur+		;;+	strongarm-* | thumb-*)+		cpu=arm+		;;+	tx39-*)+		cpu=mipstx39+		;;+	tx39el-*)+		cpu=mipstx39el+		;;+	x64-*)+		cpu=x86_64+		;;+	xscale-* | xscalee[bl]-*)+		cpu=`echo "$cpu" | sed 's/^xscale/arm/'`+		;;+	arm64-* | aarch64le-*)+		cpu=aarch64+		;;++	# Recognize the canonical CPU Types that limit and/or modify the+	# company names they are paired with.+	cr16-*)+		basic_os=${basic_os:-elf}+		;;+	crisv32-* | etraxfs*-*)+		cpu=crisv32+		vendor=axis+		;;+	cris-* | etrax*-*)+		cpu=cris+		vendor=axis+		;;+	crx-*)+		basic_os=${basic_os:-elf}+		;;+	neo-tandem)+		cpu=neo+		vendor=tandem+		;;+	nse-tandem)+		cpu=nse+		vendor=tandem+		;;+	nsr-tandem)+		cpu=nsr+		vendor=tandem+		;;+	nsv-tandem)+		cpu=nsv+		vendor=tandem+		;;+	nsx-tandem)+		cpu=nsx+		vendor=tandem+		;;+	mipsallegrexel-sony)+		cpu=mipsallegrexel+		vendor=sony+		;;+	tile*-*)+		basic_os=${basic_os:-linux-gnu}+		;;++	*)+		# Recognize the canonical CPU types that are allowed with any+		# company name.+		case $cpu in+			1750a | 580 \+			| a29k \+			| aarch64 | aarch64_be | aarch64c | arm64ec \+			| abacus \+			| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \+			| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \+			| alphapca5[67] | alpha64pca5[67] \+			| am33_2.0 \+			| amdgcn \+			| arc | arceb | arc32 | arc64 \+			| arm | arm[lb]e | arme[lb] | armv* \+			| avr | avr32 \+			| asmjs \+			| ba \+			| be32 | be64 \+			| bfin | bpf | bs2000 \+			| c[123]* | c30 | [cjt]90 | c4x \+			| c8051 | clipper | craynv | csky | cydra \+			| 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 \+			| k1om \+			| kvx \+			| le32 | le64 \+			| lm32 \+			| 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* \+			| mmix \+			| mn10200 | mn10300 \+			| moxie \+			| mt \+			| msp430 \+			| nanomips* \+			| nds32 | nds32le | nds32be \+			| nfp \+			| nios | nios2 | nios2eb | nios2el \+			| none | np1 | ns16k | ns32k | nvptx \+			| open8 \+			| or1k* \+			| or32 \+			| orion \+			| picochip \+			| pdp10 | pdp11 | pj | pjl | pn | power \+			| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \+			| pru \+			| pyramid \+			| riscv | riscv32 | riscv32be | riscv64 | riscv64be \+			| rl78 | romp | rs6000 | rx \+			| s390 | s390x \+			| score \+			| sh | shl \+			| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \+			| sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \+			| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \+			| sparclite \+			| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \+			| spu \+			| tahoe \+			| thumbv7* \+			| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \+			| tron \+			| ubicom32 \+			| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \+			| vax \+			| vc4 \+			| visium \+			| w65 \+			| wasm32 | wasm64 \+			| we32k \+			| x86 | x86_64 | xc16x | xgate | xps100 \+			| xstormy16 | xtensa* \+			| ymp \+			| z8k | z80)+				;;++			*)+				echo "Invalid configuration '$1': machine '$cpu-$vendor' not recognized" 1>&2+				exit 1+				;;+		esac+		;;+esac++# Here we canonicalize certain aliases for manufacturers.+case $vendor in+	digital*)+		vendor=dec+		;;+	commodore*)+		vendor=cbm+		;;+	*)+		;;+esac++# Decode manufacturer-specific aliases for certain operating systems.++if test x"$basic_os" != x+then++# 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+		os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`+		;;+	os2-emx)+		kernel=os2+		os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`+		;;+	nto-qnx*)+		kernel=nto+		os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`+		;;+	*-*)+		# shellcheck disable=SC2162+		saved_IFS=$IFS+		IFS="-" read kernel os <<EOF+$basic_os+EOF+		IFS=$saved_IFS+		;;+	# Default OS when just kernel was specified+	nto*)+		kernel=nto+		os=`echo "$basic_os" | sed -e 's|nto|qnx|'`+		;;+	linux*)+		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+		;;+esac++# Now, normalize the OS (knowing we just have one component, it's not a kernel,+# etc.)+case $os in+	# First match some system type aliases that might get confused+	# with valid system types.+	# solaris* is a basic system type, with this one exception.+	auroraux)+		os=auroraux+		;;+	bluegene*)+		os=cnk+		;;+	solaris1 | solaris1.*)+		os=`echo "$os" | sed -e 's|solaris1|sunos4|'`+		;;+	solaris)+		os=solaris2+		;;+	unixware*)+		os=sysv4.2uw+		;;+	# es1800 is here to avoid being matched by es* (a different OS)+	es1800*)+		os=ose+		;;+	# Some version numbers need modification+	chorusos*)+		os=chorusos+		;;+	isc)+		os=isc2.2+		;;+	sco6)+		os=sco5v6+		;;+	sco5)+		os=sco3.2v5+		;;+	sco4)+		os=sco3.2v4+		;;+	sco3.2.[4-9]*)+		os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`+		;;+	sco*v* | scout)+		# Don't match below+		;;+	sco*)+		os=sco3.2v2+		;;+	psos*)+		os=psos+		;;+	qnx*)+		os=qnx+		;;+	hiux*)+		os=hiuxwe2+		;;+	lynx*178)+		os=lynxos178+		;;+	lynx*5)+		os=lynxos5+		;;+	lynxos*)+		# don't get caught up in next wildcard+		;;+	lynx*)+		os=lynxos+		;;+	mac[0-9]*)+		os=`echo "$os" | sed -e 's|mac|macos|'`+		;;+	opened*)+		os=openedition+		;;+	os400*)+		os=os400+		;;+	sunos5*)+		os=`echo "$os" | sed -e 's|sunos5|solaris2|'`+		;;+	sunos6*)+		os=`echo "$os" | sed -e 's|sunos6|solaris3|'`+		;;+	wince*)+		os=wince+		;;+	utek*)+		os=bsd+		;;+	dynix*)+		os=bsd+		;;+	acis*)+		os=aos+		;;+	atheos*)+		os=atheos+		;;+	syllable*)+		os=syllable+		;;+	386bsd)+		os=bsd+		;;+	ctix* | uts*)+		os=sysv+		;;+	nova*)+		os=rtmk-nova+		;;+	ns2)+		os=nextstep2+		;;+	# Preserve the version number of sinix5.+	sinix5.*)+		os=`echo "$os" | sed -e 's|sinix|sysv|'`+		;;+	sinix*)+		os=sysv4+		;;+	tpf*)+		os=tpf+		;;+	triton*)+		os=sysv3+		;;+	oss*)+		os=sysv3+		;;+	svr4*)+		os=sysv4+		;;+	svr3)+		os=sysv3+		;;+	sysvr4)+		os=sysv4+		;;+	ose*)+		os=ose+		;;+	*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)+		os=mint+		;;+	dicos*)+		os=dicos+		;;+	pikeos*)+		# Until real need of OS specific support for+		# particular features comes up, bare metal+		# configurations are quite functional.+		case $cpu in+		    arm*)+			os=eabi+			;;+		    *)+			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.+		;;+esac++else++# Here we handle the default operating systems that come with various machines.+# The value should be what the vendor currently ships out the door with their+# machine or put another way, the most popular os provided with the machine.++# Note that if you're going to try to match "-MANUFACTURER" here (say,+# "-sun"), then you have to tell the case statement up towards the top+# that MANUFACTURER isn't an operating system.  Otherwise, code above+# will signal an error saying that MANUFACTURER isn't an operating+# system, and we'll never get to this point.++kernel=+obj=+case $cpu-$vendor in+	score-*)+		os=+		obj=elf+		;;+	spu-*)+		os=+		obj=elf+		;;+	*-acorn)+		os=riscix1.2+		;;+	arm*-rebel)+		kernel=linux+		os=gnu+		;;+	arm*-semi)+		os=+		obj=aout+		;;+	c4x-* | tic4x-*)+		os=+		obj=coff+		;;+	c8051-*)+		os=+		obj=elf+		;;+	clipper-intergraph)+		os=clix+		;;+	hexagon-*)+		os=+		obj=elf+		;;+	tic54x-*)+		os=+		obj=coff+		;;+	tic55x-*)+		os=+		obj=coff+		;;+	tic6x-*)+		os=+		obj=coff+		;;+	# This must come before the *-dec entry.+	pdp10-*)+		os=tops20+		;;+	pdp11-*)+		os=none+		;;+	*-dec | vax-*)+		os=ultrix4.2+		;;+	m68*-apollo)+		os=domain+		;;+	i386-sun)+		os=sunos4.0.2+		;;+	m68000-sun)+		os=sunos3+		;;+	m68*-cisco)+		os=+		obj=aout+		;;+	mep-*)+		os=+		obj=elf+		;;+	mips*-cisco)+		os=+		obj=elf+		;;+	mips*-*|nanomips*-*)+		os=+		obj=elf+		;;+	or32-*)+		os=+		obj=coff+		;;+	*-tti)	# must be before sparc entry or we get the wrong os.+		os=sysv3+		;;+	sparc-* | *-sun)+		os=sunos4.1.1+		;;+	pru-*)+		os=+		obj=elf+		;;+	*-be)+		os=beos+		;;+	*-ibm)+		os=aix+		;;+	*-knuth)+		os=mmixware+		;;+	*-wec)+		os=proelf+		;;+	*-winbond)+		os=proelf+		;;+	*-oki)+		os=proelf+		;;+	*-hp)+		os=hpux+		;;+	*-hitachi)+		os=hiux+		;;+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)+		os=sysv+		;;+	*-cbm)+		os=amigaos+		;;+	*-dg)+		os=dgux+		;;+	*-dolphin)+		os=sysv3+		;;+	m68k-ccur)+		os=rtu+		;;+	m88k-omron*)+		os=luna+		;;+	*-next)+		os=nextstep+		;;+	*-sequent)+		os=ptx+		;;+	*-crds)+		os=unos+		;;+	*-ns)+		os=genix+		;;+	i370-*)+		os=mvs+		;;+	*-gould)+		os=sysv+		;;+	*-highlevel)+		os=bsd+		;;+	*-encore)+		os=bsd+		;;+	*-sgi)+		os=irix+		;;+	*-siemens)+		os=sysv4+		;;+	*-masscomp)+		os=rtu+		;;+	f30[01]-fujitsu | f700-fujitsu)+		os=uxpv+		;;+	*-rom68k)+		os=+		obj=coff+		;;+	*-*bug)+		os=+		obj=coff+		;;+	*-apple)+		os=macos+		;;+	*-atari*)+		os=mint+		;;+	*-wrs)+		os=vxworks+		;;+	*)+		os=none+		;;+esac++fi++# 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.+	llvm* | musl* | newlib* | relibc* | uclibc*)+		;;+	# Likewise for "kernel-abi"+	eabi* | gnueabi*)+		;;+	# 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.+	gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \+	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \+	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \+	     | sym* |  plan9* | psp* | sim* | xray* | os68k* | v88r* \+	     | hiux* | abug | nacl* | netware* | windows* \+	     | os9* | macos* | osx* | ios* | tvos* | watchos* \+	     | mpw* | magic* | mmixware* | mon960* | lnews* \+	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \+	     | aos* | aros* | cloudabi* | sortix* | twizzler* \+	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \+	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \+	     | mirbsd* | netbsd* | dicos* | openedition* | ose* \+	     | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \+	     | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \+	     | bosx* | nextstep* | cxux* | oabi* \+	     | ptx* | ecoff* | winnt* | domain* | vsta* \+	     | udi* | lites* | ieee* | go32* | aux* | hcos* \+	     | chorusrdb* | cegcc* | glidix* | serenity* \+	     | cygwin* | msys* | moss* | proelf* | rtems* \+	     | midipix* | mingw32* | mingw64* | mint* \+	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \+	     | interix* | uwin* | mks* | rhapsody* | darwin* \+	     | openstep* | oskit* | conix* | pw32* | nonstopux* \+	     | storm-chaos* | tops10* | tenex* | tops20* | its* \+	     | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \+	     | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \+	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \+	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \+	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \+	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \+	     | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr* \+	     | 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+		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-$obj in+	linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \+		    | linux-mlibc*- | linux-musl*- | linux-newlib*- \+		    | linux-relibc*- | linux-uclibc*- )+		;;+	uclinux-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+		exit 1+		;;+	-kernel*- )+		echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2+		exit 1+		;;+	*-kernel*- )+		echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2+		exit 1+		;;+	*-msvc*- )+		echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2+		exit 1+		;;+	kfreebsd*-gnu*- | kopensolaris*-gnu*-)+		;;+	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.+		;;+	--*)+		# 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++# Here we handle the case where we know the os, and the CPU type, but not the+# manufacturer.  We pick the logical manufacturer.+case $vendor in+	unknown)+		case $cpu-$os in+			*-riscix*)+				vendor=acorn+				;;+			*-sunos*)+				vendor=sun+				;;+			*-cnk* | *-aix*)+				vendor=ibm+				;;+			*-beos*)+				vendor=be+				;;+			*-hpux*)+				vendor=hp+				;;+			*-mpeix*)+				vendor=hp+				;;+			*-hiux*)+				vendor=hitachi+				;;+			*-unos*)+				vendor=crds+				;;+			*-dgux*)+				vendor=dg+				;;+			*-luna*)+				vendor=omron+				;;+			*-genix*)+				vendor=ns+				;;+			*-clix*)+				vendor=intergraph+				;;+			*-mvs* | *-opened*)+				vendor=ibm+				;;+			*-os400*)+				vendor=ibm+				;;+			s390-* | s390x-*)+				vendor=ibm+				;;+			*-ptx*)+				vendor=sequent+				;;+			*-tpf*)+				vendor=ibm+				;;+			*-vxsim* | *-vxworks* | *-windiss*)+				vendor=wrs+				;;+			*-aux*)+				vendor=apple+				;;+			*-hms*)+				vendor=hitachi+				;;+			*-mpw* | *-macos*)+				vendor=apple+				;;+			*-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)+				vendor=atari+				;;+			*-vos*)+				vendor=stratus+				;;+		esac+		;;+esac++echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}"+exit++# Local variables:+# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'"
configure view
@@ -1,5389 +1,5235 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles.-# Generated by GNU Autoconf 2.69 for Haskell network package 2.6.3.5.-#-# 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='2.6.3.5'-PACKAGE_STRING='Haskell network package 2.6.3.5'-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-EXTRA_SRCS-EXTRA_LIBS-EXTRA_CPPFLAGS-CALLCONV-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-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-'-      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'-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--  # 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 ;;--  -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=`$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 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 ||-$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 2.6.3.5 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 2.6.3.5:";;-   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 2.6.3.5-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_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_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--# 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-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 2.6.3.5, 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="$ac_includes_default-#ifdef HAVE_SYS_SOCKET_H-# include <sys/socket.h>-#endif-#ifdef HAVE_NETINET_IN_H-# include <netinet/in.h>-#endif-#ifdef HAVE_NETDB_H-# include <netdb.h>-#endif-#ifdef HAVE_WINSOCK2_H-# include <winsock2.h>-#endif-#ifdef HAVE_WS2TCPIP_H-# include <ws2tcpip.h>-// fix for MingW not defining IPV6_V6ONLY-# define IPV6_V6ONLY 27-#endif"--# Safety check: Ensure that we are in the correct source directory.---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 fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock2.h ws2tcpip.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 arpa/inet.h netdb.h netinet/in.h netinet/tcp.h sys/socket.h sys/uio.h sys/un.h linux/can.h linux/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 net/if.h-do :-  ac_fn_c_check_header_mongrel "$LINENO" "net/if.h" "ac_cv_header_net_if_h" "$ac_includes_default"-if test "x$ac_cv_header_net_if_h" = xyes; then :-  cat >>confdefs.h <<_ACEOF-#define HAVE_NET_IF_H 1-_ACEOF--fi--done---for ac_func in readlink symlink if_nametoindex-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---ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_control" "ac_cv_member_struct_msghdr_msg_control" "#if HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#if HAVE_SYS_SOCKET_H-# include <sys/socket.h>-#endif-#if HAVE_SYS_UIO_H-# include <sys/uio.h>-#endif-"-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" "#if HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#if HAVE_SYS_SOCKET_H-# include <sys/socket.h>-#endif-#if HAVE_SYS_UIO_H-# include <sys/uio.h>-#endif-"-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" "#if HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#if HAVE_SYS_SOCKET_H-# include <sys/socket.h>-#endif-"-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}: checking for in_addr_t in netinet/in.h" >&5-$as_echo_n "checking for in_addr_t in netinet/in.h... " >&6; }-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <netinet/in.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "in_addr_t" >/dev/null 2>&1; then :--$as_echo "#define HAVE_IN_ADDR_T 1" >>confdefs.h- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5-$as_echo "yes" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi-rm -f conftest*---{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SO_PEERCRED and struct ucred in sys/socket.h" >&5-$as_echo_n "checking for SO_PEERCRED and struct ucred in sys/socket.h... " >&6; }-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <sys/types.h>-#include <sys/socket.h>-#ifndef SO_PEERCRED-# error no SO_PEERCRED-#endif-struct ucred u;-int-main ()-{--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  ac_cv_ucred=yes-else-  ac_cv_ucred=no-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-if test "x$ac_cv_ucred" = xno; then-    old_CFLAGS="$CFLAGS"-    CFLAGS="-D_GNU_SOURCE $CFLAGS"-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <sys/types.h>-#include <sys/socket.h>-#ifndef SO_PEERCRED-# error no SO_PEERCRED-#endif-struct ucred u;-int-main ()-{--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :-  ac_cv_ucred=yes-else-  ac_cv_ucred=no-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-    if test "x$ac_cv_ucred" = xyes; then-        EXTRA_CPPFLAGS=-D_GNU_SOURCE-    fi-else-    old_CFLAGS="$CFLAGS"-fi-if test "x$ac_cv_ucred" = xno; then-    CFLAGS="$old_CFLAGS"-    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-else--$as_echo "#define HAVE_STRUCT_UCRED 1" >>confdefs.h--    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5-$as_echo "yes" >&6; }-fi--{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getpeereid in unistd.h" >&5-$as_echo_n "checking for getpeereid in unistd.h... " >&6; }-ac_fn_c_check_func "$LINENO" "getpeereid" "ac_cv_func_getpeereid"-if test "x$ac_cv_func_getpeereid" = xyes; then :--$as_echo "#define HAVE_GETPEEREID 1" >>confdefs.h--fi---{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _head_libws2_32_a in -lws2_32" >&5-$as_echo_n "checking for _head_libws2_32_a in -lws2_32... " >&6; }-if ${ac_cv_lib_ws2_32__head_libws2_32_a+:} false; then :-  $as_echo_n "(cached) " >&6-else-  ac_check_lib_save_LIBS=$LIBS-LIBS="-lws2_32  $LIBS"-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */--/* 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 _head_libws2_32_a ();-int-main ()-{-return _head_libws2_32_a ();-  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_link "$LINENO"; then :-  ac_cv_lib_ws2_32__head_libws2_32_a=yes-else-  ac_cv_lib_ws2_32__head_libws2_32_a=no-fi-rm -f core conftest.err conftest.$ac_objext \-    conftest$ac_exeext conftest.$ac_ext-LIBS=$ac_check_lib_save_LIBS-fi-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32__head_libws2_32_a" >&5-$as_echo "$ac_cv_lib_ws2_32__head_libws2_32_a" >&6; }-if test "x$ac_cv_lib_ws2_32__head_libws2_32_a" = xyes; then :-  cat >>confdefs.h <<_ACEOF-#define HAVE_LIBWS2_32 1-_ACEOF--  LIBS="-lws2_32 $LIBS"--fi---{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo" >&5-$as_echo_n "checking for getaddrinfo... " >&6; }-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-$ac_includes_default-int testme(){ getaddrinfo; }-int-main ()-{--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :--$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h- ac_have_getaddrinfo=yes; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5-$as_echo "yes" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext--if test "x$ac_have_getaddrinfo" = x; then-  old_CFLAGS="$CFLAGS"-  if test "z$ac_cv_lib_ws2_32__head_libws2_32_a" = zyes; then-    CFLAGS="-DWINVER=0x0501 $CFLAGS"-    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for getaddrinfo if WINVER is 0x0501" >&5-$as_echo_n "checking for getaddrinfo if WINVER is 0x0501... " >&6; }-    cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-$ac_includes_default-    int testme(){ getaddrinfo; }-int-main ()-{--  ;-  return 0;-}-_ACEOF-if ac_fn_c_try_compile "$LINENO"; then :--$as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h--$as_echo "#define NEED_WINVER_XP 1" >>confdefs.h- EXTRA_CPPFLAGS="-DWINVER=0x0501 $EXTRA_CPPFLAGS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5-$as_echo "yes" >&6; }-else-  CFLAGS="$old_CFLAGS"; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-  fi-fi--for ac_func in gai_strerror-do :-  ac_fn_c_check_func "$LINENO" "gai_strerror" "ac_cv_func_gai_strerror"-if test "x$ac_cv_func_gai_strerror" = xyes; then :-  cat >>confdefs.h <<_ACEOF-#define HAVE_GAI_STRERROR 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---{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sendfile in sys/sendfile.h" >&5-$as_echo_n "checking for sendfile in sys/sendfile.h... " >&6; }-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <sys/sendfile.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "sendfile" >/dev/null 2>&1; then :--$as_echo "#define HAVE_LINUX_SENDFILE 1" >>confdefs.h- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5-$as_echo "yes" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi-rm -f conftest*---{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sendfile in sys/socket.h" >&5-$as_echo_n "checking for sendfile in sys/socket.h... " >&6; }-cat confdefs.h - <<_ACEOF >conftest.$ac_ext-/* end confdefs.h.  */-#include <sys/socket.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "sendfile" >/dev/null 2>&1; then :--$as_echo "#define HAVE_BSD_SENDFILE 1" >>confdefs.h- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5-$as_echo "yes" >&6; }-else-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5-$as_echo "no" >&6; }-fi-rm -f conftest*---for ac_func in gethostent-do :-  ac_fn_c_check_func "$LINENO" "gethostent" "ac_cv_func_gethostent"-if test "x$ac_cv_func_gethostent" = xyes; then :-  cat >>confdefs.h <<_ACEOF-#define HAVE_GETHOSTENT 1-_ACEOF--fi-done---for ac_func in accept4-do :-  ac_fn_c_check_func "$LINENO" "accept4" "ac_cv_func_accept4"-if test "x$ac_cv_func_accept4" = xyes; then :-  cat >>confdefs.h <<_ACEOF-#define HAVE_ACCEPT4 1-_ACEOF--fi-done---case "$host" in-*-mingw* | *-msys*)-	EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"-	EXTRA_LIBS=ws2_32-	CALLCONV=stdcall ;;-*-solaris2*)-	EXTRA_SRCS="cbits/ancilData.c"-	EXTRA_LIBS="nsl, socket"-	CALLCONV=ccall ;;-*)-	EXTRA_SRCS="cbits/ancilData.c"-	EXTRA_LIBS=-	CALLCONV=ccall ;;-esac------ac_config_files="$ac_config_files 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 2.6.3.5, 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_files in *"-"*) set x $ac_config_files; shift; ac_config_files=$*;;-esac--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_files="$ac_config_files"-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-      --file=FILE[:TEMPLATE]-                   instantiate the configuration file FILE-      --header=FILE[:TEMPLATE]-                   instantiate the configuration header FILE--Configuration files:-$config_files--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 2.6.3.5-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=: ;;-  --file | --fil | --fi | --f )-    $ac_shift-    case $ac_optarg in-    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;-    '') as_fn_error $? "missing file argument" ;;-    esac-    as_fn_append CONFIG_FILES " '$ac_optarg'"-    ac_need_defaults=false;;-  --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" ;;-    "network.buildinfo") CONFIG_FILES="$CONFIG_FILES network.buildinfo" ;;--  *) 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_FILES+set}" = set || CONFIG_FILES=$config_files-  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_FILES section.-# No need to generate them if there are no CONFIG_FILES.-# This happens for instance with `./config.status config.h'.-if test -n "$CONFIG_FILES"; then---ac_cr=`echo X | tr X '\015'`-# On cygwin, bash can eat \r inside `` if the user requested igncr.-# But we know of no other shell where ac_cr would be empty at this-# point, so we can use a bashism as a fallback.-if test "x$ac_cr" = x; then-  eval ac_cr=\$\'\\r\'-fi-ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`-if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then-  ac_cs_awk_cr='\\r'-else-  ac_cs_awk_cr=$ac_cr-fi--echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&-_ACEOF---{-  echo "cat >conf$$subs.awk <<_ACEOF" &&-  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&-  echo "_ACEOF"-} >conf$$subs.sh ||-  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5-ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`-ac_delim='%!_!# '-for ac_last_try in false false false false false :; do-  . ./conf$$subs.sh ||-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5--  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`-  if test $ac_delim_n = $ac_delim_num; then-    break-  elif $ac_last_try; then-    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5-  else-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "-  fi-done-rm -f conf$$subs.sh--cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1-cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&-_ACEOF-sed -n '-h-s/^/S["/; s/!.*/"]=/-p-g-s/^[^!]*!//-:repl-t repl-s/'"$ac_delim"'$//-t delim-:nl-h-s/\(.\{148\}\)..*/\1/-t more1-s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/-p-n-b repl-:more1-s/["\\]/\\&/g; s/^/"/; s/$/"\\/-p-g-s/.\{148\}//-t nl-:delim-h-s/\(.\{148\}\)..*/\1/-t more2-s/["\\]/\\&/g; s/^/"/; s/$/"/-p-b-:more2-s/["\\]/\\&/g; s/^/"/; s/$/"\\/-p-g-s/.\{148\}//-t delim-' <conf$$subs.awk | sed '-/^[^""]/{-  N-  s/\n//-}-' >>$CONFIG_STATUS || ac_write_fail=1-rm -f conf$$subs.awk-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1-_ACAWK-cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&-  for (key in S) S_is_set[key] = 1-  FS = ""--}-{-  line = $ 0-  nfields = split(line, field, "@")-  substed = 0-  len = length(field[1])-  for (i = 2; i < nfields; i++) {-    key = field[i]-    keylen = length(key)-    if (S_is_set[key]) {-      value = S[key]-      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)-      len += length(value) + length(field[++i])-      substed = 1-    } else-      len += 1 + keylen-  }--  print line-}--_ACAWK-_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1-if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then-  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"-else-  cat-fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \-  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5-_ACEOF--# VPATH may cause trouble with some makes, so we remove sole $(srcdir),-# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and-# trailing colons and then remove the whole line if VPATH becomes empty-# (actually we leave an empty line to preserve line numbers).-if test "x$srcdir" = x.; then-  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{-h-s///-s/^/:/-s/[	 ]*$/:/-s/:\$(srcdir):/:/g-s/:\${srcdir}:/:/g-s/:@srcdir@:/:/g-s/^:*//-s/:*$//-x-s/\(=[	 ]*\).*/\1/-G-s/\n//-s/^[^=]*=[	 ]*$//-}'-fi--cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1-fi # test -n "$CONFIG_FILES"--# 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 "  :F $CONFIG_FILES  :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-  :F)-  #-  # CONFIG_FILE-  #--_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1-# If the template does not know about datarootdir, expand it.-# FIXME: This hack should be removed a few years after 2.60.-ac_datarootdir_hack=; ac_datarootdir_seen=-ac_sed_dataroot='-/datarootdir/ {-  p-  q-}-/@datadir@/p-/@docdir@/p-/@infodir@/p-/@localedir@/p-/@mandir@/p'-case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in-*datarootdir*) ac_datarootdir_seen=yes;;-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}-_ACEOF-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1-  ac_datarootdir_hack='-  s&@datadir@&$datadir&g-  s&@docdir@&$docdir&g-  s&@infodir@&$infodir&g-  s&@localedir@&$localedir&g-  s&@mandir@&$mandir&g-  s&\\\${datarootdir}&$datarootdir&g' ;;-esac-_ACEOF--# Neutralize VPATH when `$srcdir' = `.'.-# Shell code in configure.ac might set extrasub.-# FIXME: do we really want to maintain this feature?-cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1-ac_sed_extra="$ac_vpsub-$extrasub-_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1-:t-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b-s|@configure_input@|$ac_sed_conf_input|;t t-s&@top_builddir@&$ac_top_builddir_sub&;t t-s&@top_build_prefix@&$ac_top_build_prefix&;t t-s&@srcdir@&$ac_srcdir&;t t-s&@abs_srcdir@&$ac_abs_srcdir&;t t-s&@top_srcdir@&$ac_top_srcdir&;t t-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t-s&@builddir@&$ac_builddir&;t t-s&@abs_builddir@&$ac_abs_builddir&;t t-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t-$ac_datarootdir_hack-"-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \-  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5--test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&-  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \-      "$ac_tmp/out"`; test -z "$ac_out"; } &&-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'-which seems to be undefined.  Please make sure it is defined" >&5-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'-which seems to be undefined.  Please make sure it is defined" >&2;}--  rm -f "$ac_tmp/stdin"-  case $ac_file in-  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;-  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;-  esac \-  || as_fn_error $? "could not create $ac_file" "$LINENO" 5- ;;-  :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.72 for Haskell network package 3.2.7.0.+#+# Report bugs to <libraries@haskell.org>.+#+#+# Copyright (C) 1992-1996, 1998-2017, 2020-2023 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+  # is contrary to our usage.  Disable this feature.+  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+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}+# 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+  # is contrary to our usage.  Disable this feature.+  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+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}+# 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+}+++# 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++# For backward compatibility with old third-party macros, we provide+# the shell variables $as_echo and $as_echo_n.  New code should use+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.+as_echo='printf %s\n'+as_echo_n='printf %s'++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_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+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+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+'+      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=--`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" ;;+    *)     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++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.72++Copyright (C) 2023 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.72.  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;}++# 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=$?+  # Sanitize IFS.+  IFS=" ""	$as_nl"+  # Save into config.log some information that might help in debugging.+  {+    echo++    printf "%s\n" "## ---------------- ##+## 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_*) { 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=\ *)+      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++    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"+  } >&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++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 C89 (global declarations)+ac_c_conftest_c89_globals='+/* Does the compiler advertise C89 conformance?+   Do not test the value of __STDC__, because some compilers set it to 0+   while being otherwise adequately conformant. */+#if !defined __STDC__+# error "Compiler does not advertise C89 conformance"+#endif++#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.+#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;+  char *restrict newvar = "Another string";++  // Check varargs.+  success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);+  test_varargs_macros ();++  // Check flexible array members.+  struct incomplete_array *ia =+    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));+  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;++  int dynamic_array[ni.number];+  dynamic_array[0] = argv[0][0];+  dynamic_array[ni.number - 1] = 543;++  // work around unused variable warnings+  ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''+	 || dynamic_array[ni.number - 1] != 543);+'++# 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=`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+	  { 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. ##+## -------------------- ##++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=`echo "$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=`echo "$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 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+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++++{ 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;+  }+  { /* 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;+  }+  { /* 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 needed to detect all undeclared functions" >&5+printf %s "checking for $CC options needed to detect all 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++ac_fn_check_decl "$LINENO" "AI_ADDRCONFIG" "ac_cv_have_decl_AI_ADDRCONFIG" "$ac_includes_default" "$ac_c_undeclared_builtin_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" "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" "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" "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" "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" "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" "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" "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" "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" "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" "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++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_*) { 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+) |+  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}"+ac_write_fail=0+ac_clean_files_save=$ac_clean_files+ac_clean_files="$ac_clean_files $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+  # is contrary to our usage.  Disable this feature.+  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+++# 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++# For backward compatibility with old third-party macros, we provide+# the shell variables $as_echo and $as_echo_n.  New code should use+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.+as_echo='printf %s\n'+as_echo_n='printf %s'++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.72.  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.72,+  with options \\"\$ac_cs_config\\"++Copyright (C) 2023 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 )+    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]) {+    # 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=`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_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+  { 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,25 +1,64 @@-AC_INIT([Haskell network package], [2.7.0.2], [libraries@haskell.org], [network])+AC_INIT([Haskell network package],+        [3.2.7.0],+        [libraries@haskell.org],+        [network]) -ac_includes_default="$ac_includes_default+dnl See also HsNet.h+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>+#include <netdb.h> #endif-#ifdef HAVE_WINSOCK2_H-# include <winsock2.h>+#ifdef HAVE_NET_IF_H+# include <net/if.h> #endif-#ifdef HAVE_WS2TCPIP_H-# include <ws2tcpip.h>-// fix for MingW not defining IPV6_V6ONLY-# define IPV6_V6ONLY 27-#endif"+#ifdef HAVE_NETIOAPI_H+# include <netioapi.h>+#endif+" -# Safety check: Ensure that we are in the correct source directory. AC_CONFIG_SRCDIR([include/HsNet.h])  AC_CONFIG_HEADERS([include/HsNetworkConfig.h])@@ -33,160 +72,28 @@  AC_C_CONST -dnl ** check for specific header (.h) files that we are interested in-AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h sys/types.h unistd.h winsock2.h ws2tcpip.h])-AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h netinet/tcp.h sys/socket.h sys/uio.h sys/un.h linux/can.h linux/tcp.h])-AC_CHECK_HEADERS([net/if.h])--AC_CHECK_FUNCS([readlink symlink if_nametoindex])--dnl ** check what fields struct msghdr contains-AC_CHECK_MEMBERS([struct msghdr.msg_control, struct msghdr.msg_accrights], [], [], [#if HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#if HAVE_SYS_SOCKET_H-# include <sys/socket.h>-#endif-#if HAVE_SYS_UIO_H-# include <sys/uio.h>-#endif])--dnl ** check if struct sockaddr contains sa_len-AC_CHECK_MEMBERS([struct sockaddr.sa_len], [], [], [#if HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#if HAVE_SYS_SOCKET_H-# include <sys/socket.h>-#endif])--dnl ---------------------------------------------------dnl * test for in_addr_t-dnl ---------------------------------------------------AC_MSG_CHECKING(for in_addr_t in netinet/in.h)-AC_EGREP_HEADER(in_addr_t, netinet/in.h,- [ AC_DEFINE([HAVE_IN_ADDR_T], [1], [Define to 1 if in_addr_t is available.]) AC_MSG_RESULT(yes) ],- AC_MSG_RESULT(no))--dnl ---------------------------------------------------dnl * test for SO_PEERCRED and struct ucred-dnl ---------------------------------------------------AC_MSG_CHECKING(for SO_PEERCRED and struct ucred in sys/socket.h)-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>-#include <sys/socket.h>-#ifndef SO_PEERCRED-# error no SO_PEERCRED-#endif-struct ucred u;]])],ac_cv_ucred=yes,ac_cv_ucred=no)-if test "x$ac_cv_ucred" = xno; then-    old_CFLAGS="$CFLAGS"-    CFLAGS="-D_GNU_SOURCE $CFLAGS"-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>-#include <sys/socket.h>-#ifndef SO_PEERCRED-# error no SO_PEERCRED-#endif-struct ucred u;]])],ac_cv_ucred=yes,ac_cv_ucred=no)-    if test "x$ac_cv_ucred" = xyes; then-        EXTRA_CPPFLAGS=-D_GNU_SOURCE-    fi-else-    old_CFLAGS="$CFLAGS"-fi-if test "x$ac_cv_ucred" = xno; then-    CFLAGS="$old_CFLAGS"-    AC_MSG_RESULT(no)-else-    AC_DEFINE([HAVE_STRUCT_UCRED], [1], [Define to 1 if you have both SO_PEERCRED and struct ucred.])-    AC_MSG_RESULT(yes)-fi--dnl ---------------------------------------------------dnl * test for GETPEEREID(3)-dnl ---------------------------------------------------AC_MSG_CHECKING(for getpeereid in unistd.h)-AC_CHECK_FUNC( getpeereid, AC_DEFINE([HAVE_GETPEEREID], [1], [Define to 1 if you have getpeereid.] ))--dnl ---------------------------------------------------dnl * check for Windows networking libraries-dnl ---------------------------------------------------AC_CHECK_LIB(ws2_32, _head_libws2_32_a)--dnl ---------------------------------------------------dnl * test for getaddrinfo as proxy for IPv6 support-dnl ---------------------------------------------------AC_MSG_CHECKING(for getaddrinfo)-dnl Can't use AC_CHECK_FUNC here, because it doesn't do the right-dnl thing on Windows.-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default-int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) ac_have_getaddrinfo=yes; AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)])+AC_CHECK_HEADERS([limits.h stdlib.h unistd.h sys/types.h fcntl.h])+AC_CHECK_HEADERS([sys/uio.h sys/socket.h netinet/in.h netinet/tcp.h])+AC_CHECK_HEADERS([sys/un.h arpa/inet.h netdb.h])+AC_CHECK_HEADERS([net/if.h netioapi.h]) -dnl Under mingw, we may need to set WINVER to 0x0501 to expose getaddrinfo.-if test "x$ac_have_getaddrinfo" = x; then-  old_CFLAGS="$CFLAGS"-  if test "z$ac_cv_lib_ws2_32__head_libws2_32_a" = zyes; then-    CFLAGS="-DWINVER=0x0501 $CFLAGS"-    AC_MSG_CHECKING(for getaddrinfo if WINVER is 0x0501)-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$ac_includes_default-    int testme(){ getaddrinfo; }]])],[AC_DEFINE([HAVE_GETADDRINFO], [1], [Define to 1 if you have the `getaddrinfo' function.]) AC_DEFINE([NEED_WINVER_XP], [1], [Define to 1 if the `getaddrinfo' function needs WINVER set.]) EXTRA_CPPFLAGS="-DWINVER=0x0501 $EXTRA_CPPFLAGS"; AC_MSG_RESULT(yes)],[CFLAGS="$old_CFLAGS"; AC_MSG_RESULT(no)])-  fi-fi+AC_CHECK_TYPES([struct ucred]) -dnl Missing under mingw, sigh.-AC_CHECK_FUNCS(gai_strerror)+AC_CHECK_FUNCS([gai_strerror gethostent accept4])+AC_CHECK_FUNCS([getpeereid]) -dnl --------------------------------------------------------dnl * test for AI_* flags that not all implementations have-dnl ------------------------------------------------------- AC_CHECK_DECLS([AI_ADDRCONFIG, AI_ALL, AI_NUMERICSERV, AI_V4MAPPED])--dnl --------------------------------------------------------dnl * test for IPV6_V6ONLY flags that not all implementations have-dnl ------------------------------------------------------- AC_CHECK_DECLS([IPV6_V6ONLY])--dnl --------------------------------------------------------dnl * test for IPPROTO_* macros/constants-dnl ------------------------------------------------------- AC_CHECK_DECLS([IPPROTO_IP, IPPROTO_TCP, IPPROTO_IPV6])--dnl ---------------------------------------------------dnl * test for Linux sendfile(2)-dnl ---------------------------------------------------AC_MSG_CHECKING(for sendfile in sys/sendfile.h)-AC_EGREP_HEADER(sendfile, sys/sendfile.h,- [ AC_DEFINE([HAVE_LINUX_SENDFILE], [1], [Define to 1 if you have a Linux sendfile(2) implementation.]) AC_MSG_RESULT(yes) ],- AC_MSG_RESULT(no))--dnl ---------------------------------------------------dnl * test for BSD sendfile(2)-dnl ---------------------------------------------------AC_MSG_CHECKING(for sendfile in sys/socket.h)-AC_EGREP_HEADER(sendfile, sys/socket.h,- [ AC_DEFINE([HAVE_BSD_SENDFILE], [1], [Define to 1 if you have a BSDish sendfile(2) implementation.]) AC_MSG_RESULT(yes) ],- AC_MSG_RESULT(no))--AC_CHECK_FUNCS(gethostent)--AC_CHECK_FUNCS(accept4)+AC_CHECK_DECLS([SO_PEERCRED])+AC_CHECK_DECLS([IP_DONTFRAG])+AC_CHECK_DECLS([IP_MTU_DISCOVER]) -case "$host" in-*-mingw* | *-msys*)-	EXTRA_SRCS="cbits/initWinSock.c, cbits/winSockErr.c, cbits/asyncAccept.c"-	EXTRA_LIBS=ws2_32-	;;-*-solaris2*)-	EXTRA_SRCS="cbits/ancilData.c"-	EXTRA_LIBS="nsl, socket"-	;;-*)-	EXTRA_SRCS="cbits/ancilData.c"-	EXTRA_LIBS=-	;;-esac-AC_SUBST([EXTRA_CPPFLAGS])-AC_SUBST([EXTRA_LIBS])-AC_SUBST([EXTRA_SRCS])+AC_CHECK_MEMBERS([struct msghdr.msg_control, struct msghdr.msg_accrights])+AC_CHECK_MEMBERS([struct sockaddr.sa_len]) -AC_CONFIG_FILES([network.buildinfo])+dnl This is a necessary hack+AC_MSG_NOTICE([creating ./network.buildinfo])+echo "install-includes: HsNetworkConfig.h" > network.buildinfo  AC_OUTPUT
examples/EchoClient.hs view
@@ -1,27 +1,30 @@ {-# LANGUAGE OverloadedStrings #-}+ -- Echo client program module Main (main) where  import qualified Control.Exception as E import qualified Data.ByteString.Char8 as C-import Network.Socket hiding (recv)+import qualified Data.List.NonEmpty as NE+import Network.Socket import Network.Socket.ByteString (recv, sendAll)  main :: IO ()-main = withSocketsDo $ do-    addr <- resolve "127.0.0.1" "3000"-    E.bracket (open addr) close talk+main = runTCPClient "127.0.0.1" "3000" $ \s -> do+    sendAll s "Hello, world!"+    msg <- recv s 1024+    putStr "Received: "+    C.putStrLn msg++-- from the "network-run" package.+runTCPClient :: HostName -> ServiceName -> (Socket -> IO a) -> IO a+runTCPClient host port client = withSocketsDo $ do+    addr <- resolve+    E.bracket (open addr) close client   where-    resolve host port = do-        let hints = defaultHints { addrSocketType = Stream }-        addr:_ <- getAddrInfo (Just hints) (Just host) (Just port)-        return addr-    open addr = do-        sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+    resolve = do+        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-    talk sock = do-        sendAll sock "Hello, world!"-        msg <- recv sock 1024-        putStr "Received: "-        C.putStrLn msg
examples/EchoServer.hs view
@@ -3,39 +3,46 @@  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 Network.Socket hiding (recv)+import qualified Data.List.NonEmpty as NE+import Network.Socket import Network.Socket.ByteString (recv, sendAll)  main :: IO ()-main = withSocketsDo $ do-    addr <- resolve "3000"+main = runTCPServer Nothing "3000" talk+  where+    talk s = do+        msg <- recv s 1024+        unless (S.null msg) $ do+            sendAll s msg+            talk s++-- from the "network-run" package.+runTCPServer :: Maybe HostName -> ServiceName -> (Socket -> IO a) -> IO a+runTCPServer mhost port server = withSocketsDo $ do+    addr <- resolve     E.bracket (open addr) close loop   where-    resolve port = do-        let hints = defaultHints {-                addrFlags = [AI_PASSIVE]-              , addrSocketType = Stream-              }-        addr:_ <- getAddrInfo (Just hints) Nothing (Just port)-        return addr-    open addr = do-        sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+    resolve = do+        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-        -- If the prefork technique is not used,-        -- set CloseOnExec for the security reasons.-        let fd = fdSocket sock-        setCloseOnExecIfNeeded fd-        bind sock (addrAddress addr)-        listen sock 10+        withFdSocket sock setCloseOnExecIfNeeded+        bind sock $ addrAddress addr+        listen sock 1024         return sock-    loop sock = forever $ do-        (conn, peer) <- accept sock-        putStrLn $ "Connection from " ++ show peer-        void $ forkFinally (talk conn) (\_ -> close conn)-    talk conn = do-        msg <- recv conn 1024-        unless (S.null msg) $ do-          sendAll conn msg-          talk conn+    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
@@ -9,10 +9,6 @@  #include "HsNetDef.h" -#ifdef NEED_WINVER-# define WINVER 0x0501-#endif- #ifndef INLINE # if defined(_MSC_VER) #  define INLINE extern __inline@@ -23,29 +19,19 @@ # endif #endif -#ifdef HAVE_GETADDRINFO-# define IPV6_SOCKET_SUPPORT 1-#else-# undef IPV6_SOCKET_SUPPORT+#ifndef _WIN32+# define _GNU_SOURCE 1 /* for struct ucred on Linux */ #endif--#if defined(HAVE_WINSOCK2_H)-#include <winsock2.h>-# ifdef HAVE_WS2TCPIP_H-#  include <ws2tcpip.h>-// fix for MingW not defining IPV6_V6ONLY-#  define IPV6_V6ONLY 27-# endif--extern int   initWinSock ();-extern const char* getWSErrorDescr(int err);-extern void* newAcceptParams(int sock,-			     int sz,-			     void* sockaddr);-extern int   acceptNewSock(void* d);-extern int   acceptDoProc(void* param);+#define __APPLE_USE_RFC_3542 1 /* for IPV6_RECVPKTINFO */ -#else+#ifdef _WIN32+# include <winsock2.h>+# include <ws2tcpip.h>+# include <mswsock.h>+# include "win32defs.h"+# include "afunix_compat.h"+# define IPV6_V6ONLY 27+#endif  #ifdef HAVE_LIMITS_H # include <limits.h>@@ -68,14 +54,12 @@ #ifdef HAVE_SYS_SOCKET_H # include <sys/socket.h> #endif-#ifdef HAVE_LINUX_TCP_H-# include <linux/tcp.h>-#elif HAVE_NETINET_TCP_H-# include <netinet/tcp.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@@ -85,53 +69,76 @@ #ifdef HAVE_NETDB_H #include <netdb.h> #endif-#ifdef HAVE_LINUX_CAN_H-# include <linux/can.h>-# define CAN_SOCKET_SUPPORT 1-#endif-#ifdef HAVE_NET_IF+#ifdef HAVE_NET_IF_H # include <net/if.h> #endif--#ifdef HAVE_BSD_SENDFILE-#include <sys/uio.h>-#endif-#ifdef HAVE_LINUX_SENDFILE-#if !defined(__USE_FILE_OFFSET64)-#include <sys/sendfile.h>-#endif+#ifdef HAVE_NETIOAPI_H+# include <netioapi.h> #endif +#ifdef _WIN32+extern int   initWinSock ();+extern const char* getWSErrorDescr(int err);+extern void* newAcceptParams(int sock,+			     int sz,+			     void* sockaddr);+extern int   acceptNewSock(void* d);+extern int   acceptDoProc(void* param);++extern LPWSACMSGHDR+cmsg_firsthdr(LPWSAMSG mhdr);++extern LPWSACMSGHDR+cmsg_nxthdr(LPWSAMSG mhdr, LPWSACMSGHDR cmsg);++extern unsigned char *+cmsg_data(LPWSACMSGHDR cmsg);++extern unsigned int+cmsg_space(unsigned int l);++extern unsigned int+cmsg_len(unsigned int l);++/**+ * WSASendMsg function+ */+extern WINAPI int+WSASendMsg (SOCKET, LPWSAMSG, DWORD, LPDWORD,+            LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);++/**+ * WSARecvMsg function+ */+extern WINAPI int+WSARecvMsg (SOCKET, LPWSAMSG, LPDWORD,+            LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);+#else  /* _WIN32 */ extern int sendFd(int sock, int outfd);  extern int recvFd(int sock); -#endif /* HAVE_WINSOCK2_H */+extern struct cmsghdr *+cmsg_firsthdr(struct msghdr *mhdr); -INLINE char *-hsnet_inet_ntoa(-#if defined(HAVE_WINSOCK2_H)-             u_long addr-#elif defined(HAVE_IN_ADDR_T)-             in_addr_t addr-#elif defined(HAVE_INTTYPES_H)-             u_int32_t addr-#else-             unsigned long addr-#endif-	    )-{-    struct in_addr a;-    a.s_addr = addr;-    return inet_ntoa(a);-}+extern struct cmsghdr *+cmsg_nxthdr(struct msghdr *mhdr, struct cmsghdr *cmsg); -#ifdef HAVE_GETADDRINFO+extern unsigned char *+cmsg_data(struct cmsghdr *cmsg);++extern size_t+cmsg_space(size_t l);++extern size_t+cmsg_len(size_t l);+#endif /* _WIN32 */+ INLINE int hsnet_getnameinfo(const struct sockaddr* a,socklen_t b, char* c,-# if defined(HAVE_WINSOCK2_H)+# if defined(_WIN32)                   DWORD d, char* e, DWORD f, int g) # else                   socklen_t d, char* e, socklen_t f, int g)@@ -152,13 +159,12 @@ {     freeaddrinfo(ai); }-#endif -#if !defined(IOV_MAX)+#ifndef IOV_MAX # define IOV_MAX 1024 #endif -#if !defined(SOCK_NONBLOCK) // Missing define in Bionic libc (Android)+#ifndef SOCK_NONBLOCK // Missing define in Bionic libc (Android) # define SOCK_NONBLOCK O_NONBLOCK #endif 
include/HsNetDef.h view
@@ -10,12 +10,16 @@ #undef PACKAGE_TARNAME #undef PACKAGE_VERSION -#if defined(HAVE_WINSOCK2_H)-# define WITH_WINSOCK  1+#if defined(HAVE_STRUCT_UCRED) && HAVE_DECL_SO_PEERCRED+# define HAVE_STRUCT_UCRED_SO_PEERCRED 1+#else+# undef HAVE_STRUCT_UCRED_SO_PEERCRED #endif -#if !defined(mingw32_HOST_OS) && !defined(_WIN32)-# define DOMAIN_SOCKET_SUPPORT 1+#ifdef HAVE_ACCEPT4+# define HAVE_ADVANCED_SOCKET_FLAGS 1+#else+# undef HAVE_ADVANCED_SOCKET_FLAGS #endif  /* stdcall is for Windows 32.@@ -36,6 +40,7 @@ #else # define CALLCONV ccall #endif+ #if defined(mingw32_HOST_OS) # define SAFE_ON_WIN safe #else
include/HsNetworkConfig.h.in view
@@ -1,88 +1,73 @@ /* 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 a BSDish sendfile(2) implementation. */-#undef HAVE_BSD_SENDFILE--/* Define to 1 if you have the declaration of `AI_ADDRCONFIG', and to 0 if you+/* 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 '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 `getaddrinfo' function. */-#undef HAVE_GETADDRINFO--/* 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 getpeereid. */+/* Define to 1 if you have the 'getpeereid' function. */ #undef HAVE_GETPEEREID -/* Define to 1 if you have the `if_nametoindex' function. */-#undef HAVE_IF_NAMETOINDEX- /* Define to 1 if you have the <inttypes.h> header file. */ #undef HAVE_INTTYPES_H -/* Define to 1 if in_addr_t is available. */-#undef HAVE_IN_ADDR_T--/* Define to 1 if you have the `ws2_32' library (-lws2_32). */-#undef HAVE_LIBWS2_32- /* Define to 1 if you have the <limits.h> header file. */ #undef HAVE_LIMITS_H -/* Define to 1 if you have the <linux/can.h> header file. */-#undef HAVE_LINUX_CAN_H--/* Define to 1 if you have a Linux sendfile(2) implementation. */-#undef HAVE_LINUX_SENDFILE--/* Define to 1 if you have the <linux/tcp.h> header file. */-#undef HAVE_LINUX_TCP_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 @@ -92,15 +77,18 @@ /* Define to 1 if you have the <netinet/tcp.h> header file. */ #undef HAVE_NETINET_TCP_H +/* Define to 1 if you have the <netioapi.h> header file. */+#undef HAVE_NETIOAPI_H+ /* Define to 1 if you have the <net/if.h> header file. */ #undef HAVE_NET_IF_H -/* Define to 1 if you have the `readlink' function. */-#undef HAVE_READLINK- /* 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 @@ -110,21 +98,18 @@ /* 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 you have both SO_PEERCRED and struct ucred. */+/* Define to 1 if the system has the type 'struct ucred'. */ #undef HAVE_STRUCT_UCRED -/* Define to 1 if you have the `symlink' function. */-#undef HAVE_SYMLINK- /* Define to 1 if you have the <sys/socket.h> header file. */ #undef HAVE_SYS_SOCKET_H @@ -143,15 +128,6 @@ /* Define to 1 if you have the <unistd.h> header file. */ #undef HAVE_UNISTD_H -/* Define to 1 if you have the <winsock2.h> header file. */-#undef HAVE_WINSOCK2_H--/* Define to 1 if you have the <ws2tcpip.h> header file. */-#undef HAVE_WS2TCPIP_H--/* Define to 1 if the `getaddrinfo' function needs WINVER set. */-#undef NEED_WINVER_XP- /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT @@ -170,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
+ include/afunix_compat.h view
@@ -0,0 +1,23 @@+/* The version of afunix.h provided by the version of MSYS2 included with x86
+ * versions of GHC before GHC 9.2 excludes certain components introduced with
+ * Windows Vista.
+ */
+
+#ifndef AFUNIX_COMPAT_H
+#define AFUNIX_COMPAT_H
+
+#if defined(_AFUNIX_) || !defined(_WIN32) || __GLASGOW_HASKELL__ > 902
+# include <afunix.h>
+#else
+
+#define UNIX_PATH_MAX 108
+
+typedef struct sockaddr_un {
+  ADDRESS_FAMILY sun_family;
+  char sun_path[UNIX_PATH_MAX];
+} SOCKADDR_UN, *PSOCKADDR_UN;
+
+#define SIO_AF_UNIX_GETPEERPID _WSAIOR(IOC_VENDOR, 256)
+
+#endif /* GHC version check */
+#endif /* AFUNIX_COMPAT_H */
+ include/alignment.h view
@@ -0,0 +1,3 @@+#if __GLASGOW_HASKELL__ < 711
+#define hsc_alignment(t ) hsc_printf ( "%lu", (unsigned long)offsetof(struct {char x__; t(y__); }, y__));
+#endif
+ include/win32defs.h view
@@ -0,0 +1,120 @@+#ifndef IP_OPTIONS
+#define IP_OPTIONS                 1 // Set/get IP options.
+#endif
+#ifndef IP_HDRINCL
+#define IP_HDRINCL                 2 // Header is included with data.
+#endif
+#ifndef IP_TOS
+#define IP_TOS                     3 // IP type of service.
+#endif
+#ifndef IP_TTL
+#define IP_TTL                     4 // IP TTL (hop limit).
+#endif
+#ifndef IP_MULTICAST_IF
+#define IP_MULTICAST_IF            9 // IP multicast interface.
+#endif
+#ifndef IP_MULTICAST_TTL
+#define IP_MULTICAST_TTL          10 // IP multicast TTL (hop limit).
+#endif
+#ifndef IP_MULTICAST_LOOP
+#define IP_MULTICAST_LOOP         11 // IP multicast loopback.
+#endif
+#ifndef IP_ADD_MEMBERSHIP
+#define IP_ADD_MEMBERSHIP         12 // Add an IP group membership.
+#endif
+#ifndef IP_DROP_MEMBERSHIP
+#define IP_DROP_MEMBERSHIP        13 // Drop an IP group membership.
+#endif
+#ifndef IP_DONTFRAGMENT
+#define IP_DONTFRAGMENT           14 // Don't fragment IP datagrams.
+#endif
+#ifndef IP_ADD_SOURCE_MEMBERSHIP
+#define IP_ADD_SOURCE_MEMBERSHIP  15 // Join IP group/source.
+#endif
+#ifndef IP_DROP_SOURCE_MEMBERSHIP
+#define IP_DROP_SOURCE_MEMBERSHIP 16 // Leave IP group/source.
+#endif
+#ifndef IP_BLOCK_SOURCE
+#define IP_BLOCK_SOURCE           17 // Block IP group/source.
+#endif
+#ifndef IP_UNBLOCK_SOURCE
+#define IP_UNBLOCK_SOURCE         18 // Unblock IP group/source.
+#endif
+#ifndef IP_PKTINFO
+#define IP_PKTINFO                19 // Receive packet information.
+#endif
+#ifndef IP_HOPLIMIT
+#define IP_HOPLIMIT               21 // Receive packet hop limit.
+#endif
+#ifndef IP_RECVTTL
+#define IP_RECVTTL                21 // Receive packet Time To Live (TTL).
+#endif
+#ifndef IP_RECEIVE_BROADCAST
+#define IP_RECEIVE_BROADCAST      22 // Allow/block broadcast reception.
+#endif
+#ifndef IP_RECVIF
+#define IP_RECVIF                 24 // Receive arrival interface.
+#endif
+#ifndef IP_RECVDSTADDR
+#define IP_RECVDSTADDR            25 // Receive destination address.
+#endif
+#ifndef IP_IFLIST
+#define IP_IFLIST                 28 // Enable/Disable an interface list.
+#endif
+#ifndef IP_ADD_IFLIST
+#define IP_ADD_IFLIST             29 // Add an interface list entry.
+#endif
+#ifndef IP_DEL_IFLIST
+#define IP_DEL_IFLIST             30 // Delete an interface list entry.
+#endif
+#ifndef IP_UNICAST_IF
+#define IP_UNICAST_IF             31 // IP unicast interface.
+#endif
+#ifndef IP_RTHDR
+#define IP_RTHDR                  32 // Set/get IPv6 routing header.
+#endif
+#ifndef IP_GET_IFLIST
+#define IP_GET_IFLIST             33 // Get an interface list.
+#endif
+#ifndef IP_RECVRTHDR
+#define IP_RECVRTHDR              38 // Receive the routing header.
+#endif
+#ifndef IP_TCLASS
+#define IP_TCLASS                 39 // Packet traffic class.
+#endif
+#ifndef IP_RECVTCLASS
+#define IP_RECVTCLASS             40 // Receive packet traffic class.
+#endif
+#ifndef IP_RECVTOS
+#define IP_RECVTOS                40 // Receive packet Type Of Service (TOS).
+#endif
+#ifndef IP_ORIGINAL_ARRIVAL_IF
+#define IP_ORIGINAL_ARRIVAL_IF    47 // Original Arrival Interface Index.
+#endif
+#ifndef IP_ECN
+#define IP_ECN                    50 // Receive ECN codepoints in the IP header.
+#endif
+#ifndef IP_PKTINFO_EX
+#define IP_PKTINFO_EX             51 // Receive extended packet information.
+#endif
+#ifndef IP_WFP_REDIRECT_RECORDS
+#define IP_WFP_REDIRECT_RECORDS   60 // WFP's Connection Redirect Records.
+#endif
+#ifndef IP_WFP_REDIRECT_CONTEXT
+#define IP_WFP_REDIRECT_CONTEXT   70 // WFP's Connection Redirect Context.
+#endif
+#ifndef IP_MTU_DISCOVER
+#define IP_MTU_DISCOVER           71 // Set/get path MTU discover state.
+#endif
+#ifndef IP_MTU
+#define IP_MTU                    73 // Get path MTU.
+#endif
+#ifndef IP_NRT_INTERFACE
+#define IP_NRT_INTERFACE          74 // Set NRT interface constraint (outbound).
+#endif
+#ifndef IP_RECVERR
+#define IP_RECVERR                75 // Receive ICMP errors.
+#endif
+#ifndef IPV6_TCLASS
+#define IPV6_TCLASS 39
+#endif
− network.buildinfo.in
@@ -1,7 +0,0 @@-ghc-options: @EXTRA_CPPFLAGS@-ghc-prof-options: @EXTRA_CPPFLAGS@-ld-options: @LDFLAGS@-cc-options: @EXTRA_CPPFLAGS@-c-sources: @EXTRA_SRCS@-extra-libraries: @EXTRA_LIBS@-install-includes: HsNetworkConfig.h
network.cabal view
@@ -1,105 +1,212 @@-name:           network-version:        2.7.0.2-license:        BSD3-license-file:   LICENSE-maintainer:     Kazu Yamamoto, Evan Borden-synopsis:       Low-level networking interface+cabal-version:      1.18+name:               network+version:            3.2.8.0+license:            BSD3+license-file:       LICENSE+maintainer:         Kazu Yamamoto, Tamar Christina++tested-with:+    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+    GHC == 8.6.5+    GHC == 8.4.4+    GHC == 8.2.2+    GHC == 8.0.2++homepage:           https://github.com/haskell/network+bug-reports:        https://github.com/haskell/network/issues+synopsis:           Low-level networking interface description:-  This package provides a low-level networking interface.-  .-  In network-2.6 the @Network.URI@ module was split off into its own-  package, network-uri-2.6. If you're using the @Network.URI@ module-  you can automatically get it from the right package by adding this-  to your .cabal file:-  .-  > library-  >   build-depends: network-uri-flag-category:       Network-build-type:     Configure-cabal-version:  >=1.8-extra-tmp-files:-  config.log config.status autom4te.cache network.buildinfo-  include/HsNetworkConfig.h+    This package provides a low-level networking interface.+    .+    === High-Level Packages+    Other packages provide higher level interfaces:+    .+    * connection+    * hookup+    * network-simple+    .+    === Extended Packages+    @network@ seeks to provide a cross-platform core for networking. As such some+    APIs live in extended libraries. Packages in the @network@ ecosystem are+    often prefixed with @network-@.+    .+    ==== @network-bsd@+    In @network-3.0.0.0@ the @Network.BSD@ module was split off into its own+    package, @network-bsd-3.0.0.0@.+    .+    ==== @network-uri@+    In @network-2.6@ the @Network.URI@ module was split off into its own package,+    @network-uri-2.6@. If you're using the @Network.URI@ module you can+    automatically get it from the right package by adding this to your @.cabal@+    file:+    .+    > library+    >   build-depends: network-uri-flag++category:           Network+build-type:         Configure++extra-doc-files:+    README.md+    CHANGELOG.md+ extra-source-files:-  README.md CHANGELOG.md-  examples/*.hs tests/*.hs config.guess config.sub install-sh-  configure.ac configure network.buildinfo.in-  include/HsNetworkConfig.h.in include/HsNet.h include/HsNetDef.h-  -- C sources only used on some systems-  cbits/ancilData.c cbits/asyncAccept.c cbits/initWinSock.c-  cbits/winSockErr.c-homepage:       https://github.com/haskell/network-bug-reports:    https://github.com/haskell/network/issues-tested-with:   GHC == 7.4.2-             , GHC == 7.6.3-             , GHC == 7.8.4-             , GHC == 7.10.3-             , GHC == 8.0.2-             , GHC == 8.2.2+    examples/*.hs+    tests/*.hs+    config.guess+    config.sub+    install-sh+    configure.ac+    configure+    include/HsNetworkConfig.h.in+    include/HsNet.h+    include/HsNetDef.h+    include/afunix_compat.h+    cbits/asyncAccept.c+    cbits/initWinSock.c+    cbits/winSockErr.c+    cbits/cmsg.c +extra-tmp-files:+    config.log+    config.status+    autom4te.cache+    network.buildinfo+    include/HsNetworkConfig.h++source-repository head+    type:     git+    location: https://github.com/haskell/network.git++flag devel+    description: using tests for developers+    default:     False+ library-  exposed-modules:-    Network-    Network.BSD-    Network.Socket-    Network.Socket.ByteString-    Network.Socket.ByteString.Lazy-    Network.Socket.Internal-  other-modules:-    Network.Socket.ByteString.Internal-    Network.Socket.Types+    exposed-modules:+        Network.Socket+        Network.Socket.Address+        Network.Socket.ByteString+        Network.Socket.ByteString.Lazy+        Network.Socket.Internal -  if !os(windows)-    other-modules:-      Network.Socket.ByteString.IOVec-      Network.Socket.ByteString.Lazy.Posix-      Network.Socket.ByteString.MsgHdr-  if os(windows)+    build-tools:      hsc2hs >=0+    c-sources:+        cbits/HsNet.c+        cbits/cmsg.c+     other-modules:-      Network.Socket.ByteString.Lazy.Windows+        Network.Socket.Buffer+        Network.Socket.ByteString.IO+        Network.Socket.ByteString.Internal+        Network.Socket.Cbits+        Network.Socket.Fcntl+        Network.Socket.Flag+        Network.Socket.Handle+        Network.Socket.If+        Network.Socket.Imports+        Network.Socket.Info+        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 -  build-depends:-    base >= 4.6 && < 5,-    bytestring < 0.11+    default-language: Haskell2010+    include-dirs:     include+    install-includes: HsNet.h HsNetDef.h alignment.h win32defs.h+    if os(windows)+        install-includes: afunix_compat.h -  if !os(windows)+    ghc-options:      -Wall -fwarn-tabs     build-depends:-      unix >= 2+        base >=4.9 && <5,+        bytestring >=0.10,+        deepseq,+        directory,+        stm -  extensions:-    CPP, DeriveDataTypeable, ForeignFunctionInterface, TypeSynonymInstances-  include-dirs: include-  includes: HsNet.h HsNetDef.h-  install-includes: HsNet.h HsNetDef.h-  c-sources: cbits/HsNet.c-  ghc-options: -Wall -fwarn-tabs+    if !os(windows)+        other-modules:+            Network.Socket.ByteString.Lazy.Posix+            Network.Socket.Posix.Cmsg+            Network.Socket.Posix.CmsgHdr+            Network.Socket.Posix.IOVec+            Network.Socket.Posix.MsgHdr +    if os(solaris)+        cpp-options:     -D__EXTENSIONS__ -D_XOPEN_SOURCE=500+        cc-options:      -D__EXTENSIONS__ -D_XOPEN_SOURCE=500+        extra-libraries:+            nsl+            socket++    if os(windows)+        c-sources:+            cbits/initWinSock.c+            cbits/winSockErr.c+            cbits/asyncAccept.c++        other-modules:+            Network.Socket.ByteString.Lazy.Windows+            Network.Socket.Win32.Cmsg+            Network.Socket.Win32.CmsgHdr+            Network.Socket.Win32.WSABuf+            Network.Socket.Win32.MsgHdr++        extra-libraries:+            ws2_32+            iphlpapi+            mswsock++        if impl(ghc >=7.10)+            cpp-options: -D_WIN32_WINNT=0x0600+            cc-options:  -D_WIN32_WINNT=0x0600++        build-depends:+            temporary++    if impl(ghc >=8)+        default-extensions: Strict StrictData+ test-suite spec-  hs-source-dirs: tests-  main-is: Spec.hs-  other-modules: RegressionSpec-                 SimpleSpec-  type: exitcode-stdio-1.0-  ghc-options: -Wall -threaded-  build-depends:-    base < 5,-    bytestring,-    directory,-    HUnit,-    network,-    hspec+    type:             exitcode-stdio-1.0+    main-is:          Spec.hs+    build-tools:      hspec-discover >=2.6+    hs-source-dirs:   tests+    other-modules:+        Network.Test.Common+        Network.SocketSpec+        Network.Socket.ByteStringSpec+        Network.Socket.ByteString.LazySpec -test-suite doctest-  hs-source-dirs: tests-  main-is: doctests.hs-  type: exitcode-stdio-1.0+    default-language: Haskell2010+    ghc-options:      -Wall -threaded+    build-depends:+        base,+        bytestring,+        directory,+        HUnit,+        network,+        temporary,+        hspec >=2.6,+        QuickCheck -  build-depends:-    base < 5,-    doctest >= 0.10.1+    if flag(devel)+        cpp-options: -DDEVELOPMENT -  ghc-options: -Wall+    if impl(ghc >=8)+        default-extensions: Strict StrictData -source-repository head-  type:     git-  location: git://github.com/haskell/network.git+    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
@@ -0,0 +1,85 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}++module Network.Socket.ByteString.LazySpec (main, spec) where++import Prelude hiding (getContents)++import Control.Monad+import qualified Data.ByteString.Lazy as L+import Network.Socket+import Network.Socket.ByteString.Lazy+import Network.Test.Common++import Test.Hspec++main :: IO ()+main = hspec spec++spec :: Spec+spec = do+    describe "send" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` lazyTestMsg+                client sock = send sock lazyTestMsg+            tcpTest client server++        it "throws when closed" $ do+            let server _ = return ()+                client sock = do+                    close sock+                    send sock lazyTestMsg `shouldThrow` anyException+            tcpTest client server++    describe "sendAll" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` lazyTestMsg+                client sock = sendAll sock lazyTestMsg+            tcpTest client server++        it "throws when closed" $ do+            let server _ = return ()+                client sock = do+                    close sock+                    sendAll sock lazyTestMsg `shouldThrow` anyException+            tcpTest client server++    describe "getContents" $ do+        it "works well" $ do+            let server sock = getContents sock `shouldReturn` lazyTestMsg+                client sock = do+                    void $ send sock lazyTestMsg+                    shutdown sock ShutdownSend+            tcpTest client server++        it "returns empty string at EOF" $ do+            let client s = getContents s `shouldReturn` L.empty+                server s = shutdown s ShutdownSend+            tcpTest client server++    describe "recv" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` lazyTestMsg+                client sock = send sock lazyTestMsg+            tcpTest client server++        it "throws when closed" $ do+            let server sock = do+                    close sock+                    recv sock 1024 `shouldThrow` anyException+                client sock = send sock lazyTestMsg+            tcpTest client server++        it "can treat overflow" $ do+            let server sock = do+                    seg1 <- recv sock (L.length lazyTestMsg - 3)+                    seg2 <- recv sock 1024+                    let msg = L.append seg1 seg2+                    msg `shouldBe` lazyTestMsg+                client sock = send sock lazyTestMsg+            tcpTest client server++        it "returns empty string at EOF" $ do+            let client s = recv s 4096 `shouldReturn` L.empty+                server s = shutdown s ShutdownSend+            tcpTest client server
+ tests/Network/Socket/ByteStringSpec.hs view
@@ -0,0 +1,314 @@+{-# LANGUAGE OverloadedStrings #-}++module Network.Socket.ByteStringSpec (main, spec) where++import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)+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++import System.Environment++import Test.Hspec++main :: IO ()+main = hspec spec++spec :: Spec+spec = do+    describe "send" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` testMsg+                client sock = send sock testMsg+            tcpTest client server++        it "throws when closed" $ do+            let server _ = return ()+                client sock = do+                    close sock+                    send sock testMsg `shouldThrow` anyException+            tcpTest client server++        it "checks -1 correctly on Windows" $ do+            sock <- socket AF_INET Stream defaultProtocol+            send sock "hello world" `shouldThrow` anyException++    describe "sendAll" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` testMsg+                client sock = sendAll sock testMsg+            tcpTest client server++        it "throws when closed" $ do+            let server _ = return ()+                client sock = do+                    close sock+                    sendAll sock testMsg `shouldThrow` anyException+            tcpTest client server++    describe "sendTo" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` testMsg+                client sock addr = sendTo sock testMsg addr+            udpTest client server++        it "throws when closed" $ do+            let server _ = return ()+                client sock addr = do+                    close sock+                    sendTo sock testMsg addr `shouldThrow` anyException+            udpTest client server++    describe "sendAllTo" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` testMsg+                client sock addr = sendAllTo sock testMsg addr+            udpTest client server++        it "throws when closed" $ do+            let server _ = return ()+                client sock addr = do+                    close sock+                    sendAllTo sock testMsg addr `shouldThrow` anyException+            udpTest client server++    describe "sendMany" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` S.append seg1 seg2+                client sock = sendMany sock [seg1, seg2]++                seg1 = C.pack "This is a "+                seg2 = C.pack "test message."+            tcpTest client server++        it "throws when closed" $ do+            let server _ = return ()+                client sock = do+                    close sock+                    sendMany sock [seg1, seg2] `shouldThrow` anyException++                seg1 = C.pack "This is a "+                seg2 = C.pack "test message."+            tcpTest client server++    describe "sendManyTo" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` S.append seg1 seg2+                client sock addr = sendManyTo sock [seg1, seg2] addr++                seg1 = C.pack "This is a "+                seg2 = C.pack "test message."+            udpTest client server++        it "throws when closed" $ do+            let server _ = return ()+                client sock addr = do+                    close sock+                    sendManyTo sock [seg1, seg2] addr `shouldThrow` anyException++                seg1 = C.pack "This is a "+                seg2 = C.pack "test message."+            udpTest client server++    describe "recv" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` testMsg+                client sock = send sock testMsg+            tcpTest client server++        it "throws when closed" $ do+            let server sock = do+                    close sock+                    recv sock 1024 `shouldThrow` anyException+                client sock = send sock testMsg+            tcpTest client server++        it "can treat overflow" $ do+            let server sock = do+                    seg1 <- recv sock (S.length testMsg - 3)+                    seg2 <- recv sock 1024+                    let msg = S.append seg1 seg2+                    msg `shouldBe` testMsg+                client sock = send sock testMsg+            tcpTest client server++        it "returns empty string at EOF" $ do+            let client s = recv s 4096 `shouldReturn` S.empty+                server s = shutdown s ShutdownSend+            tcpTest client server++        it "checks -1 correctly on Windows" $ do+            sock <- socket AF_INET Stream defaultProtocol+            recv sock 1024 `shouldThrow` anyException++    describe "recvFrom" $ do+        it "works well" $ do+            let server sock = do+                    (msg, _) <- recvFrom sock 1024+                    testMsg `shouldBe` msg+                client sock = do+                    addr <- getPeerName sock+                    sendTo sock testMsg addr+            tcpTest client server++        it "throws when closed" $ do+            let server sock = do+                    close sock+                    recvFrom sock 1024 `shouldThrow` anyException+                client sock = do+                    addr <- getPeerName sock+                    sendTo sock testMsg addr+            tcpTest client server++        it "can treat overflow" $ do+            let server sock = do+                    (seg1, _) <- recvFrom sock (S.length testMsg - 3)+                    (seg2, _) <- recvFrom sock 1024+                    let msg = S.append seg1 seg2+                    testMsg `shouldBe` msg+                client sock = send sock testMsg+            tcpTest client server++        it "returns empty string at EOF" $ do+            let server sock = do+                    (seg1, _) <- recvFrom sock (S.length testMsg - 3)+                    seg1 `shouldBe` S.empty+                client sock = shutdown sock ShutdownSend+            tcpTest client server++    describe "sendMsg" $ do+        it "works well" $ do+            let server sock = recv sock 1024 `shouldReturn` S.append seg1 seg2+                client sock addr = sendMsg sock addr [seg1, seg2] [] mempty++                seg1 = C.pack "This is a "+                seg2 = C.pack "test message."+            udpTest client server++        it "throws when closed" $ do+            let server _ = return ()+                client sock addr = do+                    close sock+                    sendMsg sock addr [seg1, seg2] [] mempty `shouldThrow` anyException++                seg1 = C.pack "This is a "+                seg2 = C.pack "test message."+            udpTest client server++    describe "recvMsg" $ do+        it "works well" $ do+            let server sock = do+                    (_, msg, cmsgs, flags) <- recvMsg sock 1024 0 mempty+                    msg `shouldBe` seg+                    cmsgs `shouldBe` []+                    flags `shouldBe` mempty+                client sock addr = sendTo sock seg addr++                seg = C.pack "This is a test message"+            udpTest client server++        it "receives truncated flag" $ do+            let server sock = do+                    (_, _, _, flags) <- recvMsg sock (S.length seg - 2) 0 mempty+                    flags .&. MSG_TRUNC `shouldBe` MSG_TRUNC+                client sock addr = sendTo sock seg addr++                seg = C.pack "This is a test message"+            udpTest client server++        it "peek" $ do+            let server sock = do+                    (_, msgs, _, _flags) <- recvMsg sock 1024 0 MSG_PEEK+                    -- flags .&. MSG_PEEK `shouldBe` MSG_PEEK -- Mac only+                    (_, msgs', _, _) <- recvMsg sock 1024 0 mempty+                    msgs `shouldBe` msgs'+                client sock addr = sendTo sock seg addr++                seg = C.pack "This is a test message"+            udpTest client server++        it "receives control messages for IPv4" $ do+            -- This test behaves strange on AppVeyor and I don't know why so skip+            -- TOS for now.+            isAppVeyor <- isJust <$> lookupEnv "APPVEYOR"++            -- Avoid race condition between the client sending the message and+            -- the server finishing its socket configuration.  Otherwise the+            -- message may be received with default socket options!+            serverReady <- newEmptyMVar++            let server sock = do+                    whenSupported RecvIPv4TTL $ setSocketOption sock RecvIPv4TTL 1+                    whenSupported RecvIPv4PktInfo $ setSocketOption sock RecvIPv4PktInfo 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+                    when (not isAppVeyor) $ do+                        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"+            udpTest client server++        it "receives control messages for IPv6" $ do+            -- Avoid race condition between the client sending the message and+            -- the server finishing its socket configuration.  Otherwise the+            -- message may be received with default socket options!+            serverReady <- newEmptyMVar++            let server sock = do+                    whenSupported RecvIPv6HopLimit $ setSocketOption sock RecvIPv6HopLimit 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+                    whenSupported RecvIPv6TClass $+                        ((lookupCmsg CmsgIdIPv6TClass cmsgs >>= decodeCmsg) :: Maybe IPv6TClass)+                            `shouldNotBe` Nothing+                    whenSupported RecvIPv6PktInfo $+                        ((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"+            udpTest6 client server++        it "receives truncated control messages" $ do+            -- Avoid race condition between the client sending the message and+            -- the server finishing its socket configuration.  Otherwise the+            -- message may be received with default socket options!+            serverReady <- newEmptyMVar++            let server sock = do+                    whenSupported RecvIPv4TTL $ setSocketOption sock RecvIPv4TTL 1+                    whenSupported RecvIPv4TOS $ setSocketOption sock RecvIPv4TOS 1+                    whenSupported RecvIPv4PktInfo $ setSocketOption sock RecvIPv4PktInfo 1+                    putMVar serverReady ()++                    (_, _, _, flags) <- recvMsg sock 1024 10 mempty+                    flags .&. MSG_CTRUNC `shouldBe` MSG_CTRUNC++                client sock addr = takeMVar serverReady >> sendTo sock seg addr++                seg = C.pack "This is a test message"+            udpTest client server
+ tests/Network/SocketSpec.hs view
@@ -0,0 +1,476 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}++module Network.SocketSpec (main, spec) where++import Control.Concurrent (threadDelay, forkIO)+import Control.Concurrent.MVar (readMVar)+import Control.Monad+import Data.Maybe (fromJust)+import Data.List (nub)+import Network.Socket+import Network.Socket.ByteString+import Network.Test.Common+import System.Mem (performGC)+import System.IO.Error (tryIOError)+import System.IO.Temp (withSystemTempDirectory)+import System.Posix.Types (Fd(..))+import Foreign.C.Types ()++import Test.Hspec+import Test.QuickCheck++main :: IO ()+main = hspec spec++spec :: Spec+spec = do+    describe "connect" $ do+        let+          hints = defaultHints { addrSocketType = Stream }+          connect' serverPort = do+              addr:_ <- getAddrInfo (Just hints) (Just serverAddr) (Just $ show serverPort)+              sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+              connect sock (addrAddress addr)+              return sock++        it "fails to connect and throws an IOException" $ do+            connect' (8003 :: Int) `shouldThrow` anyIOException++        it "successfully connects to a socket with no exception" $ do+            withPort $ \portVar -> test (tcp serverAddr return portVar)+                { clientSetup = readMVar portVar >>= connect'+                }++    describe "bind" $ do+        let hints = defaultHints+                { addrFlags = [AI_PASSIVE]+                , addrSocketType = Stream+                }+        it "successfully binds to an ipv4 socket" $ do+            addr:_ <- getAddrInfo (Just hints) (Just serverAddr) Nothing+            sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+            bind sock $ addrAddress addr++{- This does not work on Windows and Linux.+        it "fails to bind to unknown ipv4 socket" $ do+            addr:_ <- getAddrInfo (Just hints) (Just "127.0.0.3") Nothing+            sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+            bind sock (addrAddress addr) `shouldThrow` anyIOException+-}++#ifdef DEVELOPMENT+        it "successfully binds to an ipv6 socket" $ do+            addr:_ <- getAddrInfo (Just hints) (Just serverAddr6) Nothing+            sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+            bind sock $ addrAddress addr++        it "fails to bind to unknown ipv6 socket" $ do+            addr:_ <- getAddrInfo (Just hints) (Just "::6") Nothing+            sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+            bind sock (addrAddress addr) `shouldThrow` anyIOException+#endif++        it "successfully binds to a unix socket" $ do+            withSystemTempDirectory "haskell-network" $ \path -> do+                let sfile = path ++ "/socket-file"+                -- exist <- doesFileExist sfile+                -- when exist $ removeFile sfile+                -- removeFile sfile+                let addr = SockAddrUnix sfile+                when (isSupportedSockAddr addr) $ do+                    sock0 <- socket AF_UNIX Stream defaultProtocol+                    bind sock0 addr+                    listen sock0 1++                    sock1 <- socket AF_UNIX Stream defaultProtocol+                    tryIOError (bind sock1 addr) >>= \o -> case o of+                        Right () -> error "bind should have failed but succeeded"+                        _        -> return ()++                    close sock0+                    close sock1++    describe "UserTimeout" $ do+        it "can be set" $ do+            when (isSupportedSocketOption UserTimeout) $ do+              sock <- socket AF_INET Stream defaultProtocol+              setSocketOption sock UserTimeout 1000+              getSocketOption sock UserTimeout `shouldReturn` 1000+              setSocketOption sock UserTimeout 2000+              getSocketOption sock UserTimeout `shouldReturn` 2000+              close sock++    describe "getAddrInfo" $ do+        it "works for IPv4 address" $ do+            let hints = defaultHints { addrFlags = [AI_NUMERICHOST, AI_ADDRCONFIG] }+            AddrInfo{addrAddress = (SockAddrInet _ hostAddr)}:_ <-+                getAddrInfo (Just hints) (Just "127.128.129.130") Nothing+            hostAddressToTuple hostAddr `shouldBe` (0x7f, 0x80, 0x81, 0x82)++        it "works for IPv6 address" $ do+            let hints = defaultHints { addrFlags = [AI_NUMERICHOST, AI_ADDRCONFIG] }+                host = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"+            AddrInfo{addrAddress = (SockAddrInet6 _ _ hostAddr _)}:_ <-+                getAddrInfo (Just hints) (Just host) Nothing+            hostAddress6ToTuple hostAddr+                `shouldBe` (0x2001, 0x0db8, 0x85a3, 0x0000, 0x0000, 0x8a2e, 0x0370, 0x7334)++        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 :: IO [AddrInfo])++#if defined(mingw32_HOST_OS)+    let lpdevname = "loopback_0"+#elif defined(darwin_HOST_OS) || defined(freebsd_HOST_OS) || defined(openbsd_HOST_OS)+    let lpdevname = "lo0"+#else+    let lpdevname = "lo"+#endif++    describe "ifNameToIndex and ifIndexToName" $ do+        it "convert a name to an index and back" $+            do+            n <- ifNameToIndex lpdevname+            n `shouldNotBe` Nothing+            ifIndexToName (fromJust n) `shouldReturn` Just lpdevname++    describe "socket" $ do+        let gc = do+                threadDelay 100000+                performGC+            connect' = do+                threadDelay 200000+                sock <- socket AF_INET Stream defaultProtocol+                connect sock $ SockAddrInet 6000 $ tupleToHostAddress (127, 0, 0, 1)+        it "should not be GCed while blocking" $ do+            sock <- socket AF_INET Stream defaultProtocol+            setSocketOption sock ReuseAddr 1+            bind sock $ SockAddrInet 6000 $ tupleToHostAddress (127, 0, 0, 1)+            listen sock 1+            _ <- forkIO gc+            _ <- forkIO connect'+            (_sock', addr) <- accept sock+            -- check if an exception is not thrown.+            isSupportedSockAddr addr `shouldBe` True++#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+#endif++#ifdef linux_HOST_OS+            it "can end-to-end with an abstract socket" $ do+                let+                    abstractAddress = toEnum 0:"/haskell/network/abstract"+                    client sock = send sock testMsg+                    server (sock, addr) = do+                        recv sock 1024 `shouldReturn` testMsg+                        addr `shouldBe` (SockAddrUnix "")+                test . setClientAction client $+                    unix abstractAddress (const $ return ()) $ server+            it "safely throws an exception" $ do+                when isUnixDomainSocketAvailable $ do+                    let abstractAddress = toEnum 0:"/haskell/network/abstract-longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong"+                    sock <- socket AF_UNIX Stream defaultProtocol+                    bind sock (SockAddrUnix abstractAddress) `shouldThrow` anyErrorCall+#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+                    (s3, s4) <- socketPair AF_UNIX Stream defaultProtocol+                    withFdSocket s1 $ \fd1 -> void $ sendFd s3 fd1+                    fd1' <- recvFd s4+                    s1' <- mkSocket fd1'+                    void $ send s1' testMsg+                    recv s2 1024 `shouldReturn` testMsg++        -- On various BSD systems the peer credentials are exchanged during+        -- connect(), and this does not happen with `socketpair()`.  Therefore,+        -- we must actually set up a listener and connect, rather than use a+        -- socketpair().+        --+        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+            {- 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+            provided sock is an AF_UNIX socket.  This will fixed some day, but+            we should not fail on those systems in the mean-time.  The upstream+            C-library fix is to call getsockname() and check the address family+            before calling `getpeereid()`.  We could duplicate that in our own+            code, and then this test would work on those platforms that have+            `getpeereid()` and not the SO_PEERCRED socket option.++            it "return nothing for non-UNIX-domain socket" $ do+                when isUnixDomainSocketAvailable $ do+                    s <- socket AF_INET Stream defaultProtocol+                    cred1 <- getPeerCredential s+                    cred1 `shouldBe` (Nothing,Nothing,Nothing)+            -}+#endif++    describe "gracefulClose" $ do+        it "does not send TCP RST back" $ do+            let server sock = do+                    void $ recv sock 1024 -- receiving "GOAWAY"+                    gracefulClose sock 3000+                client sock = do+                    sendAll sock "GOAWAY"+                    threadDelay 10000+                    sendAll sock "PING"+                    threadDelay 10000+                    void $ recv sock 1024+            tcpTest client server++    describe "socketToFd" $ do+        it "socketToFd can send using fd" $ do+            let server sock = do+                    void $ recv sock 1024+                client sock = do+                    fd <- socketToFd sock+                    s <- mkSocket fd+                    sendAll s "HELLO WORLD"+            tcpTest client server++    describe "getNameInfo" $ do+        it "works for IPv4 address" $ do+            let addr = SockAddrInet 80 (tupleToHostAddress (127, 0, 0, 1))+            (hn_m, sn_m) <- getNameInfo [NI_NUMERICHOST, NI_NUMERICSERV] True True addr++            hn_m `shouldBe` (Just "127.0.0.1")+            sn_m `shouldBe` (Just "80")++        it "works for IPv6 address" $ do+            let addr = SockAddrInet6 80 0+                           (tupleToHostAddress6 (0x2001, 0x0db8, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7)) 0+            (hn_m, sn_m) <- getNameInfo [NI_NUMERICHOST, NI_NUMERICSERV] True True addr+            hn_m `shouldBe`(Just "2001:db8:2:3:4:5:6:7")+            sn_m `shouldBe` (Just "80")++        it "works for IPv6 address" $ do+            let addr = SockAddrInet6 80 0+                           (tupleToHostAddress6 (0x2001, 0x0db8, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7)) 0+            (hn_m, sn_m) <- getNameInfo [NI_NUMERICHOST, NI_NUMERICSERV] True True addr+            hn_m `shouldBe`(Just "2001:db8:2:3:4:5:6:7")+            sn_m `shouldBe` (Just "80")++        it "works for global multicast IPv6 address" $ do+            let addr = SockAddrInet6 80 0+                           (tupleToHostAddress6 (0xfe01, 0x0db8, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7)) 0+            (hn_m, sn_m) <- getNameInfo [NI_NUMERICHOST, NI_NUMERICSERV] True True addr+            hn_m `shouldBe`(Just "fe01:db8:2:3:4:5:6:7")+            sn_m `shouldBe` (Just "80")++    describe "show SocketAddr" $ do+        it "works for IPv4 address" $+            let addr = SockAddrInet 80 (tupleToHostAddress (127, 0, 0, 1)) in+            show addr `shouldBe` "127.0.0.1:80"++        it "works for IPv6 address" $+            let addr = SockAddrInet6 80 0+                           (tupleToHostAddress6 (0x2001, 0x0db8, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7)) 0 in+            show addr `shouldBe` "[2001:db8:2:3:4:5:6:7]:80"++        it "works for IPv6 address with zeros" $+            let addr = SockAddrInet6 80 0+                           (tupleToHostAddress6 (0x2001, 0x0db8, 0x2, 0x3, 0x0, 0x0, 0x0, 0x7)) 0 in+            show addr `shouldBe` "[2001:db8:2:3::7]:80"++        it "works for multicast IPv6 address with reserved scope" $ do+            let addr = SockAddrInet6 80 0+                           (tupleToHostAddress6 (0xff01, 0x1234, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7)) 0+            show addr `shouldBe` "[ff01:1234:2:3:4:5:6:7]:80"++    describe "show Family" $ do+        it "works for pattern synonyms" $+            let fam = AF_UNSPEC in+            show fam `shouldBe` "AF_UNSPEC"++        it "works for unsupported" $+            let fam = GeneralFamily (-1) in+            show fam `shouldBe` "UnsupportedFamily"++        it "works for positive values" $+            let fam = GeneralFamily 300 in+            show fam `shouldBe` "GeneralFamily 300"++        it "works for negative values" $+            let fam = GeneralFamily (-300) in+            show fam `shouldBe` "GeneralFamily (-300)"++    describe "show SocketType" $ do+        it "works for pattern synonyms" $+            let socktype = NoSocketType in+            show socktype `shouldBe` "NoSocketType"++        it "works for unsupported" $+            let socktype = GeneralSocketType (-1) in+            show socktype `shouldBe` "UnsupportedSocketType"++        it "works for positive values" $+            let socktype = GeneralSocketType 300 in+            show socktype `shouldBe` "GeneralSocketType 300"++        it "works for negative values" $+            let socktype = GeneralSocketType (-300) in+            show socktype `shouldBe` "GeneralSocketType (-300)"++    describe "show SocketOptions" $ do+        it "works for pattern synonyms" $+            let opt = ReuseAddr in+            show opt `shouldBe` "ReuseAddr"++        it "works for unsupported" $+            let opt = SockOpt (-1) (-1) in+            show opt `shouldBe` "UnsupportedSocketOption"++        it "works for positive values" $+            let opt = SockOpt 300 300 in+            show opt `shouldBe` "SockOpt 300 300"++        it "works for negative values" $+            let opt = SockOpt (-300) (-300) in+            show opt `shouldBe` "SockOpt (-300) (-300)"++    describe "show CmsgId" $ do+        it "works for pattern synonyms" $+            let msgid = CmsgIdIPv6HopLimit in+            show msgid `shouldBe` "CmsgIdIPv6HopLimit"++        it "works for unsupported" $+            let msgid = CmsgId (-1) (-1) in+            show msgid `shouldBe` "UnsupportedCmsgId"++        it "works for positive values" $+            let msgid = CmsgId 300 300 in+            show msgid `shouldBe` "CmsgId 300 300"++        it "works for negative values" $+            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)++        it "holds for SocketType" $ forAll socktypeGen $+            \x -> (read . show $ x) == (x :: SocketType)++        it "holds for SocketOption" $ forAll sockoptGen $+            \x -> (read . show $ x) == (x :: SocketOption)++        it "holds for CmsgId" $ forAll cmsgidGen $+            \x -> (read . show $ x) == (x :: CmsgId)+++-- Type-specific generators with strong bias towards pattern synonyms++-- Generator combinator that biases elements of a given list and otherwise+-- applies a function to a given generator+biasedGen :: (Gen a -> Gen b) -> [b] -> Gen a -> Gen b+biasedGen f xs g = do+    useBias <- (arbitrary :: Gen Bool)+    if useBias+       then elements xs+       else f g++familyGen :: Gen Family+familyGen = biasedGen (fmap GeneralFamily) familyPatterns arbitrary++socktypeGen :: Gen SocketType+socktypeGen = biasedGen (fmap GeneralSocketType) socktypePatterns arbitrary++sockoptGen :: Gen SocketOption+sockoptGen = biasedGen (\g -> SockOpt <$> g <*> g) sockoptPatterns arbitrary++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]+familyPatterns = nub+    [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]++socktypePatterns :: [SocketType]+socktypePatterns = nub+    [ UnsupportedSocketType+    , NoSocketType+    , Stream+    , Datagram+    , Raw+    , RDM+    , SeqPacket+    ]++sockoptPatterns :: [SocketOption]+sockoptPatterns = nub+    [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]++cmsgidPatterns :: [CmsgId]+cmsgidPatterns = nub+    [ UnsupportedCmsgId+    , CmsgIdIPv4TTL+    , CmsgIdIPv6HopLimit+    , CmsgIdIPv4TOS+    , CmsgIdIPv6TClass+    , CmsgIdIPv4PktInfo+    , CmsgIdIPv6PktInfo+    , CmsgIdFds+    ]
+ tests/Network/Test/Common.hs view
@@ -0,0 +1,265 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-}++module Network.Test.Common+  ( -- * Client server configuration+    ClientServer(..)+  , setClientAction+  , setServerAction+  , tcp+  , unix+  , unixWithUnlink+  , udp+  , withPort+  -- * Run a ClientServer configuration+  , test+  , tcpTest+  , tcpTest6+  , udpTest+  , udpTest6+  -- * Common constants+  , serverAddr+  , serverAddr6+  , unixAddr+  , testMsg+  , lazyTestMsg+  ) where++#if __GLASGOW_HASKELL__ < 709+import Control.Applicative ((<$>))+#endif+import Control.Concurrent (ThreadId, forkIO, myThreadId)+import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, takeMVar, readMVar)+import qualified Control.Exception as E+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)+import Test.Hspec++serverAddr :: String+serverAddr = "127.0.0.1"++serverAddr6 :: String+serverAddr6 = "::1"++testMsg :: ByteString+testMsg = "This is a test message."++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+-- client and server.  'unixTest' makes sure that the 'Socket' is+-- closed after the actions have run.+unixWithUnlink :: String -> ((Socket, SockAddr) -> IO b) -> (ClientServer Socket b)+unixWithUnlink address = unix address unlink+  where+    unlink file = do+        exist <- doesFileExist file+        when exist $ removeFile file++unix+    :: String -- ^ address+    -> (String -> IO ()) -- ^ clean up action+    -> ((Socket, SockAddr) -> IO b) -- ^ server action+    -> (ClientServer Socket b)+unix address cleanupAct serverAct = defaultClientServer+    { clientSetup = do+        sock <- socket AF_UNIX Stream defaultProtocol+        connect sock (SockAddrUnix address)+        return sock+    , serverSetup = do+        sock <- socket AF_UNIX Stream defaultProtocol+        cleanupAct address -- just in case+        bind sock (SockAddrUnix address)+        listen sock 1+        return sock+    , serverAction = \sock ->+        E.bracket (accept sock) (killClientSock . fst) serverAct+    }+  where+    killClientSock sock = do+        shutdown sock ShutdownBoth+        close sock+        cleanupAct address++-- | 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+-- client and server.  'tcpTest' makes sure that the 'Socket' is+-- closed after the actions have run.+tcpTest :: (Socket -> IO a) -> (Socket -> IO b) -> IO ()+tcpTest client server = withPort $ test . setClientAction client . tcp serverAddr server++tcpTest6 :: (Socket -> IO a) -> (Socket -> IO b) -> IO ()+tcpTest6 client server = withPort $ test . setClientAction client . tcp serverAddr6 server++tcp :: HostName -> (Socket -> IO b) -> MVar PortNumber -> ClientServer Socket ()+tcp serverAddress serverAct portVar = defaultClientServer+    { clientSetup = do+        serverPort <- readMVar portVar+        addr <- resolveClient Stream serverAddress serverPort+        sock <- socketWithAddrInfo addr+#if !defined(mingw32_HOST_OS)+        withFdSocket sock $ \fd -> do+          getNonBlock fd `shouldReturn` True+          getCloseOnExec fd `shouldReturn` False+#endif+        connect sock $ addrAddress addr+        return sock+    , serverSetup = do+        addr <- resolveServer Stream serverAddress+        sock <- socketWithAddrInfo addr+        withFdSocket sock $ \fd -> do+#if !defined(mingw32_HOST_OS)+          getNonBlock fd `shouldReturn` True+          getCloseOnExec fd `shouldReturn` False+#endif+          setSocketOption sock ReuseAddr 1+          setCloseOnExecIfNeeded fd+#if !defined(mingw32_HOST_OS)+          getCloseOnExec fd `shouldReturn` True+#endif+        bind sock $ addrAddress addr+        listen sock 1+        serverPort <- socketPort sock+        putMVar portVar serverPort+        return sock+    , serverAction = \sock -> do+        (clientSock, _) <- accept sock+#if !defined(mingw32_HOST_OS)+        withFdSocket sock $ \fd -> do+          getNonBlock fd `shouldReturn` True+          getCloseOnExec fd `shouldReturn` True+#endif+        _ <- serverAct clientSock+        close clientSock+    }++-- | Create an unconnected 'Socket' for sending UDP and receiving+-- datagrams and then run 'clientAct' and 'serverAct'.+udpTest :: (Socket -> SockAddr -> IO a) -> (Socket -> IO b) -> IO ()+udpTest client server =+    withPort $ test . setServerAction server . udp serverAddr client++udpTest6 :: (Socket -> SockAddr -> IO a) -> (Socket -> IO b) -> IO ()+udpTest6 client server =+    withPort $ test . setServerAction server . udp serverAddr6 client++udp+    :: HostName+    -> (Socket -> SockAddr -> IO a)+    -> MVar PortNumber+    -> ClientServer a Socket+udp serverAddress clientAct portVar = defaultClientServer+    { clientSetup = do+        addr <- resolveClient Datagram serverAddress 8000 -- dummy port+        socketWithAddrInfo addr+    , clientAction = \sock -> do+        serverPort <- readMVar portVar+        addr <- resolveClient Datagram serverAddress serverPort+        clientAct sock $ addrAddress addr+    , serverSetup = do+        addr <- resolveServer Datagram serverAddress+        sock <- socketWithAddrInfo addr+        setSocketOption sock ReuseAddr 1+        bind sock $ addrAddress addr+        serverPort <- socketPort sock+        putMVar portVar serverPort+        return sock+    }++data ClientServer a b+    = ClientServer+    { clientSetup :: IO Socket+    , clientAction :: Socket -> IO a+    , serverSetup :: IO Socket+    , serverAction :: Socket -> IO b+    }++setClientAction+    :: (Socket -> IO b)+    -> ClientServer a c+    -> ClientServer b c+setClientAction f c = c { clientAction = f }++setServerAction+    :: (Socket -> IO c)+    -> ClientServer a b+    -> ClientServer a c+setServerAction f c = c { serverAction = f }++defaultClientServer :: ClientServer Socket Socket+defaultClientServer = ClientServer+    { clientSetup =+        E.throwIO $ userError "no client setup defined"+    , clientAction = return+    , serverSetup = E.throwIO $ userError "no server setup defined"+    , serverAction = return+    }++-- | Run a client/server pair and synchronize them so that the server+-- is started before the client and the specified server action is+-- finished before the client closes the 'Socket'.+test :: ClientServer a b -> IO ()+test conf = do+    tid <- myThreadId+    barrier <- newEmptyMVar+    _ <- forkIO $ server tid barrier+    client tid barrier+  where+    server tid barrier =+        bracketWithReraise tid (serverSetup conf) close $ \sock -> do+        serverReady+        Just _ <- timeout 1000000 $ (serverAction conf) sock+        putMVar barrier ()+      where+        -- | Signal to the client that it can proceed.+        serverReady = putMVar barrier ()+    client tid barrier = do+        takeMVar barrier+        -- Transfer exceptions to the main thread.+        bracketWithReraise tid (clientSetup conf) close $ \res -> do+            Just _ <- timeout 1000000 $ (clientAction conf) res+            takeMVar barrier++withPort :: (MVar PortNumber -> IO a) -> IO a+withPort f = f =<< newEmptyMVar++-- | Like 'bracket' but catches and reraises the exception in another+-- thread, specified by the first argument.+bracketWithReraise :: ThreadId -> IO a -> (a -> IO b) -> (a -> IO ()) -> IO ()+bracketWithReraise tid setup teardown thing =+    E.bracket setup teardown thing+    `E.catch` \ (e :: E.SomeException) -> E.throwTo tid e++resolveClient :: SocketType -> HostName -> PortNumber -> IO AddrInfo+resolveClient socketType host port =+    NE.head <$> getAddrInfo (Just hints) (Just host) (Just $ show port)+  where+    hints = defaultHints {+        addrSocketType = socketType+      , addrFlags = [AI_NUMERICHOST]+      }++resolveServer :: SocketType -> HostName -> IO AddrInfo+resolveServer socketType host =+    NE.head <$> getAddrInfo (Just hints) (Just host) Nothing+  where+    hints = defaultHints {+        addrSocketType = socketType+      , addrFlags = [AI_PASSIVE]+      }++socketWithAddrInfo :: AddrInfo -> IO Socket+socketWithAddrInfo addr = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
− tests/RegressionSpec.hs
@@ -1,29 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--- | Tests for things that didn't work in the past.-module RegressionSpec (main, spec) where--import Control.Monad-import Network.Socket hiding (send, sendTo, recv, recvFrom)-import Network.Socket.ByteString--import Test.Hspec--main :: IO ()-main = hspec spec--spec :: Spec-spec = do-    describe "getAddrInfo" $ do-        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--    describe "Network.Socket.ByteString.recv" $ do-        it "checks -1 correctly on Windows" $ do-            sock <- socket AF_INET Stream defaultProtocol-            recv sock 1024 `shouldThrow` anyException--    describe "Network.Socket.ByteString.send" $ do-        it "checks -1 correctly on Windows" $ do-            sock <- socket AF_INET Stream defaultProtocol-            send sock "hello world" `shouldThrow` anyException
− tests/SimpleSpec.hs
@@ -1,344 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ScopedTypeVariables #-}--module SimpleSpec (main, spec) where--import Control.Concurrent (ThreadId, forkIO, myThreadId)-import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar, readMVar)-import qualified Control.Exception as E-import Control.Monad-import Data.ByteString (ByteString)-import qualified Data.ByteString as S-import qualified Data.ByteString.Char8 as C-import qualified Data.ByteString.Lazy as L-import Network.Socket hiding (send, sendTo, recv, recvFrom)-import Network.Socket.ByteString-import qualified Network.Socket.ByteString.Lazy as Lazy-import System.Directory-import System.Timeout (timeout)--import Test.Hspec--main :: IO ()-main = hspec spec--spec :: Spec-spec = do-    describe "send" $ do-        it "works well" $ do-            let server sock = recv sock 1024 `shouldReturn` testMsg-                client sock = send sock testMsg-            tcpTest client server--    describe "sendAll" $ do-        it "works well" $ do-            let server sock = recv sock 1024 `shouldReturn` testMsg-                client sock = sendAll sock testMsg-            tcpTest client server--    describe "Lazy.sendAll" $ do-        it "works well" $ do-            let server sock = recv sock 1024 `shouldReturn` testMsg-                client sock = Lazy.sendAll sock $ L.fromChunks [testMsg]-            tcpTest client server--    describe "sendTo" $ do-        it "works well" $ do-            let server sock = recv sock 1024 `shouldReturn` testMsg-                client sock serverPort = do-                    let hints = defaultHints { addrFlags = [AI_NUMERICHOST], addrSocketType = Datagram }-                    addr:_ <- getAddrInfo (Just hints) (Just serverAddr) (Just $ show serverPort)-                    sendTo sock testMsg $ addrAddress addr-            udpTest client server--    describe "sendAllTo" $ do-        it "works well" $ do-            let server sock = recv sock 1024 `shouldReturn` testMsg-                client sock serverPort = do-                    let hints = defaultHints { addrFlags = [AI_NUMERICHOST], addrSocketType = Datagram }-                    addr:_ <- getAddrInfo (Just hints) (Just serverAddr) (Just $ show serverPort)-                    sendAllTo sock testMsg $ addrAddress addr-            udpTest client server--    describe "sendMany" $ do-        it "works well" $ do-            let server sock = recv sock 1024 `shouldReturn` (S.append seg1 seg2)-                client sock = sendMany sock [seg1, seg2]--                seg1 = C.pack "This is a "-                seg2 = C.pack "test message."-            tcpTest client server--    describe "sendManyTo" $ do-        it "works well" $ do-            let server sock = recv sock 1024 `shouldReturn` (S.append seg1 seg2)-                client sock serverPort = do-                    let hints = defaultHints { addrFlags = [AI_NUMERICHOST], addrSocketType = Datagram }-                    addr:_ <- getAddrInfo (Just hints) (Just serverAddr) (Just $ show serverPort)-                    sendManyTo sock [seg1, seg2] $ addrAddress addr--                seg1 = C.pack "This is a "-                seg2 = C.pack "test message."-            udpTest client server--    describe "recv" $ do-        it "works well" $ do-            let server sock = recv sock 1024 `shouldReturn` testMsg-                client sock = send sock testMsg-            tcpTest client server--        it "can treat overflow" $ do-            let server sock = do seg1 <- recv sock (S.length testMsg - 3)-                                 seg2 <- recv sock 1024-                                 let msg = S.append seg1 seg2-                                 msg `shouldBe` testMsg-                client sock = send sock testMsg-            tcpTest client server--        it "returns empty string at EOF" $ do-            let client s = recv s 4096 `shouldReturn` S.empty-                server s = shutdown s ShutdownSend-            tcpTest client server--    describe "recvFrom" $ do-        it "works well" $ do-            let server sock = do (msg, _) <- recvFrom sock 1024-                                 testMsg `shouldBe` msg-                client sock = do-                    addr <- getPeerName sock-                    sendTo sock testMsg addr-            tcpTest client server-        it "can treat overflow" $ do-            let server sock = do (seg1, _) <- recvFrom sock (S.length testMsg - 3)-                                 (seg2, _) <- recvFrom sock 1024-                                 let msg = S.append seg1 seg2-                                 testMsg `shouldBe` msg--                client sock = send sock testMsg-            tcpTest client server--    describe "UserTimeout" $ do-        it "can be set" $ do-            when (isSupportedSocketOption UserTimeout) $ do-              sock <- socket AF_INET Stream defaultProtocol-              setSocketOption sock UserTimeout 1000-              getSocketOption sock UserTimeout `shouldReturn` 1000-              setSocketOption sock UserTimeout 2000-              getSocketOption sock UserTimeout `shouldReturn` 2000-              close sock--    -- On various BSD systems the peer credentials are exchanged during-    -- connect(), and this does not happen with `socketpair()`.  Therefore,-    -- we must actually set up a listener and connect, rather than use a-    -- socketpair().-    ---    describe "getPeerCredential" $ do-        it "can return something" $ do-            when isUnixDomainSocketAvailable $ 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 client sock = do-                        (_, uid, _) <- getPeerCredential sock-                        uid `shouldNotBe` Nothing-                    server (sock, _) = do-                        (_, uid, _) <- getPeerCredential sock-                        uid `shouldNotBe` Nothing-                unixTest client 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-           provided sock is an AF_UNIX socket.  This will fixed some day, but-           we should not fail on those systems in the mean-time.  The upstream-           C-library fix is to call getsockname() and check the address family-           before calling `getpeereid()`.  We could duplicate that in our own-           code, and then this test would work on those platforms that have-           `getpeereid()` and not the SO_PEERCRED socket option.--        it "return nothing for non-UNIX-domain socket" $ do-            when isUnixDomainSocketAvailable $ do-                s <- socket AF_INET Stream defaultProtocol-                cred1 <- getPeerCredential s-                cred1 `shouldBe` (Nothing,Nothing,Nothing)-        -}--    describe "getAddrInfo" $ do-        it "works for IPv4 address" $ do-            let hints = defaultHints { addrFlags = [AI_NUMERICHOST, AI_ADDRCONFIG] }-            AddrInfo{addrAddress = (SockAddrInet _ hostAddr)}:_ <--                getAddrInfo (Just hints) (Just "127.128.129.130") Nothing-            hostAddressToTuple hostAddr `shouldBe` (0x7f, 0x80, 0x81, 0x82)-#if defined(IPV6_SOCKET_SUPPORT)-        it "works for IPv6 address" $ do-            let hints = defaultHints { addrFlags = [AI_NUMERICHOST, AI_ADDRCONFIG] }-                host = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"-            AddrInfo{addrAddress = (SockAddrInet6 _ _ hostAddr _)}:_ <--                getAddrInfo (Just hints) (Just host) Nothing-            hostAddress6ToTuple hostAddr-                `shouldBe` (0x2001, 0x0db8, 0x85a3, 0x0000, 0x0000, 0x8a2e, 0x0370, 0x7334)-#endif----------------------------------------------------------------------------serverAddr :: String-serverAddr = "127.0.0.1"--testMsg :: ByteString-testMsg = "This is a test message."--unixAddr :: String-unixAddr = "/tmp/network-test"----------------------------------------------------------------------------- Test helpers---- | 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--- client and server.  'unixTest' makes sure that the 'Socket' is--- closed after the actions have run.-unixTest :: (Socket -> IO a) -> ((Socket, SockAddr) -> IO b) -> IO ()-unixTest clientAct serverAct = do-    test clientSetup clientAct serverSetup server-  where-    clientSetup = do-        sock <- socket AF_UNIX Stream defaultProtocol-        connect sock (SockAddrUnix unixAddr)-        return sock--    serverSetup = do-        sock <- socket AF_UNIX Stream defaultProtocol-        unlink unixAddr -- just in case-        bind sock (SockAddrUnix unixAddr)-        listen sock 1-        return sock--    server sock = E.bracket (accept sock) (killClientSock . fst) serverAct--    unlink file = do-        exist <- doesFileExist file-        when exist $ removeFile file--    killClientSock sock = do-        shutdown sock ShutdownBoth-        close sock-        unlink unixAddr---- | 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--- client and server.  'tcpTest' makes sure that the 'Socket' is--- closed after the actions have run.-tcpTest :: (Socket -> IO a) -> (Socket -> IO b) -> IO ()-tcpTest clientAct serverAct = do-    portVar <- newEmptyMVar-    test (clientSetup portVar) clientAct (serverSetup portVar) server-  where-    clientSetup portVar = do-        let hints = defaultHints { addrSocketType = Stream }-        serverPort <- readMVar portVar-        addr:_ <- getAddrInfo (Just hints) (Just serverAddr) (Just $ show serverPort)-        sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)-#if !defined(mingw32_HOST_OS)-        let fd = fdSocket sock-        getNonBlock fd `shouldReturn` True-        getCloseOnExec fd `shouldReturn` False-#endif-        connect sock $ addrAddress addr-        return sock--    serverSetup portVar = do-        let hints = defaultHints {-                addrFlags = [AI_PASSIVE]-              , addrSocketType = Stream-              }-        addr:_ <- getAddrInfo (Just hints) (Just serverAddr) Nothing-        sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)-        let fd = fdSocket sock-#if !defined(mingw32_HOST_OS)-        getNonBlock fd `shouldReturn` True-        getCloseOnExec fd `shouldReturn` False-#endif-        setSocketOption sock ReuseAddr 1-        setCloseOnExecIfNeeded fd-#if !defined(mingw32_HOST_OS)-        getCloseOnExec fd `shouldReturn` True-#endif-        bind sock $ addrAddress addr-        listen sock 1-        serverPort <- socketPort sock-        putMVar portVar serverPort-        return sock--    server sock = do-        (clientSock, _) <- accept sock-#if !defined(mingw32_HOST_OS)-        let fd = fdSocket clientSock-        getNonBlock fd `shouldReturn` True-        getCloseOnExec fd `shouldReturn` True-#endif-        _ <- serverAct clientSock-        close clientSock---- | Create an unconnected 'Socket' for sending UDP and receiving--- datagrams and then run 'clientAct' and 'serverAct'.-udpTest :: (Socket -> PortNumber -> IO a) -> (Socket -> IO b) -> IO ()-udpTest clientAct serverAct = do-    portVar <- newEmptyMVar-    test clientSetup (client portVar) (serverSetup portVar) serverAct-  where-    clientSetup = socket AF_INET Datagram defaultProtocol--    client portVar sock = do-        serverPort <- readMVar portVar-        clientAct sock serverPort--    serverSetup portVar = do-        let hints = defaultHints {-                addrFlags = [AI_PASSIVE]-              , addrSocketType = Datagram-              }-        addr:_ <- getAddrInfo (Just hints) (Just serverAddr) Nothing-        sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)-        setSocketOption sock ReuseAddr 1-        bind sock $ addrAddress addr-        serverPort <- socketPort sock-        putMVar portVar serverPort-        return sock---- | Run a client/server pair and synchronize them so that the server--- is started before the client and the specified server action is--- finished before the client closes the 'Socket'.-test :: IO Socket -> (Socket -> IO b) -> IO Socket -> (Socket -> IO c) -> IO ()-test clientSetup clientAct serverSetup serverAct = do-    tid <- myThreadId-    barrier <- newEmptyMVar-    _ <- forkIO $ server barrier-    client tid barrier-  where-    server barrier = do-        E.bracket serverSetup close $ \sock -> do-            serverReady-            Just _ <- timeout 1000000 $ serverAct sock-            putMVar barrier ()-      where-        -- | Signal to the client that it can proceed.-        serverReady = putMVar barrier ()--    client tid barrier = do-        takeMVar barrier-        -- Transfer exceptions to the main thread.-        bracketWithReraise tid clientSetup close $ \res -> do-            Just _ <- timeout 1000000 $ clientAct res-            takeMVar barrier---- | Like 'bracket' but catches and reraises the exception in another--- thread, specified by the first argument.-bracketWithReraise :: ThreadId -> IO a -> (a -> IO b) -> (a -> IO ()) -> IO ()-bracketWithReraise tid setup teardown thing =-    E.bracket setup teardown thing-    `E.catch` \ (e :: E.SomeException) -> E.throwTo tid e
− tests/doctests.hs
@@ -1,20 +0,0 @@-import Test.DocTest--main :: IO ()-main = doctest [-    "-i"-  , "-idist/build"-  , "-i."-  , "-idist/build/autogen"-  , "-Idist/build/autogen"-  , "-Idist/build"-  , "-Iinclude"-  , "-optP-include"-  , "-optPdist/build/autogen/cabal_macros.h"-  , "-DCALLCONV=ccall"-  , "-XCPP"-  , "-XDeriveDataTypeable"-  , "-package-db dist/package.conf.inplace"-  , "-package network"-  , "Network"-  ]