diff options
| -rw-r--r-- | src/Plugins/PipeReader.hs | 16 | 
1 files changed, 15 insertions, 1 deletions
| diff --git a/src/Plugins/PipeReader.hs b/src/Plugins/PipeReader.hs index 42ae500..7efea60 100644 --- a/src/Plugins/PipeReader.hs +++ b/src/Plugins/PipeReader.hs @@ -16,6 +16,10 @@ module Plugins.PipeReader where  import System.IO  import Plugins +import System.Posix.Files +import Control.Concurrent(threadDelay) +import Control.Exception +import Control.Monad(when)  data PipeReader = PipeReader String String      deriving (Read, Show) @@ -24,11 +28,21 @@ instance Exec PipeReader where      alias (PipeReader _ a)    = a      start (PipeReader p _) cb = do          let (def, pipe) = split ':' p +        when (not $ null def) (cb def) +        checkPipe pipe          h <- openFile pipe ReadWriteMode -        cb def          forever (hGetLineSafe h >>= cb)        where          forever a = a >> forever a          split c xs | c `elem` xs = let (pre, post) = span ((/=) c) xs                                     in (pre, dropWhile ((==) c) post)                     | otherwise   = ([], xs) + +checkPipe :: FilePath -> IO () +checkPipe file = do +    handle (\(SomeException _) -> waitForPipe) $ do +    status <- getFileStatus file +    if isNamedPipe status +      then return () +      else waitForPipe +    where waitForPipe = threadDelay 1000 >> checkPipe file | 
