diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,29 @@
+## 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`
diff --git a/Network.hs b/Network.hs
--- a/Network.hs
+++ b/Network.hs
@@ -59,7 +59,6 @@
     {-$performance-}
     ) where
 
-import Control.Exception (throwIO)
 import Control.Monad (liftM)
 import Data.Maybe (fromJust)
 import Network.BSD
@@ -98,9 +97,9 @@
 #if defined(IPV6_SOCKET_SUPPORT)
 -- IPv6 and IPv4.
 
-connectTo hostname (Service serv) = connect' hostname serv
+connectTo hostname (Service serv) = connect' "Network.connectTo" hostname serv
 
-connectTo hostname (PortNumber port) = connect' hostname (show port)
+connectTo hostname (PortNumber port) = connect' "Network.connectTo" hostname (show port)
 #else
 -- IPv4 only.
 
@@ -140,15 +139,15 @@
 #endif
 
 #if defined(IPV6_SOCKET_SUPPORT)
-connect' :: HostName -> ServiceName -> IO Handle
+connect' :: String -> HostName -> ServiceName -> IO Handle
 
-connect' host serv = do
+connect' caller host serv = do
     proto <- getProtocolNumber "tcp"
     let hints = defaultHints { addrFlags = [AI_ADDRCONFIG]
                              , addrProtocol = proto
                              , addrSocketType = Stream }
     addrs <- getAddrInfo (Just hints) (Just host) (Just serv)
-    firstSuccessful $ map tryToConnect addrs
+    firstSuccessful caller $ map tryToConnect addrs
   where
   tryToConnect addr =
     bracketOnError
@@ -291,14 +290,14 @@
                  SockAddrInet  _   a   -> inet_ntoa a
                  SockAddrInet6 _ _ a _ -> return (show a)
 #if defined(mingw32_HOST_OS)
-                 SockAddrUnix {}       -> throwIO $ userError "accept: socket address not supported on this platform."
+                 SockAddrUnix {}       -> ioError $ userError "Network.accept: peer socket address 'SockAddrUnix' not supported on this platform."
 #else
                  SockAddrUnix      a   -> return a
 #endif
 #if defined(CAN_SOCKET_SUPPORT)
-                 SockAddrCan {}        -> throwIO $ userError "accept: unsupported for CAN peer."
+                 SockAddrCan {}        -> ioError $ userError "Network.accept: peer socket address 'SockAddrCan' not supported."
 #else
-                 SockAddrCan {}        -> throwIO $ userError "accept: socket address not supported on this platform."
+                 SockAddrCan {}        -> ioError $ userError "Network.accept: peer socket address 'SockAddrCan' not supported on this platform."
 #endif
  handle <- socketToHandle sock' ReadWriteMode
  let port = case addr of
@@ -314,7 +313,8 @@
  return (handle, path, -1)
 #endif
 accept (MkSocket _ family _ _ _) =
-  error $ "Sorry, address family " ++ (show family) ++ " is not supported!"
+  ioError $ userError $ "Network.accept: address family '" ++
+    show family ++ "' not supported."
 
 
 -- | Close the socket. Sending data to or receiving data from closed socket
@@ -405,14 +405,14 @@
 #if defined(IPV6_SOCKET_SUPPORT)
       SockAddrInet6 port _ _ _ -> return $ PortNumber port
 #else
-      SockAddrInet6 {}         -> throwIO $ userError "socketPort: socket address not supported on this platform."
+      SockAddrInet6 {}         -> ioError $ userError "Network.socketPort: socket address 'SockAddrInet6' not supported on this platform."
 #endif
 #if defined(mingw32_HOST_OS)
-      SockAddrUnix {}          -> throwIO $ userError "socketPort: socket address not supported on this platform."
+      SockAddrUnix {}          -> ioError $ userError "Network.socketPort: socket address 'SockAddrUnix' not supported on this platform."
 #else
       SockAddrUnix path        -> return $ UnixSocket path
 #endif
-      SockAddrCan {}           -> throwIO $ userError "socketPort: CAN address not supported."
+      SockAddrCan {}           -> ioError $ userError "Network.socketPort: socket address 'SockAddrCan' not supported."
 
 -- ---------------------------------------------------------------------------
 -- Utils
@@ -463,8 +463,8 @@
 -- The operations are run outside of the catchIO cleanup handler because
 -- catchIO masks asynchronous exceptions in the cleanup handler.
 -- In the case of complete failure, the last exception is actually thrown.
-firstSuccessful :: [IO a] -> IO a
-firstSuccessful = go Nothing
+firstSuccessful :: String -> [IO a] -> IO a
+firstSuccessful caller = go Nothing
   where
   -- Attempt the next operation, remember exception on failure
   go _ (p:ps) =
@@ -474,5 +474,5 @@
          Left  e -> go (Just e) ps
 
   -- All operations failed, throw error if one exists
-  go Nothing  [] = error "firstSuccessful: empty list"
+  go Nothing  [] = ioError $ userError $ caller ++ ": firstSuccessful: empty list"
   go (Just e) [] = Exception.throwIO e
diff --git a/Network/BSD.hsc b/Network/BSD.hsc
--- a/Network/BSD.hsc
+++ b/Network/BSD.hsc
@@ -168,7 +168,7 @@
                         serviceProtocol = s_proto
                 })
 
-   poke _p = error "Storable.poke(BSD.ServiceEntry) not implemented"
+   poke = throwUnsupportedOperationPoke "ServiceEntry"
 
 
 -- | Get service by name.
@@ -178,7 +178,7 @@
 getServiceByName name proto = withLock $ do
  withCString name  $ \ cstr_name  -> do
  withCString proto $ \ cstr_proto -> do
- throwNoSuchThingIfNull "getServiceByName" "no such service entry"
+ throwNoSuchThingIfNull "Network.BSD.getServiceByName" "no such service entry"
    $ c_getservbyname cstr_name cstr_proto
  >>= peek
 
@@ -189,7 +189,7 @@
 getServiceByPort :: PortNumber -> ProtocolName -> IO ServiceEntry
 getServiceByPort port proto = withLock $ do
  withCString proto $ \ cstr_proto -> do
- throwNoSuchThingIfNull "getServiceByPort" "no such service entry"
+ throwNoSuchThingIfNull "Network.BSD.getServiceByPort" "no such service entry"
    $ c_getservbyport (fromIntegral port) cstr_proto
  >>= peek
 
@@ -205,7 +205,7 @@
 #if !defined(mingw32_HOST_OS)
 getServiceEntry :: IO ServiceEntry
 getServiceEntry = withLock $ do
- throwNoSuchThingIfNull "getServiceEntry" "no such service entry"
+ throwNoSuchThingIfNull "Network.BSD.getServiceEntry" "no such service entry"
    $ c_getservent
  >>= peek
 
@@ -270,12 +270,13 @@
                         protoNumber  = p_proto
                 })
 
-   poke _p = error "Storable.poke(BSD.ProtocolEntry) not implemented"
+   poke = throwUnsupportedOperationPoke "ProtocolEntry"
 
+
 getProtocolByName :: ProtocolName -> IO ProtocolEntry
 getProtocolByName name = withLock $ do
  withCString name $ \ name_cstr -> do
