packages feed

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