    module Network.Socks5.Lowlevel
        ( resolveToSockAddr
        , socksListen
        -- * lowlevel types
        , module Network.Socks5.Wire
        , module Network.Socks5.Command
        ) where

    import Network.Socket
    import Network.BSD
    import Network.Socks5.Command
    import Network.Socks5.Wire
    import Network.Socks5.Types
    import qualified Data.ByteString.Char8 as BC

    resolveToSockAddr :: SocksAddress -> IO SockAddr
    resolveToSockAddr (SocksAddress sockHostAddr port) =
        case sockHostAddr of
            SocksAddrIPV4 ha       -> return $ SockAddrInet port ha
            SocksAddrIPV6 ha6      -> return $ SockAddrInet6 port 0 ha6 0
            SocksAddrDomainName bs -> do he <- getHostByName (BC.unpack bs)
                                         return $ SockAddrInet port (hostAddress he)

    socksListen :: Socket -> IO SocksRequest
    socksListen sock = do
        hello <- waitSerialized sock
        case getSocksHelloMethods hello of
            _ -> do sendSerialized sock (SocksHelloResponse SocksMethodNone)
                    waitSerialized sock