- throwNoSuchThingIfNull "getProtocolByName" ("no such protocol name: " ++ name)
+ throwNoSuchThingIfNull "Network.BSD.getProtocolByName" ("no such protocol name: " ++ name)
    $ c_getprotobyname name_cstr
  >>= peek
 
@@ -285,7 +286,7 @@
 
 getProtocolByNumber :: ProtocolNumber -> IO ProtocolEntry
 getProtocolByNumber num = withLock $ do
- throwNoSuchThingIfNull "getProtocolByNumber" ("no such protocol number: " ++ show num)
+ throwNoSuchThingIfNull "Network.BSD.getProtocolByNumber" ("no such protocol number: " ++ show num)
    $ c_getprotobynumber (fromIntegral num)
  >>= peek
 
@@ -301,7 +302,7 @@
 #if !defined(mingw32_HOST_OS)
 getProtocolEntry :: IO ProtocolEntry    -- Next Protocol Entry from DB
 getProtocolEntry = withLock $ do
- ent <- throwNoSuchThingIfNull "getProtocolEntry" "no such protocol entry"
+ ent <- throwNoSuchThingIfNull "Network.BSD.getProtocolEntry" "no such protocol entry"
                 $ c_getprotoent
  peek ent
 
@@ -359,14 +360,14 @@
                         hostAddresses  = h_addr_list
                 })
 
-   poke _p = error "Storable.poke(BSD.ServiceEntry) not implemented"
+   poke = throwUnsupportedOperationPoke "HostEntry"
 
 
 -- convenience function:
 hostAddress :: HostEntry -> HostAddress
 hostAddress (HostEntry nm _ _ ls) =
  case ls of
-   []    -> error ("BSD.hostAddress: empty network address list for " ++ nm)
+   []    -> error $ "Network.BSD.hostAddress: empty network address list for " ++ nm
    (x:_) -> x
 
 -- getHostByName must use the same lock as the *hostent functions
@@ -376,7 +377,7 @@
 getHostByName :: HostName -> IO HostEntry
 getHostByName name = withLock $ do
   withCString name $ \ name_cstr -> do
-   ent <- throwNoSuchThingIfNull "getHostByName" "no such host entry"
+   ent <- throwNoSuchThingIfNull "Network.BSD.getHostByName" "no such host entry"
                 $ c_gethostbyname name_cstr
    peek ent
 
@@ -390,7 +391,7 @@
 getHostByAddr :: Family -> HostAddress -> IO HostEntry
 getHostByAddr family addr = do
  with addr $ \ ptr_addr -> withLock $ do
- throwNoSuchThingIfNull         "getHostByAddr" "no such host entry"
+ throwNoSuchThingIfNull "Network.BSD.getHostByAddr" "no such host entry"
    $ c_gethostbyaddr ptr_addr (fromIntegral (sizeOf addr)) (packFamily family)
  >>= peek
 
@@ -400,7 +401,7 @@
 #if defined(HAVE_GETHOSTENT) && !defined(mingw32_HOST_OS)
 getHostEntry :: IO HostEntry
 getHostEntry = withLock $ do
- throwNoSuchThingIfNull         "getHostEntry" "unable to retrieve host entry"
+ throwNoSuchThingIfNull "Network.BSD.getHostEntry" "unable to retrieve host entry"
    $ c_gethostent
  >>= peek
 
@@ -460,14 +461,14 @@
                         networkAddress   = n_net
                 })
 
-   poke _p = error "Storable.poke(BSD.NetEntry) not implemented"
+   poke = throwUnsupportedOperationPoke "NetworkEntry"
 
 
 #if !defined(mingw32_HOST_OS)
 getNetworkByName :: NetworkName -> IO NetworkEntry
 getNetworkByName name = withLock $ do
  withCString name $ \ name_cstr -> do
-  throwNoSuchThingIfNull "getNetworkByName" "no such network entry"
+  throwNoSuchThingIfNull "Network.BSD.getNetworkByName" "no such network entry"
     $ c_getnetbyname name_cstr
   >>= peek
 
@@ -476,7 +477,7 @@
 
 getNetworkByAddr :: NetworkAddr -> Family -> IO NetworkEntry
 getNetworkByAddr addr family = withLock $ do
- throwNoSuchThingIfNull "getNetworkByAddr" "no such network entry"
+ throwNoSuchThingIfNull "Network.BSD.getNetworkByAddr" "no such network entry"
    $ c_getnetbyaddr addr (packFamily family)
  >>= peek
 
@@ -485,7 +486,7 @@
 
 getNetworkEntry :: IO NetworkEntry
 getNetworkEntry = withLock $ do
- throwNoSuchThingIfNull "getNetworkEntry" "no more network entries"
+ throwNoSuchThingIfNull "Network.BSD.getNetworkEntry" "no more network entries"
           $ c_getnetent
  >>= peek
 
@@ -549,7 +550,7 @@
 getHostName = do
   let size = 256
   allocaArray0 size $ \ cstr -> do
-    throwSocketErrorIfMinus1_ "getHostName" $ c_gethostname cstr (fromIntegral size)
+    throwSocketErrorIfMinus1_ "Network.BSD.getHostName" $ c_gethostname cstr (fromIntegral size)
     peekCString cstr
 
 foreign import CALLCONV unsafe "gethostname"
@@ -577,3 +578,12 @@
   if (ptr == nullPtr)
    then ioError (ioeSetErrorString (mkIOError NoSuchThing loc Nothing Nothing) desc)
    else return ptr
+
+throwUnsupportedOperationPoke :: String -> Ptr a -> a -> IO ()
+throwUnsupportedOperationPoke typ _ _ =
+  ioError $ ioeSetErrorString ioe "Operation not implemented"
+  where
+    ioe = mkIOError UnsupportedOperation
+                    ("Network.BSD: instance Storable " ++ typ ++ ": poke")
+                    Nothing
+                    Nothing
diff --git a/Network/Socket.hsc b/Network/Socket.hsc
--- a/Network/Socket.hsc
+++ b/Network/Socket.hsc
@@ -160,6 +160,7 @@
     -- in case you ever want to get at the underlying file descriptor..
     , fdSocket
     , mkSocket
+    , setNonBlockIfNeeded
 
     -- * Deprecated aliases
     -- $deprecated-aliases
@@ -262,6 +263,10 @@
   FD{fdFD = fd,fdIsSocket_ = 1}
 #endif
 
+-- | Smart constructor for constructing a 'Socket'. It should only be
+-- called once for every new file descriptor. The caller must make
+-- sure that the socket is in non-blocking mode. See
+-- 'setNonBlockIfNeeded'.
 mkSocket :: CInt
          -> Family
          -> SocketType
@@ -339,7 +344,7 @@
        -> IO Socket      -- Unconnected Socket
 socket family stype protocol = do
     c_stype <- packSocketTypeOrThrow "socket" stype
-    fd <- throwSocketErrorIfMinus1Retry "socket" $
+    fd <- throwSocketErrorIfMinus1Retry "Network.Socket.socket" $
                 c_socket (packFamily family) c_stype protocol
     setNonBlockIfNeeded fd
     socket_status <- newMVar NotConnected
