module Network.TCPInfo where
import Data.List
import Network.Socket
import System.IO
data TCPInfo = TCPInfo {
myAddr :: HostName
, myPort :: ServiceName
, peerAddr :: HostName
, peerPort :: ServiceName
} deriving (Eq,Show)
accept :: Socket -> IO (Handle, TCPInfo)
accept sock = do
(sock', sockaddr) <- Network.Socket.accept sock
let getInfo = getNameInfo [NI_NUMERICHOST, NI_NUMERICSERV] True True
(Just vMyAddr, Just vMyPort) <- getSocketName sock' >>= getInfo
(Just vPeerAddr, Just vPeerPort) <- getInfo sockaddr
hdl <- socketToHandle sock' ReadWriteMode
let info = TCPInfo { myAddr = strip vMyAddr
, myPort = vMyPort
, peerAddr = strip vPeerAddr
, peerPort = vPeerPort}
return (hdl, info)
where
strip x
| "::ffff:" `isPrefixOf` x = drop 7 x
| otherwise = x