import qualified System.Miniplex as MP import System.Environment import System.Exit import System.IO import System.Posix.Process import System.Posix.Signals usage :: IO () usage = do self <- getProgName hPutStr stderr $ "Usage: " ++ self ++ " TAG\n" exitFailure main :: IO () main = do installHandler floatingPointException (Catch (raiseSignal internalAbort)) Nothing installHandler openEndedPipe Ignore Nothing args <- getArgs case args of [tag] -> MP.withSink tag service _ -> usage service :: MP.Sink -> IO () service s = do mapM_ (\x -> installHandler x (Catch (hdl x)) Nothing) signals t <- getContents mapM_ (MP.write s) (lines t) where hdl sig = do MP.destroy s installHandler sig Default Nothing raiseSignal sig exitImmediately (ExitFailure 127) signals = [sigINT, sigALRM, sigTERM, sigUSR1, sigUSR2]