@@ -372,7 +377,7 @@
 socketPair family stype protocol = do
     allocaBytes (2 * sizeOf (1 :: CInt)) $ \ fdArr -> do
     c_stype <- packSocketTypeOrThrow "socketPair" stype
-    _rc <- throwSocketErrorIfMinus1Retry "socketpair" $
+    _rc <- throwSocketErrorIfMinus1Retry "Network.Socket.socketpair" $
                 c_socketpair (packFamily family) c_stype protocol fdArr
     [fd1,fd2] <- peekArray 2 fdArr
     s1 <- mkNonBlockingSocket fd1
@@ -390,6 +395,9 @@
 #endif
 
 -- | Set the socket to nonblocking, if applicable to this platform.
+--
+-- Depending on the platform this is required when using sockets from file
+-- descriptors that are passed in through 'recvFd' or other means.
 setNonBlockIfNeeded :: CInt -> IO ()
 setNonBlockIfNeeded fd =
     System.Posix.Internals.setNonBlockingFD fd True
@@ -409,11 +417,12 @@
  modifyMVar_ socketStatus $ \ status -> do
  if status /= NotConnected
   then
-   ioError (userError ("bind: can't peform bind on socket in status " ++
-         show status))
+   ioError $ userError $
+     "Network.Socket.bind: can't bind to socket with status " ++ show status
   else do
    withSockAddr addr $ \p_addr sz -> do
-   _status <- throwSocketErrorIfMinus1Retry "bind" $ c_bind s p_addr (fromIntegral sz)
+   _status <- throwSocketErrorIfMinus1Retry "Network.Socket.bind" $
+     c_bind s p_addr (fromIntegral sz)
    return Bound
 
 -----------------------------------------------------------------------------
@@ -427,8 +436,8 @@
  modifyMVar_ socketStatus $ \currentStatus -> do
  if currentStatus /= NotConnected && currentStatus /= Bound
   then
-    ioError (userError ("connect: can't peform connect on socket in status " ++
-        show currentStatus))
+    ioError $ userError $
+      errLoc ++ ": can't connect to socket with status " ++ show currentStatus
   else do
     withSockAddr addr $ \p_addr sz -> do
 
@@ -442,9 +451,9 @@
                      _ | err == eINTR       -> connectLoop
                      _ | err == eINPROGRESS -> connectBlocked
 --                   _ | err == eAGAIN      -> connectBlocked
-                     _otherwise             -> throwSocketError "connect"
+                     _otherwise             -> throwSocketError errLoc
 #else
-                   throwSocketError "connect"
+                   throwSocketError errLoc
 #endif
                else return ()
 
@@ -453,10 +462,12 @@
            err <- getSocketOption sock SoError
            if (err == 0)
                 then return ()
-                else throwSocketErrorCode "connect" (fromIntegral err)
+                else throwSocketErrorCode errLoc (fromIntegral err)
 
     connectLoop
     return Connected
+ where
+   errLoc = "Network.Socket.connect: " ++ show sock
 
 -----------------------------------------------------------------------------
 -- Listen
@@ -471,10 +482,11 @@
  modifyMVar_ socketStatus $ \ status -> do
  if status /= Bound
    then
-     ioError (userError ("listen: can't peform listen on socket in status " ++
-         show status))
+     ioError $ userError $
+       "Network.Socket.listen: can't listen on socket with status " ++ show status
    else do
-     throwSocketErrorIfMinus1Retry_ "listen" (c_listen s (fromIntegral backlog))
+     throwSocketErrorIfMinus1Retry_ "Network.Socket.listen" $
+       c_listen s (fromIntegral backlog)
      return Listening
 
 -----------------------------------------------------------------------------
@@ -500,8 +512,10 @@
  okay <- isAcceptable sock
  if not okay
    then
-     ioError (userError ("accept: can't perform accept on socket (" ++ (show (family,stype,protocol)) ++") in status " ++
-         show currentStatus))
+     ioError $ userError $
+       "Network.Socket.accept: can't accept socket (" ++
+         show (family, stype, protocol) ++ ") with status " ++
+         show currentStatus
    else do
      let sz = sizeOfSockAddrByFamily family
      allocaBytes sz $ \ sockaddr -> do
@@ -522,11 +536,11 @@
 #else
      with (fromIntegral sz) $ \ ptr_len -> do
 # ifdef HAVE_ACCEPT4
