packages feed

network 2.3.0.2 → 3.2.8.0

raw patch · 78 files changed

Files

+ CHANGELOG.md view
@@ -0,0 +1,431 @@+# 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"+   [#330](https://github.com/haskell/network/pull/330)+* "close" does not throw exceptions. A new API: "close'" throws+   exceptions when necessary.+   [#337](https://github.com/haskell/network/pull/337)+* Fixing the hang of lazy sendAll.+   [#340](https://github.com/haskell/network/pull/340)+* Installing NetDef.h (#334)+   [#334](https://github.com/haskell/network/pull/334)++## Version 2.7.0.1++ * A new API: socketPortSafe.+   [#319](https://github.com/haskell/network/pull/319)+ * Fixing a drain bug of sendAll.+   [#320](https://github.com/haskell/network/pull/320)+ * Porting the new CALLCONV convention from master.+   [#313](https://github.com/haskell/network/pull/313)+ * Withdrawing the deprecations of packFamily and unpackFamily.+   [#324](https://github.com/haskell/network/pull/324)++## Version 2.7.0.0++ * Obsoleting the Network module.+ * Obsoleting the Network.BSD module.+ * Obsoleting APIs: MkSocket, htonl, ntohl,+              getPeerCred, getPeerEid,+              send, sendTo, recv, recvFrom, recvLen,+              inet_addr, inet_ntoa,+              isConnected, isBound, isListening, isReadable, isWritable,+              aNY_PORT, iNADDR_ANY, iN6ADDR_ANY, sOMAXCONN,+              sOL_SOCKET, sCM_RIGHTS,+              packFamily, unpackFamily, packSocketType+ * 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+ * New APIs: isUnixDomainSocketAvailable and getPeerCredential+ * socketPair, sendFd and recvFd are exported even on Windows.++## Version 2.6.3.5++ * Reverting "Do not closeFd within sendFd"+   [#271](https://github.com/haskell/network/pull/271)++## Version 2.6.3.4++ * Don't touch IPv6Only when running on OpenBSD+   [#227](https://github.com/haskell/network/pull/227)+ * Do not closeFd within sendFd+   [#271](https://github.com/haskell/network/pull/271)+ * Updating examples and docs.++## Version 2.6.3.3++ * Adds a function to show the defaultHints without reading their undefined fields+   [#291](https://github.com/haskell/network/pull/292)+ * Improve exception error messages for getAddrInfo and getNameInfo+   [#289](https://github.com/haskell/network/pull/289)++## Version 2.6.3.2++ * Zero memory of `sockaddr_un` if abstract socket+   [#220](https://github.com/haskell/network/pull/220)++ * Improving error messages+   [#232](https://github.com/haskell/network/pull/232)++ * Allow non-blocking file descriptors via `setNonBlockIfNeeded`+   [#242](https://github.com/haskell/network/pull/242)++ * Update config.{guess,sub} to latest version+   [#244](https://github.com/haskell/network/pull/244)++ * Rename `my_inet_ntoa` to avoid symbol conflicts+   [#228](https://github.com/haskell/network/pull/228)++ * Test infrastructure improvements+   [#219](https://github.com/haskell/network/pull/219)+   [#217](https://github.com/haskell/network/pull/217)+   [#218](https://github.com/haskell/network/pull/218)++ * House keeping and cleanup+   [#238](https://github.com/haskell/network/pull/238)+   [#237](https://github.com/haskell/network/pull/237)++## Version 2.6.3.1++ * Reverse breaking exception change in `Network.Socket.ByteString.recv`+   [#215](https://github.com/haskell/network/issues/215)++## Version 2.6.3.0++ * New maintainers: Evan Borden (@eborden) and Kazu Yamamoto (@kazu-yamamoto).+   The maintainer for a long period, Johan Tibell (@tibbe) stepped down.+   Thank you, Johan, for your hard work for a long time.++ * New APIs: ntohl, htonl,hostAddressToTuple{,6} and tupleToHostAddress{,6}.+   [#210](https://github.com/haskell/network/pull/210)++ * Added a Read instance for PortNumber. [#145](https://github.com/haskell/network/pull/145)++ * We only set the IPV6_V6ONLY flag to 0 for stream and datagram socket types,+   as opposed to all of them. This makes it possible to use ICMPv6.+   [#180](https://github.com/haskell/network/pull/180)+   [#181](https://github.com/haskell/network/pull/181)++ * Work around GHC bug #12020. Socket errors no longer cause segfaults or+   hangs on Windows. [#192](https://github.com/haskell/network/pull/192)++ * Various documentation improvements and the deprecated pragmas.+   [#186](https://github.com/haskell/network/pull/186)+   [#201](https://github.com/haskell/network/issues/201)+   [#205](https://github.com/haskell/network/pull/205)+   [#206](https://github.com/haskell/network/pull/206)+   [#211](https://github.com/haskell/network/issues/211)++ * Various internal improvements.+   [#193](https://github.com/haskell/network/pull/193)+   [#200](https://github.com/haskell/network/pull/200)++## Version 2.6.2.1++ * Regenerate configure and `HsNetworkConfig.h.in`.++ * Better detection of CAN sockets.++## Version 2.6.2.0++ * Add support for `TCP_USER_TIMEOUT`.++ * Don't conditionally export the `SockAddr` constructors.++ * Add `isSupportSockAddr` to allow checking for supported address types+   at runtime.
− Network.hs
@@ -1,450 +0,0 @@-{-# LANGUAGE CPP #-}--------------------------------------------------------------------------------- |--- 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------ The "Network" interface is a \"higher-level\" interface to--- networking facilities, and it is recommended unless you need the--- lower-level interface in "Network.Socket".-----------------------------------------------------------------------------------#include "HsNetworkConfig.h"--#ifdef HAVE_GETADDRINFO--- Use IPv6-capable function definitions if the OS supports it.-#define IPV6_SOCKET_SUPPORT 1-#endif--module Network (--	-- * Basic data types-	Socket,-        PortID(..),-	HostName,-	PortNumber,	-- instance (Eq, Enum, Num, Real, Integral)--	-- * Initialisation-	withSocketsDo,  -- :: IO a   -> IO a-	-	-- * Server-side connections-	listenOn,	-- :: PortID -> IO Socket-	accept,		-- :: Socket -> IO (Handle, HostName, PortNumber)-        sClose,		-- :: Socket -> IO ()--	-- * Client-side connections-	connectTo,	-- :: HostName -> PortID -> IO Handle--	-- * Simple sending and receiving-	{-$sendrecv-}-	sendTo,		-- :: HostName -> PortID -> String -> IO ()-	recvFrom,	-- :: HostName -> PortID -> IO String--	-- * Miscellaneous-	socketPort,	-- :: Socket -> IO PortID--	-- * Networking Issues-	-- ** Buffering-	{-$buffering-}--	-- ** Improving I\/O Performance over sockets-	{-$performance-}--	-- ** @SIGPIPE@-	{-$sigpipe-}--       ) where--import Control.Monad (liftM)-import Data.Maybe (fromJust)-import Network.BSD-import Network.Socket hiding ( accept, socketPort, recvFrom, sendTo, PortNumber )-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) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)-	| UnixSocket String		-- Unix family socket in file system-#endif---- | 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' hostname serv--connectTo hostname (PortNumber port) = connect' 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) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)-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' :: HostName -> ServiceName -> IO Handle--connect' host serv = do-    proto <- getProtocolNumber "tcp"-    let hints = defaultHints { addrFlags = [AI_ADDRCONFIG]-                             , addrProtocol = proto-                             , addrSocketType = Stream }-    addrs <- getAddrInfo (Just hints) (Just host) (Just serv)-    let addr = head addrs-    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.  ------ NOTE: To avoid the \"Address already in use\"--- problems popped up several times on the GHC-Users mailing list we--- set the 'ReuseAddr' socket option on the listening socket.  If you--- don't want this behaviour, please use the lower level--- 'Network.Socket.listen' instead.--listenOn :: PortID 	-- ^ Port Identifier-	 -> IO Socket	-- ^ Connected 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-	    bindSocket 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-	    bindSocket sock (SockAddrInet port iNADDR_ANY)-	    listen sock maxListenQueue-	    return sock-	)-#endif--#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)-listenOn (UnixSocket path) =-    bracketOnError-    	(socket AF_UNIX Stream 0)-	(sClose)-	(\sock -> do-	    setSocketOption sock ReuseAddr 1-	    bindSocket sock (SockAddrUnix path)-	    listen sock maxListenQueue-	    return sock-	)-#endif--#if defined(IPV6_SOCKET_SUPPORT)-listen' :: ServiceName -> IO Socket--listen' serv = do-    proto <- getProtocolNumber "tcp"-    let hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_PASSIVE]-                             , addrSocketType = Stream-                             , addrProtocol = proto }-    addrs <- getAddrInfo (Just hints) Nothing (Just serv)-    let addr = head addrs-    bracketOnError-        (socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr))-	(sClose)-	(\sock -> do-	    setSocketOption sock ReuseAddr 1-	    bindSocket 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) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)-                 SockAddrUnix      a   -> return a-# endif-                 a                     -> return (show a)- 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) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)-accept sock@(MkSocket _ AF_UNIX _ _ _) = do- ~(sock', (SockAddrUnix path)) <- Socket.accept sock- handle <- socketToHandle sock' ReadWriteMode- return (handle, path, -1)-#endif-accept sock@(MkSocket _ family _ _ _) =-  error $ "Sorry, address family " ++ (show family) ++ " is not supported!"---- -------------------------------------------------------------------------------- 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-    return (portID sockaddr)-  where-   portID sa =-    case sa of-     SockAddrInet port _      -> PortNumber port-#if defined(IPV6_SOCKET_SUPPORT)-     SockAddrInet6 port _ _ _ -> PortNumber port-#endif-#if !defined(mingw32_HOST_OS) && !defined(cygwin32_HOST_OS) && !defined(_WIN32)-     SockAddrUnix path	      -> UnixSocket path-#endif---- ------------------------------------------------------------------------------ Utils--#if __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ < 606--- 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 before after thing =-  Exception.block (do-    a <- before-    r <- Exception.catch-           (Exception.unblock (thing a))-           (\e -> do { after a; Exception.throw e })-    return r- )-#else-bracketOnError = Exception.bracketOnError-#endif---------------------------------------------------------------------------------- Extra documentation--{-$buffering--The 'Handle' returned by 'connectTo' and 'accept' is block-buffered by-default.  For an interactive application you may want to set the-buffering mode on the 'Handle' to-'LineBuffering' or 'NoBuffering', 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".--}--{-$sigpipe--On Unix, when writing to a socket and the reading end is-closed by the remote client, the program is normally sent a-@SIGPIPE@ signal by the operating system.  The-default behaviour when a @SIGPIPE@ is received is-to terminate the program silently, which can be somewhat confusing-if you haven't encountered this before.  The solution is to-specify that @SIGPIPE@ is to be ignored, using-the POSIX library:-->  import Posix->  main = do installHandler sigPIPE Ignore Nothing; ...--}--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-
− Network/BSD.hsc
@@ -1,582 +0,0 @@-{-# LANGUAGE CPP, ForeignFunctionInterface #-}--------------------------------------------------------------------------------- |--- 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"---- NOTE: ##, we want this interpreted when compiling the .hs, not by hsc2hs.-##include "Typeable.h"--module Network.BSD (-       -    -- * Host names-    HostName,-    getHostName,	    -- :: IO HostName--    HostEntry(..),-    getHostByName,	    -- :: HostName -> IO HostEntry-    getHostByAddr,	    -- :: HostAddress -> Family -> IO HostEntry-    hostAddress,	    -- :: HostEntry -> HostAddress--#if defined(HAVE_GETHOSTENT) && !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)-    getHostEntries,	    -- :: Bool -> IO [HostEntry]-    -- ** Low level functionality-    setHostEntry,	    -- :: Bool -> IO ()-    getHostEntry,	    -- :: IO HostEntry-    endHostEntry,	    -- :: IO ()-#endif--    -- * Service names-    ServiceEntry(..),-    ServiceName,-    getServiceByName,	    -- :: ServiceName -> ProtocolName -> IO ServiceEntry-    getServiceByPort,       -- :: PortNumber  -> ProtocolName -> IO ServiceEntry-    getServicePortNumber,   -- :: ServiceName -> IO PortNumber--#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)-    getServiceEntries,	    -- :: Bool -> IO [ServiceEntry]-    -- ** Low level functionality-    getServiceEntry,	    -- :: IO ServiceEntry-    setServiceEntry,	    -- :: Bool -> IO ()-    endServiceEntry,	    -- :: IO ()-#endif--    -- * Protocol names-    ProtocolName,-    ProtocolNumber,-    ProtocolEntry(..),-    getProtocolByName,	    -- :: ProtocolName   -> IO ProtocolEntry-    getProtocolByNumber,    -- :: ProtocolNumber -> IO ProtcolEntry-    getProtocolNumber,	    -- :: ProtocolName   -> ProtocolNumber-    defaultProtocol,        -- :: ProtocolNumber--#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)-    getProtocolEntries,	    -- :: Bool -> IO [ProtocolEntry]-    -- ** Low level functionality-    setProtocolEntry,	    -- :: Bool -> IO ()-    getProtocolEntry,	    -- :: IO ProtocolEntry-    endProtocolEntry,	    -- :: IO ()-#endif--    -- * Port numbers-    PortNumber,--    -- * Network names-    NetworkName,-    NetworkAddr,-    NetworkEntry(..)--#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)-    , getNetworkByName	    -- :: NetworkName -> IO NetworkEntry-    , getNetworkByAddr      -- :: NetworkAddr -> Family -> IO NetworkEntry-    , getNetworkEntries     -- :: Bool -> IO [NetworkEntry]-    -- ** Low level functionality-    , setNetworkEntry	    -- :: Bool -> IO ()-    , getNetworkEntry	    -- :: IO NetworkEntry-    , endNetworkEntry	    -- :: IO ()-#endif-    ) where--#ifdef __HUGS__-import Hugs.Prelude ( IOException(..), IOErrorType(..) )-#endif-import Network.Socket--import Control.Concurrent 	( MVar, newMVar, withMVar )-import Foreign.C.Error ( throwErrnoIfMinus1, throwErrnoIfMinus1_ )-import Foreign.C.String ( CString, peekCString, peekCStringLen, withCString )-import Foreign.C.Types ( CInt, CULong, CChar, CSize, CShort )-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-import System.IO.Unsafe ( unsafePerformIO )--#ifdef __GLASGOW_HASKELL__-# if __GLASGOW_HASKELL__ >= 611-import GHC.IO.Exception-# else-import GHC.IOBase-# endif-#endif--import Control.Monad ( liftM )---- ------------------------------------------------------------------------------ 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)--INSTANCE_TYPEABLE0(ServiceEntry,serviceEntryTc,"ServiceEntry")--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_WINSOCK_H) && !defined(cygwin32_HOST_OS)-                        servicePort     = PortNum (fromIntegral (s_port :: CShort)),-#else-                           -- s_port is already in network byte order, but it-                           -- might be the wrong size.-                        servicePort     = PortNum (fromIntegral (s_port :: CInt)),-#endif-                        serviceProtocol = s_proto-                })--   poke p = error "Storable.poke(BSD.ServiceEntry) not implemented"----- | 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 "getServiceByName" "no such service entry"-   $ (trySysCall (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 (PortNum port) proto = withLock $ do- withCString proto $ \ cstr_proto -> do- throwNoSuchThingIfNull "getServiceByPort" "no such service entry"-   $ (trySysCall (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(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)-getServiceEntry	:: IO ServiceEntry-getServiceEntry = withLock $ do- throwNoSuchThingIfNull "getServiceEntry" "no such service entry"-   $ trySysCall c_getservent- >>= peek--foreign import ccall unsafe "getservent" c_getservent :: IO (Ptr ServiceEntry)--setServiceEntry	:: Bool -> IO ()-setServiceEntry flg = withLock $ trySysCall $ c_setservent (fromBool flg)--foreign import ccall unsafe  "setservent" c_setservent :: CInt -> IO ()--endServiceEntry	:: IO ()-endServiceEntry = withLock $ trySysCall $ 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)--INSTANCE_TYPEABLE0(ProtocolEntry,protocolEntryTc,"ProtocolEntry")--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_WINSOCK_H) && !defined(cygwin32_HOST_OS)-         -- 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 p = error "Storable.poke(BSD.ProtocolEntry) not implemented"--getProtocolByName :: ProtocolName -> IO ProtocolEntry-getProtocolByName name = withLock $ do- withCString name $ \ name_cstr -> do- throwNoSuchThingIfNull "getProtocolByName" ("no such protocol name: " ++ name)-   $ (trySysCall.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 "getProtocolByNumber" ("no such protocol number: " ++ show num)-   $ (trySysCall.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(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)-getProtocolEntry :: IO ProtocolEntry	-- Next Protocol Entry from DB-getProtocolEntry = withLock $ do- ent <- throwNoSuchThingIfNull "getProtocolEntry" "no such protocol entry"-   		$ trySysCall c_getprotoent- peek ent--foreign import ccall unsafe  "getprotoent" c_getprotoent :: IO (Ptr ProtocolEntry)--setProtocolEntry :: Bool -> IO ()	-- Keep DB Open ?-setProtocolEntry flg = withLock $ trySysCall $ c_setprotoent (fromBool flg)--foreign import ccall unsafe "setprotoent" c_setprotoent :: CInt -> IO ()--endProtocolEntry :: IO ()-endProtocolEntry = withLock $ trySysCall $ 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)--INSTANCE_TYPEABLE0(HostEntry,hostEntryTc,"hostEntry")--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_WINSOCK_H) && !defined(cygwin32_HOST_OS)-                        hostFamily     = unpackFamily (fromIntegral (h_addrtype :: CShort)),-#else-                        hostFamily     = unpackFamily h_addrtype,-#endif-                        hostAddresses  = h_addr_list-                })--   poke p = error "Storable.poke(BSD.ServiceEntry) not implemented"----- convenience function:-hostAddress :: HostEntry -> HostAddress-hostAddress (HostEntry nm _ _ ls) =- case ls of-   []    -> error ("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 "getHostByName" "no such host entry"-    		$ trySysCall $ 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 	"getHostByAddr" "no such host entry"-   $ trySysCall $ 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(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)-getHostEntry :: IO HostEntry-getHostEntry = withLock $ do- throwNoSuchThingIfNull 	"getHostEntry" "unable to retrieve host entry"-   $ trySysCall $ c_gethostent- >>= peek--foreign import ccall unsafe "gethostent" c_gethostent :: IO (Ptr HostEntry)--setHostEntry :: Bool -> IO ()-setHostEntry flg = withLock $ trySysCall $ 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)--INSTANCE_TYPEABLE0(NetworkEntry,networkEntryTc,"NetworkEntry")--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 p = error "Storable.poke(BSD.NetEntry) not implemented"---#if !defined(cygwin32_HOST_OS) && !defined(mingw32_HOST_OS) && !defined(_WIN32)-getNetworkByName :: NetworkName -> IO NetworkEntry-getNetworkByName name = withLock $ do- withCString name $ \ name_cstr -> do-  throwNoSuchThingIfNull "getNetworkByName" "no such network entry"-    $ trySysCall $ 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 "getNetworkByAddr" "no such network entry"-   $ trySysCall $ 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 "getNetworkEntry" "no more network entries"-          $ trySysCall $ 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 $ trySysCall $ 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 $ trySysCall $ 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 $ 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_ "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 <- catch (liftM Just getOne) ((const.return) Nothing)-      case vv of-        Nothing -> return []-        Just v  -> loop >>= \ vs -> atEnd >> return (v:vs)----- ------------------------------------------------------------------------------ Winsock only:---   The BSD API networking calls made locally return NULL upon failure.---   That failure may very well be due to WinSock not being initialised,---   so if NULL is seen try init'ing and repeat the call.-#if !defined(mingw32_HOST_OS) && !defined(_WIN32)-trySysCall act = act-#else-trySysCall act = do-  ptr <- act-  if (ptr == nullPtr)-   then withSocketsDo act-   else return ptr-#endif--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
+ 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,2224 +0,0 @@-{-# LANGUAGE CPP #-}--------------------------------------------------------------------------------- |--- 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------ The "Network.Socket" module is for when you want full control over--- sockets.  Essentially the entire C socket API is exposed through--- this module; in general the operations follow the behaviour of the C--- functions of the same name (consult your favourite Unix networking book).------ A higher level interface to networking operations is provided--- through the module "Network".-----------------------------------------------------------------------------------#include "HsNet.h"---- NOTE: ##, we want this interpreted when compiling the .hs, not by hsc2hs.-##include "Typeable.h"---- In order to process this file, you need to have CALLCONV defined.--module Network.Socket (-    -- * Types-    Socket(..),		-- instance Eq, Show-    Family(..),		-    SocketType(..),-    SockAddr(..),-    SocketStatus(..),-    HostAddress,-#if defined(IPV6_SOCKET_SUPPORT)-    HostAddress6,-    FlowInfo,-    ScopeID,-#endif-    ShutdownCmd(..),-    ProtocolNumber,-    defaultProtocol,        -- :: ProtocolNumber-    PortNumber(..),-	-- PortNumber is used non-abstractly in Network.BSD.  ToDo: remove-	-- this use and make the type abstract.--    -- * Address operations--    HostName,-    ServiceName,--#if defined(IPV6_SOCKET_SUPPORT)-    AddrInfo(..),--    AddrInfoFlag(..),-    addrInfoFlagImplemented,-- :: AddrInfoFlag -> Bool--    defaultHints,           -- :: AddrInfo--    getAddrInfo,            -- :: Maybe AddrInfo -> Maybe HostName -> Maybe ServiceName -> IO [AddrInfo]--    NameInfoFlag(..),--    getNameInfo,            -- :: [NameInfoFlag] -> Bool -> Bool -> SockAddr -> IO (Maybe HostName, Maybe ServiceName)-#endif--    -- * Socket operations-    socket,		-- :: Family -> SocketType -> ProtocolNumber -> IO Socket -#if defined(DOMAIN_SOCKET_SUPPORT)-    socketPair,         -- :: Family -> SocketType -> ProtocolNumber -> IO (Socket, Socket)-#endif-    connect,		-- :: Socket -> SockAddr -> IO ()-    bindSocket,		-- :: Socket -> SockAddr -> IO ()-    listen,		-- :: Socket -> Int -> IO ()-    accept,		-- :: Socket -> IO (Socket, SockAddr)-    getPeerName,	-- :: Socket -> IO SockAddr-    getSocketName,	-- :: Socket -> IO SockAddr--#ifdef HAVE_STRUCT_UCRED-	-- get the credentials of our domain socket peer.-    getPeerCred,         -- :: Socket -> IO (CUInt{-pid-}, CUInt{-uid-}, CUInt{-gid-})-#endif--    socketPort,		-- :: Socket -> IO PortNumber--    socketToHandle,	-- :: Socket -> IOMode -> IO Handle--    -- ** Sending and receiving data-    -- $sendrecv-    sendTo,		-- :: Socket -> String -> SockAddr -> IO Int-    sendBufTo,          -- :: Socket -> Ptr a -> Int -> SockAddr -> IO Int--    recvFrom,		-- :: Socket -> Int -> IO (String, Int, SockAddr)-    recvBufFrom,        -- :: Socket -> Ptr a -> Int -> IO (Int, SockAddr)-    -    send,		-- :: Socket -> String -> IO Int-    recv,		-- :: Socket -> Int    -> IO String-    recvLen,            -- :: Socket -> Int    -> IO (String, Int)--    inet_addr,		-- :: String -> IO HostAddress-    inet_ntoa,		-- :: HostAddress -> IO String--    shutdown,		-- :: Socket -> ShutdownCmd -> IO ()-    sClose,		-- :: Socket -> IO ()--    -- ** Predicates on sockets-    sIsConnected,	-- :: Socket -> IO Bool-    sIsBound,		-- :: Socket -> IO Bool-    sIsListening,	-- :: Socket -> IO Bool -    sIsReadable,	-- :: Socket -> IO Bool-    sIsWritable,	-- :: Socket -> IO Bool--    -- * Socket options-    SocketOption(..),-    getSocketOption,     -- :: Socket -> SocketOption -> IO Int-    setSocketOption,     -- :: Socket -> SocketOption -> Int -> IO ()--    -- * File descriptor transmission-#ifdef DOMAIN_SOCKET_SUPPORT-    sendFd,              -- :: Socket -> CInt -> IO ()-    recvFd,              -- :: Socket -> IO CInt--      -- Note: these two will disappear shortly-    sendAncillary,       -- :: Socket -> Int -> Int -> Int -> Ptr a -> Int -> IO ()-    recvAncillary,       -- :: Socket -> Int -> Int -> IO (Int,Int,Int,Ptr a)--#endif--    -- * Special constants-    aNY_PORT,		-- :: PortNumber-    iNADDR_ANY,		-- :: HostAddress-#if defined(IPV6_SOCKET_SUPPORT)-    iN6ADDR_ANY,	-- :: HostAddress6-#endif-    sOMAXCONN,		-- :: Int-    sOL_SOCKET,         -- :: Int-#ifdef SCM_RIGHTS-    sCM_RIGHTS,         -- :: Int-#endif-    maxListenQueue,	-- :: Int--    -- * Initialisation-    withSocketsDo,	-- :: IO a -> IO a-    -    -- * Very low level operations-     -- in case you ever want to get at the underlying file descriptor..-    fdSocket,           -- :: Socket -> CInt-    mkSocket,           -- :: CInt   -> Family -    			-- -> SocketType-			-- -> ProtocolNumber-			-- -> SocketStatus-			-- -> IO Socket--    -- * Internal--    -- | The following are exported ONLY for use in the BSD module and-    -- should not be used anywhere else.--    packFamily, unpackFamily,-    packSocketType,-    throwSocketErrorIfMinus1_--) where--#ifdef __HUGS__-import Hugs.Prelude ( IOException(..), IOErrorType(..) )-import Hugs.IO ( openFd )--{-# CFILES cbits/HsNet.c #-}-# if HAVE_STRUCT_MSGHDR_MSG_CONTROL || HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS-{-# CFILES cbits/ancilData.c #-}-# endif-# if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__)-{-# CFILES cbits/initWinSock.c cbits/winSockErr.c #-}-# endif-#endif--import Data.Bits-import Data.List (foldl')-import Data.Word ( Word8, Word16, Word32 )-import Foreign.Ptr ( Ptr, castPtr, nullPtr, plusPtr )-import Foreign.Storable ( Storable(..) )-import Foreign.C.Error-import Foreign.C.String ( CString, withCString, peekCString, peekCStringLen, castCharToCChar )-import Foreign.C.Types ( CInt, CUInt, CChar, CSize )-import Foreign.Marshal.Alloc ( alloca, allocaBytes )-import Foreign.Marshal.Array ( peekArray, pokeArray, pokeArray0 )-import Foreign.Marshal.Utils ( maybeWith, with )--import System.IO-import Control.Monad ( liftM, when )-import Data.Ratio ( (%) )--import qualified Control.Exception-import Control.Concurrent.MVar-import Data.Typeable-import System.IO.Error--#ifdef __GLASGOW_HASKELL__-import GHC.Conc		(threadWaitRead, threadWaitWrite)-##if MIN_VERSION_base(4,3,1)-import GHC.Conc		(closeFdWith)-##endif-# if defined(mingw32_HOST_OS)-import GHC.Conc		( asyncDoProc )-import Foreign( FunPtr )-# endif-# if __GLASGOW_HASKELL__ >= 611-import qualified GHC.IO.Device-import GHC.IO.Handle.FD-import GHC.IO.Exception-import GHC.IO-# else-import GHC.IOBase-import GHC.Handle-# endif-import qualified System.Posix.Internals-#else-import System.IO.Unsafe	(unsafePerformIO)-#endif--# if __GLASGOW_HASKELL__ >= 611-import GHC.IO.FD-#endif--import Network.Socket.Internal---- | 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---- 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.--data SocketStatus-  -- Returned Status	Function called-  = NotConnected	-- socket-  | Bound		-- bindSocket-  | Listening		-- listen-  | Connected		-- connect/accept-  | ConvertedToHandle   -- is now a Handle, don't touch-  | Closed		-- sClose -    deriving (Eq, Show)--INSTANCE_TYPEABLE0(SocketStatus,socketStatusTc,"SocketStatus")--data Socket-  = MkSocket-	    CInt	         -- File Descriptor-	    Family				  -	    SocketType				  -	    ProtocolNumber	 -- Protocol Number-	    (MVar SocketStatus)  -- Status Flag--INSTANCE_TYPEABLE0(Socket,socketTc,"Socket")--#if __GLASGOW_HASKELL__ >= 611 && defined(mingw32_HOST_OS)-socket2FD  (MkSocket fd _ _ _ _) = -  -- HACK, 1 means True -  FD{fdFD = fd,fdIsSocket_ = 1} -#endif--mkSocket :: CInt-	 -> Family-	 -> SocketType-	 -> ProtocolNumber-	 -> SocketStatus-	 -> IO Socket-mkSocket fd fam sType pNum stat = do-   mStat <- newMVar stat-   return (MkSocket fd fam sType pNum mStat)--instance Eq Socket where-  (MkSocket _ _ _ _ m1) == (MkSocket _ _ _ _ m2) = m1 == m2--instance Show Socket where-  showsPrec n (MkSocket fd _ _ _ _) = -	showString "<socket: " . shows fd . showString ">"---fdSocket :: Socket -> CInt-fdSocket (MkSocket fd _ _ _ _) = fd--type ProtocolNumber = CInt---- | This is the default protocol for a given service.-defaultProtocol :: ProtocolNumber-defaultProtocol = 0--------------------------------------------------------------------------------- Port Numbers--INSTANCE_TYPEABLE0(PortNumber,portNumberTc,"PortNumber")--instance Show PortNumber where-  showsPrec p pn = showsPrec p (portNumberToInt pn)--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)---------------------------------------------------------------------------------- SockAddr--INSTANCE_TYPEABLE0(SockAddr,sockAddrTc,"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---------------------------------------------------------------------------------- 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'.-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-    fd <- throwSocketErrorIfMinus1Retry "socket" $-		c_socket (packFamily family) (packSocketType stype) protocol-#if !defined(__HUGS__)-# if __GLASGOW_HASKELL__ < 611-    System.Posix.Internals.setNonBlockingFD fd-# else-    System.Posix.Internals.setNonBlockingFD fd True-# endif-#endif-    socket_status <- newMVar NotConnected-    return (MkSocket fd family stype protocol socket_status)---- | 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.-#if defined(DOMAIN_SOCKET_SUPPORT)-socketPair :: Family 	          -- Family Name (usually AF_INET or AF_INET6)-           -> SocketType 	  -- Socket Type (usually Stream)-           -> ProtocolNumber      -- Protocol Number-           -> IO (Socket, Socket) -- unnamed and connected.-socketPair family stype protocol = do-    allocaBytes (2 * sizeOf (1 :: CInt)) $ \ fdArr -> do-    rc <- throwSocketErrorIfMinus1Retry "socketpair" $-		c_socketpair (packFamily family)-			     (packSocketType stype)-			     protocol fdArr-    [fd1,fd2] <- peekArray 2 fdArr -    s1 <- mkSocket fd1-    s2 <- mkSocket fd2-    return (s1,s2)-  where-    mkSocket fd = do-#if !defined(__HUGS__)-# if __GLASGOW_HASKELL__ < 611-       System.Posix.Internals.setNonBlockingFD fd-# else-       System.Posix.Internals.setNonBlockingFD fd True-# endif-#endif-       stat <- newMVar Connected-       return (MkSocket fd family stype protocol stat)--foreign import ccall unsafe "socketpair"-  c_socketpair :: CInt -> CInt -> CInt -> Ptr CInt -> IO CInt-#endif---------------------------------------------------------------------------------- Binding a socket---- | Bind the socket to an address. The socket must not already be--- bound.  The 'Family' passed to @bindSocket@ must be the--- same as that passed to 'socket'.  If the special port number--- 'aNY_PORT' is passed then the system assigns the next available--- use port.-bindSocket :: Socket	-- Unconnected Socket-           -> SockAddr  -- Address to Bind to-           -> IO ()-bindSocket (MkSocket s _family _stype _protocol socketStatus) addr = do- modifyMVar_ socketStatus $ \ status -> do- if status /= NotConnected -  then-   ioError (userError ("bindSocket: can't peform bind on socket in status " ++-	 show status))-  else do-   withSockAddr addr $ \p_addr sz -> do-   status <- throwSocketErrorIfMinus1Retry "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 = do- modifyMVar_ socketStatus $ \currentStatus -> do- if currentStatus /= NotConnected && currentStatus /= Bound-  then-   ioError (userError ("connect: can't peform connect on socket in 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_WINSOCK_H) && !defined(cygwin32_HOST_OS))-	       	       err <- getErrno-		       case () of-			 _ | err == eINTR       -> connectLoop-			 _ | err == eINPROGRESS -> connectBlocked---			 _ | err == eAGAIN      -> connectBlocked-			 otherwise              -> throwSocketError "connect"-#else-		       rc <- c_getLastError-		       case rc of-		         10093 -> do -- WSANOTINITIALISED-			   withSocketsDo (return ())-	       	           r <- c_connect s p_addr (fromIntegral sz)-	       	           if r == -1-			    then throwSocketError "connect"-			    else return r-			 _ -> throwSocketError "connect"-#endif-       	       else return r--	connectBlocked = do -#if !defined(__HUGS__)-	   threadWaitWrite (fromIntegral s)-#endif-	   err <- getSocketOption sock SoError-	   if (err == 0)-	   	then return 0-	   	else do ioError (errnoToIOError "connect" -	   			(Errno (fromIntegral err))-	   			Nothing Nothing)--   connectLoop-   return Connected---------------------------------------------------------------------------------- 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 ("listen: can't peform listen on socket in status " ++-          show status))-   else do-    throwSocketErrorIfMinus1Retry "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- okay <- sIsAcceptable sock- if not okay-   then-     ioError (userError ("accept: can't perform accept on socket (" ++ (show (family,stype,protocol)) ++") in status " ++-	 show currentStatus))-   else do-     let sz = sizeOfSockAddrByFamily family-     allocaBytes sz $ \ sockaddr -> do-#if defined(mingw32_HOST_OS) && defined(__GLASGOW_HASKELL__)-     new_sock <--	if threaded -	   then with (fromIntegral sz) $ \ ptr_len ->-		  throwErrnoIfMinus1Retry "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)-     		     (ioError (errnoToIOError "Network.Socket.accept" (Errno (fromIntegral rc)) Nothing Nothing))-		return new_sock-#else -     with (fromIntegral sz) $ \ ptr_len -> do-     new_sock <- -# if !defined(__HUGS__)-                 throwSocketErrorIfMinus1RetryMayBlock "accept"-			(threadWaitRead (fromIntegral s))-# endif-			(c_accept s sockaddr ptr_len)-# if !defined(__HUGS__)-#  if __GLASGOW_HASKELL__ < 611-     System.Posix.Internals.setNonBlockingFD new_sock-#  else-     System.Posix.Internals.setNonBlockingFD new_sock True-#  endif-# endif-#endif-     addr <- peekSockAddr sockaddr-     new_status <- newMVar Connected-     return ((MkSocket new_sock family stype protocol new_status), addr)--#if defined(mingw32_HOST_OS) && !defined(__HUGS__)-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 reciving data---- $sendrecv------ Do not use the @send@ and @recv@ functions defined in this module--- 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)-sendTo :: Socket	-- (possibly) bound/connected Socket-       -> String	-- Data to send-       -> SockAddr-       -> IO Int	-- Number of Bytes sent-sendTo sock xs addr = do- withCString xs $ \str -> do-   sendBufTo sock str (length xs) 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 (MkSocket s _family _stype _protocol status) ptr nbytes addr = do- withSockAddr addr $ \p_addr sz -> do-   liftM fromIntegral $-#if !defined(__HUGS__)-     throwSocketErrorIfMinus1RetryMayBlock "sendTo"-	(threadWaitWrite (fromIntegral s)) $-#endif-	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)-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.recvFrom")- | otherwise   = -    withNewSockAddr family $ \ptr_addr sz -> do-      alloca $ \ptr_len -> do-      	poke ptr_len (fromIntegral sz)-        len <- -#if !defined(__HUGS__)-	       throwSocketErrorIfMinus1RetryMayBlock "recvFrom"-        	   (threadWaitRead (fromIntegral s)) $-#endif-        	   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 <- sIsConnected 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.-send :: Socket	-- Bound/Connected Socket-     -> String	-- Data to send-     -> IO Int	-- Number of Bytes sent-send sock@(MkSocket s _family _stype _protocol status) xs = do- let len = length xs- withCString xs $ \str -> do-   liftM fromIntegral $-#if defined(__GLASGOW_HASKELL__) && defined(mingw32_HOST_OS)-# if __GLASGOW_HASKELL__ >= 611    -    writeRawBufferPtr -      "Network.Socket.send" -      (socket2FD sock)-      (castPtr str)-      0-      (fromIntegral len)-#else      -      writeRawBufferPtr -        "Network.Socket.send" -        (fromIntegral s) -        True -        str -        0 -       (fromIntegral len)-#endif    -    -#else-# if !defined(__HUGS__)-     throwSocketErrorIfMinus1RetryMayBlock "send"-	(threadWaitWrite (fromIntegral s)) $-# endif-	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.-recv :: Socket -> Int -> IO String-recv sock l = recvLen sock l >>= \ (s,_) -> return s--recvLen :: Socket -> Int -> IO (String, Int)-recvLen sock@(MkSocket s _family _stype _protocol status) nbytes - | nbytes <= 0 = ioError (mkInvalidRecvArgError "Network.Socket.recv")- | otherwise   = do-     allocaBytes nbytes $ \ptr -> do-        len <- -#if defined(__GLASGOW_HASKELL__) && defined(mingw32_HOST_OS)-# if __GLASGOW_HASKELL__ >= 611    -          readRawBufferPtr "Network.Socket.recvLen" (socket2FD sock) ptr 0-                 (fromIntegral nbytes)-#else          -          readRawBufferPtr "Network.Socket.recvLen" (fromIntegral s) True ptr 0-                 (fromIntegral nbytes)-#endif-#else-# if !defined(__HUGS__)-	       throwSocketErrorIfMinus1RetryMayBlock "recv"-        	   (threadWaitRead (fromIntegral s)) $-# endif-        	   c_recv s ptr (fromIntegral nbytes) 0{-flags-} -#endif-        let len' = fromIntegral len-	if len' == 0-	 then ioError (mkEOFError "Network.Socket.recv")-	 else do-	   s <- peekCStringLen (castPtr ptr,len')-	   return (s, 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$.--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 ("socketPort: not supported for Family " ++ show family))----- ------------------------------------------------------------------------------ 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 "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 "getSocketName" $ c_getsockname s ptr int_star-   peekSockAddr ptr---------------------------------------------------------------------------------- Socket Properties--data SocketOption-    = DummySocketOption__-#ifdef SO_DEBUG-    | Debug         {- SO_DEBUG     -}-#endif-#ifdef SO_REUSEADDR-    | ReuseAddr     {- SO_REUSEADDR -}-#endif-#ifdef SO_TYPE-    | Type          {- SO_TYPE      -}-#endif-#ifdef SO_ERROR-    | SoError       {- SO_ERROR     -}-#endif-#ifdef SO_DONTROUTE-    | DontRoute     {- SO_DONTROUTE -}-#endif-#ifdef SO_BROADCAST-    | Broadcast     {- SO_BROADCAST -}-#endif-#ifdef SO_SNDBUF-    | SendBuffer    {- SO_SNDBUF    -}-#endif-#ifdef SO_RCVBUF-    | RecvBuffer    {- SO_RCVBUF    -}-#endif-#ifdef SO_KEEPALIVE-    | KeepAlive     {- SO_KEEPALIVE -}-#endif-#ifdef SO_OOBINLINE-    | OOBInline     {- SO_OOBINLINE -}-#endif-#ifdef IP_TTL-    | TimeToLive    {- IP_TTL       -}-#endif-#ifdef TCP_MAXSEG-    | MaxSegment    {- TCP_MAXSEG   -}-#endif-#ifdef TCP_NODELAY-    | NoDelay       {- TCP_NODELAY  -}-#endif-#ifdef SO_LINGER-    | Linger        {- SO_LINGER    -}-#endif-#ifdef SO_REUSEPORT-    | ReusePort     {- SO_REUSEPORT -}-#endif-#ifdef SO_RCVLOWAT-    | RecvLowWater  {- SO_RCVLOWAT  -}-#endif-#ifdef SO_SNDLOWAT-    | SendLowWater  {- SO_SNDLOWAT  -}-#endif-#ifdef SO_RCVTIMEO-    | RecvTimeOut   {- SO_RCVTIMEO  -}-#endif-#ifdef SO_SNDTIMEO-    | SendTimeOut   {- SO_SNDTIMEO  -}-#endif-#ifdef SO_USELOOPBACK-    | UseLoopBack   {- SO_USELOOPBACK -}-#endif--INSTANCE_TYPEABLE0(SocketOption,socketOptionTc,"SocketOption")--socketOptLevel :: SocketOption -> CInt-socketOptLevel so = -  case so of-#ifdef IP_TTL-    TimeToLive   -> #const IPPROTO_IP-#endif-#ifdef TCP_MAXSEG-    MaxSegment   -> #const IPPROTO_TCP-#endif-#ifdef TCP_NODELAY-    NoDelay      -> #const IPPROTO_TCP-#endif-    _            -> #const SOL_SOCKET--packSocketOption :: SocketOption -> CInt-packSocketOption so =-  case so of-#ifdef SO_DEBUG-    Debug         -> #const SO_DEBUG-#endif-#ifdef SO_REUSEADDR-    ReuseAddr     -> #const SO_REUSEADDR-#endif-#ifdef SO_TYPE-    Type          -> #const SO_TYPE-#endif-#ifdef SO_ERROR-    SoError       -> #const SO_ERROR-#endif-#ifdef SO_DONTROUTE-    DontRoute     -> #const SO_DONTROUTE-#endif-#ifdef SO_BROADCAST-    Broadcast     -> #const SO_BROADCAST-#endif-#ifdef SO_SNDBUF-    SendBuffer    -> #const SO_SNDBUF-#endif-#ifdef SO_RCVBUF-    RecvBuffer    -> #const SO_RCVBUF-#endif-#ifdef SO_KEEPALIVE-    KeepAlive     -> #const SO_KEEPALIVE-#endif-#ifdef SO_OOBINLINE-    OOBInline     -> #const SO_OOBINLINE-#endif-#ifdef IP_TTL-    TimeToLive    -> #const IP_TTL-#endif-#ifdef TCP_MAXSEG-    MaxSegment    -> #const TCP_MAXSEG-#endif-#ifdef TCP_NODELAY-    NoDelay       -> #const TCP_NODELAY-#endif-#ifdef SO_LINGER-    Linger	  -> #const SO_LINGER-#endif-#ifdef SO_REUSEPORT-    ReusePort     -> #const SO_REUSEPORT-#endif-#ifdef SO_RCVLOWAT-    RecvLowWater  -> #const SO_RCVLOWAT-#endif-#ifdef SO_SNDLOWAT-    SendLowWater  -> #const SO_SNDLOWAT-#endif-#ifdef SO_RCVTIMEO-    RecvTimeOut   -> #const SO_RCVTIMEO-#endif-#ifdef SO_SNDTIMEO-    SendTimeOut   -> #const SO_SNDTIMEO-#endif-#ifdef SO_USELOOPBACK-    UseLoopBack   -> #const SO_USELOOPBACK-#endif--setSocketOption :: Socket -		-> SocketOption -- Option Name-		-> Int		-- Option Value-		-> IO ()-setSocketOption (MkSocket s _ _ _ _) so v = do-   with (fromIntegral v) $ \ptr_v -> do-   throwErrnoIfMinus1_ "setSocketOption" $-       c_setsockopt s (socketOptLevel so) (packSocketOption so) ptr_v -	  (fromIntegral (sizeOf v))-   return ()---getSocketOption :: Socket-		-> SocketOption  -- Option Name-		-> IO Int	 -- Option Value-getSocketOption (MkSocket s _ _ _ _) so = do-   alloca $ \ptr_v ->-     with (fromIntegral (sizeOf (undefined :: CInt))) $ \ptr_sz -> do-       throwErrnoIfMinus1 "getSocketOption" $-	 c_getsockopt s (socketOptLevel so) (packSocketOption so) ptr_v ptr_sz-       fromIntegral `liftM` peek ptr_v---#ifdef HAVE_STRUCT_UCRED--- | Returns the processID, userID and groupID of the socket's peer.------ Only available on platforms that support SO_PEERCRED on domain sockets.-getPeerCred :: Socket -> IO (CUInt, CUInt, CUInt)-getPeerCred sock = do-  let fd = fdSocket sock-  let sz = (fromIntegral (#const sizeof(struct ucred)))-  with sz $ \ ptr_cr -> -   alloca       $ \ ptr_sz -> do-     poke ptr_sz sz-     throwErrnoIfMinus1 "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)-#endif--##if !MIN_VERSION_base(4,3,1)-closeFdWith closer fd = closer fd-##endif--#if defined(DOMAIN_SOCKET_SUPPORT)--- sending/receiving ancillary socket data; low-level mechanism--- for transmitting file descriptors, mainly.-sendFd :: Socket -> CInt -> IO ()-sendFd sock outfd = do-  let fd = fdSocket sock-#if !defined(__HUGS__)-  throwSocketErrorIfMinus1RetryMayBlock "sendFd"-     (threadWaitWrite (fromIntegral fd)) $-     c_sendFd fd outfd-#else-  c_sendFd fd outfd-#endif-   -- Note: If Winsock supported FD-passing, thi would have been -   -- incorrect (since socket FDs need to be closed via closesocket().)-  close outfd-  -recvFd :: Socket -> IO CInt-recvFd sock = do-  let fd = fdSocket sock-  theFd <- -#if !defined(__HUGS__)-    throwSocketErrorIfMinus1RetryMayBlock "recvFd" -        (threadWaitRead (fromIntegral fd)) $-#endif-         c_recvFd fd-  return theFd---sendAncillary :: Socket-	      -> Int-	      -> Int-	      -> Int-	      -> Ptr a-	      -> Int-	      -> IO ()-sendAncillary sock level ty flags datum len = do-  let fd = fdSocket sock-  _ <--#if !defined(__HUGS__)-   throwSocketErrorIfMinus1RetryMayBlock "sendAncillary"-     (threadWaitWrite (fromIntegral fd)) $-#endif-     c_sendAncillary fd (fromIntegral level) (fromIntegral ty)-     			(fromIntegral flags) datum (fromIntegral len)-  return ()--recvAncillary :: Socket-	      -> Int-	      -> Int-	      -> IO (Int,Int,Ptr a,Int)-recvAncillary sock flags len = do-  let fd = fdSocket sock-  alloca      $ \ ptr_len   ->-   alloca      $ \ ptr_lev   ->-    alloca      $ \ ptr_ty    ->-     alloca      $ \ ptr_pData -> do-      poke ptr_len (fromIntegral len)-      _ <- -#if !defined(__HUGS__)-        throwSocketErrorIfMinus1RetryMayBlock "recvAncillary" -            (threadWaitRead (fromIntegral fd)) $-#endif-	    c_recvAncillary fd ptr_lev ptr_ty (fromIntegral flags) ptr_pData ptr_len-      len <- fromIntegral `liftM` peek ptr_len-      lev <- fromIntegral `liftM` peek ptr_lev-      ty  <- fromIntegral `liftM` peek ptr_ty-      pD  <- peek ptr_pData-      return (lev,ty,pD, len)-foreign import ccall SAFE_ON_WIN "sendAncillary"-  c_sendAncillary :: CInt -> CInt -> CInt -> CInt -> Ptr a -> CInt -> IO CInt--foreign import ccall SAFE_ON_WIN "recvAncillary"-  c_recvAncillary :: CInt -> Ptr CInt -> Ptr CInt -> CInt -> Ptr (Ptr a) -> Ptr CInt -> IO CInt--foreign import ccall SAFE_ON_WIN "sendFd" c_sendFd :: CInt -> CInt -> IO CInt-foreign import ccall SAFE_ON_WIN "recvFd" c_recvFd :: CInt -> IO CInt--#endif---{--A calling sequence table for the main functions is shown in the table below.--\begin{figure}[h]-\begin{center}-\begin{tabular}{|l|c|c|c|c|c|c|c|}d-\hline-{\bf A Call to} & socket & connect & bindSocket & listen & accept & read & write \\-\hline-{\bf Precedes} & & & & & & & \\-\hline -socket &	&	  &	       &	&	 &	& \\-\hline-connect & +	&	  &	       &	&	 &	& \\-\hline-bindSocket & +	&	  &	       &	&	 &	& \\-\hline-listen &	&	  & +	       &	&	 &	& \\-\hline-accept &	&	  &	       &  +	&	 &	& \\-\hline-read   &	&   +	  &	       &  +	&  +	 &  +	& + \\-\hline-write  &	&   +	  &	       &  +	&  +	 &  +	& + \\-\hline-\end{tabular}-\caption{Sequence Table for Major functions of Socket}-\label{tab:api-seq}-\end{center}-\end{figure}--}---- ------------------------------------------------------------------------------ OS Dependent Definitions-    -unpackFamily	:: CInt -> Family-packFamily	:: Family -> CInt--packSocketType	:: SocketType -> CInt-unpackSocketType:: CInt -> SocketType-------- -------			-packFamily f = case f of-	AF_UNSPEC -> #const AF_UNSPEC-#ifdef AF_UNIX-	AF_UNIX -> #const AF_UNIX-#endif-#ifdef AF_INET-	AF_INET -> #const AF_INET-#endif-#ifdef AF_INET6-        AF_INET6 -> #const AF_INET6-#endif-#ifdef AF_IMPLINK-	AF_IMPLINK -> #const AF_IMPLINK-#endif-#ifdef AF_PUP-	AF_PUP -> #const AF_PUP-#endif-#ifdef AF_CHAOS-	AF_CHAOS -> #const AF_CHAOS-#endif-#ifdef AF_NS-	AF_NS -> #const AF_NS-#endif-#ifdef AF_NBS-	AF_NBS -> #const AF_NBS-#endif-#ifdef AF_ECMA-	AF_ECMA -> #const AF_ECMA-#endif-#ifdef AF_DATAKIT-	AF_DATAKIT -> #const AF_DATAKIT-#endif-#ifdef AF_CCITT-	AF_CCITT -> #const AF_CCITT-#endif-#ifdef AF_SNA-	AF_SNA -> #const AF_SNA-#endif-#ifdef AF_DECnet-	AF_DECnet -> #const AF_DECnet-#endif-#ifdef AF_DLI-	AF_DLI -> #const AF_DLI-#endif-#ifdef AF_LAT-	AF_LAT -> #const AF_LAT-#endif-#ifdef AF_HYLINK-	AF_HYLINK -> #const AF_HYLINK-#endif-#ifdef AF_APPLETALK-	AF_APPLETALK -> #const AF_APPLETALK-#endif-#ifdef AF_ROUTE-	AF_ROUTE -> #const AF_ROUTE-#endif-#ifdef AF_NETBIOS-	AF_NETBIOS -> #const AF_NETBIOS-#endif-#ifdef AF_NIT-	AF_NIT -> #const AF_NIT-#endif-#ifdef AF_802-	AF_802 -> #const AF_802-#endif-#ifdef AF_ISO-	AF_ISO -> #const AF_ISO-#endif-#ifdef AF_OSI-	AF_OSI -> #const AF_OSI-#endif-#ifdef AF_NETMAN-	AF_NETMAN -> #const AF_NETMAN-#endif-#ifdef AF_X25-	AF_X25 -> #const AF_X25-#endif-#ifdef AF_AX25-	AF_AX25 -> #const AF_AX25-#endif-#ifdef AF_OSINET-	AF_OSINET -> #const AF_OSINET-#endif-#ifdef AF_GOSSIP-	AF_GOSSIP -> #const AF_GOSSIP-#endif-#ifdef AF_IPX-	AF_IPX -> #const AF_IPX-#endif-#ifdef Pseudo_AF_XTP-	Pseudo_AF_XTP -> #const Pseudo_AF_XTP-#endif-#ifdef AF_CTF-	AF_CTF -> #const AF_CTF-#endif-#ifdef AF_WAN-	AF_WAN -> #const AF_WAN-#endif-#ifdef AF_SDL-        AF_SDL -> #const AF_SDL-#endif-#ifdef AF_NETWARE-        AF_NETWARE -> #const AF_NETWARE	-#endif-#ifdef AF_NDD-        AF_NDD -> #const AF_NDD		-#endif-#ifdef AF_INTF-        AF_INTF -> #const AF_INTF-#endif-#ifdef AF_COIP-        AF_COIP -> #const AF_COIP-#endif-#ifdef AF_CNT-        AF_CNT -> #const AF_CNT-#endif-#ifdef Pseudo_AF_RTIP-        Pseudo_AF_RTIP -> #const Pseudo_AF_RTIP-#endif-#ifdef Pseudo_AF_PIP-        Pseudo_AF_PIP -> #const Pseudo_AF_PIP-#endif-#ifdef AF_SIP-        AF_SIP -> #const AF_SIP-#endif-#ifdef AF_ISDN-        AF_ISDN -> #const AF_ISDN-#endif-#ifdef Pseudo_AF_KEY-        Pseudo_AF_KEY -> #const Pseudo_AF_KEY-#endif-#ifdef AF_NATM-        AF_NATM -> #const AF_NATM-#endif-#ifdef AF_ARP-        AF_ARP -> #const AF_ARP-#endif-#ifdef Pseudo_AF_HDRCMPLT-        Pseudo_AF_HDRCMPLT -> #const Pseudo_AF_HDRCMPLT-#endif-#ifdef AF_ENCAP-        AF_ENCAP -> #const AF_ENCAP -#endif-#ifdef AF_LINK-	AF_LINK -> #const AF_LINK-#endif-#ifdef AF_RAW-        AF_RAW -> #const AF_RAW-#endif-#ifdef AF_RIF-        AF_RIF -> #const AF_RIF-#endif-#ifdef AF_NETROM-	AF_NETROM -> #const AF_NETROM-#endif-#ifdef AF_BRIDGE-	AF_BRIDGE -> #const AF_BRIDGE-#endif-#ifdef AF_ATMPVC-	AF_ATMPVC -> #const AF_ATMPVC-#endif-#ifdef AF_ROSE-	AF_ROSE -> #const AF_ROSE-#endif-#ifdef AF_NETBEUI-	AF_NETBEUI -> #const AF_NETBEUI-#endif-#ifdef AF_SECURITY-	AF_SECURITY -> #const AF_SECURITY-#endif-#ifdef AF_PACKET-	AF_PACKET -> #const AF_PACKET-#endif-#ifdef AF_ASH-	AF_ASH -> #const AF_ASH-#endif-#ifdef AF_ECONET-	AF_ECONET -> #const AF_ECONET-#endif-#ifdef AF_ATMSVC-	AF_ATMSVC -> #const AF_ATMSVC-#endif-#ifdef AF_IRDA-	AF_IRDA -> #const AF_IRDA-#endif-#ifdef AF_PPPOX-	AF_PPPOX -> #const AF_PPPOX-#endif-#ifdef AF_WANPIPE-	AF_WANPIPE -> #const AF_WANPIPE-#endif-#ifdef AF_BLUETOOTH-	AF_BLUETOOTH -> #const AF_BLUETOOTH-#endif----------- ------------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-	unknown -> error ("Network.Socket.unpackFamily: unknown address " ++-                          "family " ++ show unknown)---- Socket Types.---- | Socket Types.------ This data type might have different constructors depending on what is--- supported by the operating system.-data SocketType-	= NoSocketType-#ifdef SOCK_STREAM-	| Stream -#endif-#ifdef SOCK_DGRAM-	| Datagram-#endif-#ifdef SOCK_RAW-	| Raw -#endif-#ifdef SOCK_RDM-	| RDM -#endif-#ifdef SOCK_SEQPACKET-	| SeqPacket-#endif-	deriving (Eq, Ord, Read, Show)-	-INSTANCE_TYPEABLE0(SocketType,socketTypeTc,"SocketType")--packSocketType stype = case stype of-	NoSocketType -> 0-#ifdef SOCK_STREAM-	Stream -> #const SOCK_STREAM-#endif-#ifdef SOCK_DGRAM-	Datagram -> #const SOCK_DGRAM-#endif-#ifdef SOCK_RAW-	Raw -> #const SOCK_RAW-#endif-#ifdef SOCK_RDM-	RDM -> #const SOCK_RDM-#endif-#ifdef SOCK_SEQPACKET-	SeqPacket -> #const SOCK_SEQPACKET-#endif--unpackSocketType t = case t of-	0 -> NoSocketType-#ifdef SOCK_STREAM-	(#const SOCK_STREAM) -> Stream-#endif-#ifdef SOCK_DGRAM-	(#const SOCK_DGRAM) -> Datagram-#endif-#ifdef SOCK_RAW-	(#const SOCK_RAW) -> Raw-#endif-#ifdef SOCK_RDM-	(#const SOCK_RDM) -> RDM-#endif-#ifdef SOCK_SEQPACKET-	(#const SOCK_SEQPACKET) -> SeqPacket-#endif---- ------------------------------------------------------------------------------ Utility Functions--aNY_PORT :: PortNumber -aNY_PORT = 0---- | The IPv4 wild card address.--iNADDR_ANY :: HostAddress-iNADDR_ANY = htonl (#const INADDR_ANY)--#if defined(IPV6_SOCKET_SUPPORT)--- | The IPv6 wild card address.--iN6ADDR_ANY :: HostAddress6-iN6ADDR_ANY = (0, 0, 0, 0)-#endif--sOMAXCONN :: Int-sOMAXCONN = #const SOMAXCONN--sOL_SOCKET :: Int-sOL_SOCKET = #const SOL_SOCKET--#ifdef SCM_RIGHTS-sCM_RIGHTS :: Int-sCM_RIGHTS = #const SCM_RIGHTS-#endif--maxListenQueue :: Int-maxListenQueue = sOMAXCONN---- -------------------------------------------------------------------------------data ShutdownCmd - = ShutdownReceive- | ShutdownSend- | ShutdownBoth--INSTANCE_TYPEABLE0(ShutdownCmd,shutdownCmdTc,"ShutdownCmd")--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 "shutdown" (c_shutdown s (sdownCmdToInt stype))-  return ()---- --------------------------------------------------------------------------------- | Close the socket.  All future operations on the socket object--- will fail.  The remote end will receive no more data (after queued--- data is flushed).-sClose	 :: Socket -> IO ()-sClose (MkSocket s _ _ _ socketStatus) = do - modifyMVar_ socketStatus $ \ status ->-   case status of-     ConvertedToHandle ->-	 ioError (userError ("sClose: converted to a Handle, use hClose instead"))-     Closed ->-	 return status-     _ -> closeFdWith (close . fromIntegral) (fromIntegral s) >> return Closed---- -------------------------------------------------------------------------------sIsConnected :: Socket -> IO Bool-sIsConnected (MkSocket _ _ _ _ status) = do-    value <- readMVar status-    return (value == Connected)	---- -------------------------------------------------------------------------------- Socket Predicates--sIsBound :: Socket -> IO Bool-sIsBound (MkSocket _ _ _ _ status) = do-    value <- readMVar status-    return (value == Bound)	--sIsListening :: Socket -> IO Bool-sIsListening (MkSocket _ _ _  _ status) = do-    value <- readMVar status-    return (value == Listening)	--sIsReadable  :: Socket -> IO Bool-sIsReadable (MkSocket _ _ _ _ status) = do-    value <- readMVar status-    return (value == Listening || value == Connected)--sIsWritable  :: Socket -> IO Bool-sIsWritable = sIsReadable -- sort of.--sIsAcceptable :: Socket -> IO Bool-#if defined(DOMAIN_SOCKET_SUPPORT)-sIsAcceptable (MkSocket _ AF_UNIX x _ status)-    | x == Stream || x == SeqPacket = do-        value <- readMVar status-        return (value == Connected || value == Bound || value == Listening)-sIsAcceptable (MkSocket _ AF_UNIX _ _ _) = return False-#endif-sIsAcceptable (MkSocket _ _ _ _ status) = do-    value <- readMVar status-    return (value == Connected || value == Listening)-    --- -------------------------------------------------------------------------------- Internet address manipulation routines:--inet_addr :: String -> IO HostAddress-inet_addr ipstr = do-   withCString ipstr $ \str -> do-   had <- c_inet_addr str-   if had == -1-    then ioError (userError ("inet_addr: Malformed address: " ++ ipstr))-    else return had  -- network byte order--inet_ntoa :: HostAddress -> IO String-inet_ntoa haddr = 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'.--#ifndef __PARALLEL_HASKELL__-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-# if __GLASGOW_HASKELL__ >= 611-    h <- fdToHandle' (fromIntegral fd) (Just GHC.IO.Device.Stream) True (show s) mode True{-bin-}-# elif __GLASGOW_HASKELL__ >= 608-    h <- fdToHandle' (fromIntegral fd) (Just System.Posix.Internals.Stream) True (show s) mode True{-bin-}-# elif __GLASGOW_HASKELL__ && __GLASGOW_HASKELL__ < 608-    h <- openFd (fromIntegral fd) (Just System.Posix.Internals.Stream) True (show s) mode True{-bin-}-# elif defined(__HUGS__)-    h <- openFd (fromIntegral fd) True{-is a socket-} mode True{-bin-}-# endif-    return (ConvertedToHandle, h)-#else-socketToHandle (MkSocket s family stype protocol status) m =-  error "socketToHandle not implemented in a parallel setup"-#endif---- | 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, 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 :: 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'.-data AddrInfoFlag-    = AI_ADDRCONFIG-    | AI_ALL-    | AI_CANONNAME-    | AI_NUMERICHOST-    | AI_NUMERICSERV-    | AI_PASSIVE-    | AI_V4MAPPED-    deriving (Eq, Read, Show)--INSTANCE_TYPEABLE0(AddrInfoFlag,addrInfoFlagTc,"AddrInfoFlag")--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_TYPEABLE0(AddrInfo,addrInfoTc,"AddrInfo")--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-                             -        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 socketType protocol _ _) = do-        (#poke struct addrinfo, ai_flags) p (packBits aiFlagMapping flags)-        (#poke struct addrinfo, ai_family) p (packFamily family)-        (#poke struct addrinfo, ai_socktype) p (packSocketType socketType)-        (#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--data NameInfoFlag-    = NI_DGRAM-    | NI_NAMEREQD-    | NI_NOFQDN-    | NI_NUMERICHOST-    | NI_NUMERICSERV-    deriving (Eq, Read, Show)--INSTANCE_TYPEABLE0(NameInfoFlag,nameInfoFlagTc,"NameInfoFlag")--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'.--defaultHints :: AddrInfo--defaultHints = AddrInfo {-                         addrFlags = [],-                         addrFamily = AF_UNSPEC,-                         addrSocketType = NoSocketType,-                         addrProtocol = defaultProtocol,-                         addrAddress = undefined,-                         addrCanonName = 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--- 'bindSocket'.------ 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:------ @---   myHints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_CANONNAME] }--- @------ Values for 'addrFlags' control query behaviour.  The supported--- flags are as follows:------   [@AI_PASSIVE@] If no 'HostName' value is provided, the network---     address in each 'SockAddr'---     will be left as a "wild card", i.e. as either 'iNADDR_ANY'---     or 'iN6ADDR_ANY'.  This is useful for server applications that---     will accept connections from any client.------   [@AI_CANONNAME@] The 'addrCanonName' field of the first returned---     'AddrInfo' will contain the "canonical name" of the host.------   [@AI_NUMERICHOST@] The 'HostName' argument /must/ be a numeric---     address in string form, and network name lookups will not be---     attempted.--- --- /Note/: Although the following flags are required by RFC 3493, they--- may not have an effect on all platforms, because the underlying--- network stack may not support them.  To see whether a flag from the--- list below will have any effect, call 'addrInfoFlagImplemented'.------   [@AI_NUMERICSERV@] The 'ServiceName' argument /must/ be a port---     number in string form, and service name lookups will not be---     attempted.------   [@AI_ADDRCONFIG@] 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.------   [@AI_V4MAPPED@] If an IPv6 lookup is performed, and no IPv6---     addresses are found, IPv6-mapped IPv4 addresses will be---     returned.------   [@AI_ALL@] If 'AI_ALL' is specified, return all matching IPv6 and---     IPv4 addresses.  Otherwise, this flag has no effect.---     --- 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.------ Example:--- @---   let hints = defaultHints { addrFlags = [AI_ADDRCONFIG, AI_CANONNAME] }---   addrs <- getAddrInfo (Just hints) (Just "www.haskell.org") (Just "http")---   let addr = head addrs---   sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)---   connect sock (addrAddress addr)--- @--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 =-  maybeWith withCString node $ \c_node ->-    maybeWith withCString service $ \c_service ->-      maybeWith with hints $ \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-                    ioError (ioeSetErrorString-                             (mkIOError NoSuchThing "getAddrInfo" Nothing-                              Nothing) err)--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 = return ("error " ++ 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.  The--- supported flags are as follows:------   [@NI_NOFQDN@] If a host is local, return only the---     hostname part of the FQDN.------   [@NI_NUMERICHOST@] 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_NUMERICSERV@] The name of the service is not---     looked up.  Instead, a numeric representation of the---     service is returned.------   [@NI_NAMEREQD@] If the hostname cannot be looked up, an IO error---     is thrown.------   [@NI_DGRAM@] 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.------ Hostname and service name lookups can be expensive.  You can--- specify which lookups to perform via the two 'Bool' arguments.  If--- one of these is 'False', the corresponding value in the returned--- tuple will be 'Nothing', and no lookup will be performed.------ 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 =-  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-                  ioError (ioeSetErrorString-                           (mkIOError NoSuchThing "getNameInfo" 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-#ifdef __GLASGOW_HASKELL__-				    InvalidArgument-#else-				    IllegalOperation-#endif-                                    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 "my_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 --close :: CInt -> IO ()-close fd = throwErrnoIfMinus1Retry_ "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 unsafe "connect"-  c_connect :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt-foreign import CALLCONV unsafe "accept"-  c_accept :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt-foreign import CALLCONV safe "accept"-  c_accept_safe :: CInt -> Ptr SockAddr -> Ptr CInt{-CSockLen???-} -> IO CInt-foreign import CALLCONV unsafe "listen"-  c_listen :: CInt -> CInt -> IO CInt--#ifdef __GLASGOW_HASKELL__-foreign import ccall "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
+ 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,373 +0,0 @@-{-# LANGUAGE CPP, ForeignFunctionInterface #-}--#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--    -- * Example-    -- $example-  ) where--import Control.Monad (liftM, when)-import Data.ByteString (ByteString)-import Data.ByteString.Internal (createAndTrim)-import Data.ByteString.Unsafe (unsafeUseAsCStringLen)-import Data.Word (Word8)-import Foreign.C.Types (CInt)-import Foreign.Marshal.Alloc (allocaBytes)-import Foreign.Ptr (Ptr, castPtr)-import Network.Socket (SockAddr, Socket(..), sendBufTo, recvBufFrom)--import qualified Data.ByteString as B--import Network.Socket.ByteString.Internal--#if !defined(mingw32_HOST_OS)-import Control.Monad (zipWithM_)-import Foreign.C.Types (CChar, CSize)-import Foreign.Marshal.Array (allocaArray)-import Foreign.Marshal.Utils (with)-import Foreign.Ptr (plusPtr)-import Foreign.Storable (Storable(..))-import Network.Socket.Internal (throwSocketErrorIfMinus1RetryMayBlock,-                                withSockAddr)--import Network.Socket.ByteString.IOVec (IOVec(..))-import Network.Socket.ByteString.MsgHdr (MsgHdr(..))--#  if defined(__GLASGOW_HASKELL__)-import GHC.Conc (threadWaitRead, threadWaitWrite)-#  endif-#else-#  if defined(__GLASGOW_HASKELL__)-#    if __GLASGOW_HASKELL__ >= 611-import GHC.IO.FD-#    else-import GHC.Handle (readRawBufferPtr, writeRawBufferPtr)-#    endif-#  endif-#endif--#if !defined(mingw32_HOST_OS)-foreign import CALLCONV unsafe "send"-  c_send :: CInt -> Ptr a -> CSize -> CInt -> IO CInt-foreign import CALLCONV unsafe "recv"-  c_recv :: CInt -> Ptr CChar -> CSize -> CInt -> IO CInt-#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 (MkSocket s _ _ _ _) xs =-    unsafeUseAsCStringLen xs $ \(str, len) ->-    liftM fromIntegral $-#if defined(__GLASGOW_HASKELL__) && defined(mingw32_HOST_OS)-#  if __GLASGOW_HASKELL__ >= 611-        writeRawBufferPtr "Network.Socket.ByteString.send"-        (FD s 1) (castPtr str) 0 (fromIntegral len)-#  else-        writeRawBufferPtr "Network.Socket.ByteString.send"-        (fromIntegral s) True str 0 (fromIntegral len)-#  endif-#else-#  if !defined(__HUGS__)-        throwSocketErrorIfMinus1RetryMayBlock "send"-        (threadWaitWrite (fromIntegral s)) $-#  endif-        c_send s str (fromIntegral len) 0-#endif---- | 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 sock bs = do-    sent <- send sock bs-    when (sent < B.length bs) $ 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.-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.-sendAllTo :: Socket      -- ^ Socket-          -> ByteString  -- ^ Data to send-          -> SockAddr    -- ^ Recipient address-          -> IO ()-sendAllTo sock xs addr = do-    sent <- sendTo sock xs addr-    when (sent < B.length xs) $ 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.-sendMany :: Socket        -- ^ Connected socket-         -> [ByteString]  -- ^ Data to send-         -> IO ()-#if !defined(mingw32_HOST_OS)-sendMany sock@(MkSocket fd _ _ _ _) cs = do-    sent <- sendManyInner-    when (sent < totalLength cs) $ sendMany sock (remainingChunks sent cs)-  where-    sendManyInner =-      liftM fromIntegral . withIOVec cs $ \(iovsPtr, iovsLen) ->-          throwSocketErrorIfMinus1RetryMayBlock "writev"-              (threadWaitWrite (fromIntegral fd)) $-              c_writev (fromIntegral fd) iovsPtr (fromIntegral iovsLen)-#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.-sendManyTo :: Socket        -- ^ Socket-           -> [ByteString]  -- ^ Data to send-           -> SockAddr      -- ^ Recipient address-           -> IO ()-#if !defined(mingw32_HOST_OS)-sendManyTo sock@(MkSocket fd _ _ _ _) cs addr = do-    sent <- liftM fromIntegral sendManyToInner-    when (sent < totalLength cs) $ 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 ->-            throwSocketErrorIfMinus1RetryMayBlock "sendmsg"-              (threadWaitWrite (fromIntegral fd)) $-              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.-recv :: Socket         -- ^ Connected socket-     -> Int            -- ^ Maximum number of bytes to receive-     -> IO ByteString  -- ^ Data received-recv (MkSocket s _ _ _ _) nbytes-    | nbytes < 0 = ioError (mkInvalidRecvArgError "Network.Socket.ByteString.recv")-    | otherwise  = createAndTrim nbytes $ recvInner s nbytes--recvInner :: CInt -> Int -> Ptr Word8 -> IO Int-recvInner s nbytes ptr =-    fmap fromIntegral $-#if defined(__GLASGOW_HASKELL__) && defined(mingw32_HOST_OS)-#  if __GLASGOW_HASKELL__ >= 611-        readRawBufferPtr "Network.Socket.ByteString.recv" (FD s 1) ptr 0 (fromIntegral nbytes)-#  else-        readRawBufferPtr "Network.Socket.ByteString.recv" (fromIntegral s)-        True (castPtr ptr) 0 (fromIntegral nbytes)-#  endif-#else-#  if !defined(__HUGS__)-        throwSocketErrorIfMinus1RetryMayBlock "recv"-        (threadWaitRead (fromIntegral s)) $-#  endif-        c_recv s (castPtr ptr) (fromIntegral nbytes) 0-#endif---- | 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                     -- ^ 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---- | @totalLength cs@ is the sum of the lengths of the chunks in the list @cs@.-totalLength :: [ByteString] -> Int-totalLength = sum . map B.length---- | @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---- ------------------------------------------------------------------------ Example---- $example------ 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 where--- >--- > import Control.Monad (unless)--- > import Network.Socket hiding (recv)--- > import qualified Data.ByteString as S--- > import Network.Socket.ByteString (recv, sendAll)--- >--- > main :: IO ()--- > main = withSocketsDo $--- >     do addrinfos <- getAddrInfo--- >                     (Just (defaultHints {addrFlags = [AI_PASSIVE]}))--- >                     Nothing (Just "3000")--- >        let serveraddr = head addrinfos--- >        sock <- socket (addrFamily serveraddr) Stream defaultProtocol--- >        bindSocket sock (addrAddress serveraddr)--- >        listen sock 1--- >        (conn, _) <- accept sock--- >        talk conn--- >        sClose conn--- >        sClose sock--- >--- >     where--- >       talk :: Socket -> IO ()--- >       talk conn =--- >           do msg <- recv conn 1024--- >              unless (S.null msg) $ sendAll conn msg >> talk conn------ > -- Echo client program--- > module Main where--- >--- > import Network.Socket hiding (recv)--- > import Network.Socket.ByteString (recv, sendAll)--- > import qualified Data.ByteString.Char8 as C--- >--- > main :: IO ()--- > main = withSocketsDo $--- >     do addrinfos <- getAddrInfo Nothing (Just "") (Just "3000")--- >        let serveraddr = head addrinfos--- >        sock <- socket (addrFamily serveraddr) Stream defaultProtocol--- >        connect sock (addrAddress serveraddr)--- >        sendAll sock $ C.pack "Hello, world!"--- >        msg <- recv sock 1024--- >        sClose sock--- >        putStr "Received "--- >        C.putStrLn msg
+ 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,28 +0,0 @@--- | 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/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@@ -10,41 +10,45 @@ -- Portability : portable -- module Network.Socket.ByteString.Internal-  ( mkInvalidRecvArgError+    (+      mkInvalidRecvArgError #if !defined(mingw32_HOST_OS)-  , c_writev-  , c_sendmsg+    , c_writev+#else+    , c_wsasend #endif-  ) where+    , 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 Foreign.Ptr (Ptr)-import System.Posix.Types (CSsize)+import System.Posix.Types (CSsize(..)) -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 -#ifdef __GLASGOW_HASKELL__-# if __GLASGOW_HASKELL__ < 611-import GHC.IOBase (IOErrorType(..))-# else-import GHC.IO.Exception (IOErrorType(..))-# endif-#elif __HUGS__-import Hugs.Prelude (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-#ifdef __GLASGOW_HASKELL__                                     InvalidArgument-#else-                                    IllegalOperation-#endif                                     loc Nothing Nothing) "non-positive length"  #if !defined(mingw32_HOST_OS)@@ -52,5 +56,16 @@   c_writev :: CInt -> Ptr IOVec -> CInt -> IO CSsize  foreign import ccall unsafe "sendmsg"-  c_sendmsg :: CInt -> Ptr MsgHdr -> CInt -> IO CSsize+  c_sendmsg :: CInt -> Ptr (MsgHdr SockAddr) -> CInt -> IO CSsize++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
@@ -0,0 +1,112 @@+{-# LANGUAGE CPP #-}++-- |+-- Module      : Network.Socket.ByteString.Lazy+-- Copyright   : (c) Bryan O'Sullivan 2009+-- License     : BSD-style+--+-- Maintainer  : bos@serpentine.com+-- Stability   : experimental+-- Portability : POSIX, GHC+--+-- 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.Lazy+-- > import Prelude hiding (getContents)+module Network.Socket.ByteString.Lazy (+    -- * Send data to a socket+    send,+    sendAll,+    sendWithFds,++    -- * Receive data from a socket+    getContents,+    recv,+) where++import Data.ByteString.Lazy.Internal (+    ByteString (..),+    defaultChunkSize,+ )+import Network.Socket (ShutdownCmd (..), shutdown)+import System.IO.Error (catchIOError)+import System.IO.Unsafe (unsafeInterleaveIO)+import System.Posix.Types (Fd (..))+import Prelude hiding (getContents)++#if defined(mingw32_HOST_OS)+import Network.Socket.ByteString.Lazy.Windows  (send, sendAll)+#else+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++-- | Receive data from the socket.  The socket must be in a connected+-- state.  Data is received on demand, in chunks; each chunk will be+-- sized to reflect the amount of data received by individual 'recv'+-- calls.+--+-- All remaining data from the socket is consumed.  When there is no+-- 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 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+-- the received data is longer than the specified length, it may be+-- discarded depending on the type of socket.  This function may block+-- until a message arrives.+--+-- If there is no more data to be received, returns an empty 'ByteString'.+recv+    :: Socket+    -- ^ Connected socket+    -> Int64+    -- ^ Maximum number of bytes to receive+    -> IO ByteString+    -- ^ Data received+recv s nbytes = chunk <$> N.recv s (fromIntegral nbytes)+  where+    chunk k+        | S.null k = Empty+        | otherwise = Chunk k Empty
− Network/Socket/ByteString/Lazy.hsc
@@ -1,153 +0,0 @@-{-# LANGUAGE BangPatterns, CPP, ForeignFunctionInterface #-}---- |--- Module      : Network.Socket.ByteString.Lazy--- Copyright   : (c) Bryan O'Sullivan 2009--- License     : BSD-style------ Maintainer  : bos@serpentine.com--- 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 is made to be imported with 'Network.Socket' like so:------ > import Network.Socket hiding (send, sendTo, recv, recvFrom)--- > import Network.Socket.ByteString.Lazy--- > import Prelude hiding (getContents)----module Network.Socket.ByteString.Lazy-  (-#if !defined(mingw32_HOST_OS)-    -- * Send data to a socket-      send,-      sendAll,-#endif--    -- * Receive data from a socket-      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 System.IO.Unsafe (unsafeInterleaveIO)--import qualified Data.ByteString as S-import qualified Network.Socket.ByteString as N--#if !defined(mingw32_HOST_OS)-import Control.Monad (unless)-import Data.ByteString.Unsafe (unsafeUseAsCStringLen)-import Foreign.Marshal.Array (allocaArray)-import Foreign.Ptr (plusPtr)-import Foreign.Storable (Storable(..))-import Network.Socket.ByteString.IOVec (IOVec(IOVec))-import Network.Socket.ByteString.Internal (c_writev)-import Network.Socket.Internal (throwSocketErrorIfMinus1RetryMayBlock)--import qualified Data.ByteString.Lazy as L--#  if defined(__GLASGOW_HASKELL__)-import GHC.Conc (threadWaitWrite)-#  endif-#endif--#if !defined(mingw32_HOST_OS)--- -------------------------------------------------------------------------------- Sending---- | Send data to the socket. The socket must be in a connected state.--- Returns the number of bytes sent. Applications are responsible for--- ensuring that all data has been sent.------ Because a lazily generated 'ByteString' may be arbitrarily long,--- this function caps the amount it will attempt to send at 4MB.  This--- number is large (so it should not penalize performance on fast--- networks), but not outrageously so (to avoid demanding lazily--- computed data unnecessarily early).  Before being sent, the lazy--- 'ByteString' will be converted to a list of strict 'ByteString's--- with 'L.toChunks'; at most 1024 chunks will be sent.  /Unix only/.-send :: Socket      -- ^ Connected socket-     -> ByteString  -- ^ Data to send-     -> IO Int64    -- ^ Number of bytes sent-send (MkSocket fd _ _ _ _) s = do-  let cs  = take maxNumChunks (L.toChunks s)-      len = length cs-  liftM fromIntegral . allocaArray len $ \ptr ->-    withPokes cs ptr $ \niovs ->-#  if !defined(__HUGS__)-      throwSocketErrorIfMinus1RetryMayBlock "writev"-        (threadWaitWrite (fromIntegral fd)) $-#  endif-        c_writev (fromIntegral fd) ptr niovs-  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---- | Send data to the socket.  The socket must be in a connected--- state. This function continues to send data until either all data--- has been sent or an error occurs.  If there is an error, an--- exception is raised, and there is no way to determine how much data--- was sent.  /Unix only/.-sendAll :: Socket      -- ^ Connected socket-        -> ByteString  -- ^ Data to send-        -> IO ()-sendAll sock bs = do-  sent <- send sock bs-  let bs' = L.drop sent bs-  unless (L.null bs') $ sendAll sock bs'-#endif---- -------------------------------------------------------------------------------- Receiving---- | Receive data from the socket.  The socket must be in a connected--- state.  Data is received on demand, in chunks; each chunk will be--- sized to reflect the amount of data received by individual 'recv'--- calls.------ All remaining data from the socket is consumed.  When there is no--- 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---- | Receive data from the socket.  The socket must be in a connected--- state.  This function may return fewer bytes than specified.  If--- the received data is longer than the specified length, it may be--- discarded depending on the type of socket.  This function may block--- until a message arrives.------ If there is no more data to be received, returns an empty 'ByteString'.-recv :: Socket         -- ^ Connected socket-     -> Int64          -- ^ Maximum number of bytes to receive-     -> IO ByteString  -- ^ Data received-recv sock nbytes = chunk `liftM` N.recv sock (fromIntegral nbytes) where-  chunk k-    | S.null k  = Empty-    | otherwise = Chunk k Empty
+ Network/Socket/ByteString/Lazy/Posix.hs view
@@ -0,0 +1,65 @@+{-# LANGUAGE OverloadedStrings #-}++module Network.Socket.ByteString.Lazy.Posix (+    -- * Send data to a socket+    send,+    sendAll,+) where++import qualified Data.ByteString.Lazy as L+import Data.ByteString.Unsafe (unsafeUseAsCStringLen)+import Foreign.Marshal.Array (allocaArray)++import Network.Socket.ByteString.IO (waitWhen0)+import Network.Socket.ByteString.Internal (c_writev)+import Network.Socket.Imports+import Network.Socket.Internal+import Network.Socket.Posix.IOVec (IOVec (IOVec))+import Network.Socket.Types++-- -----------------------------------------------------------------------------+-- Sending+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 (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+    -> 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
@@ -0,0 +1,43 @@+{-# LANGUAGE OverloadedStrings #-}++module Network.Socket.ByteString.Lazy.Windows (+    -- * Send data to a socket+    send,+    sendAll,+) where++import qualified Data.ByteString as S+import qualified Data.ByteString.Lazy as L+import qualified Network.Socket.ByteString as Socket+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 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 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,47 +0,0 @@-{-# LANGUAGE CPP #-}---- | 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)-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 :: CSize-    , 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,640 +0,0 @@-{-# LANGUAGE CPP, ForeignFunctionInterface #-}--------------------------------------------------------------------------------- |--- 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"--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) && !defined(cygwin32_HOST_OS)-      c_getLastError,-#endif-      throwSocketError,--      -- * Guards for socket operations that may fail-      throwSocketErrorIfMinus1_,-      throwSocketErrorIfMinus1Retry,-      throwSocketErrorIfMinus1RetryMayBlock,--      -- * Initialization-      withSocketsDo,--      -- * Low-level helpers-      zeroMemory,-    ) where--import Data.Bits ( (.|.), shiftL, shiftR )-import Data.Word ( Word8, Word16, Word32 )-import Foreign.C.Error (throwErrno, throwErrnoIfMinus1Retry,-                        throwErrnoIfMinus1RetryMayBlock, throwErrnoIfMinus1_)-import Foreign.C.String ( castCharToCChar, peekCString )-import Foreign.C.Types ( CInt, CSize )-import Foreign.Marshal.Alloc ( allocaBytes )-import Foreign.Marshal.Array ( pokeArray, pokeArray0 )-import Foreign.Ptr ( Ptr, castPtr, plusPtr )-import Foreign.Storable ( Storable(..) )--#if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)-import Control.Exception ( finally )-#  if __GLASGOW_HASKELL__-import GHC.IOBase ( IOErrorType(..) )-#  endif-import Foreign.C.Types ( CChar )-import System.IO.Error ( ioeSetErrorString, mkIOError )-#endif----------------------------------------------------------------------------type HostAddress = Word32--#if defined(IPV6_SOCKET_SUPPORT)-type HostAddress6 = (Word32, Word32, Word32, Word32)---- 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 i = do-    let i' = i * 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 i a = do-    let i' = i * 4-        pokeByte n = pokeByteOff p (s6_addr_offset + i' + n)-        a `sr` i = fromIntegral (a `shiftR` i) :: Word8-    pokeByte 0 (a `sr` 24)-    pokeByte 1 (a `sr` 16)-    pokeByte 2 (a `sr`  8)-    pokeByte 3 (a `sr`  0)--instance Storable HostAddress6 where-    sizeOf _    = (#const sizeof(struct in6_addr))-    alignment _ = alignment (undefined :: CInt)--    peek p = do-        a <- peek32 p 0-        b <- peek32 p 1-        c <- peek32 p 2-        d <- peek32 p 3-        return (a, b, c, d)--    poke p (a, b, c, d) = do-        poke32 p 0 a-        poke32 p 1 b-        poke32 p 2 c-        poke32 p 3 d-#endif----------------------------------------------------------------------------- Port Numbers------ newtyped to prevent accidental use of sane-looking--- port numbers that haven't actually been converted to--- network-byte-order first.-----newtype PortNumber = PortNum Word16 deriving ( Eq, Ord )----------------------------------------------------------------------------- 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--data SockAddr       -- C Names-  = SockAddrInet-    PortNumber  -- sin_port  (network byte order)-    HostAddress -- sin_addr  (ditto)-#if defined(IPV6_SOCKET_SUPPORT)-  | SockAddrInet6-        PortNumber      -- sin6_port (network byte order)-        FlowInfo        -- sin6_flowinfo (ditto)-        HostAddress6    -- sin6_addr (ditto)-        ScopeID         -- sin6_scope_id (ditto)-#endif-#if defined(DOMAIN_SOCKET_SUPPORT)-  | SockAddrUnix-        String          -- sun_path-#endif-  deriving (Eq)--#if defined(WITH_WINSOCK) || defined(cygwin32_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-#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---- | 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)---- | 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_TARGET_OS)-    zeroMemory p (#const sizeof(struct sockaddr_un))-#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_TARGET_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_TARGET_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 addr-    (#poke struct sockaddr_in6, sin6_scope_id) p scope-#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-        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----------------------------------------------------------------------------- Protocol Families.---- | This data type might have different constructors depending on--- what is supported by the operating system.-data Family-    = AF_UNSPEC           -- unspecified-#ifdef AF_UNIX-    | AF_UNIX             -- local to host (pipes, portals-#endif-#ifdef AF_INET-    | AF_INET             -- internetwork: UDP, TCP, etc-#endif-#ifdef AF_INET6-    | AF_INET6            -- Internet Protocol version 6-#endif-#ifdef AF_IMPLINK-    | AF_IMPLINK          -- arpanet imp addresses-#endif-#ifdef AF_PUP-    | AF_PUP              -- pup protocols: e.g. BSP-#endif-#ifdef AF_CHAOS-    | AF_CHAOS            -- mit CHAOS protocols-#endif-#ifdef AF_NS-    | AF_NS               -- XEROX NS protocols-#endif-#ifdef AF_NBS-    | AF_NBS              -- nbs protocols-#endif-#ifdef AF_ECMA-    | AF_ECMA             -- european computer manufacturers-#endif-#ifdef AF_DATAKIT-    | AF_DATAKIT          -- datakit protocols-#endif-#ifdef AF_CCITT-    | AF_CCITT            -- CCITT protocols, X.25 etc-#endif-#ifdef AF_SNA-    | AF_SNA              -- IBM SNA-#endif-#ifdef AF_DECnet-    | AF_DECnet           -- DECnet-#endif-#ifdef AF_DLI-    | AF_DLI              -- Direct data link interface-#endif-#ifdef AF_LAT-    | AF_LAT              -- LAT-#endif-#ifdef AF_HYLINK-    | AF_HYLINK           -- NSC Hyperchannel-#endif-#ifdef AF_APPLETALK-    | AF_APPLETALK        -- Apple Talk-#endif-#ifdef AF_ROUTE-    | AF_ROUTE            -- Internal Routing Protocol-#endif-#ifdef AF_NETBIOS-    | AF_NETBIOS          -- NetBios-style addresses-#endif-#ifdef AF_NIT-    | AF_NIT              -- Network Interface Tap-#endif-#ifdef AF_802-    | AF_802              -- IEEE 802.2, also ISO 8802-#endif-#ifdef AF_ISO-    | AF_ISO              -- ISO protocols-#endif-#ifdef AF_OSI-    | AF_OSI              -- umbrella of all families used by OSI-#endif-#ifdef AF_NETMAN-    | AF_NETMAN           -- DNA Network Management-#endif-#ifdef AF_X25-    | AF_X25              -- CCITT X.25-#endif-#ifdef AF_AX25-    | AF_AX25-#endif-#ifdef AF_OSINET-    | AF_OSINET           -- AFI-#endif-#ifdef AF_GOSSIP-    | AF_GOSSIP           -- US Government OSI-#endif-#ifdef AF_IPX-    | AF_IPX              -- Novell Internet Protocol-#endif-#ifdef Pseudo_AF_XTP-    | Pseudo_AF_XTP       -- eXpress Transfer Protocol (no AF)-#endif-#ifdef AF_CTF-    | AF_CTF              -- Common Trace Facility-#endif-#ifdef AF_WAN-    | AF_WAN              -- Wide Area Network protocols-#endif-#ifdef AF_SDL-    | AF_SDL              -- SGI Data Link for DLPI-#endif-#ifdef AF_NETWARE-    | AF_NETWARE-#endif-#ifdef AF_NDD-    | AF_NDD-#endif-#ifdef AF_INTF-    | AF_INTF             -- Debugging use only-#endif-#ifdef AF_COIP-    | AF_COIP             -- connection-oriented IP, aka ST II-#endif-#ifdef AF_CNT-    | AF_CNT              -- Computer Network Technology-#endif-#ifdef Pseudo_AF_RTIP-    | Pseudo_AF_RTIP      -- Help Identify RTIP packets-#endif-#ifdef Pseudo_AF_PIP-    | Pseudo_AF_PIP       -- Help Identify PIP packets-#endif-#ifdef AF_SIP-    | AF_SIP              -- Simple Internet Protocol-#endif-#ifdef AF_ISDN-    | AF_ISDN             -- Integrated Services Digital Network-#endif-#ifdef Pseudo_AF_KEY-    | Pseudo_AF_KEY       -- Internal key-management function-#endif-#ifdef AF_NATM-    | AF_NATM             -- native ATM access-#endif-#ifdef AF_ARP-    | AF_ARP              -- (rev.) addr. res. prot. (RFC 826)-#endif-#ifdef Pseudo_AF_HDRCMPLT-    | Pseudo_AF_HDRCMPLT  -- Used by BPF to not rewrite hdrs in iface output-#endif-#ifdef AF_ENCAP-    | AF_ENCAP-#endif-#ifdef AF_LINK-    | AF_LINK             -- Link layer interface-#endif-#ifdef AF_RAW-    | AF_RAW              -- Link layer interface-#endif-#ifdef AF_RIF-    | AF_RIF              -- raw interface-#endif-#ifdef AF_NETROM-    | AF_NETROM           -- Amateur radio NetROM-#endif-#ifdef AF_BRIDGE-    | AF_BRIDGE           -- multiprotocol bridge-#endif-#ifdef AF_ATMPVC-    | AF_ATMPVC           -- ATM PVCs-#endif-#ifdef AF_ROSE-    | AF_ROSE             -- Amateur Radio X.25 PLP-#endif-#ifdef AF_NETBEUI-    | AF_NETBEUI          -- 802.2LLC-#endif-#ifdef AF_SECURITY-    | AF_SECURITY         -- Security callback pseudo AF-#endif-#ifdef AF_PACKET-    | AF_PACKET           -- Packet family-#endif-#ifdef AF_ASH-    | AF_ASH              -- Ash-#endif-#ifdef AF_ECONET-    | AF_ECONET           -- Acorn Econet-#endif-#ifdef AF_ATMSVC-    | AF_ATMSVC           -- ATM SVCs-#endif-#ifdef AF_IRDA-    | AF_IRDA             -- IRDA sockets-#endif-#ifdef AF_PPPOX-    | AF_PPPOX            -- PPPoX sockets-#endif-#ifdef AF_WANPIPE-    | AF_WANPIPE          -- Wanpipe API sockets-#endif-#ifdef AF_BLUETOOTH-    | AF_BLUETOOTH        -- bluetooth sockets-#endif-      deriving (Eq, Ord, Read, Show)---- ------------------------------------------------------------------------ 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---- | 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_-    :: 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-    :: 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.  Checks for operations that would block and--- executes an alternative action before retrying in that case.-throwSocketErrorIfMinus1RetryMayBlock-    :: 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(__GLASGOW_HASKELL__) && (!defined(HAVE_WINSOCK2_H) || defined(cygwin32_HOST_OS))--throwSocketErrorIfMinus1RetryMayBlock name on_block act =-    throwErrnoIfMinus1RetryMayBlock name act on_block--throwSocketErrorIfMinus1Retry = throwErrnoIfMinus1Retry--throwSocketErrorIfMinus1_ = throwErrnoIfMinus1_--throwSocketError = throwErrno--#else--throwSocketErrorIfMinus1RetryMayBlock name _ act-  = throwSocketErrorIfMinus1Retry name act--throwSocketErrorIfMinus1_ name act = do-  throwSocketErrorIfMinus1Retry name act-  return ()--# if defined(HAVE_WINSOCK2_H) && !defined(cygwin32_HOST_OS)-throwSocketErrorIfMinus1Retry name act = do-  r <- act-  if (r == -1)-   then do-    rc   <- c_getLastError-    case rc of-      10093 -> do -- WSANOTINITIALISED-        withSocketsDo (return ())-        r <- act-        if (r == -1)-           then throwSocketError name-           else return r-      _ -> throwSocketError name-   else return r--throwSocketError name = do-    rc <- c_getLastError-    pstr <- c_getWSError rc-    str  <- peekCString pstr-#  if __GLASGOW_HASKELL__-    ioError (ioeSetErrorString (mkIOError OtherError name Nothing Nothing) str)-#  else-    ioError (userError (name ++ ": socket error - " ++ str))-#  endif--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-# endif-#endif /* __GLASGOW_HASKELL */---- ------------------------------------------------------------------------------ WinSock support--{-| On Windows operating systems, the networking subsystem has to be-initialised using 'withSocketsDo' before any networking operations can-be used.  eg.--> main = withSocketsDo $ do {...}--Although this is only strictly necessary on Windows platforms, it is-harmless on other platforms, so for portability it is good practice to-use it all the time.--}-withSocketsDo :: IO a -> IO a-#if !defined(WITH_WINSOCK)-withSocketsDo x = x-#else-withSocketsDo act = do-    x <- initWinSock-    if x /= 0-       then ioError (userError "Failed to initialise WinSock")-       else act `finally` shutdownWinSock--foreign import ccall unsafe "initWinSock" initWinSock :: IO Int-foreign import ccall unsafe "shutdownWinSock" shutdownWinSock :: IO ()--#endif----------------------------------------------------------------------------- Helper functions--foreign import ccall unsafe "string.h" memset :: Ptr a -> CInt -> CSize -> IO ()---- | Zero a structure.-zeroMemory :: Ptr a -> CSize -> IO ()-zeroMemory dest nbytes = memset dest 0 (fromIntegral nbytes)
+ 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
@@ -0,0 +1,1447 @@+{-# 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++foreign import ccall unsafe "string.h" memset :: Ptr a -> CInt -> CSize -> IO ()++-- | Zero a structure.+zeroMemory :: Ptr a -> CSize -> IO ()+zeroMemory dest nbytes = memset dest 0 (fromIntegral nbytes)
+ 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)
− Network/URI.hs
@@ -1,1283 +0,0 @@-{-# LANGUAGE CPP #-}------------------------------------------------------------------------------------ |---  Module      :  Network.URI---  Copyright   :  (c) 2004, Graham Klyne---  License     :  BSD-style (see end of this file)------  Maintainer  :  Graham Klyne <gk@ninebynine.org>---  Stability   :  provisional---  Portability :  portable------  This module defines functions for handling URIs.  It presents substantially the---  same interface as the older GHC Network.URI module, but is implemented using---  Parsec rather than a Regex library that is not available with Hugs.  The internal---  representation of URI has been changed so that URI strings are more---  completely preserved when round-tripping to a URI value and back.------  In addition, four methods are provided for parsing different---  kinds of URI string (as noted in RFC3986):---      'parseURI',---      'parseURIReference',---      'parseRelativeReference' and---      'parseAbsoluteURI'.------  Further, four methods are provided for classifying different---  kinds of URI string (as noted in RFC3986):---      'isURI',---      'isURIReference',---      'isRelativeReference' and---      'isAbsoluteURI'.------  The long-standing official reference for URI handling was RFC2396 [1],---  as updated by RFC 2732 [2], but this was replaced by a new specification,---  RFC3986 [3] in January 2005.  This latter specification has been used---  as the primary reference for constructing the URI parser implemented---  here, and it is intended that there is a direct relationship between---  the syntax definition in that document and this parser implementation.------  RFC 1808 [4] contains a number of test cases for relative URI handling.---  Dan Connolly's Python module @uripath.py@ [5] also contains useful details---  and test cases.------  Some of the code has been copied from the previous GHC implementation,---  but the parser is replaced with one that performs more complete---  syntax checking of the URI itself, according to RFC3986 [3].------  References------  (1) <http://www.ietf.org/rfc/rfc2396.txt>------  (2) <http://www.ietf.org/rfc/rfc2732.txt>------  (3) <http://www.ietf.org/rfc/rfc3986.txt>------  (4) <http://www.ietf.org/rfc/rfc1808.txt>------  (5) <http://www.w3.org/2000/10/swap/uripath.py>--------------------------------------------------------------------------------------module Network.URI-    ( -- * The URI type-      URI(..)-    , URIAuth(..)-    , nullURI-      -- * Parsing-    , parseURI                  -- :: String -> Maybe URI-    , parseURIReference         -- :: String -> Maybe URI-    , parseRelativeReference    -- :: String -> Maybe URI-    , parseAbsoluteURI          -- :: String -> Maybe URI-      -- * Test for strings containing various kinds of URI-    , isURI-    , isURIReference-    , isRelativeReference-    , isAbsoluteURI-    , isIPv6address-    , isIPv4address-      -- * Relative URIs-    , relativeTo                -- :: URI -> URI -> Maybe URI-    , nonStrictRelativeTo       -- :: URI -> URI -> Maybe URI-    , relativeFrom              -- :: URI -> URI -> URI-      -- * Operations on URI strings-      -- | Support for putting strings into URI-friendly-      --   escaped format and getting them back again.-      --   This can't be done transparently in all cases, because certain-      --   characters have different meanings in different kinds of URI.-      --   The URI spec [3], section 2.4, indicates that all URI components-      --   should be escaped before they are assembled as a URI:-      --   \"Once produced, a URI is always in its percent-encoded form\"-    , uriToString               -- :: URI -> ShowS-    , isReserved, isUnreserved  -- :: Char -> Bool-    , isAllowedInURI, isUnescapedInURI  -- :: Char -> Bool-    , escapeURIChar             -- :: (Char->Bool) -> Char -> String-    , escapeURIString           -- :: (Char->Bool) -> String -> String-    , unEscapeString            -- :: String -> String-    -- * URI Normalization functions-    , normalizeCase             -- :: String -> String-    , normalizeEscape           -- :: String -> String-    , normalizePathSegments     -- :: String -> String-    -- * Deprecated functions-    , parseabsoluteURI          -- :: String -> Maybe URI-    , escapeString              -- :: String -> (Char->Bool) -> String-    , reserved, unreserved      -- :: Char -> Bool-    , scheme, authority, path, query, fragment-    )-where--import Text.ParserCombinators.Parsec-    ( GenParser(..), ParseError(..)-    , parse, (<|>), (<?>), try-    , option, many, many1, count, notFollowedBy, lookAhead-    , char, satisfy, oneOf, string, letter, digit, hexDigit, eof-    , unexpected-    )--import Data.Char( ord, chr, isHexDigit, isSpace, toLower, toUpper, digitToInt )--import Debug.Trace( trace )--import Numeric( showIntAtBase )--import Data.Maybe( isJust )--import Control.Monad( MonadPlus(..) )--#ifdef __GLASGOW_HASKELL__-import Data.Typeable  ( Typeable )-# if MIN_VERSION_base(4,0,0)-import Data.Data      ( Data )-# else-import Data.Generics  ( Data )-# endif-#else-import Data.Typeable  ( Typeable(..), TyCon, mkTyCon, mkTyConApp )-#endif-----------------------------------------------------------------  The URI datatype----------------------------------------------------------------- |Represents a general universal resource identifier using---  its component parts.------  For example, for the URI------  >   foo://anonymous@www.haskell.org:42/ghc?query#frag------  the components are:----data URI = URI-    { uriScheme     :: String           -- ^ @foo:@-    , uriAuthority  :: Maybe URIAuth    -- ^ @\/\/anonymous\@www.haskell.org:42@-    , uriPath       :: String           -- ^ @\/ghc@-    , uriQuery      :: String           -- ^ @?query@-    , uriFragment   :: String           -- ^ @#frag@-    } deriving (Eq-#ifdef __GLASGOW_HASKELL__-    , Typeable, Data-#endif-    )--#ifndef __GLASGOW_HASKELL__-uriTc :: TyCon-uriTc = mkTyCon "URI"--instance Typeable URI where-  typeOf _ = mkTyConApp uriTc []-#endif---- |Type for authority value within a URI-data URIAuth = URIAuth-    { uriUserInfo   :: String           -- ^ @anonymous\@@-    , uriRegName    :: String           -- ^ @www.haskell.org@-    , uriPort       :: String           -- ^ @:42@-    } deriving (Eq-#ifdef __GLASGOW_HASKELL__-    , Typeable, Data-#endif-    )--#ifndef __GLASGOW_HASKELL__-uriAuthTc :: TyCon-uriAuthTc = mkTyCon "URIAuth"--instance Typeable URIAuth where-  typeOf _ = mkTyConApp uriAuthTc []-#endif---- |Blank URI-nullURI :: URI-nullURI = URI-    { uriScheme     = ""-    , uriAuthority  = Nothing-    , uriPath       = ""-    , uriQuery      = ""-    , uriFragment   = ""-    }----  URI as instance of Show.  Note that for security reasons, the default---  behaviour is to suppress any userinfo field (see RFC3986, section 7.5).---  This can be overridden by using uriToString directly with first---  argument @id@ (noting that this returns a ShowS value rather than a string).------  [[[Another design would be to embed the userinfo mapping function in---  the URIAuth value, with the default value suppressing userinfo formatting,---  but providing a function to return a new URI value with userinfo---  data exposed by show.]]]----instance Show URI where-    showsPrec _ uri = uriToString defaultUserInfoMap uri--defaultUserInfoMap :: String -> String-defaultUserInfoMap uinf = user++newpass-    where-        (user,pass) = break (==':') uinf-        newpass     = if null pass || (pass == "@")-                                   || (pass == ":@")-                        then pass-                        else ":...@"--testDefaultUserInfoMap =-     [ defaultUserInfoMap ""                == ""-     , defaultUserInfoMap "@"               == "@"-     , defaultUserInfoMap "user@"           == "user@"-     , defaultUserInfoMap "user:@"          == "user:@"-     , defaultUserInfoMap "user:anonymous@" == "user:...@"-     , defaultUserInfoMap "user:pass@"      == "user:...@"-     , defaultUserInfoMap "user:pass"       == "user:...@"-     , defaultUserInfoMap "user:anonymous"  == "user:...@"-     ]-----------------------------------------------------------------  Parse a URI----------------------------------------------------------------- |Turn a string containing a URI into a 'URI'.---  Returns 'Nothing' if the string is not a valid URI;---  (an absolute URI with optional fragment identifier).------  NOTE: this is different from the previous network.URI,---  whose @parseURI@ function works like 'parseURIReference'---  in this module.----parseURI :: String -> Maybe URI-parseURI = parseURIAny uri---- |Parse a URI reference to a 'URI' value.---  Returns 'Nothing' if the string is not a valid URI reference.---  (an absolute or relative URI with optional fragment identifier).----parseURIReference :: String -> Maybe URI-parseURIReference = parseURIAny uriReference---- |Parse a relative URI to a 'URI' value.---  Returns 'Nothing' if the string is not a valid relative URI.---  (a relative URI with optional fragment identifier).----parseRelativeReference :: String -> Maybe URI-parseRelativeReference = parseURIAny relativeRef---- |Parse an absolute URI to a 'URI' value.---  Returns 'Nothing' if the string is not a valid absolute URI.---  (an absolute URI without a fragment identifier).----parseAbsoluteURI :: String -> Maybe URI-parseAbsoluteURI = parseURIAny absoluteURI---- |Test if string contains a valid URI---  (an absolute URI with optional fragment identifier).----isURI :: String -> Bool-isURI = isValidParse uri---- |Test if string contains a valid URI reference---  (an absolute or relative URI with optional fragment identifier).----isURIReference :: String -> Bool-isURIReference = isValidParse uriReference---- |Test if string contains a valid relative URI---  (a relative URI with optional fragment identifier).----isRelativeReference :: String -> Bool-isRelativeReference = isValidParse relativeRef---- |Test if string contains a valid absolute URI---  (an absolute URI without a fragment identifier).----isAbsoluteURI :: String -> Bool-isAbsoluteURI = isValidParse absoluteURI---- |Test if string contains a valid IPv6 address----isIPv6address :: String -> Bool-isIPv6address = isValidParse ipv6address---- |Test if string contains a valid IPv4 address----isIPv4address :: String -> Bool-isIPv4address = isValidParse ipv4address---- |Test function: parse and reconstruct a URI reference----testURIReference :: String -> String-testURIReference uristr = show (parseAll uriReference "" uristr)----  Helper function for turning a string into a URI----parseURIAny :: URIParser URI -> String -> Maybe URI-parseURIAny parser uristr = case parseAll parser "" uristr of-        Left  _ -> Nothing-        Right u -> Just u----  Helper function to test a string match to a parser----isValidParse :: URIParser a -> String -> Bool-isValidParse parser uristr = case parseAll parser "" uristr of-        -- Left  e -> error (show e)-        Left  _ -> False-        Right u -> True--parseAll :: URIParser a -> String -> String -> Either ParseError a-parseAll parser filename uristr = parse newparser filename uristr-    where-        newparser =-            do  { res <- parser-                ; eof-                ; return res-                }-----------------------------------------------------------------  URI parser body based on Parsec elements and combinators-----------------------------------------------------------------  Parser parser type.---  Currently-type URIParser a = GenParser Char () a----  RFC3986, section 2.1------  Parse and return a 'pct-encoded' sequence----escaped :: URIParser String-escaped =-    do  { char '%'-        ; h1 <- hexDigitChar-        ; h2 <- hexDigitChar-        ; return $ ['%',h1,h2]-        }----  RFC3986, section 2.2------ |Returns 'True' if the character is a \"reserved\" character in a---  URI.  To include a literal instance of one of these characters in a---  component of a URI, it must be escaped.----isReserved :: Char -> Bool-isReserved c = isGenDelims c || isSubDelims c--isGenDelims c = c `elem` ":/?#[]@"--isSubDelims c = c `elem` "!$&'()*+,;="--genDelims :: URIParser String-genDelims = do { c <- satisfy isGenDelims ; return [c] }--subDelims :: URIParser String-subDelims = do { c <- satisfy isSubDelims ; return [c] }----  RFC3986, section 2.3------ |Returns 'True' if the character is an \"unreserved\" character in---  a URI.  These characters do not need to be escaped in a URI.  The---  only characters allowed in a URI are either \"reserved\",---  \"unreserved\", or an escape sequence (@%@ followed by two hex digits).----isUnreserved :: Char -> Bool-isUnreserved c = isAlphaNumChar c || (c `elem` "-_.~")--unreservedChar :: URIParser String-unreservedChar = do { c <- satisfy isUnreserved ; return [c] }----  RFC3986, section 3------   URI         = scheme ":" hier-part [ "?" query ] [ "#" fragment ]------   hier-part   = "//" authority path-abempty---               / path-abs---               / path-rootless---               / path-empty--uri :: URIParser URI-uri =-    do  { us <- try uscheme-        -- ; ua <- option Nothing ( do { try (string "//") ; uauthority } )-        -- ; up <- upath-        ; (ua,up) <- hierPart-        ; uq <- option "" ( do { char '?' ; uquery    } )-        ; uf <- option "" ( do { char '#' ; ufragment } )-        ; return $ URI-            { uriScheme    = us-            , uriAuthority = ua-            , uriPath      = up-            , uriQuery     = uq-            , uriFragment  = uf-            }-        }--hierPart :: URIParser ((Maybe URIAuth),String)-hierPart =-        do  { try (string "//")-            ; ua <- uauthority-            ; up <- pathAbEmpty-            ; return (ua,up)-            }-    <|> do  { up <- pathAbs-            ; return (Nothing,up)-            }-    <|> do  { up <- pathRootLess-            ; return (Nothing,up)-            }-    <|> do  { return (Nothing,"")-            }----  RFC3986, section 3.1--uscheme :: URIParser String-uscheme =-    do  { s <- oneThenMany alphaChar (satisfy isSchemeChar)-        ; char ':'-        ; return $ s++":"-        }----  RFC3986, section 3.2--uauthority :: URIParser (Maybe URIAuth)-uauthority =-    do  { uu <- option "" (try userinfo)-        ; uh <- host-        ; up <- option "" port-        ; return $ Just $ URIAuth-            { uriUserInfo = uu-            , uriRegName  = uh-            , uriPort     = up-            }-        }----  RFC3986, section 3.2.1--userinfo :: URIParser String-userinfo =-    do  { uu <- many (uchar ";:&=+$,")-        ; char '@'-        ; return (concat uu ++"@")-        }----  RFC3986, section 3.2.2--host :: URIParser String-host = ipLiteral <|> try ipv4address <|> regName--ipLiteral :: URIParser String-ipLiteral =-    do  { char '['-        ; ua <- ( ipv6address <|> ipvFuture )-        ; char ']'-        ; return $ "[" ++ ua ++ "]"-        }-    <?> "IP address literal"--ipvFuture :: URIParser String-ipvFuture =-    do  { char 'v'-        ; h <- hexDigitChar-        ; char '.'-        ; a <- many1 (satisfy isIpvFutureChar)-        ; return $ 'c':h:'.':a-        }--isIpvFutureChar c = isUnreserved c || isSubDelims c || (c==';')--ipv6address :: URIParser String-ipv6address =-        try ( do-                { a2 <- count 6 h4c-                ; a3 <- ls32-                ; return $ concat a2 ++ a3-                } )-    <|> try ( do-                { string "::"-                ; a2 <- count 5 h4c-                ; a3 <- ls32-                ; return $ "::" ++ concat a2 ++ a3-                } )-    <|> try ( do-                { a1 <- opt_n_h4c_h4 0-                ; string "::"-                ; a2 <- count 4 h4c-                ; a3 <- ls32-                ; return $ a1 ++ "::" ++ concat a2 ++ a3-                } )-    <|> try ( do-                { a1 <- opt_n_h4c_h4 1-                ; string "::"-                ; a2 <- count 3 h4c-                ; a3 <- ls32-                ; return $ a1 ++ "::" ++ concat a2 ++ a3-                } )-    <|> try ( do-                { a1 <- opt_n_h4c_h4 2-                ; string "::"-                ; a2 <- count 2 h4c-                ; a3 <- ls32-                ; return $ a1 ++ "::" ++ concat a2 ++ a3-                } )-    <|> try ( do-                { a1 <- opt_n_h4c_h4 3-                ; string "::"-                ; a2 <- h4c-                ; a3 <- ls32-                ; return $ a1 ++ "::" ++ a2 ++ a3-                } )-    <|> try ( do-                { a1 <- opt_n_h4c_h4 4-                ; string "::"-                ; a3 <- ls32-                ; return $ a1 ++ "::" ++ a3-                } )-    <|> try ( do-                { a1 <- opt_n_h4c_h4 5-                ; string "::"-                ; a3 <- h4-                ; return $ a1 ++ "::" ++ a3-                } )-    <|> try ( do-                { a1 <- opt_n_h4c_h4 6-                ; string "::"-                ; return $ a1 ++ "::"-                } )-    <?> "IPv6 address"--opt_n_h4c_h4 :: Int -> URIParser String-opt_n_h4c_h4 n = option "" $-    do  { a1 <- countMinMax 0 n h4c-        ; a2 <- h4-        ; return $ concat a1 ++ a2-        }--ls32 :: URIParser String-ls32 =  try ( do-                { a1 <- h4c-                ; a2 <- h4-                ; return (a1++a2)-                } )-    <|> ipv4address--h4c :: URIParser String-h4c = try $-    do  { a1 <- h4-        ; char ':'-        ; notFollowedBy (char ':')-        ; return $ a1 ++ ":"-        }--h4 :: URIParser String-h4 = countMinMax 1 4 hexDigitChar--ipv4address :: URIParser String-ipv4address =-    do  { a1 <- decOctet ; char '.'-        ; a2 <- decOctet ; char '.'-        ; a3 <- decOctet ; char '.'-        ; a4 <- decOctet-        ; return $ a1++"."++a2++"."++a3++"."++a4-        }--decOctet :: URIParser String-decOctet =-    do  { a1 <- countMinMax 1 3 digitChar-        ; if read a1 > 255 then-            fail "Decimal octet value too large"-          else-            return a1-        }--regName :: URIParser String-regName =-    do  { ss <- countMinMax 0 255 ( unreservedChar <|> escaped <|> subDelims )-        ; return $ concat ss-        }-    <?> "Registered name"----  RFC3986, section 3.2.3--port :: URIParser String-port =-    do  { char ':'-        ; p <- many digitChar-        ; return (':':p)-        }-------  RFC3986, section 3.3------   path          = path-abempty    ; begins with "/" or is empty---                 / path-abs        ; begins with "/" but not "//"---                 / path-noscheme   ; begins with a non-colon segment---                 / path-rootless   ; begins with a segment---                 / path-empty      ; zero characters------   path-abempty  = *( "/" segment )---   path-abs      = "/" [ segment-nz *( "/" segment ) ]---   path-noscheme = segment-nzc *( "/" segment )---   path-rootless = segment-nz *( "/" segment )---   path-empty    = 0<pchar>------   segment       = *pchar---   segment-nz    = 1*pchar---   segment-nzc   = 1*( unreserved / pct-encoded / sub-delims / "@" )------   pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"--{--upath :: URIParser String-upath = pathAbEmpty-    <|> pathAbs-    <|> pathNoScheme-    <|> pathRootLess-    <|> pathEmpty--}--pathAbEmpty :: URIParser String-pathAbEmpty =-    do  { ss <- many slashSegment-        ; return $ concat ss-        }--pathAbs :: URIParser String-pathAbs =-    do  { char '/'-        ; ss <- option "" pathRootLess-        ; return $ '/':ss-        }--pathNoScheme :: URIParser String-pathNoScheme =-    do  { s1 <- segmentNzc-        ; ss <- many slashSegment-        ; return $ concat (s1:ss)-        }--pathRootLess :: URIParser String-pathRootLess =-    do  { s1 <- segmentNz-        ; ss <- many slashSegment-        ; return $ concat (s1:ss)-        }--slashSegment :: URIParser String-slashSegment =-    do  { char '/'-        ; s <- segment-        ; return ('/':s)-        }--segment :: URIParser String-segment =-    do  { ps <- many pchar-        ; return $ concat ps-        }--segmentNz :: URIParser String-segmentNz =-    do  { ps <- many1 pchar-        ; return $ concat ps-        }--segmentNzc :: URIParser String-segmentNzc =-    do  { ps <- many1 (uchar "@")-        ; return $ concat ps-        }--pchar :: URIParser String-pchar = uchar ":@"---- helper function for pchar and friends-uchar :: String -> URIParser String-uchar extras =-        unreservedChar-    <|> escaped-    <|> subDelims-    <|> do { c <- oneOf extras ; return [c] }----  RFC3986, section 3.4--uquery :: URIParser String-uquery =-    do  { ss <- many $ uchar (":@"++"/?")-        ; return $ '?':concat ss-        }----  RFC3986, section 3.5--ufragment :: URIParser String-ufragment =-    do  { ss <- many $ uchar (":@"++"/?")-        ; return $ '#':concat ss-        }----  Reference, Relative and Absolute URI forms------  RFC3986, section 4.1--uriReference :: URIParser URI-uriReference = uri <|> relativeRef----  RFC3986, section 4.2------   relative-URI  = relative-part [ "?" query ] [ "#" fragment ]------   relative-part = "//" authority path-abempty---                 / path-abs---                 / path-noscheme---                 / path-empty--relativeRef :: URIParser URI-relativeRef =-    do  { notMatching uscheme-        -- ; ua <- option Nothing ( do { try (string "//") ; uauthority } )-        -- ; up <- upath-        ; (ua,up) <- relativePart-        ; uq <- option "" ( do { char '?' ; uquery    } )-        ; uf <- option "" ( do { char '#' ; ufragment } )-        ; return $ URI-            { uriScheme    = ""-            , uriAuthority = ua-            , uriPath      = up-            , uriQuery     = uq-            , uriFragment  = uf-            }-        }--relativePart :: URIParser ((Maybe URIAuth),String)-relativePart =-        do  { try (string "//")-            ; ua <- uauthority-            ; up <- pathAbEmpty-            ; return (ua,up)-            }-    <|> do  { up <- pathAbs-            ; return (Nothing,up)-            }-    <|> do  { up <- pathNoScheme-            ; return (Nothing,up)-            }-    <|> do  { return (Nothing,"")-            }----  RFC3986, section 4.3--absoluteURI :: URIParser URI-absoluteURI =-    do  { us <- uscheme-        -- ; ua <- option Nothing ( do { try (string "//") ; uauthority } )-        -- ; up <- upath-        ; (ua,up) <- hierPart-        ; uq <- option "" ( do { char '?' ; uquery    } )-        ; return $ URI-            { uriScheme    = us-            , uriAuthority = ua-            , uriPath      = up-            , uriQuery     = uq-            , uriFragment  = ""-            }-        }----  Imports from RFC 2234--    -- NOTE: can't use isAlphaNum etc. because these deal with ISO 8859-    -- (and possibly Unicode!) chars.-    -- [[[Above was a comment originally in GHC Network/URI.hs:-    --    when IRIs are introduced then most codepoints above 128(?) should-    --    be treated as unreserved, and higher codepoints for letters should-    --    certainly be allowed.-    -- ]]]--isAlphaChar c    = (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')--isDigitChar c    = (c >= '0' && c <= '9')--isAlphaNumChar c = isAlphaChar c || isDigitChar c--isHexDigitChar c = isHexDigit c--isSchemeChar c   = (isAlphaNumChar c) || (c `elem` "+-.")--alphaChar :: URIParser Char-alphaChar = satisfy isAlphaChar         -- or: Parsec.letter ?--digitChar :: URIParser Char-digitChar = satisfy isDigitChar         -- or: Parsec.digit ?--alphaNumChar :: URIParser Char-alphaNumChar = satisfy isAlphaNumChar--hexDigitChar :: URIParser Char-hexDigitChar = satisfy isHexDigitChar   -- or: Parsec.hexDigit ?----  Additional parser combinators for common patterns--oneThenMany :: GenParser t s a -> GenParser t s a -> GenParser t s [a]-oneThenMany p1 pr =-    do  { a1 <- p1-        ; ar <- many pr-        ; return (a1:ar)-        }--countMinMax :: Int -> Int -> GenParser t s a -> GenParser t s [a]-countMinMax m n p | m > 0 =-    do  { a1 <- p-        ; ar <- countMinMax (m-1) (n-1) p-        ; return (a1:ar)-        }-countMinMax _ n _ | n <= 0 = return []-countMinMax _ n p = option [] $-    do  { a1 <- p-        ; ar <- countMinMax 0 (n-1) p-        ; return (a1:ar)-        }--notMatching :: Show a => GenParser tok st a -> GenParser tok st ()-notMatching p = do { a <- try p ; unexpected (show a) } <|> return ()-----------------------------------------------------------------  Reconstruct a URI string------------------------------------------------------------------- |Turn a 'URI' into a string.------  Uses a supplied function to map the userinfo part of the URI.------  The Show instance for URI uses a mapping that hides any password---  that may be present in the URI.  Use this function with argument @id@---  to preserve the password in the formatted output.----uriToString :: (String->String) -> URI -> ShowS-uriToString userinfomap URI { uriScheme=scheme-                            , uriAuthority=authority-                            , uriPath=path-                            , uriQuery=query-                            , uriFragment=fragment-                            } =-    (scheme++) . (uriAuthToString userinfomap authority)-               . (path++) . (query++) . (fragment++)--uriAuthToString :: (String->String) -> (Maybe URIAuth) -> ShowS-uriAuthToString _           Nothing   = id          -- shows ""-uriAuthToString userinfomap-        (Just URIAuth { uriUserInfo = uinfo-                      , uriRegName  = regname-                      , uriPort     = port-                      } ) =-    ("//"++) . (if null uinfo then id else ((userinfomap uinfo)++))-             . (regname++)-             . (port++)-----------------------------------------------------------------  Character classes----------------------------------------------------------------- | Returns 'True' if the character is allowed in a URI.----isAllowedInURI :: Char -> Bool-isAllowedInURI c = isReserved c || isUnreserved c || c == '%' -- escape char---- | Returns 'True' if the character is allowed unescaped in a URI.----isUnescapedInURI :: Char -> Bool-isUnescapedInURI c = isReserved c || isUnreserved c-----------------------------------------------------------------  Escape sequence handling----------------------------------------------------------------- |Escape character if supplied predicate is not satisfied,---  otherwise return character as singleton string.----escapeURIChar :: (Char->Bool) -> Char -> String-escapeURIChar p c-    | p c       = [c]-    | otherwise = '%' : myShowHex (ord c) ""-    where-        myShowHex :: Int -> ShowS-        myShowHex n r =  case showIntAtBase 16 (toChrHex) n r of-            []  -> "00"-            [c] -> ['0',c]-            cs  -> cs-        toChrHex d-            | d < 10    = chr (ord '0' + fromIntegral d)-            | otherwise = chr (ord 'A' + fromIntegral (d - 10))---- |Can be used to make a string valid for use in a URI.----escapeURIString-    :: (Char->Bool)     -- ^ a predicate which returns 'False'-                        --   if the character should be escaped-    -> String           -- ^ the string to process-    -> String           -- ^ the resulting URI string-escapeURIString p s = concatMap (escapeURIChar p) s---- |Turns all instances of escaped characters in the string back---  into literal characters.----unEscapeString :: String -> String-unEscapeString [] = ""-unEscapeString ('%':x1:x2:s) | isHexDigit x1 && isHexDigit x2 =-    chr (digitToInt x1 * 16 + digitToInt x2) : unEscapeString s-unEscapeString (c:s) = c : unEscapeString s----------------------------------------------------------------- Resolving a relative URI relative to a base URI----------------------------------------------------------------- |Returns a new 'URI' which represents the value of the---  first 'URI' interpreted as relative to the second 'URI'.---  For example:------  > "foo" `relativeTo` "http://bar.org/" = "http://bar.org/foo"---  > "http:foo" `nonStrictRelativeTo` "http://bar.org/" = "http://bar.org/foo"------  Algorithm from RFC3986 [3], section 5.2.2-----nonStrictRelativeTo :: URI -> URI -> Maybe URI-nonStrictRelativeTo ref base = relativeTo ref' base-    where-        ref' = if uriScheme ref == uriScheme base-               then ref { uriScheme="" }-               else ref--isDefined :: ( MonadPlus m, Eq (m a) ) => m a -> Bool-isDefined a = a /= mzero---- |Compute an absolute 'URI' for a supplied URI---  relative to a given base.-relativeTo :: URI -> URI -> Maybe URI-relativeTo ref base-    | isDefined ( uriScheme ref ) =-        just_segments ref-    | isDefined ( uriAuthority ref ) =-        just_segments ref { uriScheme = uriScheme base }-    | isDefined ( uriPath ref ) =-        if (head (uriPath ref) == '/') then-            just_segments ref-                { uriScheme    = uriScheme base-                , uriAuthority = uriAuthority base-                }-        else-            just_segments ref-                { uriScheme    = uriScheme base-                , uriAuthority = uriAuthority base-                , uriPath      = mergePaths base ref-                }-    | isDefined ( uriQuery ref ) =-        just_segments ref-            { uriScheme    = uriScheme base-            , uriAuthority = uriAuthority base-            , uriPath      = uriPath base-            }-    | otherwise =-        just_segments ref-            { uriScheme    = uriScheme base-            , uriAuthority = uriAuthority base-            , uriPath      = uriPath base-            , uriQuery     = uriQuery base-            }-    where-        just_segments u =-            Just $ u { uriPath = removeDotSegments (uriPath u) }-        mergePaths b r-            | isDefined (uriAuthority b) && null pb = '/':pr-            | otherwise                             = dropLast pb ++ pr-            where-                pb = uriPath b-                pr = uriPath r-        dropLast = fst . splitLast -- reverse . dropWhile (/='/') . reverse----  Remove dot segments, but protect leading '/' character-removeDotSegments :: String -> String-removeDotSegments ('/':ps) = '/':elimDots ps []-removeDotSegments ps       = elimDots ps []----  Second arg accumulates segments processed so far in reverse order-elimDots :: String -> [String] -> String--- elimDots ps rs | traceVal "\nps " ps $ traceVal "rs " rs $ False = error ""-elimDots [] [] = ""-elimDots [] rs = concat (reverse rs)-elimDots (    '.':'/':ps)     rs = elimDots ps rs-elimDots (    '.':[]    )     rs = elimDots [] rs-elimDots (    '.':'.':'/':ps) rs = elimDots ps (dropHead rs)-elimDots (    '.':'.':[]    ) rs = elimDots [] (dropHead rs)-elimDots ps rs = elimDots ps1 (r:rs)-    where-        (r,ps1) = nextSegment ps----  Return tail of non-null list, otherwise return null list-dropHead :: [a] -> [a]-dropHead []     = []-dropHead (r:rs) = rs----  Returns the next segment and the rest of the path from a path string.---  Each segment ends with the next '/' or the end of string.----nextSegment :: String -> (String,String)-nextSegment ps =-    case break (=='/') ps of-        (r,'/':ps1) -> (r++"/",ps1)-        (r,_)       -> (r,[])----  Split last (name) segment from path, returning (path,name)-splitLast :: String -> (String,String)-splitLast path = (reverse revpath,reverse revname)-    where-        (revname,revpath) = break (=='/') $ reverse path----------------------------------------------------------------- Finding a URI relative to a base URI----------------------------------------------------------------- |Returns a new 'URI' which represents the relative location of---  the first 'URI' with respect to the second 'URI'.  Thus, the---  values supplied are expected to be absolute URIs, and the result---  returned may be a relative URI.------  Example:------  > "http://example.com/Root/sub1/name2#frag"---  >   `relativeFrom` "http://example.com/Root/sub2/name2#frag"---  >   == "../sub1/name2#frag"------  There is no single correct implementation of this function,---  but any acceptable implementation must satisfy the following:------  > (uabs `relativeFrom` ubase) `relativeTo` ubase == uabs------  For any valid absolute URI.---  (cf. <http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html>---       <http://lists.w3.org/Archives/Public/uri/2003Jan/0005.html>)----relativeFrom :: URI -> URI -> URI-relativeFrom uabs base-    | diff uriScheme    uabs base = uabs-    | diff uriAuthority uabs base = uabs { uriScheme = "" }-    | diff uriPath      uabs base = uabs-        { uriScheme    = ""-        , uriAuthority = Nothing-        , uriPath      = relPathFrom (removeBodyDotSegments $ uriPath uabs)-                                     (removeBodyDotSegments $ uriPath base)-        }-    | diff uriQuery     uabs base = uabs-        { uriScheme    = ""-        , uriAuthority = Nothing-        , uriPath      = ""-        }-    | otherwise = uabs          -- Always carry fragment from uabs-        { uriScheme    = ""-        , uriAuthority = Nothing-        , uriPath      = ""-        , uriQuery     = ""-        }-    where-        diff :: Eq b => (a -> b) -> a -> a -> Bool-        diff sel u1 u2 = sel u1 /= sel u2-        -- Remove dot segments except the final segment-        removeBodyDotSegments p = removeDotSegments p1 ++ p2-            where-                (p1,p2) = splitLast p--relPathFrom :: String -> String -> String-relPathFrom []   base = "/"-relPathFrom pabs []   = pabs-relPathFrom pabs base =                 -- Construct a relative path segments-    if sa1 == sb1                       -- if the paths share a leading segment-        then if (sa1 == "/")            -- other than a leading '/'-            then if (sa2 == sb2)-                then relPathFrom1 ra2 rb2-                else pabs-            else relPathFrom1 ra1 rb1-        else pabs-    where-        (sa1,ra1) = nextSegment pabs-        (sb1,rb1) = nextSegment base-        (sa2,ra2) = nextSegment ra1-        (sb2,rb2) = nextSegment rb1----  relPathFrom1 strips off trailing names from the supplied paths,---  and calls difPathFrom to find the relative path from base to---  target-relPathFrom1 :: String -> String -> String-relPathFrom1 pabs base = relName-    where-        (sa,na) = splitLast pabs-        (sb,nb) = splitLast base-        rp      = relSegsFrom sa sb-        relName = if null rp then-                      if (na == nb) then ""-                      else if protect na then "./"++na-                      else na-                  else-                      rp++na-        -- Precede name with some path if it is null or contains a ':'-        protect na = null na || ':' `elem` na----  relSegsFrom discards any common leading segments from both paths,---  then invokes difSegsFrom to calculate a relative path from the end---  of the base path to the end of the target path.---  The final name is handled separately, so this deals only with---  "directory" segtments.----relSegsFrom :: String -> String -> String-{--relSegsFrom sabs base-    | traceVal "\nrelSegsFrom\nsabs " sabs $ traceVal "base " base $-      False = error ""--}-relSegsFrom []   []   = ""      -- paths are identical-relSegsFrom sabs base =-    if sa1 == sb1-        then relSegsFrom ra1 rb1-        else difSegsFrom sabs base-    where-        (sa1,ra1) = nextSegment sabs-        (sb1,rb1) = nextSegment base----  difSegsFrom calculates a path difference from base to target,---  not including the final name at the end of the path---  (i.e. results always ends with '/')------  This function operates under the invariant that the supplied---  value of sabs is the desired path relative to the beginning of---  base.  Thus, when base is empty, the desired path has been found.----difSegsFrom :: String -> String -> String-{--difSegsFrom sabs base-    | traceVal "\ndifSegsFrom\nsabs " sabs $ traceVal "base " base $-      False = error ""--}-difSegsFrom sabs ""   = sabs-difSegsFrom sabs base = difSegsFrom ("../"++sabs) (snd $ nextSegment base)-----------------------------------------------------------------  Other normalization functions----------------------------------------------------------------- |Case normalization; cf. RFC3986 section 6.2.2.1---  NOTE:  authority case normalization is not performed----normalizeCase :: String -> String-normalizeCase uristr = ncScheme uristr-    where-        ncScheme (':':cs)                = ':':ncEscape cs-        ncScheme (c:cs) | isSchemeChar c = toLower c:ncScheme cs-        ncScheme _                       = ncEscape uristr -- no scheme present-        ncEscape ('%':h1:h2:cs) = '%':toUpper h1:toUpper h2:ncEscape cs-        ncEscape (c:cs)         = c:ncEscape cs-        ncEscape []             = []---- |Encoding normalization; cf. RFC3986 section 6.2.2.2----normalizeEscape :: String -> String-normalizeEscape ('%':h1:h2:cs)-    | isHexDigit h1 && isHexDigit h2 && isUnreserved escval =-        escval:normalizeEscape cs-    where-        escval = chr (digitToInt h1*16+digitToInt h2)-normalizeEscape (c:cs)         = c:normalizeEscape cs-normalizeEscape []             = []---- |Path segment normalization; cf. RFC3986 section 6.2.2.4----normalizePathSegments :: String -> String-normalizePathSegments uristr = normstr juri-    where-        juri = parseURI uristr-        normstr Nothing  = uristr-        normstr (Just u) = show (normuri u)-        normuri u = u { uriPath = removeDotSegments (uriPath u) }-----------------------------------------------------------------  Local trace helper functions---------------------------------------------------------------traceShow :: Show a => String -> a -> a-traceShow msg x = trace (msg ++ show x) x--traceVal :: Show a => String -> a -> b -> b-traceVal msg x y = trace (msg ++ show x) y-----------------------------------------------------------------  Deprecated functions---------------------------------------------------------------{-# DEPRECATED parseabsoluteURI "use parseAbsoluteURI" #-}-parseabsoluteURI :: String -> Maybe URI-parseabsoluteURI = parseAbsoluteURI--{-# DEPRECATED escapeString "use escapeURIString, and note the flipped arguments" #-}-escapeString :: String -> (Char->Bool) -> String-escapeString = flip escapeURIString--{-# DEPRECATED reserved "use isReserved" #-}-reserved :: Char -> Bool-reserved = isReserved--{-# DEPRECATED unreserved "use isUnreserved" #-}-unreserved :: Char -> Bool-unreserved = isUnreserved----  Additional component access functions for backward compatibility--{-# DEPRECATED scheme "use uriScheme" #-}-scheme :: URI -> String-scheme = orNull init . uriScheme--{-# DEPRECATED authority "use uriAuthority, and note changed functionality" #-}-authority :: URI -> String-authority = dropss . ($"") . uriAuthToString id . uriAuthority-    where-        -- Old-style authority component does not include leading '//'-        dropss ('/':'/':s) = s-        dropss s           = s--{-# DEPRECATED path "use uriPath" #-}-path :: URI -> String-path = uriPath--{-# DEPRECATED query "use uriQuery, and note changed functionality" #-}-query :: URI -> String-query = orNull tail . uriQuery--{-# DEPRECATED fragment "use uriFragment, and note changed functionality" #-}-fragment :: URI -> String-fragment = orNull tail . uriFragment--orNull :: ([a]->[a]) -> [a] -> [a]-orNull _ [] = []-orNull f as = f as----------------------------------------------------------------------------------------  Copyright (c) 2004, G. KLYNE.  All rights reserved.---  Distributed as free software under the following license.------  Redistribution and use in source and binary forms, with or without---  modification, are permitted provided that the following conditions---  are met:------  - Redistributions of source code must retain the above copyright notice,---  this list of conditions and the following disclaimer.------  - Redistributions in binary form must reproduce the above copyright---  notice, this list of conditions and the following disclaimer in the---  documentation and/or other materials provided with the distribution.------  - Neither name of the copyright holders nor the names of its---  contributors may be used to endorse or promote products derived from---  this software without specific prior written permission.------  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS---  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT---  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR---  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT---  HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,---  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,---  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS---  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND---  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR---  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE---  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.------------------------------------------------------------------------------------
− README
@@ -1,4 +0,0 @@-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 tools.  There is no need to run-the "configure" script: the "setup configure" step will do this for you.
+ README.md view
@@ -0,0 +1,45 @@+![GitHub Actions status](https://github.com/haskell/network/workflows/Haskell%20CI/badge.svg)+# [`network`](http://hackage.haskell.org/package/network)++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++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.++### Windows++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"+```
Setup.hs view
@@ -3,4 +3,4 @@ import Distribution.Simple  main :: IO ()-main = defaultMainWithHooks defaultUserHooks+main = defaultMainWithHooks autoconfUserHooks
− cbits/ancilData.c
@@ -1,237 +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.- *- *- * NOTE: recv/sendAncillary() is being phased out in preference- *       of the more specific send/recvFd(), as the latter is- *       really the only application of recv/sendAncillary() and- *       stand the chance of being supported on platforms that- *       don't have send/recvmsg() (but do have ioctl() support- *       for this kind of thing, for instance.)- *- */--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-sendAncillary(int sock,-	      int level,-	      int type,-	      int flags,-	      void* data,-	      int len)-{-  struct msghdr msg = {0};-  struct iovec iov[1];-  char  buf[2];-#if HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS-  /* Contains the older BSD msghdr fields only, so no room-     for 'type' or 'level' data.-  */-  msg.msg_accrights = data;-  msg.msg_accrightslen=len;-#else-  struct cmsghdr *cmsg;-  char ancBuffer[CMSG_SPACE(len)];-  char* dPtr;-  -  msg.msg_control = ancBuffer;-  msg.msg_controllen = sizeof(ancBuffer);--  cmsg = CMSG_FIRSTHDR(&msg);-  cmsg->cmsg_level = level;-  cmsg->cmsg_type = type;-  cmsg->cmsg_len = CMSG_LEN(len);-  dPtr = (char*)CMSG_DATA(cmsg);-  -  memcpy(dPtr, data, len);-  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,flags);-}--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--  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) {-    return rc;-  }-  -#if HAVE_STRUCT_MSGHDR_MSG_CONTROL-  cptr = (struct cmsghdr*)CMSG_FIRSTHDR(&msg);-  return *(int*)CMSG_DATA(cptr);-#else-  return *(int*)fdBuffer;-#endif-}---int-recvAncillary(int  sock,-	      int* pLevel,-	      int* pType,-	      int  flags,-	      void** pData,-	      int* pLen)-{-  struct msghdr msg = {0};-  char  duffBuf[10];-  int rc;-  struct iovec iov[1];-#if HAVE_STRUCT_MSGHDR_MSG_CONTROL-  struct cmsghdr *cmsg = NULL;-  struct cmsghdr *cptr;-#endif-  -  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(*pLen));-  if (cmsg==NULL) {-    return -1;-  }-  -  msg.msg_control = (void *)cmsg;-  msg.msg_controllen = CMSG_LEN(*pLen);-#else-  *pData = (void*)malloc(*pLen);-  if (*pData) {-      msg.msg_accrights    = *pData;-  } else {-      return -1;-  }-  msg.msg_accrightslen = *pLen;-#endif--  if ((rc = recvmsg(sock,&msg,flags)) < 0) {-    return rc;-  }-  -#if HAVE_STRUCT_MSGHDR_MSG_CONTROL-  cptr = (struct cmsghdr*)CMSG_FIRSTHDR(&msg);--  *pLevel = cptr->cmsg_level;-  *pType  = cptr->cmsg_type;-  /* The length of the data portion only */-  *pLen   = cptr->cmsg_len - sizeof(struct cmsghdr);-  *pData  = CMSG_DATA(cptr);-#else-  /* Sensible defaults, I hope.. */-  *pLevel = 0;-  *pType  = 0;-#endif--  return rc;-}-#endif
cbits/asyncAccept.c view
@@ -5,13 +5,14 @@ #include "HsNet.h" #include "HsFFI.h" -#if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__) && !defined(__HUGS__)+#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.  *@@ -25,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*@@ -39,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,63 +1,58 @@ #include "HsNet.h" #include "HsFFI.h" -#if defined(HAVE_WINSOCK_H) && !defined(__CYGWIN__)+#if defined(_WIN32)  static int winsock_inited = 0;-static int winsock_uninited = 0; +static void+shutdownHandler(void)+{+  WSACleanup();+}+ /* Initialising WinSock... */ int initWinSock () {   WORD wVersionRequested;-  WSADATA wsaData;  +  WSADATA wsaData;   int err;-#ifdef __HUGS__-  int optval = SO_SYNCHRONOUS_NONALERT;-#endif    if (!winsock_inited) {-    wVersionRequested = MAKEWORD( 1, 1 );+    wVersionRequested = MAKEWORD( 2, 2 );      err = WSAStartup ( wVersionRequested, &wsaData );-    +     if ( err != 0 ) {        return err;     } -    if ( LOBYTE( wsaData.wVersion ) != 1 ||-       HIBYTE( wsaData.wVersion ) != 1 ) {+    if ( LOBYTE( wsaData.wVersion ) != 2 ||+       HIBYTE( wsaData.wVersion ) != 2 ) {       WSACleanup();       return (-1);     }-#ifdef __HUGS__-    /* By default, socket() creates sockets in overlapped mode-     * (so that async I/O is possible). The CRT can only handle-     * non-overlapped sockets, so turn off overlap mode here.-     */-    setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,-	       &optval, sizeof(optval));-#endif +    atexit(shutdownHandler);     winsock_inited = 1;   }   return 0; } -static void-shutdownHandler(void)+SOCKET+wsaDuplicate (SOCKET s) {-  WSACleanup();-}+  WSAPROTOCOL_INFOW protocolInfo;+  if (WSADuplicateSocketW (s, GetCurrentProcessId (), &protocolInfo) != 0)+    return -1; -void-shutdownWinSock()-{-    if (!winsock_uninited) {-	atexit(shutdownHandler);-	winsock_uninited = 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_WINSOCK_H) && !defined(__CYGWIN__)+#if defined(_WIN32) #include <stdio.h>  /* to the end */
config.guess view
@@ -1,1496 +1,1811 @@ #! /bin/sh # Attempt to guess a canonical system name.-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,-#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.--timestamp='2006-02-23'--# 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 2 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, write to the Free Software-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA-# 02110-1301, USA.-#-# 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.---# Originally written by Per Bothner <per@bothner.com>.-# Please send patches to <config-patches@gnu.org>.  Submit a context-# diff and a properly formatted ChangeLog entry.-#-# This script attempts to guess a canonical system name similar to-# config.sub.  If it succeeds, it prints the system name on stdout, and-# exits with 0.  Otherwise, it exits with 1.-#-# The plan is that this can be called by configure scripts if you-# don't specify an explicit build system type.--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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005-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--# 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 tupples: *-*-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=`(/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 ;;-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;-	esac-	# The Operating System including object format, if it has switched-	# to ELF recently, or will in the future.-	case "${UNAME_MACHINE_ARCH}" in-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)-		eval $set_cc_for_build-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \-			| grep __ELF__ >/dev/null-		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-	# 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/[-_].*/\./'`-		;;-	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}"-	exit ;;-    *:OpenBSD:*:*)-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}-	exit ;;-    *:ekkoBSD:*:*)-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}-	exit ;;-    *:SolidBSD:*:*)-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}-	exit ;;-    macppc:MirBSD:*:*)-	echo powerppc-unknown-mirbsd${UNAME_RELEASE}-	exit ;;-    *:MirBSD:*:*)-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}-	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'`-	exit ;;-    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 ;;-    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:SunOS:5.*:*)-	echo i386-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:*:[45])-	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/oslevel ] ; then-		IBM_REV=`/usr/bin/oslevel`-	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 __LP64__ >/dev/null-	    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:*:*)-	case ${UNAME_MACHINE} in-	    pc98)-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;-	    *)-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;-	esac-	exit ;;-    i*:CYGWIN*:*)-	echo ${UNAME_MACHINE}-pc-cygwin-	exit ;;-    i*:MINGW*:*)-	echo ${UNAME_MACHINE}-pc-mingw32-	exit ;;-    i*:MSYS_NT-*:*:*)-	echo ${UNAME_MACHINE}-pc-mingw32-	exit ;;-    i*:windows32*:*)-    	# uname -m includes "-pc" on this system.-    	echo ${UNAME_MACHINE}-mingw32-	exit ;;-    i*:PW*:*)-	echo ${UNAME_MACHINE}-pc-pw32-	exit ;;-    x86:Interix*:[345]*)-	echo i586-pc-interix${UNAME_RELEASE}-	exit ;;-    EM64T:Interix*:[345]*)-	echo x86_64-unknown-interix${UNAME_RELEASE}-	exit ;;-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)-	echo i${UNAME_MACHINE}-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-gnu`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 '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu-	exit ;;-    i*86:Minix:*:*)-	echo ${UNAME_MACHINE}-pc-minix-	exit ;;-    arm*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-gnu-	exit ;;-    cris:Linux:*:*)-	echo cris-axis-linux-gnu-	exit ;;-    crisv32:Linux:*:*)-	echo crisv32-axis-linux-gnu-	exit ;;-    frv:Linux:*:*)-    	echo frv-unknown-linux-gnu-	exit ;;-    ia64:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-gnu-	exit ;;-    m32r*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-gnu-	exit ;;-    m68*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-gnu-	exit ;;-    mips:Linux:*:*)-	eval $set_cc_for_build-	sed 's/^	//' << EOF >$dummy.c-	#undef CPU-	#undef mips-	#undef mipsel-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)-	CPU=mipsel-	#else-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)-	CPU=mips-	#else-	CPU=-	#endif-	#endif-EOF-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '-	    /^CPU/{-		s: ::g-		p-	    }'`"-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }-	;;-    mips64:Linux:*:*)-	eval $set_cc_for_build-	sed 's/^	//' << EOF >$dummy.c-	#undef CPU-	#undef mips64-	#undef mips64el-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)-	CPU=mips64el-	#else-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)-	CPU=mips64-	#else-	CPU=-	#endif-	#endif-EOF-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '-	    /^CPU/{-		s: ::g-		p-	    }'`"-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }-	;;-    or32:Linux:*:*)-	echo or32-unknown-linux-gnu-	exit ;;-    ppc:Linux:*:*)-	echo powerpc-unknown-linux-gnu-	exit ;;-    ppc64:Linux:*:*)-	echo powerpc64-unknown-linux-gnu-	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 ld.so.1 >/dev/null-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi-	echo ${UNAME_MACHINE}-unknown-linux-gnu${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-gnu ;;-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;-	  *)    echo hppa-unknown-linux-gnu ;;-	esac-	exit ;;-    parisc64:Linux:*:* | hppa64:Linux:*:*)-	echo hppa64-unknown-linux-gnu-	exit ;;-    s390:Linux:*:* | s390x:Linux:*:*)-	echo ${UNAME_MACHINE}-ibm-linux-	exit ;;-    sh64*:Linux:*:*)-    	echo ${UNAME_MACHINE}-unknown-linux-gnu-	exit ;;-    sh*:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-gnu-	exit ;;-    sparc:Linux:*:* | sparc64:Linux:*:*)-	echo ${UNAME_MACHINE}-unknown-linux-gnu-	exit ;;-    vax:Linux:*:*)-	echo ${UNAME_MACHINE}-dec-linux-gnu-	exit ;;-    x86_64:Linux:*:*)-	echo x86_64-unknown-linux-gnu-	exit ;;-    i*86:Linux:*:*)-	# The BFD linker knows what the default object file format is, so-	# first see if it will tell us. cd to the root directory to prevent-	# problems with other programs or directories called `ld' in the path.-	# Set LC_ALL=C to ensure ld outputs messages in English.-	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \-			 | sed -ne '/supported targets:/!d-				    s/[ 	][ 	]*/ /g-				    s/.*supported targets: *//-				    s/ .*//-				    p'`-        case "$ld_supported_targets" in-	  elf32-i386)-		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"-		;;-	  a.out-i386-linux)-		echo "${UNAME_MACHINE}-pc-linux-gnuaout"-		exit ;;-	  coff-i386)-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"-		exit ;;-	  "")-		# Either a pre-BFD a.out linker (linux-gnuoldld) or-		# one that does not give us useful --help.-		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"-		exit ;;-	esac-	# Determine whether the default compiler is a.out or elf-	eval $set_cc_for_build-	sed 's/^	//' << EOF >$dummy.c-	#include <features.h>-	#ifdef __ELF__-	# ifdef __GLIBC__-	#  if __GLIBC__ >= 2-	LIBC=gnu-	#  else-	LIBC=gnulibc1-	#  endif-	# else-	LIBC=gnulibc1-	# endif-	#else-	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)-	LIBC=gnu-	#else-	LIBC=gnuaout-	#endif-	#endif-	#ifdef __dietlibc__-	LIBC=dietlibc-	#endif-EOF-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '-	    /^LIBC/{-		s: ::g-		p-	    }'`"-	test x"${LIBC}" != x && {-		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"-		exit-	}-	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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.0*:*)-	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 i386.-	echo i386-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; } ;;-    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.0*:*)-	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 ;;-    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 ;;-    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-	case $UNAME_PROCESSOR in-	    unknown) UNAME_PROCESSOR=powerpc ;;-	esac-	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 ;;-    NSE-?:NONSTOP_KERNEL:*:*)-	echo nse-tandem-nsk${UNAME_RELEASE}-	exit ;;-    NSR-?:NONSTOP_KERNEL:*:*)-	echo nsr-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 ;;-esac--#echo '(No uname command or uname output not recognized.)' 1>&2-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2--eval $set_cc_for_build-cat >$dummy.c <<EOF-#ifdef _SEQUENT_-# include <sys/types.h>-# include <sys/utsname.h>-#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 (__arm) && defined (__acorn) && defined (__unix)-  printf ("arm-acorn-riscix\n"); exit (0);-#endif--#if defined (hp300) && !defined (hpux)-  printf ("m68k-hp-bsd\n"); exit (0);-#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-    printf ("vax-dec-ultrix\n"); exit (0);-# 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; }--# Convex versions that predate uname can use getsysinfo(1)--if [ -x /usr/convex/getsysinfo ]-then-    case `getsysinfo -f cpu_type` in-    c1*)-	echo c1-convex-bsd-	exit ;;-    c2*)-	if getsysinfo -f scalar_acc-	then echo c32-convex-bsd-	else echo c2-convex-bsd-	fi-	exit ;;-    c34*)-	echo c34-convex-bsd-	exit ;;-    c38*)-	echo c38-convex-bsd-	exit ;;-    c4*)-	echo c4-convex-bsd-	exit ;;-    esac-fi--cat >&2 <<EOF-$0: unable to guess system type--This script, last modified $timestamp, has failed to recognize-the operating system you are using. It is advised that you-download the most up to date version of the config scripts from--  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess-and-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub--If the version you run ($0) is already up to date, please-send the following data and any information you think might be-pertinent to <config-patches@gnu.org> in order to provide the needed-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,1607 +1,1970 @@ #! /bin/sh # Configuration validation subroutine script.-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,-#   2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.--timestamp='2006-02-23'--# This file is (in principle) common to ALL GNU software.-# The presence of a machine in this file suggests that SOME GNU software-# can handle that machine.  It does not imply ALL GNU software can.-#-# 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 2 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, write to the Free Software-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA-# 02110-1301, USA.-#-# 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.---# Please send patches to <config-patches@gnu.org>.  Submit a context-# diff and a properly formatted ChangeLog entry.-#-# 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.--# 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-       $0 [OPTION] 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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005-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-dietlibc | linux-newlib* | linux-uclibc* | \-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \-  storm-chaos* | os2-emx* | rtmk-nova*)-    os=-$maybe_os-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-    ;;-  *)-    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)-		os=-		basic_machine=$1-		;;-	-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*)-		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 \-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \-	| am33_2.0 \-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \-	| bfin \-	| c4x | clipper \-	| d10v | d30v | dlx | dsp16xx \-	| fr30 | frv \-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \-	| i370 | i860 | i960 | ia64 \-	| ip2k | iq2000 \-	| m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \-	| mips | mipsbe | mipseb | mipsel | mipsle \-	| mips16 \-	| mips64 | mips64el \-	| mips64vr | mips64vrel \-	| mips64orion | mips64orionel \-	| mips64vr4100 | mips64vr4100el \-	| mips64vr4300 | mips64vr4300el \-	| mips64vr5000 | mips64vr5000el \-	| mips64vr5900 | mips64vr5900el \-	| mipsisa32 | mipsisa32el \-	| mipsisa32r2 | mipsisa32r2el \-	| mipsisa64 | mipsisa64el \-	| mipsisa64r2 | mipsisa64r2el \-	| mipsisa64sb1 | mipsisa64sb1el \-	| mipsisa64sr71k | mipsisa64sr71kel \-	| mipstx39 | mipstx39el \-	| mn10200 | mn10300 \-	| mt \-	| msp430 \-	| nios | nios2 \-	| ns16k | ns32k \-	| or32 \-	| pdp10 | pdp11 | pj | pjl \-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \-	| pyramid \-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \-	| sh64 | sh64le \-	| sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \-	| sparcv8 | sparcv9 | sparcv9b \-	| strongarm \-	| tahoe | thumb | tic4x | tic80 | tron \-	| v850 | v850e \-	| we32k \-	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \-	| z8k)-		basic_machine=$basic_machine-unknown-		;;-	m32c)-		basic_machine=$basic_machine-unknown-		;;-	m6811 | m68hc11 | m6812 | m68hc12)-		# Motorola 68HC11/12.-		basic_machine=$basic_machine-unknown-		os=-none-		;;-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)-		;;-	ms1)-		basic_machine=mt-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-* \-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \-	| avr-* \-	| bfin-* | bs2000-* \-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \-	| clipper-* | craynv-* | cydra-* \-	| d10v-* | d30v-* | dlx-* \-	| elxsi-* \-	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \-	| h8300-* | h8500-* \-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \-	| i*86-* | i860-* | i960-* | ia64-* \-	| ip2k-* | iq2000-* \-	| m32r-* | m32rle-* \-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \-	| m88110-* | m88k-* | maxq-* | mcore-* \-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \-	| mips16-* \-	| mips64-* | mips64el-* \-	| mips64vr-* | mips64vrel-* \-	| mips64orion-* | mips64orionel-* \-	| mips64vr4100-* | mips64vr4100el-* \-	| mips64vr4300-* | mips64vr4300el-* \-	| mips64vr5000-* | mips64vr5000el-* \-	| mips64vr5900-* | mips64vr5900el-* \-	| mipsisa32-* | mipsisa32el-* \-	| mipsisa32r2-* | mipsisa32r2el-* \-	| mipsisa64-* | mipsisa64el-* \-	| mipsisa64r2-* | mipsisa64r2el-* \-	| mipsisa64sb1-* | mipsisa64sb1el-* \-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \-	| mipstx39-* | mipstx39el-* \-	| mmix-* \-	| mt-* \-	| msp430-* \-	| nios-* | nios2-* \-	| none-* | np1-* | ns16k-* | ns32k-* \-	| orion-* \-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \-	| pyramid-* \-	| romp-* | rs6000-* \-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \-	| sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \-	| sparclite-* \-	| sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \-	| tahoe-* | thumb-* \-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \-	| tron-* \-	| v850-* | v850e-* | vax-* \-	| we32k-* \-	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \-	| xstormy16-* | xtensa-* \-	| ymp-* \-	| z8k-*)-		;;-	m32c-*)-		;;-	# 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-		;;-	aux)-		basic_machine=m68k-apple-		os=-aux-		;;-	balance)-		basic_machine=ns32k-sequent-		os=-dynix-		;;-	c90)-		basic_machine=c90-cray-		os=-unicos-		;;-	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-		;;-	cr16c)-		basic_machine=cr16c-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-		;;-	djgpp)-		basic_machine=i586-pc-		os=-msdosdjgpp-		;;-	dpx20 | dpx20-*)-		basic_machine=rs6000-bull-		os=-bosx-		;;-	dpx2* | dpx2*-bull)-		basic_machine=m68k-bull-		os=-sysv3-		;;-	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'm not sure what "Sysv32" means.  Should this be sysv3.2?-	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-		;;-	m88k-omron*)-		basic_machine=m88k-omron-		;;-	magnum | m3230)-		basic_machine=mips-mips-		os=-sysv-		;;-	merlin)-		basic_machine=ns32k-utek-		os=-sysv-		;;-	mingw32)-		basic_machine=i386-pc-		os=-mingw32-		;;-	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-		;;-	msdos)-		basic_machine=i386-pc-		os=-msdos-		;;-	ms1-*)-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`-		;;-	mvs)-		basic_machine=i370-ibm-		os=-mvs-		;;-	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-		;;-	nsr-tandem)-		basic_machine=nsr-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-		;;-	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)	basic_machine=powerpc-unknown-		;;-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`-		;;-	ppcle | powerpclittle | ppc-le | powerpc-little)-		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 | ppc64-le | powerpc64-little)-		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)-		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-		;;-	sei)-		basic_machine=mips-sei-		os=-seiux-		;;-	sequent)-		basic_machine=i386-sequent-		;;-	sh)-		basic_machine=sh-hitachi-		os=-hms-		;;-	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-		;;-	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-		;;-	tic54x | c54x*)-		basic_machine=tic54x-unknown-		os=-coff-		;;-	tic55x | c55x*)-		basic_machine=tic55x-unknown-		os=-coff-		;;-	tic6x | c6x*)-		basic_machine=tic6x-unknown-		os=-coff-		;;-	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-		;;-	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-		;;-	ymp)-		basic_machine=ymp-cray-		os=-unicos-		;;-	z8k-*-coff)-		basic_machine=z8k-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[34]eb | sh[1234]le | sh[23]ele)-		basic_machine=sh-unknown-		;;-	sparc | sparcv8 | sparcv9 | sparcv9b)-		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.-	-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* | -sunos | -sunos[34]*\-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \-	      | -aos* \-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \-	      | -openbsd* | -solidbsd* \-	      | -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* \-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \-	      | -uxpv* | -beos* | -mpeix* | -udk* \-	      | -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*)-	# 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-		;;-	-kaos*)-		os=-kaos-		;;-	-zvmoe)-		os=-zvmoe-		;;-	-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-	*-acorn)-		os=-riscix1.2-		;;-	arm*-rebel)-		os=-linux-		;;-	arm*-semi)-		os=-aout-		;;-    c4x-* | tic4x-*)-        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-		# This also exists in the configure program, but was not the-		# default.-		# os=-sunos4-		;;-	m68*-cisco)-		os=-aout-		;;-	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-		;;-	*-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-				;;-			-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,6226 +1,5235 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles.-# Generated by GNU Autoconf 2.61 for Haskell network package 1.0.-#-# Report bugs to <libraries@haskell.org>.-#-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,-# 2002, 2003, 2004, 2005, 2006 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=:-  # Zsh 3.x and 4.x performs 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-----# PATH needs CR-# 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--# The user is always right.-if test "${PATH_SEPARATOR+set}" != set; then-  echo "#! /bin/sh" >conf$$.sh-  echo  "exit 0"   >>conf$$.sh-  chmod +x conf$$.sh-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then-    PATH_SEPARATOR=';'-  else-    PATH_SEPARATOR=:-  fi-  rm -f conf$$.sh-fi--# Support unset when possible.-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then-  as_unset=unset-else-  as_unset=false-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.)-as_nl='-'-IFS=" ""	$as_nl"--# Find who we are.  Look in the path if we contain no directory separator.-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-  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2-  { (exit 1); exit 1; }-fi--# Work around bugs in pre-3.0 UWIN ksh.-for as_var in ENV MAIL MAILPATH-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var-done-PS1='$ '-PS2='> '-PS4='+ '--# NLS nuisances.-for as_var in \-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \-  LC_TELEPHONE LC_TIME-do-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then-    eval $as_var=C; export $as_var-  else-    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var-  fi-done--# Required to use basename.-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---# Name of the executable.-as_me=`$as_basename -- "$0" ||-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \-	 X"$0" : 'X\(//\)$' \| \-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||-echo X/"$0" |-    sed '/^.*\/\([^/][^/]*\)\/*$/{-	    s//\1/-	    q-	  }-	  /^X\/\(\/\/\)$/{-	    s//\1/-	    q-	  }-	  /^X\/\(\/\).*/{-	    s//\1/-	    q-	  }-	  s/.*/./; q'`--# CDPATH.-$as_unset CDPATH---if test "x$CONFIG_SHELL" = x; then-  if (eval ":") 2>/dev/null; then-  as_have_required=yes-else-  as_have_required=no-fi--  if test $as_have_required = yes && 	 (eval ":-(as_func_return () {-  (exit \$1)-}-as_func_success () {-  as_func_return 0-}-as_func_failure () {-  as_func_return 1-}-as_func_ret_success () {-  return 0-}-as_func_ret_failure () {-  return 1-}--exitcode=0-if as_func_success; then-  :-else-  exitcode=1-  echo as_func_success failed.-fi--if as_func_failure; then-  exitcode=1-  echo as_func_failure succeeded.-fi--if as_func_ret_success; then-  :-else-  exitcode=1-  echo as_func_ret_success failed.-fi--if as_func_ret_failure; then-  exitcode=1-  echo as_func_ret_failure succeeded.-fi--if ( set x; as_func_ret_success y && test x = \"\$1\" ); then-  :-else-  exitcode=1-  echo positional parameters were not saved.-fi--test \$exitcode = 0) || { (exit 1); exit 1; }--(-  as_lineno_1=\$LINENO-  as_lineno_2=\$LINENO-  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&-  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }-") 2> /dev/null; then-  :-else-  as_candidate_shells=-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH-do-  IFS=$as_save_IFS-  test -z "$as_dir" && as_dir=.-  case $as_dir in-	 /*)-	   for as_base in sh bash ksh sh5; do-	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"-	   done;;-       esac-done-IFS=$as_save_IFS---      for as_shell in $as_candidate_shells $SHELL; do-	 # Try only shells that exist, to save several forks.-	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&-		{ ("$as_shell") 2> /dev/null <<\_ASEOF-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then-  emulate sh-  NULLCMD=:-  # Zsh 3.x and 4.x performs 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---:-_ASEOF-}; then-  CONFIG_SHELL=$as_shell-	       as_have_required=yes-	       if { "$as_shell" 2> /dev/null <<\_ASEOF-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then-  emulate sh-  NULLCMD=:-  # Zsh 3.x and 4.x performs 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_func_return () {-  (exit $1)-}-as_func_success () {-  as_func_return 0-}-as_func_failure () {-  as_func_return 1-}-as_func_ret_success () {-  return 0-}-as_func_ret_failure () {-  return 1-}--exitcode=0-if as_func_success; then-  :-else-  exitcode=1-  echo as_func_success failed.-fi--if as_func_failure; then-  exitcode=1-  echo as_func_failure succeeded.-fi--if as_func_ret_success; then-  :-else-  exitcode=1-  echo as_func_ret_success failed.-fi--if as_func_ret_failure; then-  exitcode=1-  echo as_func_ret_failure succeeded.-fi--if ( set x; as_func_ret_success y && test x = "$1" ); then-  :-else-  exitcode=1-  echo positional parameters were not saved.-fi--test $exitcode = 0) || { (exit 1); exit 1; }--(-  as_lineno_1=$LINENO-  as_lineno_2=$LINENO-  test "x$as_lineno_1" != "x$as_lineno_2" &&-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }--_ASEOF-}; then-  break-fi--fi--      done--      if test "x$CONFIG_SHELL" != x; then-  for as_var in BASH_ENV ENV-        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var-        done-        export CONFIG_SHELL-        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}-fi---    if test $as_have_required = no; then-  echo This script requires a shell more modern than all the-      echo shells that I found on your system.  Please install a-      echo modern shell, or manually run the script under such a-      echo shell if you do have one.-      { (exit 1); exit 1; }-fi---fi--fi----(eval "as_func_return () {-  (exit \$1)-}-as_func_success () {-  as_func_return 0-}-as_func_failure () {-  as_func_return 1-}-as_func_ret_success () {-  return 0-}-as_func_ret_failure () {-  return 1-}--exitcode=0-if as_func_success; then-  :-else-  exitcode=1-  echo as_func_success failed.-fi--if as_func_failure; then-  exitcode=1-  echo as_func_failure succeeded.-fi--if as_func_ret_success; then-  :-else-  exitcode=1-  echo as_func_ret_success failed.-fi--if as_func_ret_failure; then-  exitcode=1-  echo as_func_ret_failure succeeded.-fi--if ( set x; as_func_ret_success y && test x = \"\$1\" ); then-  :-else-  exitcode=1-  echo positional parameters were not saved.-fi--test \$exitcode = 0") || {-  echo No shell found that supports shell functions.-  echo Please tell autoconf@gnu.org about your system,-  echo including any error possibly output before this-  echo message-}----  as_lineno_1=$LINENO-  as_lineno_2=$LINENO-  test "x$as_lineno_1" != "x$as_lineno_2" &&-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {--  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO-  # uniformly replaced by the line number.  The first 'sed' inserts a-  # line-number line after each line using $LINENO; the second 'sed'-  # does the real work.  The second script uses 'N' to pair each-  # line-number line with the line containing $LINENO, and appends-  # trailing '-' during substitution so that $LINENO is not a special-  # case at line end.-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the-  # scripts with optimization help from Paolo Bonzini.  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" ||-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2-   { (exit 1); exit 1; }; }--  # 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-}---if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then-  as_dirname=dirname-else-  as_dirname=false-fi--ECHO_C= ECHO_N= ECHO_T=-case `echo -n x` in--n*)-  case `echo 'x\c'` in-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.-  *)   ECHO_C='\c';;-  esac;;-*)-  ECHO_N='-n';;-esac--if expr a : '\(a\)' >/dev/null 2>&1 &&-   test "X`expr 00001 : '.*\(...\)'`" = X001; then-  as_expr=expr-else-  as_expr=false-fi--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-fi-echo >conf$$.file-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 -p'.-  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||-    as_ln_s='cp -p'-elif ln conf$$.file conf$$ 2>/dev/null; then-  as_ln_s=ln-else-  as_ln_s='cp -p'-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=:-else-  test -d ./-p && rmdir ./-p-  as_mkdir_p=false-fi--if test -x / >/dev/null 2>&1; then-  as_test_x='test -x'-else-  if ls -dL / >/dev/null 2>&1; then-    as_ls_L_option=L-  else-    as_ls_L_option=-  fi-  as_test_x='-    eval sh -c '\''-      if test -d "$1"; then-        test -d "$1/.";-      else-	case $1 in-        -*)set "./$1";;-	esac;-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in-	???[sx]*):;;*)false;;esac;fi-    '\'' sh-  '-fi-as_executable_p=$as_test_x--# 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 7<&0 </dev/null 6>&1--# Name of the host.-# hostname on some systems (SVR3.2, 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=-SHELL=${CONFIG_SHELL-/bin/sh}--# Identity of this package.-PACKAGE_NAME='Haskell network package'-PACKAGE_TARNAME='network'-PACKAGE_VERSION='1.0'-PACKAGE_STRING='Haskell network package 1.0'-PACKAGE_BUGREPORT='libraries@haskell.org'--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='SHELL-PATH_SEPARATOR-PACKAGE_NAME-PACKAGE_TARNAME-PACKAGE_VERSION-PACKAGE_STRING-PACKAGE_BUGREPORT-exec_prefix-prefix-program_transform_name-bindir-sbindir-libexecdir-datarootdir-datadir-sysconfdir-sharedstatedir-localstatedir-includedir-oldincludedir-docdir-infodir-htmldir-dvidir-pdfdir-psdir-libdir-localedir-mandir-DEFS-ECHO_C-ECHO_N-ECHO_T-LIBS-build_alias-host_alias-target_alias-build-build_cpu-build_vendor-build_os-host-host_cpu-host_vendor-host_os-CC-CFLAGS-LDFLAGS-CPPFLAGS-ac_ct_CC-EXEEXT-OBJEXT-CPP-GREP-EGREP-CALLCONV-EXTRA_CPPFLAGS-EXTRA_LIBS-EXTRA_SRCS-LIBOBJS-LTLIBOBJS'-ac_subst_files=''-      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-# The variables have the same names as the options, with-# dashes changed to underlines.-cache_file=/dev/null-exec_prefix=NONE-no_create=-no_recursion=-prefix=NONE-program_prefix=NONE-program_suffix=NONE-program_transform_name=s,x,x,-silent=-site=-srcdir=-verbose=-x_includes=NONE-x_libraries=NONE--# Installation directory options.-# These are left unexpanded so users can "make install exec_prefix=/foo"-# and all the variables that are supposed to be based on exec_prefix-# by default will actually change.-# Use braces instead of parens because sh, perl, etc. also accept them.-# (The list follows the same order as the GNU Coding Standards.)-bindir='${exec_prefix}/bin'-sbindir='${exec_prefix}/sbin'-libexecdir='${exec_prefix}/libexec'-datarootdir='${prefix}/share'-datadir='${datarootdir}'-sysconfdir='${prefix}/etc'-sharedstatedir='${prefix}/com'-localstatedir='${prefix}/var'-includedir='${prefix}/include'-oldincludedir='/usr/include'-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'-infodir='${datarootdir}/info'-htmldir='${docdir}'-dvidir='${docdir}'-pdfdir='${docdir}'-psdir='${docdir}'-libdir='${exec_prefix}/lib'-localedir='${datarootdir}/locale'-mandir='${datarootdir}/man'--ac_prev=-ac_dashdash=-for ac_option-do-  # If the previous option needs an argument, assign it.-  if test -n "$ac_prev"; then-    eval $ac_prev=\$ac_option-    ac_prev=-    continue-  fi--  case $ac_option in-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;-  *)	ac_optarg=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_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2-   { (exit 1); exit 1; }; }-    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`-    eval enable_$ac_feature=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_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2-   { (exit 1); exit 1; }; }-    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`-    eval enable_$ac_feature=\$ac_optarg ;;--  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \-  | --exec | --exe | --ex)-    ac_prev=exec_prefix ;;-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \-  | --exec=* | --exe=* | --ex=*)-    exec_prefix=$ac_optarg ;;--  -gas | --gas | --ga | --g)-    # Obsolete; use --with-gas.-    with_gas=yes ;;--  -help | --help | --hel | --he | -h)-    ac_init_help=long ;;-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)-    ac_init_help=recursive ;;-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)-    ac_init_help=short ;;--  -host | --host | --hos | --ho)-    ac_prev=host_alias ;;-  -host=* | --host=* | --hos=* | --ho=*)-    host_alias=$ac_optarg ;;--  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)-    ac_prev=htmldir ;;-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \-  | --ht=*)-    htmldir=$ac_optarg ;;--  -includedir | --includedir | --includedi | --included | --include \-  | --includ | --inclu | --incl | --inc)-    ac_prev=includedir ;;-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \-  | --includ=* | --inclu=* | --incl=* | --inc=*)-    includedir=$ac_optarg ;;--  -infodir | --infodir | --infodi | --infod | --info | --inf)-    ac_prev=infodir ;;-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)-    infodir=$ac_optarg ;;--  -libdir | --libdir | --libdi | --libd)-    ac_prev=libdir ;;-  -libdir=* | --libdir=* | --libdi=* | --libd=*)-    libdir=$ac_optarg ;;--  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \-  | --libexe | --libex | --libe)-    ac_prev=libexecdir ;;-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \-  | --libexe=* | --libex=* | --libe=*)-    libexecdir=$ac_optarg ;;--  -localedir | --localedir | --localedi | --localed | --locale)-    ac_prev=localedir ;;-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)-    localedir=$ac_optarg ;;--  -localstatedir | --localstatedir | --localstatedi | --localstated \-  | --localstate | --localstat | --localsta | --localst | --locals)-    ac_prev=localstatedir ;;-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)-    localstatedir=$ac_optarg ;;--  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)-    ac_prev=mandir ;;-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)-    mandir=$ac_optarg ;;--  -nfp | --nfp | --nf)-    # Obsolete; use --without-fp.-    with_fp=no ;;--  -no-create | --no-create | --no-creat | --no-crea | --no-cre \-  | --no-cr | --no-c | -n)-    no_create=yes ;;--  -no-recursion | --no-recursion | --no-recursio | --no-recursi \-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)-    no_recursion=yes ;;--  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \-  | --oldin | --oldi | --old | --ol | --o)-    ac_prev=oldincludedir ;;-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)-    oldincludedir=$ac_optarg ;;--  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)-    ac_prev=prefix ;;-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)-    prefix=$ac_optarg ;;--  -program-prefix | --program-prefix | --program-prefi | --program-pref \-  | --program-pre | --program-pr | --program-p)-    ac_prev=program_prefix ;;-  -program-prefix=* | --program-prefix=* | --program-prefi=* \-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)-    program_prefix=$ac_optarg ;;--  -program-suffix | --program-suffix | --program-suffi | --program-suff \-  | --program-suf | --program-su | --program-s)-    ac_prev=program_suffix ;;-  -program-suffix=* | --program-suffix=* | --program-suffi=* \-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)-    program_suffix=$ac_optarg ;;--  -program-transform-name | --program-transform-name \-  | --program-transform-nam | --program-transform-na \-  | --program-transform-n | --program-transform- \-  | --program-transform | --program-transfor \-  | --program-transfo | --program-transf \-  | --program-trans | --program-tran \-  | --progr-tra | --program-tr | --program-t)-    ac_prev=program_transform_name ;;-  -program-transform-name=* | --program-transform-name=* \-  | --program-transform-nam=* | --program-transform-na=* \-  | --program-transform-n=* | --program-transform-=* \-  | --program-transform=* | --program-transfor=* \-  | --program-transfo=* | --program-transf=* \-  | --program-trans=* | --program-tran=* \-  | --progr-tra=* | --program-tr=* | --program-t=*)-    program_transform_name=$ac_optarg ;;--  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)-    ac_prev=pdfdir ;;-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)-    pdfdir=$ac_optarg ;;--  -psdir | --psdir | --psdi | --psd | --ps)-    ac_prev=psdir ;;-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)-    psdir=$ac_optarg ;;--  -q | -quiet | --quiet | --quie | --qui | --qu | --q \-  | -silent | --silent | --silen | --sile | --sil)-    silent=yes ;;--  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)-    ac_prev=sbindir ;;-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \-  | --sbi=* | --sb=*)-    sbindir=$ac_optarg ;;--  -sharedstatedir | --sharedstatedir | --sharedstatedi \-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \-  | --sharedst | --shareds | --shared | --share | --shar \-  | --sha | --sh)-    ac_prev=sharedstatedir ;;-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \-  | --sha=* | --sh=*)-    sharedstatedir=$ac_optarg ;;--  -site | --site | --sit)-    ac_prev=site ;;-  -site=* | --site=* | --sit=*)-    site=$ac_optarg ;;--  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)-    ac_prev=srcdir ;;-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)-    srcdir=$ac_optarg ;;--  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \-  | --syscon | --sysco | --sysc | --sys | --sy)-    ac_prev=sysconfdir ;;-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)-    sysconfdir=$ac_optarg ;;--  -target | --target | --targe | --targ | --tar | --ta | --t)-    ac_prev=target_alias ;;-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)-    target_alias=$ac_optarg ;;--  -v | -verbose | --verbose | --verbos | --verbo | --verb)-    verbose=yes ;;--  -version | --version | --versio | --versi | --vers | -V)-    ac_init_version=: ;;--  -with-* | --with-*)-    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid package name: $ac_package" >&2-   { (exit 1); exit 1; }; }-    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`-    eval with_$ac_package=\$ac_optarg ;;--  -without-* | --without-*)-    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`-    # Reject names that are not valid shell variable names.-    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid package name: $ac_package" >&2-   { (exit 1); exit 1; }; }-    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`-    eval with_$ac_package=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 ;;--  -*) { echo "$as_me: error: unrecognized option: $ac_option-Try \`$0 --help' for more information." >&2-   { (exit 1); exit 1; }; }-    ;;--  *=*)-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`-    # Reject names that are not valid shell variable names.-    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&-      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2-   { (exit 1); exit 1; }; }-    eval $ac_envvar=\$ac_optarg-    export $ac_envvar ;;--  *)-    # FIXME: should be removed in autoconf 3.0.-    echo "$as_me: WARNING: you should use --build, --host, --target" >&2-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&-      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'`-  { echo "$as_me: error: missing argument to $ac_option" >&2-   { (exit 1); exit 1; }; }-fi--# Be sure to have absolute directory names.-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \-		datadir sysconfdir sharedstatedir localstatedir includedir \-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \-		libdir localedir mandir-do-  eval ac_val=\$$ac_var-  case $ac_val in-    [\\/$]* | ?:[\\/]* )  continue;;-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;-  esac-  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2-   { (exit 1); exit 1; }; }-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-    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.-    If a cross compiler is detected then cross compile mode will be used." >&2-  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 .` ||-  { echo "$as_me: error: Working directory cannot be determined" >&2-   { (exit 1); exit 1; }; }-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||-  { echo "$as_me: error: pwd does not report name of working directory" >&2-   { (exit 1); exit 1; }; }---# 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 -- "$0" ||-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \-	 X"$0" : 'X\(//\)[^/]' \| \-	 X"$0" : 'X\(//\)$' \| \-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||-echo X"$0" |-    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 .."-  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2-   { (exit 1); exit 1; }; }-fi-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"-ac_abs_confdir=`(-	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2-   { (exit 1); exit 1; }; }-	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 1.0 to adapt to many kinds of systems.--Usage: $0 [OPTION]... [VAR=VALUE]...--To assign environment variables (e.g., CC, CFLAGS...), specify them as-VAR=VALUE.  See below for descriptions of some of the useful variables.--Defaults for the options are specified in brackets.--Configuration:-  -h, --help              display this help and exit-      --help=short        display options specific to this package-      --help=recursive    display the short help of all the included packages-  -V, --version           display version information and exit-  -q, --quiet, --silent   do not print \`checking...' messages-      --cache-file=FILE   cache test results in FILE [disabled]-  -C, --config-cache      alias for \`--cache-file=config.cache'-  -n, --no-create         do not create output files-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']--Installation directories:-  --prefix=PREFIX         install architecture-independent files in PREFIX-			  [$ac_default_prefix]-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX-			  [PREFIX]--By default, \`make install' will install all the files in-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify-an installation prefix other than \`$ac_default_prefix' using \`--prefix',-for instance \`--prefix=\$HOME'.--For better control, use the options below.--Fine tuning of the installation directories:-  --bindir=DIR           user executables [EPREFIX/bin]-  --sbindir=DIR          system admin executables [EPREFIX/sbin]-  --libexecdir=DIR       program executables [EPREFIX/libexec]-  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]-  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]-  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]-  --libdir=DIR           object code libraries [EPREFIX/lib]-  --includedir=DIR       C header files [PREFIX/include]-  --oldincludedir=DIR    C header files for non-gcc [/usr/include]-  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]-  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]-  --infodir=DIR          info documentation [DATAROOTDIR/info]-  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]-  --mandir=DIR           man documentation [DATAROOTDIR/man]-  --docdir=DIR           documentation root [DATAROOTDIR/doc/network]-  --htmldir=DIR          html documentation [DOCDIR]-  --dvidir=DIR           dvi documentation [DOCDIR]-  --pdfdir=DIR           pdf documentation [DOCDIR]-  --psdir=DIR            ps documentation [DOCDIR]-_ACEOF--  cat <<\_ACEOF--System types:-  --build=BUILD     configure for building on BUILD [guessed]-  --host=HOST       cross-compile to build programs to run on HOST [BUILD]-_ACEOF-fi--if test -n "$ac_init_help"; then-  case $ac_init_help in-     short | recursive ) echo "Configuration of Haskell network package 1.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    C/C++/Objective 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" || continue-    ac_builddir=.--case "$ac_dir" in-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;-*)-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`-  # A ".." for each directory in $ac_dir_suffix.-  ac_top_builddir_sub=`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-      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 1.0-generated by GNU Autoconf 2.61--Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,-2002, 2003, 2004, 2005, 2006 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-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 1.0, which was-generated by GNU Autoconf 2.61.  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=.-  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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;-    esac-    case $ac_pass in-    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;-    2)-      ac_configure_args1="$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-      ac_configure_args="$ac_configure_args '$ac_arg'"-      ;;-    esac-  done-done-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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--    cat <<\_ASBOX-## ---------------- ##-## Cache variables. ##-## ---------------- ##-_ASBOX-    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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;-      esac-      case $ac_var in #(-      _ | IFS | as_nl) ;; #(-      *) $as_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--    cat <<\_ASBOX-## ----------------- ##-## Output variables. ##-## ----------------- ##-_ASBOX-    echo-    for ac_var in $ac_subst_vars-    do-      eval ac_val=\$$ac_var-      case $ac_val in-      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;-      esac-      echo "$ac_var='\''$ac_val'\''"-    done | sort-    echo--    if test -n "$ac_subst_files"; then-      cat <<\_ASBOX-## ------------------- ##-## File substitutions. ##-## ------------------- ##-_ASBOX-      echo-      for ac_var in $ac_subst_files-      do-	eval ac_val=\$$ac_var-	case $ac_val in-	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;-	esac-	echo "$ac_var='\''$ac_val'\''"-      done | sort-      echo-    fi--    if test -s confdefs.h; then-      cat <<\_ASBOX-## ----------- ##-## confdefs.h. ##-## ----------- ##-_ASBOX-      echo-      cat confdefs.h-      echo-    fi-    test "$ac_signal" != 0 &&-      echo "$as_me: caught signal $ac_signal"-    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'; { (exit 1); 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--# 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---# Let the site file select an alternate cache file if it wants to.-# Prefer explicitly selected file to automatically selected ones.-if test -n "$CONFIG_SITE"; then-  set x "$CONFIG_SITE"-elif test "x$prefix" != xNONE; then-  set x "$prefix/share/config.site" "$prefix/etc/config.site"-else-  set x "$ac_default_prefix/share/config.site" \-	"$ac_default_prefix/etc/config.site"-fi-shift-for ac_site_file-do-  if test -r "$ac_site_file"; then-    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5-echo "$as_me: loading site script $ac_site_file" >&6;}-    sed 's/^/| /' "$ac_site_file" >&5-    . "$ac_site_file"-  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.-  if test -f "$cache_file"; then-    { echo "$as_me:$LINENO: loading cache $cache_file" >&5-echo "$as_me: loading cache $cache_file" >&6;}-    case $cache_file in-      [\\/]* | ?:[\\/]* ) . "$cache_file";;-      *)                      . "./$cache_file";;-    esac-  fi-else-  { echo "$as_me:$LINENO: creating cache $cache_file" >&5-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,)-      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}-      ac_cache_corrupted=: ;;-    ,set)-      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5-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-	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}-	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5-echo "$as_me:   former value:  $ac_old_val" >&2;}-	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5-echo "$as_me:   current value: $ac_new_val" >&2;}-	ac_cache_corrupted=:-      fi;;-  esac-  # Pass precious variables to config.status.-  if test "$ac_new_set" = set; then-    case $ac_new_val in-    *\'*) ac_arg=$ac_var=`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.-      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;-    esac-  fi-done-if $ac_cache_corrupted; then-  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5-echo "$as_me: error: changes in the environment can compromise the build" >&2;}-  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}-   { (exit 1); exit 1; }; }-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----ac_includes_default="$ac_includes_default-#ifdef HAVE_NETDB_H-# include <netdb.h>-#endif-#ifdef HAVE_WINSOCK2_H-# include <winsock2.h>-#endif-#ifdef HAVE_WS2TCPIP_H-# include <ws2tcpip.h>-#endif-#ifdef HAVE_WSPIAPI_H-# include <wspiapi.h>-#endif"--# Safety check: Ensure that we are in the correct source directory.---ac_config_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-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5-echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}-   { (exit 1); exit 1; }; }-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 ||-  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5-echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}-   { (exit 1); exit 1; }; }--{ echo "$as_me:$LINENO: checking build system type" >&5-echo $ECHO_N "checking build system type... $ECHO_C" >&6; }-if test "${ac_cv_build+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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 &&-  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}-   { (exit 1); exit 1; }; }-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||-  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5-echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}-   { (exit 1); exit 1; }; }--fi-{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5-echo "${ECHO_T}$ac_cv_build" >&6; }-case $ac_cv_build in-*-*-*) ;;-*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5-echo "$as_me: error: invalid value of canonical build" >&2;}-   { (exit 1); exit 1; }; };;-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---{ echo "$as_me:$LINENO: checking host system type" >&5-echo $ECHO_N "checking host system type... $ECHO_C" >&6; }-if test "${ac_cv_host+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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` ||-    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5-echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}-   { (exit 1); exit 1; }; }-fi--fi-{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5-echo "${ECHO_T}$ac_cv_host" >&6; }-case $ac_cv_host in-*-*-*) ;;-*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5-echo "$as_me: error: invalid value of canonical host" >&2;}-   { (exit 1); exit 1; }; };;-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-{ echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }-if test "${ac_cv_prog_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then-    ac_cv_prog_CC="${ac_tool_prefix}gcc"-    echo "$as_me:$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-  { echo "$as_me:$LINENO: result: $CC" >&5-echo "${ECHO_T}$CC" >&6; }-else-  { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}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-{ echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then-    ac_cv_prog_ac_ct_CC="gcc"-    echo "$as_me:$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-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5-echo "${ECHO_T}$ac_ct_CC" >&6; }-else-  { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6; }-fi--  if test "x$ac_ct_CC" = x; then-    CC=""-  else-    case $cross_compiling:$ac_tool_warned in-yes:)-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools-whose name does not start with the host triplet.  If you think this-configuration is useful to you, please write to autoconf@gnu.org." >&5-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools-whose name does not start with the host triplet.  If you think this-configuration is useful to you, please write to autoconf@gnu.org." >&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-{ echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }-if test "${ac_cv_prog_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then-    ac_cv_prog_CC="${ac_tool_prefix}cc"-    echo "$as_me:$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-  { echo "$as_me:$LINENO: result: $CC" >&5-echo "${ECHO_T}$CC" >&6; }-else-  { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}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-{ echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }-if test "${ac_cv_prog_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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"-    echo "$as_me:$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-  { echo "$as_me:$LINENO: result: $CC" >&5-echo "${ECHO_T}$CC" >&6; }-else-  { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}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-{ echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }-if test "${ac_cv_prog_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"-    echo "$as_me:$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-  { echo "$as_me:$LINENO: result: $CC" >&5-echo "${ECHO_T}$CC" >&6; }-else-  { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}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-{ echo "$as_me:$LINENO: checking for $ac_word" >&5-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then-    ac_cv_prog_ac_ct_CC="$ac_prog"-    echo "$as_me:$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-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5-echo "${ECHO_T}$ac_ct_CC" >&6; }-else-  { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}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:)-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools-whose name does not start with the host triplet.  If you think this-configuration is useful to you, please write to autoconf@gnu.org." >&5-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools-whose name does not start with the host triplet.  If you think this-configuration is useful to you, please write to autoconf@gnu.org." >&2;}-ac_tool_warned=yes ;;-esac-    CC=$ac_ct_CC-  fi-fi--fi---test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH-See \`config.log' for more details." >&5-echo "$as_me: error: no acceptable C compiler found in \$PATH-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }--# Provide some information about the compiler.-echo "$as_me:$LINENO: checking for C compiler version" >&5-ac_compiler=`set X $ac_compile; echo $2`-{ (ac_try="$ac_compiler --version >&5"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compiler --version >&5") 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }-{ (ac_try="$ac_compiler -v >&5"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compiler -v >&5") 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }-{ (ac_try="$ac_compiler -V >&5"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compiler -V >&5") 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }--cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-ac_clean_files_save=$ac_clean_files-ac_clean_files="$ac_clean_files a.out 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.-{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`-#-# List of possible output files, starting from the most likely.-# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)-# only as a last resort.  b.out is created by i960 compilers.-ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'-#-# The IRIX 6 linker writes into existing files which may not be-# executable, retaining their permissions.  Remove them first so a-# subsequent execution test works.-ac_rmfiles=-for ac_file in $ac_files-do-  case $ac_file in-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_link_default") 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; 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 | *.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--{ echo "$as_me:$LINENO: result: $ac_file" >&5-echo "${ECHO_T}$ac_file" >&6; }-if test -z "$ac_file"; then-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--{ { echo "$as_me:$LINENO: error: C compiler cannot create executables-See \`config.log' for more details." >&5-echo "$as_me: error: C compiler cannot create executables-See \`config.log' for more details." >&2;}-   { (exit 77); exit 77; }; }-fi--ac_exeext=$ac_cv_exeext--# Check that the compiler produces executables we can run.  If not, either-# the compiler is broken, or we cross compile.-{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0-# If not cross compiling, check that we can run a simple program.-if test "$cross_compiling" != yes; then-  if { ac_try='./$ac_file'-  { (case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_try") 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-    cross_compiling=no-  else-    if test "$cross_compiling" = maybe; then-	cross_compiling=yes-    else-	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.-If you meant to cross compile, use \`--host'.-See \`config.log' for more details." >&5-echo "$as_me: error: cannot run C compiled programs.-If you meant to cross compile, use \`--host'.-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }-    fi-  fi-fi-{ echo "$as_me:$LINENO: result: yes" >&5-echo "${ECHO_T}yes" >&6; }--rm -f a.out a.exe conftest$ac_cv_exeext b.out-ac_clean_files=$ac_clean_files_save-# Check that the compiler produces executables we can run.  If not, either-# the compiler is broken, or we cross compile.-{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }-{ echo "$as_me:$LINENO: result: $cross_compiling" >&5-echo "${ECHO_T}$cross_compiling" >&6; }--{ echo "$as_me:$LINENO: checking for suffix of executables" >&5-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }-if { (ac_try="$ac_link"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_link") 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; 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 | *.o | *.obj ) ;;-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`-	  break;;-    * ) break;;-  esac-done-else-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link-See \`config.log' for more details." >&5-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }-fi--rm -f conftest$ac_cv_exeext-{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5-echo "${ECHO_T}$ac_cv_exeext" >&6; }--rm -f conftest.$ac_ext-EXEEXT=$ac_cv_exeext-ac_exeext=$EXEEXT-{ echo "$as_me:$LINENO: checking for suffix of object files" >&5-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }-if test "${ac_cv_objext+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* 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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; 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 ) ;;-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`-       break;;-  esac-done-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile-See \`config.log' for more details." >&5-echo "$as_me: error: cannot compute suffix of object files: cannot compile-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }-fi--rm -f conftest.$ac_cv_objext conftest.$ac_ext-fi-{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5-echo "${ECHO_T}$ac_cv_objext" >&6; }-OBJEXT=$ac_cv_objext-ac_objext=$OBJEXT-{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }-if test "${ac_cv_c_compiler_gnu+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{-#ifndef __GNUC__-       choke me-#endif--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_compiler_gnu=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	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-{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }-GCC=`test $ac_compiler_gnu = yes && echo yes`-ac_test_CFLAGS=${CFLAGS+set}-ac_save_CFLAGS=$CFLAGS-{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }-if test "${ac_cv_prog_cc_g+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_prog_cc_g=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	CFLAGS=""-      cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  :-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_c_werror_flag=$ac_save_c_werror_flag-	 CFLAGS="-g"-	 cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_prog_cc_g=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5---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-{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5-echo "${ECHO_T}$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-{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5-echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }-if test "${ac_cv_prog_cc_c89+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  ac_cv_prog_cc_c89=no-ac_save_CC=$CC-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <stdarg.h>-#include <stdio.h>-#include <sys/types.h>-#include <sys/stat.h>-/* 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"-  rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_prog_cc_c89=$ac_arg-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5---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)-    { echo "$as_me:$LINENO: result: none needed" >&5-echo "${ECHO_T}none needed" >&6; } ;;-  xno)-    { echo "$as_me:$LINENO: result: unsupported" >&5-echo "${ECHO_T}unsupported" >&6; } ;;-  *)-    CC="$CC $ac_cv_prog_cc_c89"-    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5-echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;-esac---ac_ext=c-ac_cpp='$CPP $CPPFLAGS'-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'-ac_compiler_gnu=$ac_cv_c_compiler_gnu----{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5-echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }-if test "${ac_cv_c_const+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */--int-main ()-{-/* FIXME: Include the comments suggested by Paul. */-#ifndef __cplusplus-  /* Ultrix mips cc rejects this.  */-  typedef int charset[2];-  const charset cs;-  /* 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.  */-    char *t;-    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 saying-       "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */-    struct s { int j; const int *ap[3]; };-    struct s *b; 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-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_c_const=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_c_const=no-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5-echo "${ECHO_T}$ac_cv_c_const" >&6; }-if test $ac_cv_c_const = no; then--cat >>confdefs.h <<\_ACEOF-#define const-_ACEOF--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-{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }-# On Suns, sometimes $CPP names a directory.-if test -n "$CPP" && test -d "$CPP"; then-  CPP=-fi-if test -z "$CPP"; then-  if test "${ac_cv_prog_CPP+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#ifdef __STDC__-# include <limits.h>-#else-# include <assert.h>-#endif-		     Syntax error-_ACEOF-if { (ac_try="$ac_cpp conftest.$ac_ext"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null && {-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||-	 test ! -s conftest.err-       }; then-  :-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  # Broken: fails on valid input.-continue-fi--rm -f conftest.err conftest.$ac_ext--  # OK, works on sane cases.  Now check whether nonexistent headers-  # can be detected and how.-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <ac_nonexistent.h>-_ACEOF-if { (ac_try="$ac_cpp conftest.$ac_ext"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null && {-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||-	 test ! -s conftest.err-       }; then-  # Broken: success on invalid input.-continue-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  # Passes both tests.-ac_preproc_ok=:-break-fi--rm -f conftest.err conftest.$ac_ext--done-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.-rm -f 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-{ echo "$as_me:$LINENO: result: $CPP" >&5-echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#ifdef __STDC__-# include <limits.h>-#else-# include <assert.h>-#endif-		     Syntax error-_ACEOF-if { (ac_try="$ac_cpp conftest.$ac_ext"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null && {-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||-	 test ! -s conftest.err-       }; then-  :-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  # Broken: fails on valid input.-continue-fi--rm -f conftest.err conftest.$ac_ext--  # OK, works on sane cases.  Now check whether nonexistent headers-  # can be detected and how.-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <ac_nonexistent.h>-_ACEOF-if { (ac_try="$ac_cpp conftest.$ac_ext"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null && {-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||-	 test ! -s conftest.err-       }; then-  # Broken: success on invalid input.-continue-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  # Passes both tests.-ac_preproc_ok=:-break-fi--rm -f conftest.err conftest.$ac_ext--done-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.-rm -f conftest.err conftest.$ac_ext-if $ac_preproc_ok; then-  :-else-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check-See \`config.log' for more details." >&5-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check-See \`config.log' for more details." >&2;}-   { (exit 1); exit 1; }; }-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---{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5-echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }-if test "${ac_cv_path_GREP+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  # Extract the first word of "grep ggrep" to use in msg output-if test -z "$GREP"; then-set dummy grep ggrep; ac_prog_name=$2-if test "${ac_cv_path_GREP+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  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"-    { test -f "$ac_path_GREP" && $as_test_x "$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-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"-  while :-  do-    cat "conftest.in" "conftest.in" >"conftest.tmp"-    mv "conftest.tmp" "conftest.in"-    cp "conftest.in" "conftest.nl"-    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-    ac_count=`expr $ac_count + 1`-    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---fi--GREP="$ac_cv_path_GREP"-if test -z "$GREP"; then-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5-echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}-   { (exit 1); exit 1; }; }-fi--else-  ac_cv_path_GREP=$GREP-fi---fi-{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5-echo "${ECHO_T}$ac_cv_path_GREP" >&6; }- GREP="$ac_cv_path_GREP"---{ echo "$as_me:$LINENO: checking for egrep" >&5-echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }-if test "${ac_cv_path_EGREP+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1-   then ac_cv_path_EGREP="$GREP -E"-   else-     # Extract the first word of "egrep" to use in msg output-if test -z "$EGREP"; then-set dummy egrep; ac_prog_name=$2-if test "${ac_cv_path_EGREP+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  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"-    { test -f "$ac_path_EGREP" && $as_test_x "$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-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"-  while :-  do-    cat "conftest.in" "conftest.in" >"conftest.tmp"-    mv "conftest.tmp" "conftest.in"-    cp "conftest.in" "conftest.nl"-    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-    ac_count=`expr $ac_count + 1`-    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---fi--EGREP="$ac_cv_path_EGREP"-if test -z "$EGREP"; then-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5-echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}-   { (exit 1); exit 1; }; }-fi--else-  ac_cv_path_EGREP=$EGREP-fi---   fi-fi-{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5-echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }- EGREP="$ac_cv_path_EGREP"---{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }-if test "${ac_cv_header_stdc+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <stdlib.h>-#include <stdarg.h>-#include <string.h>-#include <float.h>--int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_header_stdc=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	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 >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* 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 -r conftest*--fi--if test $ac_cv_header_stdc = yes; then-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* 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 -r 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 >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* 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-rm -f conftest$ac_exeext-if { (ac_try="$ac_link"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_link") 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'-  { (case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_try") 2>&5-  ac_status=$?-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); }; }; then-  :-else-  echo "$as_me: program exited with status $ac_status" >&5-echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--( exit $ac_status )-ac_cv_header_stdc=no-fi-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext-fi---fi-fi-{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5-echo "${ECHO_T}$ac_cv_header_stdc" >&6; }-if test $ac_cv_header_stdc = yes; then--cat >>confdefs.h <<\_ACEOF-#define STDC_HEADERS 1-_ACEOF--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=`echo "ac_cv_header_$ac_header" | $as_tr_sh`-{ echo "$as_me:$LINENO: checking for $ac_header" >&5-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default--#include <$ac_header>-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  eval "$as_ac_Header=yes"-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	eval "$as_ac_Header=no"-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-ac_res=`eval echo '${'$as_ac_Header'}'`-	       { echo "$as_me:$LINENO: result: $ac_res" >&5-echo "${ECHO_T}$ac_res" >&6; }-if test `eval echo '${'$as_ac_Header'}'` = yes; then-  cat >>confdefs.h <<_ACEOF-#define `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 wspiapi.h-do-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then-  { echo "$as_me:$LINENO: checking for $ac_header" >&5-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-fi-ac_res=`eval echo '${'$as_ac_Header'}'`-	       { echo "$as_me:$LINENO: result: $ac_res" >&5-echo "${ECHO_T}$ac_res" >&6; }-else-  # Is the header compilable?-{ echo "$as_me:$LINENO: checking $ac_header usability" >&5-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default-#include <$ac_header>-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_header_compiler=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_header_compiler=no-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5-echo "${ECHO_T}$ac_header_compiler" >&6; }--# Is the header present?-{ echo "$as_me:$LINENO: checking $ac_header presence" >&5-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <$ac_header>-_ACEOF-if { (ac_try="$ac_cpp conftest.$ac_ext"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null && {-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||-	 test ! -s conftest.err-       }; then-  ac_header_preproc=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  ac_header_preproc=no-fi--rm -f conftest.err conftest.$ac_ext-{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5-echo "${ECHO_T}$ac_header_preproc" >&6; }--# So?  What about this header?-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in-  yes:no: )-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}-    ac_header_preproc=yes-    ;;-  no:yes:* )-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}-    ( cat <<\_ASBOX-## ------------------------------------ ##-## Report this to libraries@haskell.org ##-## ------------------------------------ ##-_ASBOX-     ) | sed "s/^/$as_me: WARNING:     /" >&2-    ;;-esac-{ echo "$as_me:$LINENO: checking for $ac_header" >&5-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  eval "$as_ac_Header=\$ac_header_preproc"-fi-ac_res=`eval echo '${'$as_ac_Header'}'`-	       { echo "$as_me:$LINENO: result: $ac_res" >&5-echo "${ECHO_T}$ac_res" >&6; }--fi-if test `eval echo '${'$as_ac_Header'}'` = yes; then-  cat >>confdefs.h <<_ACEOF-#define `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-do-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then-  { echo "$as_me:$LINENO: checking for $ac_header" >&5-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-fi-ac_res=`eval echo '${'$as_ac_Header'}'`-	       { echo "$as_me:$LINENO: result: $ac_res" >&5-echo "${ECHO_T}$ac_res" >&6; }-else-  # Is the header compilable?-{ echo "$as_me:$LINENO: checking $ac_header usability" >&5-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default-#include <$ac_header>-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_header_compiler=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_header_compiler=no-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5-echo "${ECHO_T}$ac_header_compiler" >&6; }--# Is the header present?-{ echo "$as_me:$LINENO: checking $ac_header presence" >&5-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <$ac_header>-_ACEOF-if { (ac_try="$ac_cpp conftest.$ac_ext"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } >/dev/null && {-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||-	 test ! -s conftest.err-       }; then-  ac_header_preproc=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--  ac_header_preproc=no-fi--rm -f conftest.err conftest.$ac_ext-{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5-echo "${ECHO_T}$ac_header_preproc" >&6; }--# So?  What about this header?-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in-  yes:no: )-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}-    ac_header_preproc=yes-    ;;-  no:yes:* )-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}-    ( cat <<\_ASBOX-## ------------------------------------ ##-## Report this to libraries@haskell.org ##-## ------------------------------------ ##-_ASBOX-     ) | sed "s/^/$as_me: WARNING:     /" >&2-    ;;-esac-{ echo "$as_me:$LINENO: checking for $ac_header" >&5-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  eval "$as_ac_Header=\$ac_header_preproc"-fi-ac_res=`eval echo '${'$as_ac_Header'}'`-	       { echo "$as_me:$LINENO: result: $ac_res" >&5-echo "${ECHO_T}$ac_res" >&6; }--fi-if test `eval echo '${'$as_ac_Header'}'` = yes; then-  cat >>confdefs.h <<_ACEOF-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1-_ACEOF--fi--done-----for ac_func in readlink symlink-do-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`-{ echo "$as_me:$LINENO: checking for $ac_func" >&5-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }-if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */-#define $ac_func innocuous_$ac_func--/* System header to define __stub macros and hopefully few prototypes,-    which can conflict with char $ac_func (); 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 $ac_func--/* 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 $ac_func ();-/* 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_$ac_func || defined __stub___$ac_func-choke me-#endif--int-main ()-{-return $ac_func ();-  ;-  return 0;-}-_ACEOF-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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_link") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest$ac_exeext &&-       $as_test_x conftest$ac_exeext; then-  eval "$as_ac_var=yes"-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	eval "$as_ac_var=no"-fi--rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \-      conftest$ac_exeext conftest.$ac_ext-fi-ac_res=`eval echo '${'$as_ac_var'}'`-	       { echo "$as_me:$LINENO: result: $ac_res" >&5-echo "${ECHO_T}$ac_res" >&6; }-if test `eval echo '${'$as_ac_var'}'` = yes; then-  cat >>confdefs.h <<_ACEOF-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1-_ACEOF--fi-done---{ echo "$as_me:$LINENO: checking for struct msghdr.msg_control" >&5-echo $ECHO_N "checking for struct msghdr.msg_control... $ECHO_C" >&6; }-if test "${ac_cv_member_struct_msghdr_msg_control+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#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--int-main ()-{-static struct msghdr ac_aggr;-if (ac_aggr.msg_control)-return 0;-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_member_struct_msghdr_msg_control=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#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--int-main ()-{-static struct msghdr ac_aggr;-if (sizeof ac_aggr.msg_control)-return 0;-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_member_struct_msghdr_msg_control=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_member_struct_msghdr_msg_control=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-{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_msghdr_msg_control" >&5-echo "${ECHO_T}$ac_cv_member_struct_msghdr_msg_control" >&6; }-if test $ac_cv_member_struct_msghdr_msg_control = yes; then--cat >>confdefs.h <<_ACEOF-#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1-_ACEOF---fi-{ echo "$as_me:$LINENO: checking for struct msghdr.msg_accrights" >&5-echo $ECHO_N "checking for struct msghdr.msg_accrights... $ECHO_C" >&6; }-if test "${ac_cv_member_struct_msghdr_msg_accrights+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#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--int-main ()-{-static struct msghdr ac_aggr;-if (ac_aggr.msg_accrights)-return 0;-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_member_struct_msghdr_msg_accrights=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#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--int-main ()-{-static struct msghdr ac_aggr;-if (sizeof ac_aggr.msg_accrights)-return 0;-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_member_struct_msghdr_msg_accrights=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_member_struct_msghdr_msg_accrights=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-{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_msghdr_msg_accrights" >&5-echo "${ECHO_T}$ac_cv_member_struct_msghdr_msg_accrights" >&6; }-if test $ac_cv_member_struct_msghdr_msg_accrights = yes; then--cat >>confdefs.h <<_ACEOF-#define HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS 1-_ACEOF---fi---{ echo "$as_me:$LINENO: checking for struct sockaddr.sa_len" >&5-echo $ECHO_N "checking for struct sockaddr.sa_len... $ECHO_C" >&6; }-if test "${ac_cv_member_struct_sockaddr_sa_len+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#if HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#if HAVE_SYS_SOCKET_H-# include <sys/socket.h>-#endif--int-main ()-{-static struct sockaddr ac_aggr;-if (ac_aggr.sa_len)-return 0;-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_member_struct_sockaddr_sa_len=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#if HAVE_SYS_TYPES_H-# include <sys/types.h>-#endif-#if HAVE_SYS_SOCKET_H-# include <sys/socket.h>-#endif--int-main ()-{-static struct sockaddr ac_aggr;-if (sizeof ac_aggr.sa_len)-return 0;-  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_member_struct_sockaddr_sa_len=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_member_struct_sockaddr_sa_len=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-{ echo "$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_sa_len" >&5-echo "${ECHO_T}$ac_cv_member_struct_sockaddr_sa_len" >&6; }-if test $ac_cv_member_struct_sockaddr_sa_len = yes; then--cat >>confdefs.h <<_ACEOF-#define HAVE_STRUCT_SOCKADDR_SA_LEN 1-_ACEOF---fi---{ echo "$as_me:$LINENO: checking for in_addr_t in netinet/in.h" >&5-echo $ECHO_N "checking for in_addr_t in netinet/in.h... $ECHO_C" >&6; }-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <netinet/in.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "in_addr_t" >/dev/null 2>&1; then--cat >>confdefs.h <<\_ACEOF-#define HAVE_IN_ADDR_T 1-_ACEOF- { echo "$as_me:$LINENO: result: yes" >&5-echo "${ECHO_T}yes" >&6; }-else-  { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6; }-fi-rm -f -r conftest*---{ echo "$as_me:$LINENO: checking for SO_PEERCRED and struct ucred in sys/socket.h" >&5-echo $ECHO_N "checking for SO_PEERCRED and struct ucred in sys/socket.h... $ECHO_C" >&6; }-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <sys/types.h>-#include <sys/socket.h>-#ifndef SO_PEERCRED-# error no SO_PEERCRED-#endif-struct ucred u;-int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_ucred=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_ucred=no-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-if test "x$ac_cv_ucred" = xno; then-    old_CFLAGS="$CFLAGS"-    CFLAGS="-D_GNU_SOURCE $CFLAGS"-    cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <sys/types.h>-#include <sys/socket.h>-#ifndef SO_PEERCRED-# error no SO_PEERCRED-#endif-struct ucred u;-int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_ucred=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_ucred=no-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-    if test "x$ac_cv_ucred" = xyes; then-        EXTRA_CPPFLAGS=-D_GNU_SOURCE-    fi-else-    old_CFLAGS="$CFLAGS"-fi-if test "x$ac_cv_ucred" = xno; then-    CFLAGS="$old_CFLAGS"-    { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6; }-else--cat >>confdefs.h <<\_ACEOF-#define HAVE_STRUCT_UCRED 1-_ACEOF--    { echo "$as_me:$LINENO: result: yes" >&5-echo "${ECHO_T}yes" >&6; }-fi---{ echo "$as_me:$LINENO: checking for _head_libws2_32_a in -lws2_32" >&5-echo $ECHO_N "checking for _head_libws2_32_a in -lws2_32... $ECHO_C" >&6; }-if test "${ac_cv_lib_ws2_32__head_libws2_32_a+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  ac_check_lib_save_LIBS=$LIBS-LIBS="-lws2_32  $LIBS"-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* 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-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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_link") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest$ac_exeext &&-       $as_test_x conftest$ac_exeext; then-  ac_cv_lib_ws2_32__head_libws2_32_a=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_lib_ws2_32__head_libws2_32_a=no-fi--rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \-      conftest$ac_exeext conftest.$ac_ext-LIBS=$ac_check_lib_save_LIBS-fi-{ echo "$as_me:$LINENO: result: $ac_cv_lib_ws2_32__head_libws2_32_a" >&5-echo "${ECHO_T}$ac_cv_lib_ws2_32__head_libws2_32_a" >&6; }-if test $ac_cv_lib_ws2_32__head_libws2_32_a = yes; then-  cat >>confdefs.h <<_ACEOF-#define HAVE_LIBWS2_32 1-_ACEOF--  LIBS="-lws2_32 $LIBS"--fi---{ echo "$as_me:$LINENO: checking for getaddrinfo" >&5-echo $ECHO_N "checking for getaddrinfo... $ECHO_C" >&6; }-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default-int testme(){ getaddrinfo; }-int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then--cat >>confdefs.h <<\_ACEOF-#define HAVE_GETADDRINFO 1-_ACEOF- ac_have_getaddrinfo=yes; { echo "$as_me:$LINENO: result: yes" >&5-echo "${ECHO_T}yes" >&6; }-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	{ echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}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"-    { echo "$as_me:$LINENO: checking for getaddrinfo if WINVER is 0x0501" >&5-echo $ECHO_N "checking for getaddrinfo if WINVER is 0x0501... $ECHO_C" >&6; }-    cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default-    int testme(){ getaddrinfo; }-int-main ()-{--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then--cat >>confdefs.h <<\_ACEOF-#define HAVE_GETADDRINFO 1-_ACEOF--cat >>confdefs.h <<\_ACEOF-#define NEED_WINVER_XP 1-_ACEOF- EXTRA_CPPFLAGS="-DWINVER=0x0501 $EXTRA_CPPFLAGS"; { echo "$as_me:$LINENO: result: yes" >&5-echo "${ECHO_T}yes" >&6; }-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	CFLAGS="$old_CFLAGS"; { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6; }-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-  fi-fi---for ac_func in gai_strerror-do-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`-{ echo "$as_me:$LINENO: checking for $ac_func" >&5-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }-if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */-#define $ac_func innocuous_$ac_func--/* System header to define __stub macros and hopefully few prototypes,-    which can conflict with char $ac_func (); 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 $ac_func--/* 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 $ac_func ();-/* 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_$ac_func || defined __stub___$ac_func-choke me-#endif--int-main ()-{-return $ac_func ();-  ;-  return 0;-}-_ACEOF-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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_link") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest$ac_exeext &&-       $as_test_x conftest$ac_exeext; then-  eval "$as_ac_var=yes"-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	eval "$as_ac_var=no"-fi--rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \-      conftest$ac_exeext conftest.$ac_ext-fi-ac_res=`eval echo '${'$as_ac_var'}'`-	       { echo "$as_me:$LINENO: result: $ac_res" >&5-echo "${ECHO_T}$ac_res" >&6; }-if test `eval echo '${'$as_ac_var'}'` = yes; then-  cat >>confdefs.h <<_ACEOF-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1-_ACEOF--fi-done---{ echo "$as_me:$LINENO: checking whether AI_ADDRCONFIG is declared" >&5-echo $ECHO_N "checking whether AI_ADDRCONFIG is declared... $ECHO_C" >&6; }-if test "${ac_cv_have_decl_AI_ADDRCONFIG+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default-int-main ()-{-#ifndef AI_ADDRCONFIG-  (void) AI_ADDRCONFIG;-#endif--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_have_decl_AI_ADDRCONFIG=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_have_decl_AI_ADDRCONFIG=no-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_AI_ADDRCONFIG" >&5-echo "${ECHO_T}$ac_cv_have_decl_AI_ADDRCONFIG" >&6; }-if test $ac_cv_have_decl_AI_ADDRCONFIG = yes; then--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_ADDRCONFIG 1-_ACEOF---else-  cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_ADDRCONFIG 0-_ACEOF---fi-{ echo "$as_me:$LINENO: checking whether AI_ALL is declared" >&5-echo $ECHO_N "checking whether AI_ALL is declared... $ECHO_C" >&6; }-if test "${ac_cv_have_decl_AI_ALL+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default-int-main ()-{-#ifndef AI_ALL-  (void) AI_ALL;-#endif--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_have_decl_AI_ALL=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_have_decl_AI_ALL=no-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_AI_ALL" >&5-echo "${ECHO_T}$ac_cv_have_decl_AI_ALL" >&6; }-if test $ac_cv_have_decl_AI_ALL = yes; then--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_ALL 1-_ACEOF---else-  cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_ALL 0-_ACEOF---fi-{ echo "$as_me:$LINENO: checking whether AI_NUMERICSERV is declared" >&5-echo $ECHO_N "checking whether AI_NUMERICSERV is declared... $ECHO_C" >&6; }-if test "${ac_cv_have_decl_AI_NUMERICSERV+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default-int-main ()-{-#ifndef AI_NUMERICSERV-  (void) AI_NUMERICSERV;-#endif--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_have_decl_AI_NUMERICSERV=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_have_decl_AI_NUMERICSERV=no-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_AI_NUMERICSERV" >&5-echo "${ECHO_T}$ac_cv_have_decl_AI_NUMERICSERV" >&6; }-if test $ac_cv_have_decl_AI_NUMERICSERV = yes; then--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_NUMERICSERV 1-_ACEOF---else-  cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_NUMERICSERV 0-_ACEOF---fi-{ echo "$as_me:$LINENO: checking whether AI_V4MAPPED is declared" >&5-echo $ECHO_N "checking whether AI_V4MAPPED is declared... $ECHO_C" >&6; }-if test "${ac_cv_have_decl_AI_V4MAPPED+set}" = set; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-$ac_includes_default-int-main ()-{-#ifndef AI_V4MAPPED-  (void) AI_V4MAPPED;-#endif--  ;-  return 0;-}-_ACEOF-rm -f conftest.$ac_objext-if { (ac_try="$ac_compile"-case "(($ac_try" in-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;-  *) ac_try_echo=$ac_try;;-esac-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_compile") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest.$ac_objext; then-  ac_cv_have_decl_AI_V4MAPPED=yes-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	ac_cv_have_decl_AI_V4MAPPED=no-fi--rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext-fi-{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_AI_V4MAPPED" >&5-echo "${ECHO_T}$ac_cv_have_decl_AI_V4MAPPED" >&6; }-if test $ac_cv_have_decl_AI_V4MAPPED = yes; then--cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_V4MAPPED 1-_ACEOF---else-  cat >>confdefs.h <<_ACEOF-#define HAVE_DECL_AI_V4MAPPED 0-_ACEOF---fi----{ echo "$as_me:$LINENO: checking for sendfile in sys/sendfile.h" >&5-echo $ECHO_N "checking for sendfile in sys/sendfile.h... $ECHO_C" >&6; }-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <sys/sendfile.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "sendfile" >/dev/null 2>&1; then--cat >>confdefs.h <<\_ACEOF-#define HAVE_LINUX_SENDFILE 1-_ACEOF- { echo "$as_me:$LINENO: result: yes" >&5-echo "${ECHO_T}yes" >&6; }-else-  { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6; }-fi-rm -f -r conftest*---{ echo "$as_me:$LINENO: checking for sendfile in sys/socket.h" >&5-echo $ECHO_N "checking for sendfile in sys/socket.h... $ECHO_C" >&6; }-cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-#include <sys/socket.h>--_ACEOF-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |-  $EGREP "sendfile" >/dev/null 2>&1; then--cat >>confdefs.h <<\_ACEOF-#define HAVE_BSD_SENDFILE 1-_ACEOF- { echo "$as_me:$LINENO: result: yes" >&5-echo "${ECHO_T}yes" >&6; }-else-  { echo "$as_me:$LINENO: result: no" >&5-echo "${ECHO_T}no" >&6; }-fi-rm -f -r conftest*----for ac_func in gethostent-do-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`-{ echo "$as_me:$LINENO: checking for $ac_func" >&5-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }-if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then-  echo $ECHO_N "(cached) $ECHO_C" >&6-else-  cat >conftest.$ac_ext <<_ACEOF-/* confdefs.h.  */-_ACEOF-cat confdefs.h >>conftest.$ac_ext-cat >>conftest.$ac_ext <<_ACEOF-/* end confdefs.h.  */-/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.-   For example, HP-UX 11i <limits.h> declares gettimeofday.  */-#define $ac_func innocuous_$ac_func--/* System header to define __stub macros and hopefully few prototypes,-    which can conflict with char $ac_func (); 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 $ac_func--/* 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 $ac_func ();-/* 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_$ac_func || defined __stub___$ac_func-choke me-#endif--int-main ()-{-return $ac_func ();-  ;-  return 0;-}-_ACEOF-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 "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5-  (eval "$ac_link") 2>conftest.er1-  ac_status=$?-  grep -v '^ *+' conftest.er1 >conftest.err-  rm -f conftest.er1-  cat conftest.err >&5-  echo "$as_me:$LINENO: \$? = $ac_status" >&5-  (exit $ac_status); } && {-	 test -z "$ac_c_werror_flag" ||-	 test ! -s conftest.err-       } && test -s conftest$ac_exeext &&-       $as_test_x conftest$ac_exeext; then-  eval "$as_ac_var=yes"-else-  echo "$as_me: failed program was:" >&5-sed 's/^/| /' conftest.$ac_ext >&5--	eval "$as_ac_var=no"-fi--rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \-      conftest$ac_exeext conftest.$ac_ext-fi-ac_res=`eval echo '${'$as_ac_var'}'`-	       { echo "$as_me:$LINENO: result: $ac_res" >&5-echo "${ECHO_T}$ac_res" >&6; }-if test `eval echo '${'$as_ac_var'}'` = yes; then-  cat >>confdefs.h <<_ACEOF-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1-_ACEOF--fi-done---case "$host" in-*-mingw32)-	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_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;-      esac-      case $ac_var in #(-      _ | IFS | as_nl) ;; #(-      *) $as_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-    test "x$cache_file" != "x/dev/null" &&-      { echo "$as_me:$LINENO: updating cache $cache_file" >&5-echo "$as_me: updating cache $cache_file" >&6;}-    cat confcache >$cache_file-  else-    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5-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=-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=`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.-  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"-  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'-done-LIBOBJS=$ac_libobjs--LTLIBOBJS=$ac_ltlibobjs----: ${CONFIG_STATUS=./config.status}-ac_clean_files_save=$ac_clean_files-ac_clean_files="$ac_clean_files $CONFIG_STATUS"-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5-echo "$as_me: creating $CONFIG_STATUS" >&6;}-cat >$CONFIG_STATUS <<_ACEOF-#! $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}-_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF-## --------------------- ##-## 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=:-  # Zsh 3.x and 4.x performs 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-----# PATH needs CR-# 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--# The user is always right.-if test "${PATH_SEPARATOR+set}" != set; then-  echo "#! /bin/sh" >conf$$.sh-  echo  "exit 0"   >>conf$$.sh-  chmod +x conf$$.sh-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then-    PATH_SEPARATOR=';'-  else-    PATH_SEPARATOR=:-  fi-  rm -f conf$$.sh-fi--# Support unset when possible.-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then-  as_unset=unset-else-  as_unset=false-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.)-as_nl='-'-IFS=" ""	$as_nl"--# Find who we are.  Look in the path if we contain no directory separator.-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-  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2-  { (exit 1); exit 1; }-fi--# Work around bugs in pre-3.0 UWIN ksh.-for as_var in ENV MAIL MAILPATH-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var-done-PS1='$ '-PS2='> '-PS4='+ '--# NLS nuisances.-for as_var in \-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \-  LC_TELEPHONE LC_TIME-do-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then-    eval $as_var=C; export $as_var-  else-    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var-  fi-done--# Required to use basename.-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---# Name of the executable.-as_me=`$as_basename -- "$0" ||-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \-	 X"$0" : 'X\(//\)$' \| \-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||-echo X/"$0" |-    sed '/^.*\/\([^/][^/]*\)\/*$/{-	    s//\1/-	    q-	  }-	  /^X\/\(\/\/\)$/{-	    s//\1/-	    q-	  }-	  /^X\/\(\/\).*/{-	    s//\1/-	    q-	  }-	  s/.*/./; q'`--# CDPATH.-$as_unset CDPATH----  as_lineno_1=$LINENO-  as_lineno_2=$LINENO-  test "x$as_lineno_1" != "x$as_lineno_2" &&-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {--  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO-  # uniformly replaced by the line number.  The first 'sed' inserts a-  # line-number line after each line using $LINENO; the second 'sed'-  # does the real work.  The second script uses 'N' to pair each-  # line-number line with the line containing $LINENO, and appends-  # trailing '-' during substitution so that $LINENO is not a special-  # case at line end.-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the-  # scripts with optimization help from Paolo Bonzini.  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" ||-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2-   { (exit 1); exit 1; }; }--  # 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-}---if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then-  as_dirname=dirname-else-  as_dirname=false-fi--ECHO_C= ECHO_N= ECHO_T=-case `echo -n x` in--n*)-  case `echo 'x\c'` in-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.-  *)   ECHO_C='\c';;-  esac;;-*)-  ECHO_N='-n';;-esac--if expr a : '\(a\)' >/dev/null 2>&1 &&-   test "X`expr 00001 : '.*\(...\)'`" = X001; then-  as_expr=expr-else-  as_expr=false-fi--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-fi-echo >conf$$.file-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 -p'.-  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||-    as_ln_s='cp -p'-elif ln conf$$.file conf$$ 2>/dev/null; then-  as_ln_s=ln-else-  as_ln_s='cp -p'-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=:-else-  test -d ./-p && rmdir ./-p-  as_mkdir_p=false-fi--if test -x / >/dev/null 2>&1; then-  as_test_x='test -x'-else-  if ls -dL / >/dev/null 2>&1; then-    as_ls_L_option=L-  else-    as_ls_L_option=-  fi-  as_test_x='-    eval sh -c '\''-      if test -d "$1"; then-        test -d "$1/.";-      else-	case $1 in-        -*)set "./$1";;-	esac;-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in-	???[sx]*):;;*)false;;esac;fi-    '\'' sh-  '-fi-as_executable_p=$as_test_x--# 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--# 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 1.0, which was-generated by GNU Autoconf 2.61.  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--cat >>$CONFIG_STATUS <<_ACEOF-# Files that config.status was made for.-config_files="$ac_config_files"-config_headers="$ac_config_headers"--_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF-ac_cs_usage="\-\`$as_me' instantiates files from templates according to the-current configuration.--Usage: $0 [OPTIONS] [FILE]...--  -h, --help       print this help, then exit-  -V, --version    print version number and configuration settings, then exit-  -q, --quiet      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 <bug-autoconf@gnu.org>."--_ACEOF-cat >>$CONFIG_STATUS <<_ACEOF-ac_cs_version="\\-Haskell network package config.status 1.0-configured by $0, generated by GNU Autoconf 2.61,-  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"--Copyright (C) 2006 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'-_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF-# If no file are specified by the user, then we need to provide default-# value.  By we need to know if files were specified by the user.-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=$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 )-    echo "$ac_cs_version"; exit ;;-  --debug | --debu | --deb | --de | --d | -d )-    debug=: ;;-  --file | --fil | --fi | --f )-    $ac_shift-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"-    ac_need_defaults=false;;-  --header | --heade | --head | --hea )-    $ac_shift-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"-    ac_need_defaults=false;;-  --he | --h)-    # Conflict between --help and --header-    { echo "$as_me: error: ambiguous option: $1-Try \`$0 --help' for more information." >&2-   { (exit 1); exit 1; }; };;-  --help | --hel | -h )-    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.-  -*) { echo "$as_me: error: unrecognized option: $1-Try \`$0 --help' for more information." >&2-   { (exit 1); exit 1; }; } ;;--  *) ac_config_targets="$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-if \$ac_cs_recheck; then-  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6-  CONFIG_SHELL=$SHELL-  export CONFIG_SHELL-  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion-fi--_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF-exec 5>>config.log-{-  echo-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX-## Running $as_me. ##-_ASBOX-  echo "$ac_log"-} >&5--_ACEOF-cat >>$CONFIG_STATUS <<_ACEOF-_ACEOF--cat >>$CONFIG_STATUS <<\_ACEOF--# 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" ;;--  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}-   { (exit 1); exit 1; }; };;-  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=-  trap 'exit_status=$?-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status-' 0-  trap '{ (exit 1); exit 1; }' 1 2 13 15-}-# Create a (secure) tmp directory for tmp files.--{-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&-  test -n "$tmp" && test -d "$tmp"-}  ||-{-  tmp=./conf$$-$RANDOM-  (umask 077 && mkdir "$tmp")-} ||-{-   echo "$me: cannot create a temporary directory in ." >&2-   { (exit 1); exit 1; }-}--#-# Set up the sed scripts for CONFIG_FILES section.-#--# No need to generate the scripts if there are no CONFIG_FILES.-# This happens for instance when ./config.status config.h-if test -n "$CONFIG_FILES"; then--_ACEOF----ac_delim='%!_!# '-for ac_last_try in false false false false false :; do-  cat >conf$$subs.sed <<_ACEOF-SHELL!$SHELL$ac_delim-PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim-PACKAGE_NAME!$PACKAGE_NAME$ac_delim-PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim-PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim-PACKAGE_STRING!$PACKAGE_STRING$ac_delim-PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim-exec_prefix!$exec_prefix$ac_delim-prefix!$prefix$ac_delim-program_transform_name!$program_transform_name$ac_delim-bindir!$bindir$ac_delim-sbindir!$sbindir$ac_delim-libexecdir!$libexecdir$ac_delim-datarootdir!$datarootdir$ac_delim-datadir!$datadir$ac_delim-sysconfdir!$sysconfdir$ac_delim-sharedstatedir!$sharedstatedir$ac_delim-localstatedir!$localstatedir$ac_delim-includedir!$includedir$ac_delim-oldincludedir!$oldincludedir$ac_delim-docdir!$docdir$ac_delim-infodir!$infodir$ac_delim-htmldir!$htmldir$ac_delim-dvidir!$dvidir$ac_delim-pdfdir!$pdfdir$ac_delim-psdir!$psdir$ac_delim-libdir!$libdir$ac_delim-localedir!$localedir$ac_delim-mandir!$mandir$ac_delim-DEFS!$DEFS$ac_delim-ECHO_C!$ECHO_C$ac_delim-ECHO_N!$ECHO_N$ac_delim-ECHO_T!$ECHO_T$ac_delim-LIBS!$LIBS$ac_delim-build_alias!$build_alias$ac_delim-host_alias!$host_alias$ac_delim-target_alias!$target_alias$ac_delim-build!$build$ac_delim-build_cpu!$build_cpu$ac_delim-build_vendor!$build_vendor$ac_delim-build_os!$build_os$ac_delim-host!$host$ac_delim-host_cpu!$host_cpu$ac_delim-host_vendor!$host_vendor$ac_delim-host_os!$host_os$ac_delim-CC!$CC$ac_delim-CFLAGS!$CFLAGS$ac_delim-LDFLAGS!$LDFLAGS$ac_delim-CPPFLAGS!$CPPFLAGS$ac_delim-ac_ct_CC!$ac_ct_CC$ac_delim-EXEEXT!$EXEEXT$ac_delim-OBJEXT!$OBJEXT$ac_delim-CPP!$CPP$ac_delim-GREP!$GREP$ac_delim-EGREP!$EGREP$ac_delim-CALLCONV!$CALLCONV$ac_delim-EXTRA_CPPFLAGS!$EXTRA_CPPFLAGS$ac_delim-EXTRA_LIBS!$EXTRA_LIBS$ac_delim-EXTRA_SRCS!$EXTRA_SRCS$ac_delim-LIBOBJS!$LIBOBJS$ac_delim-LTLIBOBJS!$LTLIBOBJS$ac_delim-_ACEOF--  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 61; then-    break-  elif $ac_last_try; then-    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5-echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}-   { (exit 1); exit 1; }; }-  else-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "-  fi-done--ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`-if test -n "$ac_eof"; then-  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`-  ac_eof=`expr $ac_eof + 1`-fi--cat >>$CONFIG_STATUS <<_ACEOF-cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end-_ACEOF-sed '-s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g-s/^/s,@/; s/!/@,|#_!!_#|/-:n-t n-s/'"$ac_delim"'$/,g/; t-s/$/\\/; p-N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n-' >>$CONFIG_STATUS <conf$$subs.sed-rm -f conf$$subs.sed-cat >>$CONFIG_STATUS <<_ACEOF-:end-s/|#_!!_#|//g-CEOF$ac_eof-_ACEOF---# VPATH may cause trouble with some makes, so we remove $(srcdir),-# ${srcdir} and @srcdir@ 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[	 ]*=/{-s/:*\$(srcdir):*/:/-s/:*\${srcdir}:*/:/-s/:*@srcdir@:*/:/-s/^\([^=]*=[	 ]*\):*/\1/-s/:*$//-s/^[^=]*=[	 ]*$//-}'-fi--cat >>$CONFIG_STATUS <<\_ACEOF-fi # test -n "$CONFIG_FILES"---for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS-do-  case $ac_tag in-  :[FHLC]) ac_mode=$ac_tag; continue;;-  esac-  case $ac_mode$ac_tag in-  :[FHL]*:*);;-  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5-echo "$as_me: error: Invalid tag $ac_tag." >&2;}-   { (exit 1); exit 1; }; };;-  :[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="$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 ||-	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5-echo "$as_me: error: cannot find input file: $ac_f" >&2;}-   { (exit 1); exit 1; }; };;-      esac-      ac_file_inputs="$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 "`IFS=:-	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."-    if test x"$ac_file" != x-; then-      configure_input="$ac_file.  $configure_input"-      { echo "$as_me:$LINENO: creating $ac_file" >&5-echo "$as_me: creating $ac_file" >&6;}-    fi--    case $ac_tag in-    *:-:* | *:-) cat >"$tmp/stdin";;-    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 ||-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"-  case $as_dir in #(-  -*) as_dir=./$as_dir;;-  esac-  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {-    as_dirs=-    while :; do-      case $as_dir in #(-      *\'*) as_qdir=`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 ||-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" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5-echo "$as_me: error: cannot create directory $as_dir" >&2;}-   { (exit 1); exit 1; }; }; }-  ac_builddir=.--case "$ac_dir" in-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;-*)-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`-  # A ".." for each directory in $ac_dir_suffix.-  ac_top_builddir_sub=`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-# 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=--case `sed -n '/datarootdir/ {-  p-  q-}-/@datadir@/p-/@docdir@/p-/@infodir@/p-/@localedir@/p-/@mandir@/p-' $ac_file_inputs` in-*datarootdir*) ac_datarootdir_seen=yes;;-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)-  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5-echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}-_ACEOF-cat >>$CONFIG_STATUS <<_ACEOF-  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-  sed "$ac_vpsub-$extrasub-_ACEOF-cat >>$CONFIG_STATUS <<\_ACEOF-:t-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b-s&@configure_input@&$configure_input&;t t-s&@top_builddir@&$ac_top_builddir_sub&;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-" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out--test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&-  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'-which seems to be undefined.  Please make sure it is defined." >&5-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 "$tmp/stdin"-  case $ac_file in-  -) cat "$tmp/out"; rm -f "$tmp/out";;-  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;-  esac- ;;-  :H)-  #-  # CONFIG_HEADER-  #-_ACEOF--# Transform confdefs.h into a sed script `conftest.defines', that-# substitutes the proper values into config.h.in to produce config.h.-rm -f conftest.defines conftest.tail-# First, append a space to every undef/define line, to ease matching.-echo 's/$/ /' >conftest.defines-# Then, protect against being on the right side of a sed subst, or in-# an unquoted here document, in config.status.  If some macros were-# called several times there might be several #defines for the same-# symbol, which is useless.  But do not sort them, since the last-# AC_DEFINE must be honored.-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*-# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where-# NAME is the cpp macro being defined, VALUE is the value it is being given.-# PARAMS is the parameter list in the macro definition--in most cases, it's-# just an empty string.-ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'-ac_dB='\\)[	 (].*,\\1define\\2'-ac_dC=' '-ac_dD=' ,'--uniq confdefs.h |-  sed -n '-	t rset-	:rset-	s/^[	 ]*#[	 ]*define[	 ][	 ]*//-	t ok-	d-	:ok-	s/[\\&,]/\\&/g-	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p-	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p-  ' >>conftest.defines--# Remove the space that was appended to ease matching.-# Then 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.-# (The regexp can be short, since the line contains either #define or #undef.)-echo 's/ $//-s,^[	 #]*u.*,/* & */,' >>conftest.defines--# Break up conftest.defines:-ac_max_sed_lines=50--# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"-# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"-# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"-# et cetera.-ac_in='$ac_file_inputs'-ac_out='"$tmp/out1"'-ac_nxt='"$tmp/out2"'--while :-do-  # Write a here document:-    cat >>$CONFIG_STATUS <<_ACEOF-    # First, check the format of the line:-    cat >"\$tmp/defines.sed" <<\\CEOF-/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def-/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def-b-:def-_ACEOF-  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS-  echo 'CEOF-    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS-  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in-  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail-  grep . conftest.tail >/dev/null || break-  rm -f conftest.defines-  mv conftest.tail conftest.defines-done-rm -f conftest.defines conftest.tail--echo "ac_result=$ac_in" >>$CONFIG_STATUS-cat >>$CONFIG_STATUS <<\_ACEOF-  if test x"$ac_file" != x-; then-    echo "/* $configure_input  */" >"$tmp/config.h"-    cat "$ac_result" >>"$tmp/config.h"-    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5-echo "$as_me: $ac_file is unchanged" >&6;}-    else-      rm -f $ac_file-      mv "$tmp/config.h" $ac_file-    fi-  else-    echo "/* $configure_input  */"-    cat "$ac_result"-  fi-  rm -f "$tmp/out12"- ;;---  esac--done # for ac_tag---{ (exit 0); exit 0; }-_ACEOF-chmod +x $CONFIG_STATUS-ac_clean_files=$ac_clean_files_save---# 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 || { (exit 1); exit 1; }-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,20 +1,64 @@-AC_INIT([Haskell network package], [1.0], [libraries@haskell.org], [network])+AC_INIT([Haskell network package],+        [3.2.7.0],+        [libraries@haskell.org],+        [network]) -ac_includes_default="$ac_includes_default-#ifdef HAVE_NETDB_H-# include <netdb.h>+dnl See also HsNet.h+ac_includes_default="#ifndef _WIN32+# define _GNU_SOURCE 1  /* for struct ucred on Linux */ #endif-#ifdef HAVE_WINSOCK2_H+$ac_includes_default++#ifdef _WIN32 # include <winsock2.h>-#endif-#ifdef HAVE_WS2TCPIP_H # include <ws2tcpip.h>+# define IPV6_V6ONLY 27 #endif-#ifdef HAVE_WSPIAPI_H-# include <wspiapi.h>-#endif" -# Safety check: Ensure that we are in the correct source directory.+#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_SRCDIR([include/HsNet.h])  AC_CONFIG_HEADERS([include/HsNetworkConfig.h])@@ -28,142 +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 wspiapi.h])-AC_CHECK_HEADERS([arpa/inet.h netdb.h netinet/in.h netinet/tcp.h sys/socket.h sys/uio.h sys/un.h])--AC_CHECK_FUNCS([readlink symlink])--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 * 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 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_DECLS([IPV6_V6ONLY])+AC_CHECK_DECLS([IPPROTO_IP, IPPROTO_TCP, IPPROTO_IPV6])+AC_CHECK_DECLS([SO_PEERCRED])+AC_CHECK_DECLS([IP_DONTFRAG])+AC_CHECK_DECLS([IP_MTU_DISCOVER]) -case "$host" in-*-mingw32)-	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_SUBST([CALLCONV])-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,18 +1,30 @@+{-# LANGUAGE OverloadedStrings #-}+ -- Echo client program-module Main where+module Main (main) where -import Network.Socket hiding (recv)-import Network.Socket.ByteString (recv, sendAll)+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 = withSocketsDo $-    do addrinfos <- getAddrInfo Nothing (Just "") (Just "3000")-       let serveraddr = head addrinfos-       sock <- socket (addrFamily serveraddr) Stream defaultProtocol-       connect sock (addrAddress serveraddr)-       sendAll sock $ C.pack "Hello, world!"-       msg <- recv sock 1024-       sClose sock-       putStr "Received "-       C.putStrLn msg+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 = 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
examples/EchoServer.hs view
@@ -1,27 +1,48 @@ -- Echo server program-module Main where+module Main (main) where -import Control.Monad (unless)-import Network.Socket hiding (recv)+import Control.Concurrent (forkFinally)+import qualified Control.Exception as E+import Control.Monad (forever, unless, void) import qualified Data.ByteString as S+import qualified Data.List.NonEmpty as NE+import Network.Socket import Network.Socket.ByteString (recv, sendAll)  main :: IO ()-main = withSocketsDo $-    do addrinfos <- getAddrInfo-                    (Just (defaultHints {addrFlags = [AI_PASSIVE]}))-                    Nothing (Just "3000")-       let serveraddr = head addrinfos-       sock <- socket (addrFamily serveraddr) Stream defaultProtocol-       bindSocket sock (addrAddress serveraddr)-       listen sock 1-       (conn, _) <- accept sock-       talk conn-       sClose conn-       sClose sock+main = runTCPServer Nothing "3000" talk+  where+    talk s = do+        msg <- recv s 1024+        unless (S.null msg) $ do+            sendAll s msg+            talk s -    where-      talk :: Socket -> IO ()-      talk conn =-          do msg <- recv conn 1024-             unless (S.null msg) $ sendAll conn msg >> talk conn+-- 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 = 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)
include/HsNet.h view
@@ -1,63 +1,37 @@ /* -----------------------------------------------------------------------------  *- * Definitions for package `net' which are visible in Haskell land.+ * Definitions for package `network' which are visible in Haskell land.  *  * ---------------------------------------------------------------------------*/  #ifndef HSNET_H #define HSNET_H -#include "HsNetworkConfig.h"--#ifdef NEED_WINVER-# define WINVER 0x0501-#endif--/* ultra-evil... */-#undef PACKAGE_BUGREPORT-#undef PACKAGE_NAME-#undef PACKAGE_STRING-#undef PACKAGE_TARNAME-#undef PACKAGE_VERSION+#include "HsNetDef.h"  #ifndef INLINE # if defined(_MSC_VER) #  define INLINE extern __inline-# elif defined(__GNUC__)+# elif defined(__GNUC_GNU_INLINE__) #  define INLINE extern inline # else #  define INLINE inline # 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) && !defined(__CYGWIN__)-#include <winsock2.h>-# ifdef HAVE_WS2TCPIP_H-#  include <ws2tcpip.h>-# endif-# ifdef HAVE_WSPIAPI_H-#  include <wspiapi.h>-# endif--extern void  shutdownWinSock();-extern int   initWinSock ();-extern const char* getWSErrorDescr(int err);--# if !defined(__HUGS__)-extern void* newAcceptParams(int sock,-			     int sz,-			     void* sockaddr);-extern int   acceptNewSock(void* d);-extern int   acceptDoProc(void* param);-# endif+#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>@@ -80,12 +54,12 @@ #ifdef HAVE_SYS_SOCKET_H # include <sys/socket.h> #endif-#ifdef 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@@ -95,63 +69,76 @@ #ifdef HAVE_NETDB_H #include <netdb.h> #endif--#ifdef HAVE_BSD_SENDFILE-#include <sys/uio.h>-#endif-#ifdef HAVE_LINUX_SENDFILE-#if !defined(__USE_FILE_OFFSET64)-#include <sys/sendfile.h>+#ifdef HAVE_NET_IF_H+# include <net/if.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); -/* The next two are scheduled for deletion */-extern int-sendAncillary(int sock,-	      int level,-	      int type,-	      int flags,-	      void* data,-	      int len);+extern struct cmsghdr *+cmsg_firsthdr(struct msghdr *mhdr); -extern int-recvAncillary(int  sock,-	      int* pLevel,-	      int* pType,-	      int  flags,-	      void** pData,-	      int* pLen);+extern struct cmsghdr *+cmsg_nxthdr(struct msghdr *mhdr, struct cmsghdr *cmsg); -#endif /* HAVE_WINSOCK2_H && !__CYGWIN */+extern unsigned char *+cmsg_data(struct cmsghdr *cmsg); -INLINE char *-my_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 size_t+cmsg_space(size_t l); -#ifdef HAVE_GETADDRINFO+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) && !defined(__CYGWIN__)+# if defined(_WIN32)                   DWORD d, char* e, DWORD f, int g) # else                   socklen_t d, char* e, socklen_t f, int g)@@ -172,22 +159,13 @@ {     freeaddrinfo(ai); }-#endif -#if defined(HAVE_WINSOCK_H) && !defined(cygwin32_HOST_OS)-# define WITH_WINSOCK  1-#endif--#if !defined(mingw32_HOST_OS) && !defined(_WIN32)-# define DOMAIN_SOCKET_SUPPORT 1+#ifndef IOV_MAX+# define IOV_MAX 1024 #endif -#if !defined(CALLCONV)-# if defined(WITH_WINSOCK)-#  define CALLCONV stdcall-# else-#  define CALLCONV ccall-# endif+#ifndef SOCK_NONBLOCK // Missing define in Bionic libc (Android)+# define SOCK_NONBLOCK O_NONBLOCK #endif  #endif /* HSNET_H */
+ include/HsNetDef.h view
@@ -0,0 +1,50 @@+#ifndef HSNETDEF_H+#define HSNETDEF_H++#include "HsNetworkConfig.h"++/* ultra-evil... */+#undef PACKAGE_BUGREPORT+#undef PACKAGE_NAME+#undef PACKAGE_STRING+#undef PACKAGE_TARNAME+#undef PACKAGE_VERSION++#if defined(HAVE_STRUCT_UCRED) && HAVE_DECL_SO_PEERCRED+# define HAVE_STRUCT_UCRED_SO_PEERCRED 1+#else+# undef HAVE_STRUCT_UCRED_SO_PEERCRED+#endif++#ifdef HAVE_ACCEPT4+# define HAVE_ADVANCED_SOCKET_FLAGS 1+#else+# undef HAVE_ADVANCED_SOCKET_FLAGS+#endif++/* stdcall is for Windows 32.+   Haskell FFI does not have a keyword for Windows 64.+   If ccall/stdcall is specified on Windows 64,+   GHC ignores it and use a proper ABI for Windows 64.+   But if stdcall is specified, GHC displays a warning.+   So, let's use ccall for Windows 64.+ */+#if defined(mingw32_HOST_OS)+# if defined(i386_HOST_ARCH)+#  define CALLCONV stdcall+# elif defined(x86_64_HOST_ARCH)+#  define CALLCONV ccall+# else+#  error Unknown mingw32 arch+# endif+#else+# define CALLCONV ccall+#endif++#if defined(mingw32_HOST_OS)+# define SAFE_ON_WIN safe+#else+# define SAFE_ON_WIN unsafe+#endif++#endif /* HSNETDEF_H */
− include/HsNetworkConfig.h
@@ -1,144 +0,0 @@-/* include/HsNetworkConfig.h.  Generated from HsNetworkConfig.h.in by configure.  */-/* include/HsNetworkConfig.h.in.  Generated from configure.ac by autoheader.  */--/* Define to 1 if you have the <arpa/inet.h> header file. */-#define HAVE_ARPA_INET_H 1--/* Define to 1 if you have a BSDish sendfile(2) implementation. */-#define HAVE_BSD_SENDFILE 1--/* Define to 1 if you have the declaration of `AI_ADDRCONFIG', and to 0 if you-   don't. */-#define HAVE_DECL_AI_ADDRCONFIG 1--/* Define to 1 if you have the declaration of `AI_ALL', and to 0 if you don't.-   */-#define HAVE_DECL_AI_ALL 1--/* Define to 1 if you have the declaration of `AI_NUMERICSERV', and to 0 if-   you don't. */-#define HAVE_DECL_AI_NUMERICSERV 1--/* Define to 1 if you have the declaration of `AI_V4MAPPED', and to 0 if you-   don't. */-#define HAVE_DECL_AI_V4MAPPED 1--/* Define to 1 if you have the <fcntl.h> header file. */-#define HAVE_FCNTL_H 1--/* Define to 1 if you have the `gai_strerror' function. */-#define HAVE_GAI_STRERROR 1--/* Define to 1 if you have the `getaddrinfo' function. */-#define HAVE_GETADDRINFO 1--/* Define to 1 if you have the `gethostent' function. */-#define HAVE_GETHOSTENT 1--/* Define to 1 if you have the <inttypes.h> header file. */-#define HAVE_INTTYPES_H 1--/* Define to 1 if in_addr_t is available. */-#define HAVE_IN_ADDR_T 1--/* Define to 1 if you have the `ws2_32' library (-lws2_32). */-/* #undef HAVE_LIBWS2_32 */--/* Define to 1 if you have the <limits.h> header file. */-#define HAVE_LIMITS_H 1--/* Define to 1 if you have a Linux sendfile(2) implementation. */-/* #undef HAVE_LINUX_SENDFILE */--/* Define to 1 if you have the <memory.h> header file. */-#define HAVE_MEMORY_H 1--/* Define to 1 if you have the <netdb.h> header file. */-#define HAVE_NETDB_H 1--/* Define to 1 if you have the <netinet/in.h> header file. */-#define HAVE_NETINET_IN_H 1--/* Define to 1 if you have the <netinet/tcp.h> header file. */-#define HAVE_NETINET_TCP_H 1--/* Define to 1 if you have the `readlink' function. */-#define HAVE_READLINK 1--/* Define to 1 if you have the <stdint.h> header file. */-#define HAVE_STDINT_H 1--/* Define to 1 if you have the <stdlib.h> header file. */-#define HAVE_STDLIB_H 1--/* Define to 1 if you have the <strings.h> header file. */-#define HAVE_STRINGS_H 1--/* Define to 1 if you have the <string.h> header file. */-#define HAVE_STRING_H 1--/* Define to 1 if `msg_accrights' is member of `struct msghdr'. */-/* #undef HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS */--/* Define to 1 if `msg_control' is member of `struct msghdr'. */-#define HAVE_STRUCT_MSGHDR_MSG_CONTROL 1--/* Define to 1 if `sa_len' is member of `struct sockaddr'. */-#define HAVE_STRUCT_SOCKADDR_SA_LEN 1--/* Define to 1 if you have both SO_PEERCRED and struct ucred. */-/* #undef HAVE_STRUCT_UCRED */--/* Define to 1 if you have the `symlink' function. */-#define HAVE_SYMLINK 1--/* Define to 1 if you have the <sys/socket.h> header file. */-#define HAVE_SYS_SOCKET_H 1--/* Define to 1 if you have the <sys/stat.h> header file. */-#define HAVE_SYS_STAT_H 1--/* Define to 1 if you have the <sys/types.h> header file. */-#define HAVE_SYS_TYPES_H 1--/* Define to 1 if you have the <sys/uio.h> header file. */-#define HAVE_SYS_UIO_H 1--/* Define to 1 if you have the <sys/un.h> header file. */-#define HAVE_SYS_UN_H 1--/* Define to 1 if you have the <unistd.h> header file. */-#define HAVE_UNISTD_H 1--/* Define to 1 if you have the <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 you have the <wspiapi.h> header file. */-/* #undef HAVE_WSPIAPI_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. */-#define PACKAGE_BUGREPORT "libraries@haskell.org"--/* Define to the full name of this package. */-#define PACKAGE_NAME "Haskell network package"--/* Define to the full name and version of this package. */-#define PACKAGE_STRING "Haskell network package 1.0"--/* Define to the one symbol short name of this package. */-#define PACKAGE_TARNAME "network"--/* Define to the version of this package. */-#define PACKAGE_VERSION "1.0"--/* Define to 1 if you have the ANSI C header files. */-#define STDC_HEADERS 1--/* Define to empty if `const' does not conform to ANSI C. */-/* #undef const */
include/HsNetworkConfig.h.in view
@@ -1,57 +1,73 @@ /* include/HsNetworkConfig.h.in.  Generated from configure.ac by autoheader.  */ +/* 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+   don't. */+#undef HAVE_DECL_IPPROTO_IP++/* 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+   don't. */+#undef HAVE_DECL_IPPROTO_TCP++/* 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 the 'getpeereid' function. */+#undef HAVE_GETPEEREID+ /* 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 a Linux sendfile(2) implementation. */-#undef HAVE_LINUX_SENDFILE--/* 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 @@ -61,12 +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 `readlink' function. */-#undef HAVE_READLINK+/* 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 <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 @@ -76,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 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 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 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 @@ -109,18 +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 you have the <wspiapi.h> header file. */-#undef HAVE_WSPIAPI_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 @@ -133,11 +140,16 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */+#undef PACKAGE_URL+ /* 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/Typeable.h
@@ -1,9 +0,0 @@-/* Cut down from base/include/Typeable.h */-#ifndef TYPEABLE_H-#define TYPEABLE_H--#define INSTANCE_TYPEABLE0(tycon,tcname,str) \-tcname = mkTyCon str; \-instance Typeable tycon where { typeOf _ = mkTyConApp tcname [] }--#endif
+ 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,4 +0,0 @@-ghc-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@-cc-options: -DCALLCONV=@CALLCONV@ @EXTRA_CPPFLAGS@-c-sources: @EXTRA_SRCS@-extra-libraries: @EXTRA_LIBS@
network.cabal view
@@ -1,59 +1,212 @@-name:           network-version:        2.3.0.2-license:        BSD3-license-file:   LICENSE-maintainer:     Johan Tibell <johan.tibell@gmail.com>-synopsis:       Low-level networking interface-description:    Low-level networking interface-category:       Network-build-type:     Configure-cabal-version:  >=1.6-extra-tmp-files:-  config.log config.status autom4te.cache network.buildinfo-  include/HsNetworkConfig.h+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.+    .+    === 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 examples/*.hs tests/*.hs config.guess config.sub install-sh-  configure.ac configure network.buildinfo.in-  include/HsNetworkConfig.h.in include/HsNet.h include/Typeable.h-  -- C sources only used on some systems-  cbits/ancilData.c cbits/asyncAccept.c cbits/initWinSock.c-  cbits/winSockErr.c-homepage:       http://github.com/haskell/network-bug-reports:    http://trac.haskell.org/network/+    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-    Network.URI-  other-modules:-    Network.Socket.ByteString.Internal+    exposed-modules:+        Network.Socket+        Network.Socket.Address+        Network.Socket.ByteString+        Network.Socket.ByteString.Lazy+        Network.Socket.Internal -  if !os(windows)+    build-tools:      hsc2hs >=0+    c-sources:+        cbits/HsNet.c+        cbits/cmsg.c+     other-modules:-      Network.Socket.ByteString.IOVec-      Network.Socket.ByteString.MsgHdr+        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 >= 3 && < 4.4,-    bytestring < 1.0,-    parsec >= 2.0 && < 3.2+    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 && < 3+        base >=4.9 && <5,+        bytestring >=0.10,+        deepseq,+        directory,+        stm -  extensions:-    CPP, DeriveDataTypeable, ForeignFunctionInterface, TypeSynonymInstances-  include-dirs: include-  includes: HsNet.h-  install-includes: HsNet.h HsNetworkConfig.h-  c-sources: cbits/HsNet.c+    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 -source-repository head-  type:     git-  location: git://github.com/haskell/network.git+    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+    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++    default-language: Haskell2010+    ghc-options:      -Wall -threaded+    build-depends:+        base,+        bytestring,+        directory,+        HUnit,+        network,+        temporary,+        hspec >=2.6,+        QuickCheck++    if flag(devel)+        cpp-options: -DDEVELOPMENT++    if impl(ghc >=8)+        default-extensions: Strict StrictData++    if os(windows)+        cpp-options: -D_WIN32
+ tests/BadFileDescriptor.hs view
@@ -0,0 +1,52 @@+-- Test code for "threadWait: invalid argument (Bad file descriptor)"+-- See https://ghc.haskell.org/trac/ghc/ticket/14621+-- See https://github.com/haskell/network/issues/287+--+-- % runghc BadFileDescriptor.hs+-- BadFileDescriptor.hs: threadWait: invalid argument (Bad file descriptor)+module Main where++import Control.Concurrent (forkIO)+import Control.Monad (forever, void)+import Network.Socket hiding (recv)+import Network.Socket.ByteString (recv, sendAll)++main :: IO ()+main = do+    let localhost = "localhost"+        listenPort = "9876"+        connectPort = "6789"+    proxy localhost listenPort connectPort++proxy :: HostName -> ServiceName -> ServiceName -> IO ()+proxy localhost listenPort connectPort = do+    fromClient <- serverSocket localhost listenPort+    toServer <- clientSocket localhost connectPort+    void $ forkIO $ relay toServer fromClient+    relay fromClient toServer++relay :: Socket -> Socket -> IO ()+relay s1 s2 = forever $ do+    payload <- recv s1 4096+    sendAll s2 payload++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)+    sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+    bind sock (addrAddress addr)+    listen sock 1+    fst <$> accept sock++clientSocket :: HostName -> ServiceName -> IO Socket+clientSocket host port = do+    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/Simple.hs
@@ -1,141 +0,0 @@-module Main where--import Control.Concurrent (forkIO)-import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)-import Control.Exception (bracket)-import Control.Monad (when)-import Network.Socket hiding (recv, recvFrom, send)-import System.Exit (exitFailure)-import Test.HUnit (Counts(..), Test(..), (@=?), runTestTT)--import qualified Data.ByteString as S-import qualified Data.ByteString.Char8 as C-import qualified Data.ByteString.Lazy.Char8 as L--import Network.Socket.ByteString (recv, recvFrom, send, sendAll, sendMany)-import qualified Network.Socket.ByteString.Lazy as NSBL----------------------------------------------------------------------------port :: PortNumber-port = fromIntegral (3000 :: Int)--testMsg :: S.ByteString-testMsg = C.pack "This is a test message."--testLazySend :: Test-testLazySend = TestCase $ connectedTest client server-    where-      server sock = recv sock 1024 >>= (@=?) (C.take 1024 strictTestMsg)-      client sock = NSBL.send sock lazyTestMsg >>= (@=?) 1024--      -- message containing too many chunks to be sent in one system call-      lazyTestMsg = let alphabet = map C.singleton ['a'..'z']-                    in L.fromChunks (concat (replicate 100 alphabet))--      strictTestMsg = C.concat . L.toChunks $ lazyTestMsg----------------------------------------------------------------------------- Tests--testSendAll :: Test-testSendAll = TestCase $ connectedTest client server-    where-      server sock = recv sock 1024 >>= (@=?) testMsg-      client sock = sendAll sock testMsg--testSendMany :: Test-testSendMany = TestCase $ connectedTest client server-    where-      server sock = recv sock 1024 >>= (@=?) (S.append seg1 seg2)-      client sock = sendMany sock [seg1, seg2]--      seg1 = C.pack "This is a "-      seg2 = C.pack "test message."--testRecv :: Test-testRecv = TestCase $ connectedTest client server-    where-      server sock = recv sock 1024 >>= (@=?) testMsg-      client sock = send sock testMsg--testOverFlowRecv :: Test-testOverFlowRecv = TestCase $ connectedTest client server-    where-      server sock = do seg1 <- recv sock (S.length testMsg - 3)-                       seg2 <- recv sock 1024-                       let msg = S.append seg1 seg2-                       testMsg @=? msg--      client sock = send sock testMsg--testRecvFrom :: Test-testRecvFrom = TestCase $ connectedTest client server-    where-      server sock = do (msg, _) <- recvFrom sock 1024-                       testMsg @=? msg--      client sock = send sock testMsg--testOverFlowRecvFrom :: Test-testOverFlowRecvFrom = TestCase $ connectedTest client server-    where-      server sock = do (seg1, _) <- recvFrom sock (S.length testMsg - 3)-                       (seg2, _) <- recvFrom sock 1024-                       let msg = S.append seg1 seg2-                       testMsg @=? msg--      client sock = send sock testMsg----------------------------------------------------------------------------- Test helpers---- | 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 connection.-connectedTest :: (Socket -> IO a) -> (Socket -> IO b) -> IO ()-connectedTest clientAct serverAct = do-    barrier <- newEmptyMVar-    forkIO $ server barrier-    client barrier-  where-    server barrier = do-        addr <- inet_addr "127.0.0.1"-        bracket (socket AF_INET Stream defaultProtocol) sClose $ \sock -> do-            setSocketOption sock ReuseAddr 1-            bindSocket sock (SockAddrInet port addr)-            listen sock 1-            serverReady-            (clientSock, _) <- accept sock-            serverAct clientSock-            sClose clientSock-            putMVar barrier ()-      where-        -- | Signal to the client that it can proceed.-        serverReady = putMVar barrier ()--    client barrier = do-        takeMVar barrier-        bracket (socket AF_INET Stream defaultProtocol) sClose $ \sock -> do-            addr <- inet_addr "127.0.0.1"-            connect sock $ SockAddrInet port addr-            clientAct sock-            takeMVar barrier----------------------------------------------------------------------------- Test harness--main :: IO ()-main = withSocketsDo $ do-    counts <- runTestTT tests-    when (errors counts + failures counts > 0) exitFailure--tests :: Test-tests = TestList [ TestLabel "testLazySend" testLazySend-                 , TestLabel "testSendAll" testSendMany-                 , TestLabel "testSendMany" testSendMany-                 , TestLabel "testRecv" testRecv-                 , TestLabel "testOverFlowRecv" testOverFlowRecv-                 , TestLabel "testRecvFrom" testRecvFrom-                 , TestLabel "testOverFlowRecvFrom" testOverFlowRecvFrom-                 ]
+ tests/Spec.hs view
@@ -0,0 +1,1 @@+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
− tests/net001.hs
@@ -1,27 +0,0 @@-module Main where--import Network-import Control.Concurrent-import System.IO---- NOTE: this test depends on non-blocking I/O support,--- which win32 doesn't support. Rather than having the--- test program block, we fail to initialise WinSock--- (via withSocketsDo) here so that the test will fall over--- (and repeatedly remind us to implement Win32 support--- for non-blocking I/O !)--main = {- withSocketsDo $ -} do-   forkIO server-   threadDelay 1000000-   h <- connectTo "localhost" (PortNumber 22222)-   l <- hGetLine h-   hClose h-   print l- where-   server = do-	  s <- listenOn (PortNumber 22222)-	  (h, host, port) <- accept s-	  hPutStrLn h "hello"-	  hClose h-
− tests/net002.hs
@@ -1,133 +0,0 @@--- $Id: net002.hs,v 1.5 2005/01/17 09:57:24 simonmar Exp $--- http://www.bagley.org/~doug/shootout/--- Haskell echo/client server--- written by Brian Gregor--- compile with:--- ghc -O -o echo -package net -package concurrent -package lang echo.hs-    --- !!! exposed a bug in 5.02.2's network library, accept wasn't setting the--- socket it returned to non-blocking mode.---- NOTE: this test depends on non-blocking I/O support,--- which win32 doesn't support. Rather than having the--- test program block, we fail to initialise WinSock--- (via withSocketsDo) here so that the test will fall over--- (and repeatedly remind us to implement Win32 support--- for non-blocking I/O !)--module Main where--import Network.Socket--import Prelude hiding (putStr)-import System.IO hiding (putStr)-import qualified System.IO-import System.IO.Error-import Control.Concurrent-import System.Environment 	( getArgs )-import System.Exit 		( exitFailure )-import Control.Exception 	( finally )--server_sock :: IO (Socket)-server_sock = do-    s <- socket AF_INET Stream 6-    setSocketOption s ReuseAddr 1-    -- bindSocket s (SockAddrInet (mkPortNumber portnum) iNADDR_ANY)-    bindSocket s (SockAddrInet (PortNum portnum) iNADDR_ANY)-    listen s 2-    return s--eofAsEmptyHandler :: IOError -> IO String-eofAsEmptyHandler e- | isEOFError e = return ""- | otherwise    = ioError e---- For debugging, enable the putStr below.  Turn it off to get deterministic--- results: on a multiprocessor we can't predict the order of the messages.-putStr = const (return ())--- putStr = System.IO.putStr --echo_server s = do-    (s', clientAddr) <- accept s-    proc <- read_data s' 0-    putStrLn ("server processed "++(show proc)++" bytes")-    sClose s'-    where-        read_data sock totalbytes = do-            -- (str,i) <- readSocket sock 19-            str <- recv sock 19 `catch` eofAsEmptyHandler-            -- if (i >= 19) -            putStr ("Server recv: " ++ str)-            if ((length str) >= 19) -                then do-                    putStr ("Server read: " ++ str)-                    -- writ <- writeSocket sock str-                    writ <- send sock str-                    putStr ("Server wrote: " ++ str)-                    ---                    read_data sock $! (totalbytes+(length $! str))-                    -- read_data sock (totalbytes+(length str))-                else do-                    putStr ("server read: " ++ str)-                    return totalbytes--local       = "127.0.0.1"        -message     = "Hello there sailor\n"-portnum     = 7001--client_sock = do-    s <- socket AF_INET Stream 6-    ia <- inet_addr local-    -- connect s (SockAddrInet (mkPortNumber portnum) ia)-    connect s (SockAddrInet (PortNum portnum) ia)-    return s--echo_client n = do-    s <- client_sock-    drop <- server_echo s n-    sClose s-    where-        server_echo sock n = if n > 0-            then do -                -- writeSocket sock message-                send sock message-                putStr ("Client wrote: " ++ message)-                ---                -- (str,i) <- readSocket sock 19-                str <- recv sock 19 `catch` eofAsEmptyHandler-                if (str /= message)-                    then do-                        putStr ("Client read error: " ++ str ++ "\n")-                        exitFailure-                    else do-                        putStr ("Client read success")-                        server_echo sock (n-1)-            else do -                putStr "Client read nil\n"-                return []--main = {- withSocketsDo $ -} do -    ~[n] <- getArgs-    -- server & client semaphores-    -- get the server socket-    ssock <- server_sock -    -- fork off the server-    s <- myForkIO (echo_server ssock)-    -- fork off the client-    c <- myForkIO (echo_client (read n::Int))-    -- let 'em run until they've signaled they're done-    join s-    System.IO.putStr "join s\n"-    join c-    System.IO.putStr "join c\n"---- these are used to make the main thread wait until--- the child threads have exited-myForkIO :: IO () -> IO (MVar ())-myForkIO io = do-    mvar <- newEmptyMVar-    forkIO (io `finally` putMVar mvar ())-    return mvar--join :: MVar () -> IO ()-join mvar = readMVar mvar
− tests/uri001.hs
@@ -1,1166 +0,0 @@------------------------------------------------------------------------------------  $Id: URITest.hs,v 1.8 2005/07/19 22:01:27 gklyne Exp $------  Copyright (c) 2004, G. KLYNE.  All rights reserved.---  See end of this file for licence information.------------------------------------------------------------------------------------ |---  Module      :  URITest---  Copyright   :  (c) 2004, Graham Klyne---  License     :  BSD-style (see end of this file)------  Maintainer  :  Graham Klyne---  Stability   :  provisional---  Portability :  H98------  This Module contains test cases for module URI.------  Using GHC, I compile with this command line:---  ghc --make -fglasgow-exts---      -i..\;C:\Dev\Haskell\Lib\HUnit;C:\Dev\Haskell\Lib\Parsec---      -o URITest.exe URITest -main-is URITest.main---  The -i line may need changing for alternative installations.--------------------------------------------------------------------------------------module Main where--import Network.URI-    ( URI(..), URIAuth(..)-    , nullURI-    , parseURI, parseURIReference, parseRelativeReference, parseAbsoluteURI-    , parseabsoluteURI-    , isURI, isURIReference, isRelativeReference, isAbsoluteURI-    , isIPv6address, isIPv4address-    , relativeTo, nonStrictRelativeTo-    , relativeFrom-    , uriToString-    , isUnescapedInURI, escapeURIString, unEscapeString-    , normalizeCase, normalizeEscape, normalizePathSegments-    )--import Test.HUnit--import IO ( Handle, openFile, IOMode(WriteMode), hClose, hPutStr, hPutStrLn )--import Maybe ( fromJust )---- Test supplied string for valid URI reference syntax---   isValidURIRef :: String -> Bool--- Test supplied string for valid absolute URI reference syntax---   isAbsoluteURIRef :: String -> Bool--- Test supplied string for valid absolute URI syntax---   isAbsoluteURI :: String -> Bool--data URIType = AbsId    -- URI form (absolute, no fragment)-             | AbsRf    -- Absolute URI reference-             | RelRf    -- Relative URI reference-             | InvRf    -- Invalid URI reference-isValidT :: URIType -> Bool-isValidT InvRf = False-isValidT _     = True--isAbsRfT :: URIType -> Bool-isAbsRfT AbsId = True-isAbsRfT AbsRf = True-isAbsRfT _     = False--isRelRfT :: URIType -> Bool-isRelRfT RelRf = True-isRelRfT _     = False--isAbsIdT :: URIType -> Bool-isAbsIdT AbsId = True-isAbsIdT _     = False--testEq :: (Eq a, Show a) => String -> a -> a -> Test-testEq lab a1 a2 = TestCase ( assertEqual lab a1 a2 )--testURIRef :: URIType -> String -> Test-testURIRef t u = TestList-  [ testEq ("test_isURIReference:"++u) (isValidT t) (isURIReference u)-  , testEq ("test_isRelativeReference:"++u)  (isRelRfT t) (isRelativeReference  u)-  , testEq ("test_isAbsoluteURI:"++u)  (isAbsIdT t) (isAbsoluteURI  u)-  ]--testURIRefComponents :: String -> (Maybe URI) -> String -> Test-testURIRefComponents lab uv us =-    testEq ("testURIRefComponents:"++us) uv (parseURIReference us)---testURIRef001 = testURIRef AbsRf "http://example.org/aaa/bbb#ccc"-testURIRef002 = testURIRef AbsId "mailto:local@domain.org"-testURIRef003 = testURIRef AbsRf "mailto:local@domain.org#frag"-testURIRef004 = testURIRef AbsRf "HTTP://EXAMPLE.ORG/AAA/BBB#CCC"-testURIRef005 = testURIRef RelRf "//example.org/aaa/bbb#ccc"-testURIRef006 = testURIRef RelRf "/aaa/bbb#ccc"-testURIRef007 = testURIRef RelRf "bbb#ccc"-testURIRef008 = testURIRef RelRf "#ccc"-testURIRef009 = testURIRef RelRf "#"-testURIRef010 = testURIRef RelRf "/"--- escapes-testURIRef011 = testURIRef AbsRf "http://example.org/aaa%2fbbb#ccc"-testURIRef012 = testURIRef AbsRf "http://example.org/aaa%2Fbbb#ccc"-testURIRef013 = testURIRef RelRf "%2F"-testURIRef014 = testURIRef RelRf "aaa%2Fbbb"--- ports-testURIRef015 = testURIRef AbsRf "http://example.org:80/aaa/bbb#ccc"-testURIRef016 = testURIRef AbsRf "http://example.org:/aaa/bbb#ccc"-testURIRef017 = testURIRef AbsRf "http://example.org./aaa/bbb#ccc"-testURIRef018 = testURIRef AbsRf "http://example.123./aaa/bbb#ccc"--- bare authority-testURIRef019 = testURIRef AbsId "http://example.org"--- IPv6 literals (from RFC2732):-testURIRef021 = testURIRef AbsId "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html"-testURIRef022 = testURIRef AbsId "http://[1080:0:0:0:8:800:200C:417A]/index.html"-testURIRef023 = testURIRef AbsId "http://[3ffe:2a00:100:7031::1]"-testURIRef024 = testURIRef AbsId "http://[1080::8:800:200C:417A]/foo"-testURIRef025 = testURIRef AbsId "http://[::192.9.5.5]/ipng"-testURIRef026 = testURIRef AbsId "http://[::FFFF:129.144.52.38]:80/index.html"-testURIRef027 = testURIRef AbsId "http://[2010:836B:4179::836B:4179]"-testURIRef028 = testURIRef RelRf "//[2010:836B:4179::836B:4179]"-testURIRef029 = testURIRef InvRf "[2010:836B:4179::836B:4179]"--- RFC2396 test cases-testURIRef031 = testURIRef RelRf "./aaa"-testURIRef032 = testURIRef RelRf "../aaa"-testURIRef033 = testURIRef AbsId "g:h"-testURIRef034 = testURIRef RelRf "g"-testURIRef035 = testURIRef RelRf "./g"-testURIRef036 = testURIRef RelRf "g/"-testURIRef037 = testURIRef RelRf "/g"-testURIRef038 = testURIRef RelRf "//g"-testURIRef039 = testURIRef RelRf "?y"-testURIRef040 = testURIRef RelRf "g?y"-testURIRef041 = testURIRef RelRf "#s"-testURIRef042 = testURIRef RelRf "g#s"-testURIRef043 = testURIRef RelRf "g?y#s"-testURIRef044 = testURIRef RelRf ";x"-testURIRef045 = testURIRef RelRf "g;x"-testURIRef046 = testURIRef RelRf "g;x?y#s"-testURIRef047 = testURIRef RelRf "."-testURIRef048 = testURIRef RelRf "./"-testURIRef049 = testURIRef RelRf ".."-testURIRef050 = testURIRef RelRf "../"-testURIRef051 = testURIRef RelRf "../g"-testURIRef052 = testURIRef RelRf "../.."-testURIRef053 = testURIRef RelRf "../../"-testURIRef054 = testURIRef RelRf "../../g"-testURIRef055 = testURIRef RelRf "../../../g"-testURIRef056 = testURIRef RelRf "../../../../g"-testURIRef057 = testURIRef RelRf "/./g"-testURIRef058 = testURIRef RelRf "/../g"-testURIRef059 = testURIRef RelRf "g."-testURIRef060 = testURIRef RelRf ".g"-testURIRef061 = testURIRef RelRf "g.."-testURIRef062 = testURIRef RelRf "..g"-testURIRef063 = testURIRef RelRf "./../g"-testURIRef064 = testURIRef RelRf "./g/."-testURIRef065 = testURIRef RelRf "g/./h"-testURIRef066 = testURIRef RelRf "g/../h"-testURIRef067 = testURIRef RelRf "g;x=1/./y"-testURIRef068 = testURIRef RelRf "g;x=1/../y"-testURIRef069 = testURIRef RelRf "g?y/./x"-testURIRef070 = testURIRef RelRf "g?y/../x"-testURIRef071 = testURIRef RelRf "g#s/./x"-testURIRef072 = testURIRef RelRf "g#s/../x"-testURIRef073 = testURIRef RelRf ""-testURIRef074 = testURIRef RelRf "A'C"-testURIRef075 = testURIRef RelRf "A$C"-testURIRef076 = testURIRef RelRf "A@C"-testURIRef077 = testURIRef RelRf "A,C"--- Invalid-testURIRef080 = testURIRef InvRf "http://foo.org:80Path/More"-testURIRef081 = testURIRef InvRf "::"-testURIRef082 = testURIRef InvRf " "-testURIRef083 = testURIRef InvRf "%"-testURIRef084 = testURIRef InvRf "A%Z"-testURIRef085 = testURIRef InvRf "%ZZ"-testURIRef086 = testURIRef InvRf "%AZ"-testURIRef087 = testURIRef InvRf "A C"--- testURIRef088 = -- (case removed)--- testURIRef089 = -- (case removed)-testURIRef090 = testURIRef InvRf "A\"C"-testURIRef091 = testURIRef InvRf "A`C"-testURIRef092 = testURIRef InvRf "A<C"-testURIRef093 = testURIRef InvRf "A>C"-testURIRef094 = testURIRef InvRf "A^C"-testURIRef095 = testURIRef InvRf "A\\C"-testURIRef096 = testURIRef InvRf "A{C"-testURIRef097 = testURIRef InvRf "A|C"-testURIRef098 = testURIRef InvRf "A}C"--- From RFC2396:--- rel_segment   = 1*( unreserved | escaped |---                     ";" | "@" | "&" | "=" | "+" | "$" | "," )--- unreserved    = alphanum | mark--- mark          = "-" | "_" | "." | "!" | "~" | "*" | "'" |---                 "(" | ")"--- Note RFC 2732 allows '[', ']' ONLY for reserved purpose of IPv6 literals,--- or does it?-testURIRef101 = testURIRef InvRf "A[C"-testURIRef102 = testURIRef InvRf "A]C"-testURIRef103 = testURIRef InvRf "A[**]C"-testURIRef104 = testURIRef InvRf "http://[xyz]/"-testURIRef105 = testURIRef InvRf "http://]/"-testURIRef106 = testURIRef InvRf "http://example.org/[2010:836B:4179::836B:4179]"-testURIRef107 = testURIRef InvRf "http://example.org/abc#[2010:836B:4179::836B:4179]"-testURIRef108 = testURIRef InvRf "http://example.org/xxx/[qwerty]#a[b]"--- Random other things that crop up-testURIRef111 = testURIRef AbsRf "http://example/Andr&#567;"-testURIRef112 = testURIRef AbsId "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/"-testURIRef113 = testURIRef AbsId "http://46229EFFE16A9BD60B9F1BE88B2DB047ADDED785/demo.mp3"-testURIRef114 = testURIRef InvRf "http://example.org/xxx/qwerty#a#b"-testURIRef115 = testURIRef InvRf "dcp.tcp.pft://192.168.0.1:1002:3002?fec=1&crc=0"-testURIRef116 = testURIRef AbsId "dcp.tcp.pft://192.168.0.1:1002?fec=1&crc=0"-testURIRef117 = testURIRef AbsId "foo://"--testURIRefSuite = TestLabel "Test URIrefs" testURIRefList-testURIRefList = TestList-  [-    testURIRef001, testURIRef002, testURIRef003, testURIRef004,-    testURIRef005, testURIRef006, testURIRef007, testURIRef008,-    testURIRef009, testURIRef010,-    ---    testURIRef011, testURIRef012, testURIRef013, testURIRef014,-    testURIRef015, testURIRef016, testURIRef017, testURIRef018,-    ---    testURIRef019,-    ---    testURIRef021, testURIRef022, testURIRef023, testURIRef024,-    testURIRef025, testURIRef026, testURIRef027, testURIRef028,-    testURIRef029,-    ---    testURIRef031, testURIRef032, testURIRef033, testURIRef034,-    testURIRef035, testURIRef036, testURIRef037, testURIRef038,-    testURIRef039,-    testURIRef040, testURIRef041, testURIRef042, testURIRef043,-    testURIRef044, testURIRef045, testURIRef046, testURIRef047,-    testURIRef048, testURIRef049,-    testURIRef050, testURIRef051, testURIRef052, testURIRef053,-    testURIRef054, testURIRef055, testURIRef056, testURIRef057,-    testURIRef058, testURIRef059,-    testURIRef060, testURIRef061, testURIRef062, testURIRef063,-    testURIRef064, testURIRef065, testURIRef066, testURIRef067,-    testURIRef068, testURIRef069,-    testURIRef070, testURIRef071, testURIRef072, testURIRef073,-    testURIRef074, testURIRef075, testURIRef076, testURIRef077,-    ---    testURIRef080,-    testURIRef081, testURIRef082, testURIRef083, testURIRef084,-    testURIRef085, testURIRef086, testURIRef087, -- testURIRef088,-    -- testURIRef089,-    testURIRef090, testURIRef091, testURIRef092, testURIRef093,-    testURIRef094, testURIRef095, testURIRef096, testURIRef097,-    testURIRef098, -- testURIRef099,-    ---    testURIRef101, testURIRef102, testURIRef103, testURIRef104,-    testURIRef105, testURIRef106, testURIRef107, testURIRef108,-    ---    testURIRef111, testURIRef112, testURIRef113, testURIRef114,-    testURIRef115, testURIRef116, testURIRef117-  ]---- test decomposition of URI into components-testComponent01 = testURIRefComponents "testComponent01"-        ( Just $ URI-            { uriScheme    = "http:"-            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")-            , uriPath      = "/aaa/bbb"-            , uriQuery     = "?qqq"-            , uriFragment  = "#fff"-            } )-        "http://user:pass@example.org:99/aaa/bbb?qqq#fff"-testComponent02 = testURIRefComponents "testComponent02"-        ( const Nothing-        ( Just $ URI-            { uriScheme    = "http:"-            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")-            , uriPath      = "aaa/bbb"-            , uriQuery     = ""-            , uriFragment  = ""-            } )-        )-        "http://user:pass@example.org:99aaa/bbb"-testComponent03 = testURIRefComponents "testComponent03"-        ( Just $ URI-            { uriScheme    = "http:"-            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")-            , uriPath      = ""-            , uriQuery     = "?aaa/bbb"-            , uriFragment  = ""-            } )-        "http://user:pass@example.org:99?aaa/bbb"-testComponent04 = testURIRefComponents "testComponent03"-        ( Just $ URI-            { uriScheme    = "http:"-            , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")-            , uriPath      = ""-            , uriQuery     = ""-            , uriFragment  = "#aaa/bbb"-            } )-        "http://user:pass@example.org:99#aaa/bbb"--- These test cases contributed by Robert Buck (mathworks.com)-testComponent11 = testURIRefComponents "testComponent03"-        ( Just $ URI-            { uriScheme    = "about:"-            , uriAuthority = Nothing-            , uriPath      = ""-            , uriQuery     = ""-            , uriFragment  = ""-            } )-        "about:"-testComponent12 = testURIRefComponents "testComponent03"-        ( Just $ URI-            { uriScheme    = "file:"-            , uriAuthority = Just (URIAuth "" "windowsauth" "")-            , uriPath      = "/d$"-            , uriQuery     = ""-            , uriFragment  = ""-            } )-        "file://windowsauth/d$"--testComponentSuite = TestLabel "Test URIrefs" $ TestList-  [ testComponent01-  , testComponent02-  , testComponent03-  , testComponent04-  , testComponent11-  , testComponent12-  ]---- Get reference relative to given base---   relativeRef :: String -> String -> String------ Get absolute URI given base and relative reference---   absoluteURI :: String -> String -> String------ Test cases taken from: http://www.w3.org/2000/10/swap/uripath.py--- (Thanks, Dan Connolly)------ NOTE:  absoluteURI base (relativeRef base u) is always equivalent to u.--- cf. http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html--testRelSplit :: String -> String -> String -> String -> Test-testRelSplit label base uabs urel =-    testEq label urel (mkrel puabs pubas)-    where-        mkrel (Just u1) (Just u2) = show (u1 `relativeFrom` u2)-        mkrel Nothing   _         = "Invalid URI: "++urel-        mkrel _         Nothing   = "Invalid URI: "++uabs-        puabs = parseURIReference uabs-        pubas = parseURIReference base--testRelJoin  :: String -> String -> String -> String -> Test-testRelJoin label base urel uabs =-    testEq label uabs (mkabs purel pubas)-    where-        mkabs (Just u1) (Just u2) = shabs (u1 `relativeTo` u2)-        mkabs Nothing   _         = "Invalid URI: "++urel-        mkabs _         Nothing   = "Invalid URI: "++uabs-        shabs (Just u) = show u-        shabs Nothing  = "No result"-        purel = parseURIReference urel-        pubas = parseURIReference base--testRelative :: String -> String -> String -> String -> Test-testRelative label base uabs urel = TestList-    [-    (testRelSplit (label++"(rel)") base uabs urel),-    (testRelJoin  (label++"(abs)") base urel uabs)-    ]--testRelative01 = testRelative "testRelative01"-                    "foo:xyz" "bar:abc" "bar:abc"-testRelative02 = testRelative "testRelative02"-                    "http://example/x/y/z" "http://example/x/abc" "../abc"-testRelative03 = testRelative "testRelative03"-                    "http://example2/x/y/z" "http://example/x/abc" "//example/x/abc"-                    -- "http://example2/x/y/z" "http://example/x/abc" "http://example/x/abc"-testRelative04 = testRelative "testRelative04"-                    "http://ex/x/y/z" "http://ex/x/r" "../r"-testRelative05 = testRelative "testRelative05"-                    "http://ex/x/y/z" "http://ex/r" "/r"-                    -- "http://ex/x/y/z" "http://ex/r" "../../r"-testRelative06 = testRelative "testRelative06"-                    "http://ex/x/y/z" "http://ex/x/y/q/r" "q/r"-testRelative07 = testRelative "testRelative07"-                    "http://ex/x/y" "http://ex/x/q/r#s" "q/r#s"-testRelative08 = testRelative "testRelative08"-                    "http://ex/x/y" "http://ex/x/q/r#s/t" "q/r#s/t"-testRelative09 = testRelative "testRelative09"-                    "http://ex/x/y" "ftp://ex/x/q/r" "ftp://ex/x/q/r"-testRelative10 = testRelative "testRelative10"-                    -- "http://ex/x/y" "http://ex/x/y" "y"-                    "http://ex/x/y" "http://ex/x/y" ""-testRelative11 = testRelative "testRelative11"-                    -- "http://ex/x/y/" "http://ex/x/y/" "./"-                    "http://ex/x/y/" "http://ex/x/y/" ""-testRelative12 = testRelative "testRelative12"-                    -- "http://ex/x/y/pdq" "http://ex/x/y/pdq" "pdq"-                    "http://ex/x/y/pdq" "http://ex/x/y/pdq" ""-testRelative13 = testRelative "testRelative13"-                    "http://ex/x/y/" "http://ex/x/y/z/" "z/"-testRelative14 = testRelative "testRelative14"-                    -- "file:/swap/test/animal.rdf" "file:/swap/test/animal.rdf#Animal" "animal.rdf#Animal"-                    "file:/swap/test/animal.rdf" "file:/swap/test/animal.rdf#Animal" "#Animal"-testRelative15 = testRelative "testRelative15"-                    "file:/e/x/y/z" "file:/e/x/abc" "../abc"-testRelative16 = testRelative "testRelative16"-                    "file:/example2/x/y/z" "file:/example/x/abc" "/example/x/abc"-testRelative17 = testRelative "testRelative17"-                    "file:/ex/x/y/z" "file:/ex/x/r" "../r"-testRelative18 = testRelative "testRelative18"-                    "file:/ex/x/y/z" "file:/r" "/r"-testRelative19 = testRelative "testRelative19"-                    "file:/ex/x/y" "file:/ex/x/q/r" "q/r"-testRelative20 = testRelative "testRelative20"-                    "file:/ex/x/y" "file:/ex/x/q/r#s" "q/r#s"-testRelative21 = testRelative "testRelative21"-                    "file:/ex/x/y" "file:/ex/x/q/r#" "q/r#"-testRelative22 = testRelative "testRelative22"-                    "file:/ex/x/y" "file:/ex/x/q/r#s/t" "q/r#s/t"-testRelative23 = testRelative "testRelative23"-                    "file:/ex/x/y" "ftp://ex/x/q/r" "ftp://ex/x/q/r"-testRelative24 = testRelative "testRelative24"-                    -- "file:/ex/x/y" "file:/ex/x/y" "y"-                    "file:/ex/x/y" "file:/ex/x/y" ""-testRelative25 = testRelative "testRelative25"-                    -- "file:/ex/x/y/" "file:/ex/x/y/" "./"-                    "file:/ex/x/y/" "file:/ex/x/y/" ""-testRelative26 = testRelative "testRelative26"-                    -- "file:/ex/x/y/pdq" "file:/ex/x/y/pdq" "pdq"-                    "file:/ex/x/y/pdq" "file:/ex/x/y/pdq" ""-testRelative27 = testRelative "testRelative27"-                    "file:/ex/x/y/" "file:/ex/x/y/z/" "z/"-testRelative28 = testRelative "testRelative28"-                    "file:/devel/WWW/2000/10/swap/test/reluri-1.n3"-                    "file://meetings.example.com/cal#m1" "//meetings.example.com/cal#m1"-                    -- "file:/devel/WWW/2000/10/swap/test/reluri-1.n3"-                    -- "file://meetings.example.com/cal#m1" "file://meetings.example.com/cal#m1"-testRelative29 = testRelative "testRelative29"-                    "file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3"-                    "file://meetings.example.com/cal#m1" "//meetings.example.com/cal#m1"-                    -- "file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3"-                    -- "file://meetings.example.com/cal#m1" "file://meetings.example.com/cal#m1"-testRelative30 = testRelative "testRelative30"-                    "file:/some/dir/foo" "file:/some/dir/#blort" "./#blort"-testRelative31 = testRelative "testRelative31"-                    "file:/some/dir/foo" "file:/some/dir/#" "./#"-testRelative32 = testRelative "testRelative32"-                    "http://ex/x/y" "http://ex/x/q:r" "./q:r"-                    -- see RFC2396bis, section 5       ^^-testRelative33 = testRelative "testRelative33"-                    "http://ex/x/y" "http://ex/x/p=q:r" "./p=q:r"-                    -- "http://ex/x/y" "http://ex/x/p=q:r" "p=q:r"-testRelative34 = testRelative "testRelative34"-                    "http://ex/x/y?pp/qq" "http://ex/x/y?pp/rr" "?pp/rr"-testRelative35 = testRelative "testRelative35"-                    "http://ex/x/y?pp/qq" "http://ex/x/y/z" "y/z"-testRelative36 = testRelative "testRelative36"-                    "mailto:local"-                    "mailto:local/qual@domain.org#frag"-                    "local/qual@domain.org#frag"-testRelative37 = testRelative "testRelative37"-                    "mailto:local/qual1@domain1.org"-                    "mailto:local/more/qual2@domain2.org#frag"-                    "more/qual2@domain2.org#frag"-testRelative38 = testRelative "testRelative38"-                    "http://ex/x/z?q" "http://ex/x/y?q" "y?q"-testRelative39 = testRelative "testRelative39"-                    "http://ex?p" "http://ex/x/y?q" "/x/y?q"-testRelative40 = testRelative "testRelative40"-                    "foo:a/b" "foo:a/c/d" "c/d"-testRelative41 = testRelative "testRelative41"-                    "foo:a/b" "foo:/c/d" "/c/d"-testRelative42 = testRelative "testRelative42"-                    "foo:a/b?c#d" "foo:a/b?c" ""-testRelative43 = testRelative "testRelative42"-                    "foo:a" "foo:b/c" "b/c"-testRelative44 = testRelative "testRelative44"-                    "foo:/a/y/z" "foo:/a/b/c" "../b/c"-testRelative45 = testRelJoin "testRelative45"-                    "foo:a" "./b/c" "foo:b/c"-testRelative46 = testRelJoin "testRelative46"-                    "foo:a" "/./b/c" "foo:/b/c"-testRelative47 = testRelJoin "testRelative47"-                    "foo://a//b/c" "../../d" "foo://a/d"-testRelative48 = testRelJoin "testRelative48"-                    "foo:a" "." "foo:"-testRelative49 = testRelJoin "testRelative49"-                    "foo:a" ".." "foo:"---- add escape tests-testRelative50 = testRelative "testRelative50"-                    "http://example/x/y%2Fz" "http://example/x/abc" "abc"-testRelative51 = testRelative "testRelative51"-                    "http://example/a/x/y/z" "http://example/a/x%2Fabc" "../../x%2Fabc"-testRelative52 = testRelative "testRelative52"-                    "http://example/a/x/y%2Fz" "http://example/a/x%2Fabc" "../x%2Fabc"-testRelative53 = testRelative "testRelative53"-                    "http://example/x%2Fy/z" "http://example/x%2Fy/abc" "abc"-testRelative54 = testRelative "testRelative54"-                    "http://ex/x/y" "http://ex/x/q%3Ar" "q%3Ar"-testRelative55 = testRelative "testRelative55"-                    "http://example/x/y%2Fz" "http://example/x%2Fabc" "/x%2Fabc"--- Apparently, TimBL prefers the following way to 41, 42 above--- cf. http://lists.w3.org/Archives/Public/uri/2003Feb/0028.html--- He also notes that there may be different relative fuctions--- that satisfy the basic equivalence axiom:--- cf. http://lists.w3.org/Archives/Public/uri/2003Jan/0008.html-testRelative56 = testRelative "testRelative56"-                    "http://example/x/y/z" "http://example/x%2Fabc" "/x%2Fabc"-testRelative57 = testRelative "testRelative57"-                    "http://example/x/y%2Fz" "http://example/x%2Fabc" "/x%2Fabc"---- Other oddball tests-    -- Check segment normalization code:-testRelative60 = testRelJoin "testRelative60"-                    "ftp://example/x/y" "http://example/a/b/../../c" "http://example/c"-testRelative61 = testRelJoin "testRelative61"-                    "ftp://example/x/y" "http://example/a/b/c/../../" "http://example/a/"-testRelative62 = testRelJoin "testRelative62"-                    "ftp://example/x/y" "http://example/a/b/c/./" "http://example/a/b/c/"-testRelative63 = testRelJoin "testRelative63"-                    "ftp://example/x/y" "http://example/a/b/c/.././" "http://example/a/b/"-testRelative64 = testRelJoin "testRelative64"-                    "ftp://example/x/y" "http://example/a/b/c/d/../../../../e" "http://example/e"-testRelative65 = testRelJoin "testRelative65"-                    "ftp://example/x/y" "http://example/a/b/c/d/../.././../../e" "http://example/e"-    -- Check handling of queries and fragments with non-relative paths-testRelative70 = testRelative "testRelative70"-                    "mailto:local1@domain1?query1" "mailto:local2@domain2"-                    "local2@domain2"-testRelative71 = testRelative "testRelative71"-                    "mailto:local1@domain1" "mailto:local2@domain2?query2"-                    "local2@domain2?query2"-testRelative72 = testRelative "testRelative72"-                    "mailto:local1@domain1?query1" "mailto:local2@domain2?query2"-                    "local2@domain2?query2"-testRelative73 = testRelative "testRelative73"-                    "mailto:local@domain?query1" "mailto:local@domain?query2"-                    "?query2"-testRelative74 = testRelative "testRelative74"-                    "mailto:?query1" "mailto:local@domain?query2"-                    "local@domain?query2"-testRelative75 = testRelative "testRelative75"-                    "mailto:local@domain?query1" "mailto:local@domain?query2"-                    "?query2"-testRelative76 = testRelative "testRelative76"-                    "foo:bar" "http://example/a/b?c/../d"  "http://example/a/b?c/../d"-testRelative77 = testRelative "testRelative77"-                    "foo:bar" "http://example/a/b#c/../d"  "http://example/a/b#c/../d"-{- These (78-81) are some awkward test cases thrown up by a question on the URI list:-     http://lists.w3.org/Archives/Public/uri/2005Jul/0013-   Mote that RFC 3986 discards path segents after the final '/' only when merging two-   paths - otherwise the final segment in the base URI is mnaintained.  This leads to-   difficulty in constructinmg a reversible relativeTo/relativeFrom pair of functions.--}-testRelative78 = testRelative "testRelative78"-                    "http://www.example.com/data/limit/.." "http://www.example.com/data/limit/test.xml"-                    "test.xml"-testRelative79 = testRelative "testRelative79"-                    "file:/some/dir/foo" "file:/some/dir/#blort" "./#blort"-testRelative80 = testRelative "testRelative80"-                    "file:/some/dir/foo" "file:/some/dir/#" "./#"-testRelative81 = testRelative "testRelative81"-                    "file:/some/dir/.." "file:/some/dir/#blort" "./#blort"---- testRelative  base abs rel--- testRelSplit  base abs rel--- testRelJoin   base rel abs-testRelative91 = testRelSplit "testRelative91"-                    "http://example.org/base/uri" "http:this"-                    "this"-testRelative92 = testRelJoin "testRelative92"-                    "http://example.org/base/uri" "http:this"-                    "http:this"-testRelative93 = testRelJoin "testRelative93"-                    "http:base" "http:this"-                    "http:this"-testRelative94 = testRelJoin "testRelative94"-                    "f:/a" ".//g"-                    "f://g"-testRelative95 = testRelJoin "testRelative95"-                    "f://example.org/base/a" "b/c//d/e"-                    "f://example.org/base/b/c//d/e"-testRelative96 = testRelJoin "testRelative96"-                    "mid:m@example.ord/c@example.org" "m2@example.ord/c2@example.org"-                    "mid:m@example.ord/m2@example.ord/c2@example.org"-testRelative97 = testRelJoin "testRelative97"-                    "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/" "mini1.xml"-                    "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/mini1.xml"-testRelative98 = testRelative "testRelative98"-                    "foo:a/y/z" "foo:a/b/c" "../b/c"-testRelative99 = testRelJoin "testRelative99"-                    "f:/a/" "..//g"-                    "f://g"---testRelativeSuite = TestLabel "Test Relative URIs" testRelativeList-testRelativeList  = TestList-  [ testRelative01, testRelative02, testRelative03, testRelative04-  , testRelative05, testRelative06, testRelative07, testRelative08-  , testRelative09-  , testRelative10, testRelative11, testRelative12, testRelative13-  , testRelative14, testRelative15, testRelative16, testRelative17-  , testRelative18, testRelative19-  , testRelative20, testRelative21, testRelative22, testRelative23-  , testRelative24, testRelative25, testRelative26, testRelative27-  , testRelative28, testRelative29-  , testRelative30, testRelative31, testRelative32, testRelative33-  , testRelative34, testRelative35, testRelative36, testRelative37-  , testRelative38, testRelative39-  , testRelative40, testRelative41, testRelative42, testRelative43-  , testRelative44, testRelative45, testRelative46, testRelative47-  , testRelative48, testRelative49-    ---  , testRelative50, testRelative51, testRelative52, testRelative53-  , testRelative54, testRelative55, testRelative56, testRelative57-    ---  , testRelative60, testRelative61, testRelative62, testRelative63-  , testRelative64, testRelative65-    ---  , testRelative70, testRelative71, testRelative72, testRelative73-  , testRelative74, testRelative75, testRelative76, testRelative77-  -- Awkward cases:-  , testRelative78, testRelative79, testRelative80, testRelative81-    ---  -- , testRelative90-  , testRelative91, testRelative92, testRelative93-  , testRelative94, testRelative95, testRelative96-  , testRelative97, testRelative98, testRelative99-  ]---- RFC2396 relative-to-absolute URI tests--rfcbase  = "http://a/b/c/d;p?q"--- normal cases, RFC2396bis 5.4.1-testRFC01 = testRelJoin "testRFC01" rfcbase "g:h" "g:h"-testRFC02 = testRelJoin "testRFC02" rfcbase "g" "http://a/b/c/g"-testRFC03 = testRelJoin "testRFC03" rfcbase "./g" "http://a/b/c/g"-testRFC04 = testRelJoin "testRFC04" rfcbase "g/" "http://a/b/c/g/"-testRFC05 = testRelJoin "testRFC05" rfcbase "/g" "http://a/g"-testRFC06 = testRelJoin "testRFC06" rfcbase "//g" "http://g"-testRFC07 = testRelJoin "testRFC07" rfcbase "?y" "http://a/b/c/d;p?y"-testRFC08 = testRelJoin "testRFC08" rfcbase "g?y" "http://a/b/c/g?y"-testRFC09 = testRelJoin "testRFC09" rfcbase "?q#s" "http://a/b/c/d;p?q#s"-testRFC23 = testRelJoin "testRFC10" rfcbase "#s" "http://a/b/c/d;p?q#s"-testRFC10 = testRelJoin "testRFC11" rfcbase "g#s" "http://a/b/c/g#s"-testRFC11 = testRelJoin "testRFC12" rfcbase "g?y#s" "http://a/b/c/g?y#s"-testRFC12 = testRelJoin "testRFC13" rfcbase ";x" "http://a/b/c/;x"-testRFC13 = testRelJoin "testRFC14" rfcbase "g;x" "http://a/b/c/g;x"-testRFC14 = testRelJoin "testRFC15" rfcbase "g;x?y#s" "http://a/b/c/g;x?y#s"-testRFC24 = testRelJoin "testRFC16" rfcbase "" "http://a/b/c/d;p?q"-testRFC15 = testRelJoin "testRFC17" rfcbase "." "http://a/b/c/"-testRFC16 = testRelJoin "testRFC18" rfcbase "./" "http://a/b/c/"-testRFC17 = testRelJoin "testRFC19" rfcbase ".." "http://a/b/"-testRFC18 = testRelJoin "testRFC20" rfcbase "../" "http://a/b/"-testRFC19 = testRelJoin "testRFC21" rfcbase "../g" "http://a/b/g"-testRFC20 = testRelJoin "testRFC22" rfcbase "../.." "http://a/"-testRFC21 = testRelJoin "testRFC23" rfcbase "../../" "http://a/"-testRFC22 = testRelJoin "testRFC24" rfcbase "../../g" "http://a/g"--- abnormal cases, RFC2396bis 5.4.2-testRFC31 = testRelJoin "testRFC31" rfcbase "?q" rfcbase-testRFC32 = testRelJoin "testRFC32" rfcbase "../../../g" "http://a/g"-testRFC33 = testRelJoin "testRFC33" rfcbase "../../../../g" "http://a/g"-testRFC34 = testRelJoin "testRFC34" rfcbase "/./g" "http://a/g"-testRFC35 = testRelJoin "testRFC35" rfcbase "/../g" "http://a/g"-testRFC36 = testRelJoin "testRFC36" rfcbase "g." "http://a/b/c/g."-testRFC37 = testRelJoin "testRFC37" rfcbase ".g" "http://a/b/c/.g"-testRFC38 = testRelJoin "testRFC38" rfcbase "g.." "http://a/b/c/g.."-testRFC39 = testRelJoin "testRFC39" rfcbase "..g" "http://a/b/c/..g"-testRFC40 = testRelJoin "testRFC40" rfcbase "./../g" "http://a/b/g"-testRFC41 = testRelJoin "testRFC41" rfcbase "./g/." "http://a/b/c/g/"-testRFC42 = testRelJoin "testRFC42" rfcbase "g/./h" "http://a/b/c/g/h"-testRFC43 = testRelJoin "testRFC43" rfcbase "g/../h" "http://a/b/c/h"-testRFC44 = testRelJoin "testRFC44" rfcbase "g;x=1/./y" "http://a/b/c/g;x=1/y"-testRFC45 = testRelJoin "testRFC45" rfcbase "g;x=1/../y" "http://a/b/c/y"-testRFC46 = testRelJoin "testRFC46" rfcbase "g?y/./x" "http://a/b/c/g?y/./x"-testRFC47 = testRelJoin "testRFC47" rfcbase "g?y/../x" "http://a/b/c/g?y/../x"-testRFC48 = testRelJoin "testRFC48" rfcbase "g#s/./x" "http://a/b/c/g#s/./x"-testRFC49 = testRelJoin "testRFC49" rfcbase "g#s/../x" "http://a/b/c/g#s/../x"-testRFC50 = testRelJoin "testRFC50" rfcbase "http:x" "http:x"---- Null path tests--- See RFC2396bis, section 5.2,--- "If the base URI's path component is the empty string, then a single---  slash character is copied to the buffer"-testRFC60 = testRelative "testRFC60" "http://ex"     "http://ex/x/y?q" "/x/y?q"-testRFC61 = testRelJoin  "testRFC61" "http://ex"     "x/y?q"           "http://ex/x/y?q"-testRFC62 = testRelative "testRFC62" "http://ex?p"   "http://ex/x/y?q" "/x/y?q"-testRFC63 = testRelJoin  "testRFC63" "http://ex?p"   "x/y?q"           "http://ex/x/y?q"-testRFC64 = testRelative "testRFC64" "http://ex#f"   "http://ex/x/y?q" "/x/y?q"-testRFC65 = testRelJoin  "testRFC65" "http://ex#f"   "x/y?q"           "http://ex/x/y?q"-testRFC66 = testRelative "testRFC66" "http://ex?p"   "http://ex/x/y#g" "/x/y#g"-testRFC67 = testRelJoin  "testRFC67" "http://ex?p"   "x/y#g"           "http://ex/x/y#g"-testRFC68 = testRelative "testRFC68" "http://ex"     "http://ex/"      "/"-testRFC69 = testRelJoin  "testRFC69" "http://ex"     "./"              "http://ex/"-testRFC70 = testRelative "testRFC70" "http://ex"     "http://ex/a/b"   "/a/b"-testRFC71 = testRelative "testRFC71" "http://ex/a/b" "http://ex"       "./"--testRFC2396Suite = TestLabel "Test RFC2396 examples" testRFC2396List-testRFC2396List  = TestList-  [-    testRFC01, testRFC02, testRFC03, testRFC04,-    testRFC05, testRFC06, testRFC07, testRFC08,-    testRFC09,-    testRFC10, testRFC11, testRFC12, testRFC13,-    testRFC14, testRFC15, testRFC16, testRFC17,-    testRFC18, testRFC19,-    testRFC20, testRFC21, testRFC22, testRFC23,-    testRFC24,-    -- testRFC30,-    testRFC31, testRFC32, testRFC33,-    testRFC34, testRFC35, testRFC36, testRFC37,-    testRFC38, testRFC39,-    testRFC40, testRFC41, testRFC42, testRFC43,-    testRFC44, testRFC45, testRFC46, testRFC47,-    testRFC48, testRFC49,-    testRFC50,-    ---    testRFC60, testRFC61, testRFC62, testRFC63,-    testRFC64, testRFC65, testRFC66, testRFC67,-    testRFC68, testRFC69,-    testRFC70-  ]---- And some other oddballs:-mailbase = "mailto:local/option@domain.org?notaquery#frag"-testMail01 = testRelJoin "testMail01"-            mailbase "more@domain"-            "mailto:local/more@domain"-testMail02 = testRelJoin "testMail02"-            mailbase "#newfrag"-            "mailto:local/option@domain.org?notaquery#newfrag"-testMail03 = testRelJoin "testMail03"-            mailbase "l1/q1@domain"-            "mailto:local/l1/q1@domain"--testMail11 = testRelJoin "testMail11"-             "mailto:local1@domain1?query1" "mailto:local2@domain2"-             "mailto:local2@domain2"-testMail12 = testRelJoin "testMail12"-             "mailto:local1@domain1" "mailto:local2@domain2?query2"-             "mailto:local2@domain2?query2"-testMail13 = testRelJoin "testMail13"-             "mailto:local1@domain1?query1" "mailto:local2@domain2?query2"-             "mailto:local2@domain2?query2"-testMail14 = testRelJoin "testMail14"-             "mailto:local@domain?query1" "mailto:local@domain?query2"-             "mailto:local@domain?query2"-testMail15 = testRelJoin "testMail15"-             "mailto:?query1" "mailto:local@domain?query2"-             "mailto:local@domain?query2"-testMail16 = testRelJoin "testMail16"-             "mailto:local@domain?query1" "?query2"-             "mailto:local@domain?query2"-testInfo17 = testRelJoin "testInfo17"-             "info:name/1234/../567" "name/9876/../543"-             "info:name/name/543"-testInfo18 = testRelJoin "testInfo18"-             "info:/name/1234/../567" "name/9876/../543"-             "info:/name/name/543"--testOddballSuite = TestLabel "Test oddball examples" testOddballList-testOddballList  = TestList-  [ testMail01, testMail02, testMail03-  , testMail11, testMail12, testMail13, testMail14, testMail15, testMail16-  , testInfo17-  ]----  Normalization tests----  Case normalization; cf. RFC2396bis section 6.2.2.1---  NOTE:  authority case normalization is not performed-testNormalize01 = testEq "testNormalize01"-                  "http://EXAMPLE.com/Root/%2A?%2B#%2C"-                  (normalizeCase "HTTP://EXAMPLE.com/Root/%2a?%2b#%2c")----  Encoding normalization; cf. RFC2396bis section 6.2.2.2-testNormalize11 = testEq "testNormalize11"-                  "HTTP://EXAMPLE.com/Root/~Me/"-                  (normalizeEscape "HTTP://EXAMPLE.com/Root/%7eMe/")-testNormalize12 = testEq "testNormalize12"-                  "foo:%40AZ%5b%60az%7b%2f09%3a-._~"-                  (normalizeEscape "foo:%40%41%5a%5b%60%61%7a%7b%2f%30%39%3a%2d%2e%5f%7e")-testNormalize13 = testEq "testNormalize13"-                  "foo:%3a%2f%3f%23%5b%5d%40"-                  (normalizeEscape "foo:%3a%2f%3f%23%5b%5d%40")----  Path segment normalization; cf. RFC2396bis section 6.2.2.4-testNormalize21 = testEq "testNormalize21"-                    "http://example/c"-                    (normalizePathSegments "http://example/a/b/../../c")-testNormalize22 = testEq "testNormalize22"-                    "http://example/a/"-                    (normalizePathSegments "http://example/a/b/c/../../")-testNormalize23 = testEq "testNormalize23"-                    "http://example/a/b/c/"-                    (normalizePathSegments "http://example/a/b/c/./")-testNormalize24 = testEq "testNormalize24"-                    "http://example/a/b/"-                    (normalizePathSegments "http://example/a/b/c/.././")-testNormalize25 = testEq "testNormalize25"-                    "http://example/e"-                    (normalizePathSegments "http://example/a/b/c/d/../../../../e")-testNormalize26 = testEq "testNormalize26"-                    "http://example/e"-                    (normalizePathSegments "http://example/a/b/c/d/../.././../../e")-testNormalize27 = testEq "testNormalize27"-                    "http://example/e"-                    (normalizePathSegments "http://example/a/b/../.././../../e")-testNormalize28 = testEq "testNormalize28"-                    "foo:e"-                    (normalizePathSegments "foo:a/b/../.././../../e")--testNormalizeSuite = TestList-  [ testNormalize01-  , testNormalize11-  , testNormalize12-  , testNormalize13-  , testNormalize21, testNormalize22, testNormalize23, testNormalize24-  , testNormalize25, testNormalize26, testNormalize27, testNormalize28-  ]---- URI formatting (show) tests--ts02URI = URI   { uriScheme    = "http:"-                , uriAuthority = Just (URIAuth "user:pass@" "example.org" ":99")-                , uriPath      = "/aaa/bbb"-                , uriQuery     = "?ccc"-                , uriFragment  = "#ddd/eee"-                }--ts04URI = URI   { uriScheme    = "http:"-                , uriAuthority = Just (URIAuth "user:anonymous@" "example.org" ":99")-                , uriPath      = "/aaa/bbb"-                , uriQuery     = "?ccc"-                , uriFragment  = "#ddd/eee"-                }--ts02str = "http://user:...@example.org:99/aaa/bbb?ccc#ddd/eee"-ts03str = "http://user:pass@example.org:99/aaa/bbb?ccc#ddd/eee"-ts04str = "http://user:...@example.org:99/aaa/bbb?ccc#ddd/eee"--testShowURI01 = testEq "testShowURI01" ""      (show nullURI)-testShowURI02 = testEq "testShowURI02" ts02str (show ts02URI)-testShowURI03 = testEq "testShowURI03" ts03str ((uriToString id ts02URI) "")-testShowURI04 = testEq "testShowURI04" ts04str (show ts04URI)--testShowURI = TestList-  [ testShowURI01-  , testShowURI02-  , testShowURI03-  , testShowURI04-  ]----- URI escaping tests--te01str = "http://example.org/az/09-_/.~:/?#[]@!$&'()*+,;="-te02str = "http://example.org/a</b>/c%/d /e"-te02esc = "http://example.org/a%3C/b%3E/c%25/d%20/e"--testEscapeURIString01 = testEq "testEscapeURIString01"-    te01str (escapeURIString isUnescapedInURI te01str)--testEscapeURIString02 = testEq "testEscapeURIString02"-    te02esc (escapeURIString isUnescapedInURI te02str)--testEscapeURIString03 = testEq "testEscapeURIString03"-    te01str (unEscapeString te01str)--testEscapeURIString04 = testEq "testEscapeURIString04"-    te02str (unEscapeString te02esc)---testEscapeURIString = TestList-  [ testEscapeURIString01-  , testEscapeURIString02-  , testEscapeURIString03-  , testEscapeURIString04-  ]---- URI string normalization tests--tn01str = "eXAMPLE://a/b/%7bfoo%7d"-tn01nrm = "example://a/b/%7Bfoo%7D"--tn02str = "example://a/b/%63/"-tn02nrm = "example://a/b/c/"--tn03str = "example://a/./b/../b/c/foo"-tn03nrm = "example://a/b/c/foo"--tn04str = "eXAMPLE://a/b/%7bfoo%7d"     -- From RFC2396bis, 6.2.2-tn04nrm = "example://a/b/%7Bfoo%7D"--tn06str = "file:/x/..//y"-tn06nrm = "file://y"--tn07str = "file:x/..//y/"-tn07nrm = "file:/y/"--testNormalizeURIString01 = testEq "testNormalizeURIString01"-    tn01nrm (normalizeCase tn01str)-testNormalizeURIString02 = testEq "testNormalizeURIString02"-    tn02nrm (normalizeEscape tn02str)-testNormalizeURIString03 = testEq "testNormalizeURIString03"-    tn03nrm (normalizePathSegments tn03str)-testNormalizeURIString04 = testEq "testNormalizeURIString04"-    tn04nrm ((normalizeCase . normalizeEscape . normalizePathSegments) tn04str)-testNormalizeURIString05 = testEq "testNormalizeURIString05"-    tn04nrm ((normalizePathSegments . normalizeEscape . normalizeCase) tn04str)-testNormalizeURIString06 = testEq "testNormalizeURIString06"-    tn06nrm (normalizePathSegments tn06str)-testNormalizeURIString07 = testEq "testNormalizeURIString07"-    tn07nrm (normalizePathSegments tn07str)--testNormalizeURIString = TestList-  [ testNormalizeURIString01-  , testNormalizeURIString02-  , testNormalizeURIString03-  , testNormalizeURIString04-  , testNormalizeURIString05-  , testNormalizeURIString06-  , testNormalizeURIString07-  ]--tnus67 = runTestTT $ TestList-  [ testNormalizeURIString06-  , testNormalizeURIString07-  ]---- Test strict vs non-strict relativeTo logic--trbase = fromJust $ parseURIReference "http://bar.org/"--testRelativeTo01 = testEq "testRelativeTo01"-    "http://bar.org/foo"-    (show . fromJust $-      (fromJust $ parseURIReference "foo") `relativeTo` trbase)--testRelativeTo02 = testEq "testRelativeTo02"-    "http:foo"-    (show . fromJust $-      (fromJust $ parseURIReference "http:foo") `relativeTo` trbase)--testRelativeTo03 = testEq "testRelativeTo03"-    "http://bar.org/foo"-    (show . fromJust $-      (fromJust $ parseURIReference "http:foo") `nonStrictRelativeTo` trbase)--testRelativeTo = TestList-  [ testRelativeTo01-  , testRelativeTo02-  , testRelativeTo03-  ]---- Test alternative parsing functions-testAltFn01 = testEq "testAltFn01" "Just http://a.b/c#f"-    (show . parseURI $ "http://a.b/c#f")-testAltFn02 = testEq "testAltFn02" "Just http://a.b/c#f"-    (show . parseURIReference $ "http://a.b/c#f")-testAltFn03 = testEq "testAltFn03" "Just c/d#f"-    (show . parseRelativeReference $ "c/d#f")-testAltFn04 = testEq "testAltFn04" "Nothing"-    (show . parseRelativeReference $ "http://a.b/c#f")-testAltFn05 = testEq "testAltFn05" "Just http://a.b/c"-    (show . parseAbsoluteURI $ "http://a.b/c")-testAltFn06 = testEq "testAltFn06" "Nothing"-    (show . parseAbsoluteURI $ "http://a.b/c#f")-testAltFn07 = testEq "testAltFn07" "Nothing"-    (show . parseAbsoluteURI $ "c/d")-testAltFn08 = testEq "testAltFn08" "Just http://a.b/c"-    (show . parseabsoluteURI $ "http://a.b/c")--testAltFn11 = testEq "testAltFn11" True  (isURI "http://a.b/c#f")-testAltFn12 = testEq "testAltFn12" True  (isURIReference "http://a.b/c#f")-testAltFn13 = testEq "testAltFn13" True  (isRelativeReference "c/d#f")-testAltFn14 = testEq "testAltFn14" False (isRelativeReference "http://a.b/c#f")-testAltFn15 = testEq "testAltFn15" True  (isAbsoluteURI "http://a.b/c")-testAltFn16 = testEq "testAltFn16" False (isAbsoluteURI "http://a.b/c#f")-testAltFn17 = testEq "testAltFn17" False (isAbsoluteURI "c/d")--testAltFn = TestList-  [ testAltFn01-  , testAltFn02-  , testAltFn03-  , testAltFn04-  , testAltFn05-  , testAltFn06-  , testAltFn07-  , testAltFn08-  , testAltFn11-  , testAltFn12-  , testAltFn13-  , testAltFn14-  , testAltFn15-  , testAltFn16-  , testAltFn17-  ]---- Full test suite-allTests = TestList-  [ testURIRefSuite-  , testComponentSuite-  , testRelativeSuite-  , testRFC2396Suite-  , testOddballSuite-  , testNormalizeSuite-  , testShowURI-  , testEscapeURIString-  , testNormalizeURIString-  , testRelativeTo-  , testAltFn-  ]--main = runTestTT allTests--runTestFile t = do-    h <- openFile "a.tmp" WriteMode-    runTestText (putTextToHandle h False) t-    hClose h-tf = runTestFile-tt = runTestTT---- Miscellaneous values for hand-testing/debugging in Hugs:--uref = testURIRefSuite-tr01 = testRelative01-tr02 = testRelative02-tr03 = testRelative03-tr04 = testRelative04-rel  = testRelativeSuite-rfc  = testRFC2396Suite-oddb = testOddballSuite--(Just bu02) = parseURIReference "http://example/x/y/z"-(Just ou02) = parseURIReference "../abc"-(Just ru02) = parseURIReference "http://example/x/abc"--- fileuri = testURIReference "file:///C:/DEV/Haskell/lib/HXmlToolbox-3.01/examples/"--cu02 = ou02 `relativeTo` bu02----------------------------------------------------------------------------------------  Copyright (c) 2004, G. KLYNE.  All rights reserved.---  Distributed as free software under the following license.------  Redistribution and use in source and binary forms, with or without---  modification, are permitted provided that the following conditions---  are met:------  - Redistributions of source code must retain the above copyright notice,---  this list of conditions and the following disclaimer.------  - Redistributions in binary form must reproduce the above copyright---  notice, this list of conditions and the following disclaimer in the---  documentation and/or other materials provided with the distribution.------  - Neither name of the copyright holders nor the names of its---  contributors may be used to endorse or promote products derived from---  this software without specific prior written permission.------  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND THE CONTRIBUTORS---  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT---  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR---  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT---  HOLDERS OR THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,---  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,---  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS---  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND---  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR---  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE---  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.--------------------------------------------------------------------------------------- $Source: /srv/cvs/cvs.haskell.org/fptools/libraries/network/tests/URITest.hs,v $--- $Author: gklyne $--- $Revision: 1.8 $--- $Log: URITest.hs,v $--- Revision 1.8  2005/07/19 22:01:27  gklyne--- Added some additional test cases raised by discussion on URI@w3.org mailing list about 2005-07-19.  The test p[roposed by this discussion exposed a subtle bug in relativeFrom not being an exact inverse of relativeTo.------ Revision 1.7  2005/06/06 16:31:44  gklyne--- Added two new test cases.------ Revision 1.6  2005/05/31 17:18:36  gklyne--- Added some additional test cases triggered by URI-list discussions.------ Revision 1.5  2005/04/07 11:09:37  gklyne--- Added test cases for alternate parsing functions (including deprecated 'parseabsoluteURI')------ Revision 1.4  2005/04/05 12:47:32  gklyne--- Added test case.--- Changed module name, now requires GHC -main-is to compile.--- All tests run OK with GHC 6.4 on MS-Windows.------ Revision 1.3  2004/11/05 17:29:09  gklyne--- Changed password-obscuring logic to reflect late change in revised URI--- specification (password "anonymous" is no longer a special case).--- Updated URI test module to use function 'escapeURIString'.--- (Should unEscapeString be similarly updated?)------ Revision 1.2  2004/10/27 13:06:55  gklyne--- Updated URI module function names per:--- http://www.haskell.org//pipermail/cvs-libraries/2004-October/002916.html--- Added test cases to give better covereage of module functions.------ Revision 1.1  2004/10/14 16:11:30  gklyne--- Add URI unit test to cvs.haskell.org repository------ Revision 1.17  2004/10/14 11:51:09  graham--- Confirm that URITest runs with GHC.--- Fix up some comments and other minor details.------ Revision 1.16  2004/10/14 11:45:30  graham--- Use moduke name main for GHC 6.2------ Revision 1.15  2004/08/11 11:07:39  graham--- Add new test case.------ Revision 1.14  2004/06/30 11:35:27  graham--- Update URI code to use hierarchical libraries for Parsec and Network.------ Revision 1.13  2004/06/22 16:19:16  graham--- New URI test case added.------ Revision 1.12  2004/04/21 15:13:29  graham--- Add test case------ Revision 1.11  2004/04/21 14:54:05  graham--- Fix up some tests------ Revision 1.10  2004/04/20 14:54:13  graham--- Fix up test cases related to port number in authority,--- and add some more URI decomposition tests.------ Revision 1.9  2004/04/07 15:06:17  graham--- Add extra test case--- Revise syntax in line with changes to RFC2396bis------ Revision 1.8  2004/03/17 14:34:58  graham--- Add Network.HTTP files to CVS------ Revision 1.7  2004/03/16 14:19:38  graham--- Change licence to BSD style;  add nullURI definition; new test cases.------ Revision 1.6  2004/02/20 12:12:00  graham--- Add URI normalization functions------ Revision 1.5  2004/02/19 23:19:35  graham--- Network.URI module passes all test cases------ Revision 1.4  2004/02/17 20:06:02  graham--- Revised URI parser to reflect latest RFC2396bis (-04)------ Revision 1.3  2004/02/11 14:32:14  graham--- Added work-in-progress notes.------ Revision 1.2  2004/02/02 14:00:39  graham--- Fix optional host name in URI.  Add test cases.------ Revision 1.1  2004/01/27 21:13:45  graham--- New URI module and test suite added,--- implementing the GHC Network.URI interface.---