bein-0.1: Bein/BeinClient.hs
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