-     new_sock <- throwSocketErrorIfMinus1RetryMayBlock "accept"
+     new_sock <- throwSocketErrorIfMinus1RetryMayBlock "Network.Socket.accept"
                         (threadWaitRead (fromIntegral s))
                         (c_accept4 s sockaddr ptr_len (#const SOCK_NONBLOCK))
 # else
-     new_sock <- throwSocketErrorWaitRead sock "accept"
+     new_sock <- throwSocketErrorWaitRead sock "Network.Socket.accept"
                         (c_accept s sockaddr ptr_len)
      setNonBlockIfNeeded new_sock
 # endif /* HAVE_ACCEPT4 */
@@ -547,7 +561,7 @@
 #endif
 
 -----------------------------------------------------------------------------
--- ** Sending and reciving data
+-- ** Sending and receiving data
 
 -- $sendrecv
 --
@@ -587,7 +601,7 @@
 sendBufTo sock@(MkSocket s _family _stype _protocol _status) ptr nbytes addr = do
  withSockAddr addr $ \p_addr sz -> do
    liftM fromIntegral $
-     throwSocketErrorWaitWrite sock "sendTo" $
+     throwSocketErrorWaitWrite sock "Network.Socket.sendTo" $
         c_sendto s ptr (fromIntegral $ nbytes) 0{-flags-}
                         p_addr (fromIntegral sz)
 
@@ -622,7 +636,7 @@
     withNewSockAddr family $ \ptr_addr sz -> do
       alloca $ \ptr_len -> do
         poke ptr_len (fromIntegral sz)
-        len <- throwSocketErrorWaitRead sock "recvFrom" $
+        len <- throwSocketErrorWaitRead sock "Network.Socket.recvFrom" $
                    c_recvfrom s ptr (fromIntegral nbytes) 0{-flags-}
                                 ptr_addr ptr_len
         let len' = fromIntegral len
@@ -678,7 +692,7 @@
       0
       (fromIntegral len)
 #else
-     throwSocketErrorWaitWrite sock "sendBuf" $
+     throwSocketErrorWaitWrite sock "Network.Socket.sendBuf" $
         c_send s str (fromIntegral len) 0{-flags-}
 #endif
 
@@ -732,7 +746,7 @@
                 readRawBufferPtr "Network.Socket.recvBuf"
                 (socket2FD sock) ptr 0 (fromIntegral nbytes)
 #else
-               throwSocketErrorWaitRead sock "recvBuf" $
+               throwSocketErrorWaitRead sock "Network.Socket.recvBuf" $
                    c_recv s (castPtr ptr) (fromIntegral nbytes) 0{-flags-}
 #endif
         let len' = fromIntegral len
@@ -759,7 +773,9 @@
     return port
 #endif
 socketPort (MkSocket _ family _ _ _) =
-    ioError (userError ("socketPort: not supported for Family " ++ show family))
+    ioError $ userError $
+      "Network.Socket.socketPort: address family '" ++ show family ++
+      "' not supported."
 
 
 -- ---------------------------------------------------------------------------
@@ -775,7 +791,8 @@
 getPeerName (MkSocket s family _ _ _) = do
  withNewSockAddr family $ \ptr sz -> do
    with (fromIntegral sz) $ \int_star -> do
-   throwSocketErrorIfMinus1Retry_ "getPeerName" $ c_getpeername s ptr int_star
+   throwSocketErrorIfMinus1Retry_ "Network.Socket.getPeerName" $
+     c_getpeername s ptr int_star
    _sz <- peek int_star
    peekSockAddr ptr
 
@@ -783,7 +800,8 @@
 getSocketName (MkSocket s family _ _ _) = do
  withNewSockAddr family $ \ptr sz -> do
    with (fromIntegral sz) $ \int_star -> do
-   throwSocketErrorIfMinus1Retry_ "getSocketName" $ c_getsockname s ptr int_star
+   throwSocketErrorIfMinus1Retry_ "Network.Socket.getSocketName" $
+     c_getsockname s ptr int_star
    peekSockAddr ptr
 
 -----------------------------------------------------------------------------
@@ -938,7 +956,7 @@
 setSocketOption (MkSocket s _ _ _ _) so v = do
    (level, opt) <- packSocketOption' "setSocketOption" so
    with (fromIntegral v) $ \ptr_v -> do
-   throwSocketErrorIfMinus1_ "setSocketOption" $
+   throwSocketErrorIfMinus1_ "Network.Socket.setSocketOption" $
        c_setsockopt s level opt ptr_v
           (fromIntegral (sizeOf (undefined :: CInt)))
    return ()
@@ -953,7 +971,7 @@
    (level, opt) <- packSocketOption' "getSocketOption" so
    alloca $ \ptr_v ->
      with (fromIntegral (sizeOf (undefined :: CInt))) $ \ptr_sz -> do
-       throwSocketErrorIfMinus1Retry_ "getSocketOption" $
+       throwSocketErrorIfMinus1Retry_ "Network.Socket.getSocketOption" $
          c_getsockopt s level opt ptr_v ptr_sz
        fromIntegral `liftM` peek ptr_v
 
@@ -971,7 +989,7 @@
   let sz = (#const sizeof(struct ucred))
   allocaBytes sz $ \ ptr_cr ->
    with (fromIntegral sz) $ \ ptr_sz -> do
-     _ <- ($) throwSocketErrorIfMinus1Retry "getPeerCred" $
+     _ <- ($) throwSocketErrorIfMinus1Retry "Network.Socket.getPeerCred" $
        c_getsockopt fd (#const SOL_SOCKET) (#const SO_PEERCRED) ptr_cr ptr_sz
      pid <- (#peek struct ucred, pid) ptr_cr
      uid <- (#peek struct ucred, uid) ptr_cr
@@ -990,7 +1008,7 @@
   let fd = fdSocket sock
   alloca $ \ ptr_uid ->
     alloca $ \ ptr_gid -> do
-      throwSocketErrorIfMinus1Retry_ "getPeerEid" $
+      throwSocketErrorIfMinus1Retry_ "Network.Socket.getPeerEid" $
         c_getpeereid fd ptr_uid ptr_gid
       uid <- peek ptr_uid
       gid <- peek ptr_gid
@@ -1007,15 +1025,18 @@
 -- for transmitting file descriptors, mainly.
 sendFd :: Socket -> CInt -> IO ()
 sendFd sock outfd = do
-  _ <- ($) throwSocketErrorWaitWrite sock "sendFd" $
+  _ <- ($) throwSocketErrorWaitWrite sock "Network.Socket.sendFd" $
      c_sendFd (fdSocket sock) outfd
    -- Note: If Winsock supported FD-passing, thi would have been
    -- incorrect (since socket FDs need to be closed via closesocket().)
   closeFd outfd
 
+-- | Receive a file descriptor over a domain socket. Note that the resulting
+-- file descriptor may have to be put into non-blocking mode in order to be
+-- used safely. See 'setNonBlockIfNeeded'.
 recvFd :: Socket -> IO CInt
 recvFd sock = do
-  theFd <- throwSocketErrorWaitRead sock "recvFd" $
+  theFd <- throwSocketErrorWaitRead sock "Network.Socket.recvFd" $
                c_recvFd (fdSocket sock)
   return theFd
 
@@ -1084,7 +1105,8 @@
 -- 'ShutdownBoth', further sends and receives are disallowed.
 shutdown :: Socket -> ShutdownCmd -> IO ()
 shutdown (MkSocket s _ _ _ _) stype = do
-  throwSocketErrorIfMinus1Retry_ "shutdown" (c_shutdown s (sdownCmdToInt stype))
+  throwSocketErrorIfMinus1Retry_ "Network.Socket.shutdown" $
+    c_shutdown s (sdownCmdToInt stype)
   return ()
 
 -- -----------------------------------------------------------------------------
@@ -1153,7 +1175,8 @@
    withCString ipstr $ \str -> do
    had <- c_inet_addr str
    if had == -1
-    then ioError (userError ("inet_addr: Malformed address: " ++ ipstr))
+    then ioError $ userError $
+      "Network.Socket.inet_addr: Malformed address: " ++ ipstr
     else return had  -- network byte order
 
 inet_ntoa :: HostAddress -> IO String
@@ -1443,7 +1466,7 @@
                     return ais
             _ -> do err <- gai_strerror ret
                     ioError (ioeSetErrorString
-                             (mkIOError NoSuchThing "getAddrInfo" Nothing
+                             (mkIOError NoSuchThing "Network.Socket.getAddrInfo" Nothing
                               Nothing) err)
     -- Leaving out the service and using AI_NUMERICSERV causes a
     -- segfault on OS X 10.8.2. This code removes AI_NUMERICSERV
@@ -1480,7 +1503,7 @@
 foreign import ccall safe "gai_strerror"
     c_gai_strerror :: CInt -> IO CString
 #else
-gai_strerror n = return ("error " ++ show n)
+gai_strerror n = ioError $ userError $ "Network.Socket.gai_strerror not supported: " ++ show n
 #endif
 
 withCStringIf :: Bool -> Int -> (CSize -> CString -> IO a) -> IO a
@@ -1523,7 +1546,7 @@
             return (host, serv)
           _ -> do err <- gai_strerror ret
                   ioError (ioeSetErrorString
-                           (mkIOError NoSuchThing "getNameInfo" Nothing
+                           (mkIOError NoSuchThing "Network.Socket.getNameInfo" Nothing
                             Nothing) err)
 
 foreign import ccall safe "hsnet_getnameinfo"
@@ -1542,7 +1565,7 @@
 -- ---------------------------------------------------------------------------
 -- foreign imports from the C library
 
-foreign import ccall unsafe "my_inet_ntoa"
+foreign import ccall unsafe "hsnet_inet_ntoa"
   c_inet_ntoa :: HostAddress -> IO (Ptr CChar)
 
 foreign import CALLCONV unsafe "inet_addr"
diff --git a/Network/Socket/ByteString.hsc b/Network/Socket/ByteString.hsc
--- a/Network/Socket/ByteString.hsc
+++ b/Network/Socket/ByteString.hsc
@@ -43,14 +43,15 @@
     -- $example
     ) where
 
+import Control.Exception (catch, throwIO)
 import Control.Monad (when)
 import Data.ByteString (ByteString)
 import Data.ByteString.Internal (createAndTrim)
 import Data.ByteString.Unsafe (unsafeUseAsCStringLen)
-import Data.Word (Word8)
 import Foreign.Marshal.Alloc (allocaBytes)
-import Foreign.Ptr (Ptr, castPtr)
-import Network.Socket (sendBuf, sendBufTo, recvBufFrom)
+import Foreign.Ptr (castPtr)
+import Network.Socket (sendBuf, sendBufTo, recvBuf, recvBufFrom)
+import System.IO.Error (isEOFError)
 
 import qualified Data.ByteString as B
 
@@ -62,22 +63,13 @@
 import Control.Monad (liftM, zipWithM_)
 import Foreign.Marshal.Array (allocaArray)
 import Foreign.Marshal.Utils (with)
-import Foreign.Ptr (plusPtr)
+import Foreign.Ptr (Ptr, plusPtr)
 import Foreign.Storable (Storable(..))
-import Foreign.C.Types (CChar, CSize(..), CInt(..))
 
 import Network.Socket.ByteString.IOVec (IOVec(..))
 import Network.Socket.ByteString.MsgHdr (MsgHdr(..))
-
-#else
-import GHC.IO.FD (FD(..), readRawBufferPtr)
 #endif
 
-#if !defined(mingw32_HOST_OS)
-foreign import CALLCONV unsafe "recv"
-  c_recv :: CInt -> Ptr CChar -> CSize -> CInt -> IO CInt
-#endif
-
 -- ----------------------------------------------------------------------------
 -- Sending
 
@@ -175,7 +167,7 @@
   where
     sendManyInner =
       liftM fromIntegral . withIOVec cs $ \(iovsPtr, iovsLen) ->
-          throwSocketErrorWaitWrite sock "writev" $
+          throwSocketErrorWaitWrite sock "Network.Socket.ByteString.sendMany" $
               c_writev (fromIntegral fd) iovsPtr
               (fromIntegral (min iovsLen (#const IOV_MAX)))
 #else
@@ -206,7 +198,7 @@
                 addrPtr (fromIntegral addrSize)
                 iovsPtr (fromIntegral iovsLen)
           with msgHdr $ \msgHdrPtr ->
-            throwSocketErrorWaitWrite sock "sendmsg" $
+            throwSocketErrorWaitWrite sock "Network.Socket.ByteString.sendManyTo" $
               c_sendmsg (fromIntegral fd) msgHdrPtr 0
 #else
 sendManyTo sock cs = sendAllTo sock (B.concat cs)
@@ -233,20 +225,10 @@
      -> IO ByteString  -- ^ Data received
 recv sock nbytes
     | nbytes < 0 = ioError (mkInvalidRecvArgError "Network.Socket.ByteString.recv")
-    | otherwise  = createAndTrim nbytes $ recvInner sock nbytes
-
-recvInner :: Socket -> Int -> Ptr Word8 -> IO Int
-recvInner sock nbytes ptr =
-    fmap fromIntegral $
-#if defined(mingw32_HOST_OS)
-      throwSocketErrorIfMinus1Retry "Network.Socket.recvBuf" $
-        readRawBufferPtr "Network.Socket.ByteString.recv" (FD s 1) ptr 0 (fromIntegral nbytes)
-#else
-      throwSocketErrorWaitRead sock "recv" $
-        c_recv s (castPtr ptr) (fromIntegral nbytes) 0
-#endif
-  where
-    s = sockFd sock
+    | otherwise  = createAndTrim nbytes $ \ptr ->
+        catch
+          (recvBuf sock ptr nbytes)
+          (\e -> if isEOFError e then return 0 else throwIO e)
 
 -- | Receive data from the socket.  The socket need not be in a
 -- connected state.  Returns @(bytes, address)@ where @bytes@ is a
diff --git a/Network/Socket/Internal.hsc b/Network/Socket/Internal.hsc
--- a/Network/Socket/Internal.hsc
+++ b/Network/Socket/Internal.hsc
@@ -266,7 +266,8 @@
 -- 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 "Failed to initialise WinSock"
+    when (x /= 0) $ ioError $
+      userError "Network.Socket.Internal.withSocketsDo: Failed to initialise WinSock"
 
 foreign import ccall unsafe "initWinSock" initWinSock :: IO Int
 
diff --git a/Network/Socket/Types.hsc b/Network/Socket/Types.hsc
--- a/Network/Socket/Types.hsc
+++ b/Network/Socket/Types.hsc
@@ -59,7 +59,6 @@
     ) where
 
 import Control.Concurrent.MVar
-import Control.Exception (throwIO)
 import Control.Monad
 import Data.Bits
 import Data.Maybe
@@ -82,7 +81,8 @@
 --   * Status flag
 --
 --   If you are calling the 'MkSocket' constructor directly you should ensure
---   you have called 'Network.withSocketsDo'.
+--   you have called 'Network.withSocketsDo' and that the file descriptor is
+--   in non-blocking mode. See 'Network.Socket.setNonBlockIfNeeded'.
 data Socket
   = MkSocket
             CInt                 -- File Descriptor
@@ -724,8 +724,9 @@
 #ifdef AF_CAN
         (#const AF_CAN) -> AF_CAN
 #endif
-        unknown -> error ("Network.Socket.unpackFamily: unknown address " ++
-                          "family " ++ show unknown)
+        unknown -> error $
+          "Network.Socket.Types.unpackFamily: unknown address family: " ++
+          show unknown
 
 ------------------------------------------------------------------------
 -- Port Numbers
@@ -892,8 +893,9 @@
 #if defined(CAN_SOCKET_SUPPORT)
 sizeOfSockAddrByFamily AF_CAN   = #const sizeof(struct sockaddr_can)
 #endif
-sizeOfSockAddrByFamily family =
-    error $ "sizeOfSockAddrByFamily: " ++ show family ++ " not supported."
+sizeOfSockAddrByFamily family = error $
+    "Network.Socket.Types.sizeOfSockAddrByFamily: address family '" ++
+    show family ++ "' not supported."
 
 -- | Use a 'SockAddr' with a function requiring a pointer to a
 -- 'SockAddr' and the length of that 'SockAddr'.
@@ -922,6 +924,10 @@
 pokeSockAddr p (SockAddrUnix path) = do
 #if defined(darwin_HOST_OS)
     zeroMemory p (#const sizeof(struct sockaddr_un))
+#else
+    case path of
+      ('\0':_) -> zeroMemory p (#const sizeof(struct sockaddr_un))
+      _        -> return ()
 #endif
 #if defined(HAVE_STRUCT_SOCKADDR_SA_LEN)
     (#poke struct sockaddr_un, sun_len) p ((#const sizeof(struct sockaddr_un)) :: Word8)
@@ -990,7 +996,9 @@
         ifidx <- (#peek struct sockaddr_can, can_ifindex) p
         return (SockAddrCan ifidx)
 #endif
-    _ -> throwIO $ userError $ "peekSockAddr: " ++ show family ++ " not supported on this platform."
+    _ -> ioError $ userError $
+      "Network.Socket.Types.peekSockAddr: address family '" ++
+      show family ++ "' not supported."
 
 ------------------------------------------------------------------------
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,10 +1,19 @@
 # [`network`](http://hackage.haskell.org/package/network) [![Build Status](https://travis-ci.org/haskell/network.svg?branch=master)](https://travis-ci.org/haskell/network) [![Build status](https://ci.appveyor.com/api/projects/status/5erq63o4m29bhl57/branch/master?svg=true)](https://ci.appveyor.com/project/eborden/network/branch/master)
 
-
-
 To build this package using Cabal directly from git, you must run
 `autoreconf` before the usual Cabal build steps
 (configure/build/install).  `autoreconf` is included in the
 [GNU Autoconf](http://www.gnu.org/software/autoconf/) tools.  There is
 no need to run the `configure` script: the `setup configure` step will
 do this for you.
+
+## Support Policy
+
+### GHC
+
+`network`'s GHC policy supports 3 [stable](https://downloads.haskell.org/~ghc/8.0.2/docs/html/users_guide/intro.html#ghc-version-numbering-policy) versions. The current stable
+version and two previous stable versions are supported.
+
+### Hugs, JHC, UHC
+
+`network` does not officially support these compilers.
diff --git a/config.guess b/config.guess
--- a/config.guess
+++ b/config.guess
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2014 Free Software Foundation, Inc.
+#   Copyright 1992-2017 Free Software Foundation, Inc.
 
-timestamp='2014-03-23'
+timestamp='2017-03-05'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -24,12 +24,12 @@
 # program.  This Exception is an additional permission under section 7
 # of the GNU General Public License, version 3 ("GPLv3").
 #
-# Originally written by Per Bothner.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 #
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# Please send patches to <config-patches@gnu.org>.
 
 
 me=`echo "$0" | sed -e 's,.*/,,'`
@@ -50,7 +50,7 @@
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2014 Free Software Foundation, Inc.
+Copyright 1992-2017 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -168,19 +168,29 @@
 	# 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)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
+	# to ELF recently (or will in the future) and ABI.
 	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		os=netbsdelf
+		;;
 	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
@@ -197,6 +207,13 @@
 		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
@@ -207,13 +224,13 @@
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
 	exit ;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -223,6 +240,10 @@
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
 	exit ;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
+	exit ;;
     *:ekkoBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 	exit ;;
@@ -235,6 +256,9 @@
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -251,42 +275,42 @@
 	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" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
+		UNAME_MACHINE=alphaev5 ;;
 	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
+		UNAME_MACHINE=alphaev56 ;;
 	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
+		UNAME_MACHINE=alphapca56 ;;
 	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
+		UNAME_MACHINE=alphapca57 ;;
 	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
+		UNAME_MACHINE=alphaev6 ;;
 	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
+		UNAME_MACHINE=alphaev67 ;;
 	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
+		UNAME_MACHINE=alphaev69 ;;
 	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
+		UNAME_MACHINE=alphaev7 ;;
 	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
+		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'`
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
 	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
 	exitcode=$?
 	trap '' 0
@@ -359,16 +383,16 @@
 	exit ;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
 	eval $set_cc_for_build
-	SUN_ARCH="i386"
+	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		grep IS_64BIT_ARCH >/dev/null
 	    then
-		SUN_ARCH="x86_64"
+		SUN_ARCH=x86_64
 	    fi
 	fi
 	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
@@ -393,7 +417,7 @@
 	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
+	test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3
 	case "`/bin/arch`" in
 	    sun3)
 		echo m68k-sun-sunos${UNAME_RELEASE}
@@ -579,8 +603,9 @@
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -617,13 +642,13 @@
 		    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
+		      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
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
 			esac ;;
 		    esac
 		fi
@@ -662,11 +687,11 @@
 		    exit (0);
 		}
 EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    (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" ]
+	if [ ${HP_ARCH} = hppa2.0w ]
 	then
 	    eval $set_cc_for_build
 
@@ -679,12 +704,12 @@
 	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
 	    # => hppa64-hp-hpux11.23
 
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
 		grep -q __LP64__
 	    then
-		HP_ARCH="hppa2.0w"
+		HP_ARCH=hppa2.0w
 	    else
-		HP_ARCH="hppa64"
+		HP_ARCH=hppa64
 	    fi
 	fi
 	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
@@ -789,14 +814,14 @@
 	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_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/ /_/'`
+	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:*:*)
@@ -812,10 +837,11 @@
 	UNAME_PROCESSOR=`/usr/bin/uname -p`
 	case ${UNAME_PROCESSOR} in
 	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+		UNAME_PROCESSOR=x86_64 ;;
+	    i386)
+		UNAME_PROCESSOR=i586 ;;
 	esac
+	echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
 	exit ;;
     i*:CYGWIN*:*)
 	echo ${UNAME_MACHINE}-pc-cygwin
@@ -878,7 +904,7 @@
 	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/[-(].*//'`-${LIBC}
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
 	exit ;;
     i*86:Minix:*:*)
 	echo ${UNAME_MACHINE}-pc-minix
@@ -901,7 +927,7 @@
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
 	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     arc:Linux:*:* | arceb:Linux:*:*)
@@ -932,6 +958,9 @@
     crisv32:Linux:*:*)
 	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     frv:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -944,6 +973,9 @@
     ia64:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
+    k1om:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     m32r*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -969,6 +1001,9 @@
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
 	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
+    mips64el:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     openrisc*:Linux:*:*)
 	echo or1k-unknown-linux-${LIBC}
 	exit ;;
@@ -1001,6 +1036,9 @@
     ppcle:Linux:*:*)
 	echo powerpcle-unknown-linux-${LIBC}
 	exit ;;
+    riscv32:Linux:*:* | riscv64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
 	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
@@ -1020,7 +1058,7 @@
 	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1099,7 +1137,7 @@
 	# 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 configury will decide that
+	# prints for the "djgpp" host, or else GDB configure will decide that
 	# this is a cross-build.
 	echo i586-pc-msdosdjgpp
 	exit ;;
@@ -1248,6 +1286,9 @@
     SX-8R:SUPER-UX:*:*)
 	echo sx8r-nec-superux${UNAME_RELEASE}
 	exit ;;
+    SX-ACE:SUPER-UX:*:*)
+	echo sxace-nec-superux${UNAME_RELEASE}
+	exit ;;
     Power*:Rhapsody:*:*)
 	echo powerpc-apple-rhapsody${UNAME_RELEASE}
 	exit ;;
@@ -1261,9 +1302,9 @@
 	    UNAME_PROCESSOR=powerpc
 	fi
 	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
-	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
 		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		    grep IS_64BIT_ARCH >/dev/null
 		then
 		    case $UNAME_PROCESSOR in
@@ -1285,7 +1326,7 @@
 	exit ;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
+	if test "$UNAME_PROCESSOR" = x86; then
 		UNAME_PROCESSOR=i386
 		UNAME_MACHINE=pc
 	fi
@@ -1303,6 +1344,9 @@
     NSR-?:NONSTOP_KERNEL:*:*)
 	echo nsr-tandem-nsk${UNAME_RELEASE}
 	exit ;;
+    NSX-?:NONSTOP_KERNEL:*:*)
+	echo nsx-tandem-nsk${UNAME_RELEASE}
+	exit ;;
     *:NonStop-UX:*:*)
 	echo mips-compaq-nonstopux
 	exit ;;
@@ -1316,7 +1360,7 @@
 	# "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
+	if test "$cputype" = 386; then
 	    UNAME_MACHINE=i386
 	else
 	    UNAME_MACHINE="$cputype"
@@ -1358,7 +1402,7 @@
 	echo i386-pc-xenix
 	exit ;;
     i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'`
 	exit ;;
     i*86:rdos:*:*)
 	echo ${UNAME_MACHINE}-pc-rdos
