module Main where import Control.Monad import Network.Socket import System.Environment (getArgs) import System.Exit (exitSuccess) import System.IO (hPutStrLn, hGetLine, hFlush, Handle, IOMode(ReadWriteMode), hSetBuffering, BufferMode(LineBuffering), stdin, stdout) help :: IO a help = putStrLn "Usage: MutualAuthClient socketfile" >> exitSuccess getSocketFile :: IO String getSocketFile = do args <- getArgs case args of [] -> help [x] -> return x _ -> help main :: IO b main = do socketName <- getSocketFile s <- socket AF_UNIX Stream 0 connect s (SockAddrUnix socketName) h <- socketToHandle s ReadWriteMode hSetBuffering h LineBuffering forever $ interactOnHandle h whileM :: IO Bool -> IO () -> IO () whileM p v = p >>= \b -> if b then v >> whileM p v else return () interactOnHandle :: Handle -> IO () interactOnHandle h = putStrLn "Listening." >> transput stdin h >> putStrLn "Receiving." >> transput h stdout >> interactOnHandle h transput :: Handle -> Handle -> IO () transput from to = do l <- hGetLine from hPutStrLn to l if l == "." then hFlush to else transput from to