summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/Plugins/PipeReader.hs16
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