@@ -1369,23 +1413,25 @@
     x86_64:VMkernel:*:*)
 	echo ${UNAME_MACHINE}-unknown-esx
 	exit ;;
+    amd64:Isilon\ OneFS:*:*)
+	echo x86_64-unknown-onefs
+	exit ;;
 esac
 
 cat >&2 <<EOF
 $0: unable to guess system type
 
-This script, 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
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite
+config.guess and config.sub with the latest versions from:
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=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.
+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
 
diff --git a/config.sub b/config.sub
--- a/config.sub
+++ b/config.sub
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2014 Free Software Foundation, Inc.
+#   Copyright 1992-2017 Free Software Foundation, Inc.
 
-timestamp='2014-04-03'
+timestamp='2017-04-02'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@
 # of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# 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.
@@ -33,7 +33,7 @@
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -53,8 +53,7 @@
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
@@ -68,7 +67,7 @@
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2014 Free Software Foundation, Inc.
+Copyright 1992-2017 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,8 +116,8 @@
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
-  kopensolaris*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
+  kopensolaris*-gnu* | cloudabi*-eabi* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
@@ -255,15 +254,16 @@
 	| arc | arceb \
 	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 	| avr | avr32 \
+	| ba \
 	| be32 | be64 \
 	| bfin \
 	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| hexagon \
