module Main where
import Control.Monad
import Control.Concurrent
import System.IO
import Control.Applicative
import Control.Exception (handle)
import System.Posix.Signals
import Network(listenOn, PortID(..))
import Network.Socket
import System.IO
import System.IO.Error (isEOFError)

sGetLine :: Socket -> IO String
sGetLine s = reverse <$> go []
    where go xs = do
            (x,n) <- recvLen s 1
            if x == "\n" || n <= 0
               then return xs
               else go $ x++xs

listenSock :: Socket -> IO ThreadId
listenSock sk = forkIO . forever $ handle (\e -> print e) $ do
           (resp,_) <- accept sk
           forkIO . forever $ sGetLine resp >>= putStrLn
           return ()

main :: IO ()
main = do
  installHandler sigPIPE Ignore Nothing
  sk <- listenOn $ PortNumber 9020
  listenSock sk
  forever $ threadDelay 1000000