-	| i370 | i860 | i960 | ia64 \
+	| i370 | i860 | i960 | ia16 | ia64 \
 	| ip2k | iq2000 \
 	| k1om \
 	| le32 | le64 \
@@ -283,8 +283,10 @@
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipsr5900 | mipsr5900el \
@@ -299,10 +301,12 @@
 	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pru \
 	| pyramid \
+	| riscv32 | riscv64 \
 	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -310,6 +314,8 @@
 	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
+	| wasm32 \
 	| we32k \
 	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
@@ -324,6 +330,9 @@
 	c6x)
 		basic_machine=tic6x-unknown
 		;;
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
 	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
@@ -369,17 +378,18 @@
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
 	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| hexagon-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
+	| i*86-* | i860-* | i960-* | ia16-* | ia64-* \
 	| ip2k-* | iq2000-* \
 	| k1om-* \
 	| le32-* | le64-* \
@@ -401,8 +411,10 @@
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 	| mipsr5900-* | mipsr5900el-* \
@@ -418,13 +430,15 @@
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pru-* \
 	| pyramid-* \
+	| riscv32-* | riscv64-* \
 	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tile*-* \
@@ -432,6 +446,8 @@
 	| ubicom32-* \
 	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
 	| vax-* \
+	| visium-* \
+	| wasm32-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
@@ -508,6 +524,9 @@
 		basic_machine=i386-pc
 		os=-aros
 		;;
+	asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -628,6 +647,14 @@
 		basic_machine=m68k-bull
 		os=-sysv3
 		;;
+	e500v[12])
+		basic_machine=powerpc-unknown
+		os=$os"spe"
+		;;
+	e500v[12]-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=$os"spe"
+		;;
 	ebmon29k)
 		basic_machine=a29k-amd
 		os=-ebmon
@@ -769,6 +796,9 @@
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -824,6 +854,10 @@
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -916,6 +950,9 @@
 	nsr-tandem)
 		basic_machine=nsr-tandem
 		;;
+	nsx-tandem)
+		basic_machine=nsx-tandem
+		;;
 	op50n-* | op60c-*)
 		basic_machine=hppa1.1-oki
 		os=-proelf
@@ -1000,7 +1037,7 @@
 	ppc-* | ppcbe-*)
 		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
+	ppcle | powerpclittle)
 		basic_machine=powerpcle-unknown
 		;;
 	ppcle-* | powerpclittle-*)
@@ -1010,7 +1047,7 @@
 		;;
 	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
 		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+	ppc64le | powerpc64little)
 		basic_machine=powerpc64le-unknown
 		;;
 	ppc64le-* | powerpc64little-*)
@@ -1211,6 +1248,9 @@
 		basic_machine=a29k-wrs
 		os=-vxworks
 		;;
+	wasm32)
+		basic_machine=wasm32-unknown
+		;;
 	w65*)
 		basic_machine=w65-wdc
 		os=-none
@@ -1356,27 +1396,28 @@
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
 	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -bitrig* | -openbsd* | -solidbsd* \
+	      | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \
 	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
 	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \
 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
+	      | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
 	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
+	      | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1508,6 +1549,8 @@
 		;;
 	-nacl*)
 		;;
+	-ios)
+		;;
 	-none)
 		;;
 	*)
@@ -1602,6 +1645,9 @@
 		;;
 	sparc-* | *-sun)
 		os=-sunos4.1.1
+		;;
+	pru-*)
+		os=-elf
 		;;
 	*-be)
 		os=-beos
diff --git a/configure b/configure
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for Haskell network package 2.3.0.14.
+# Generated by GNU Autoconf 2.69 for Haskell network package 2.6.3.1.
 #
 # Report bugs to <libraries@haskell.org>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='Haskell network package'
 PACKAGE_TARNAME='network'
-PACKAGE_VERSION='2.3.0.14'
-PACKAGE_STRING='Haskell network package 2.3.0.14'
+PACKAGE_VERSION='2.6.3.1'
+PACKAGE_STRING='Haskell network package 2.6.3.1'
 PACKAGE_BUGREPORT='libraries@haskell.org'
 PACKAGE_URL=''
 
@@ -665,6 +665,7 @@
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -736,6 +737,7 @@
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -988,6 +990,15 @@
   | -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=* \
@@ -1125,7 +1136,7 @@
 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
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1238,7 +1249,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures Haskell network package 2.3.0.14 to adapt to many kinds of systems.
+\`configure' configures Haskell network package 2.6.3.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1278,6 +1289,7 @@
   --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]
@@ -1303,7 +1315,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of Haskell network package 2.3.0.14:";;
+     short | recursive ) echo "Configuration of Haskell network package 2.6.3.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1388,7 +1400,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-Haskell network package configure 2.3.0.14
+Haskell network package configure 2.6.3.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1860,7 +1872,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by Haskell network package $as_me 2.3.0.14, which was
+It was created by Haskell network package $as_me 2.6.3.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4609,7 +4621,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by Haskell network package $as_me 2.3.0.14, which was
+This file was extended by Haskell network package $as_me 2.6.3.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4671,7 +4683,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-Haskell network package config.status 2.3.0.14
+Haskell network package config.status 2.6.3.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT([Haskell network package], [2.3.0.14], [libraries@haskell.org], [network])
+AC_INIT([Haskell network package], [2.6.3.1], [libraries@haskell.org], [network])
 
 ac_includes_default="$ac_includes_default
 #ifdef HAVE_SYS_SOCKET_H
diff --git a/include/HsNet.h b/include/HsNet.h
--- a/include/HsNet.h
+++ b/include/HsNet.h
@@ -1,6 +1,6 @@
 /* -----------------------------------------------------------------------------
  *
- * Definitions for package `net' which are visible in Haskell land.
+ * Definitions for package `network' which are visible in Haskell land.
  *
  * ---------------------------------------------------------------------------*/
 
@@ -118,7 +118,7 @@
 #endif /* HAVE_WINSOCK2_H */
 
 INLINE char *
-my_inet_ntoa(
+hsnet_inet_ntoa(
 #if defined(HAVE_WINSOCK2_H)
              u_long addr
 #elif defined(HAVE_IN_ADDR_T)
@@ -129,7 +129,7 @@
              unsigned long addr
 #endif
 	    )
-{ 
+{
     struct in_addr a;
     a.s_addr = addr;
     return inet_ntoa(a);
diff --git a/include/HsNetworkConfig.h b/include/HsNetworkConfig.h
--- a/include/HsNetworkConfig.h
+++ b/include/HsNetworkConfig.h
@@ -160,7 +160,7 @@
 #define PACKAGE_NAME "Haskell network package"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "Haskell network package 2.3.0.14"
+#define PACKAGE_STRING "Haskell network package 2.6.3.1"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "network"
@@ -169,7 +169,7 @@
 #define PACKAGE_URL ""
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "2.3.0.14"
+#define PACKAGE_VERSION "2.6.3.1"
 
 /* Define to 1 if you have the ANSI C header files. */
 #define STDC_HEADERS 1
diff --git a/network.cabal b/network.cabal
--- a/network.cabal
+++ b/network.cabal
@@ -1,5 +1,5 @@
 name:           network
-version:        2.6.3.1
+version:        2.6.3.2
 license:        BSD3
 license-file:   LICENSE
 maintainer:     Kazu Yamamoto, Evan Borden
@@ -41,7 +41,7 @@
   cbits/winSockErr.c
 homepage:       https://github.com/haskell/network
 bug-reports:    https://github.com/haskell/network/issues
-tested-with:   GHC == 7.0.4, GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.1, GHC == 7.10.2, GHC == 8.0.1
+tested-with:   GHC == 7.8.4, GHC == 7.10.1, GHC == 7.10.2, GHC == 8.0.1, GHC == 8.0.2
 
 library
   exposed-modules:
diff --git a/tests/Regression.hs b/tests/Regression.hs
--- a/tests/Regression.hs
+++ b/tests/Regression.hs
@@ -9,8 +9,6 @@
 import Test.Framework.Providers.HUnit (testCase)
 import Test.HUnit (assertFailure)
 
-import qualified Regression.Issue215 as Issue215
-
 ------------------------------------------------------------------------
 -- Tests
 
@@ -51,7 +49,6 @@
     [ testCase "testGetAddrInfo" testGetAddrInfo
     , testCase "badRecvShouldThrow" badRecvShouldThrow
     , testCase "badSendShouldThrow" badSendShouldThrow
-    , testCase "recvShouldntThrowOnClosedSocket" Issue215.main
     ]
 
 ------------------------------------------------------------------------
diff --git a/tests/Simple.hs b/tests/Simple.hs
--- a/tests/Simple.hs
+++ b/tests/Simple.hs
@@ -12,6 +12,7 @@
 import Data.Maybe (fromJust)
 #endif
 import Network.Socket hiding (recv, recvFrom, send, sendTo)
+import qualified Network.Socket (recv)
 import Network.Socket.ByteString
 
 --- To tests for AF_CAN on Linux, you need to bring up a virtual (or real can
@@ -30,7 +31,7 @@
 #endif
 import Test.Framework (Test, defaultMain, testGroup)
 import Test.Framework.Providers.HUnit (testCase)
-import Test.HUnit (Assertion, (@=?))
+import Test.HUnit (Assertion, (@=?), assertBool, assertFailure)
 
 ------------------------------------------------------------------------
 
@@ -229,9 +230,35 @@
     serverSetup = clientSetup
 #endif
 
+-- The String version of 'recv' should throw an exception when the remote end
+-- has closed the connection, the ByteString version should return an empty
+-- ByteString.
+testStringEol :: Assertion
+testStringEol = tcpTest client close
+  where client s = do
+          res <- E.try $ Network.Socket.recv s 4096
+          case res of
+            Left (_ :: IOError) -> return ()
+            Right _ -> assertFailure
+              "String recv didn't throw an exception on a closed socket"
+
+testByteStringEol :: Assertion
+testByteStringEol = tcpTest client close
+  where client s = do
+          res :: Either IOError C.ByteString <- E.try $ recv s 4096
+          res @=? Right S.empty
+
 ------------------------------------------------------------------------
 -- Conversions of IP addresses
 
+testHtonlNtohl :: Assertion
+testHtonlNtohl = do
+    let addrl = 0xCafeBabe
+    addrl @=? (htonl . ntohl) addrl
+    addrl @=? (ntohl . htonl) addrl
+    assertBool "BE or LE byte order" $
+        ntohl addrl `elem` [0xCafeBabe, 0xbebafeca]
+
 testHostAddressToTuple :: Assertion
 testHostAddressToTuple = do
     -- Look up a numeric IPv4 host
@@ -287,10 +314,13 @@
     , testCase "testUserTimeout" testUserTimeout
 --    , testCase "testGetPeerCred" testGetPeerCred
 --    , testCase "testGetPeerEid" testGetPeerEid
+    , testCase "testStringEol" testStringEol
+    , testCase "testByteStringEol" testByteStringEol
 #if defined(HAVE_LINUX_CAN_H)
     , testCase "testCanSend" testCanSend
 #endif
       -- conversions of IP addresses
+    , testCase "testHtonlNtohl" testHtonlNtohl
     , testCase "testHostAddressToTuple" testHostAddressToTuple
     , testCase "testHostAddressToTupleInv" testHostAddressToTupleInv
 #if defined(IPV6_SOCKET_SUPPORT)
@@ -314,7 +344,7 @@
     case sockAddr of
         (SockAddrInet port _) -> return port
         (SockAddrInet6 port _ _ _) -> return port
-        _ -> error "getPeerPort: only works with IP sockets"
+        _ -> ioError $ userError "getPeerPort: only works with IP sockets"
 
 -- | Establish a connection between client and server and then run
 -- 'clientAct' and 'serverAct', in different threads.  Both actions
