fix breakage in wormhole's sendFile
authorJoey Hess <joeyh@joeyh.name>
Mon, 26 Sep 2022 19:26:29 +0000 (15:26 -0400)
committerJoey Hess <joeyh@joeyh.name>
Mon, 26 Sep 2022 19:26:29 +0000 (15:26 -0400)
Commit ff0927bde98e7b7fd4a7ef49b61b8770c6df294d broke this, it made it
try to read all of the input before looking for the code. But, wormhole
keeps running until it sends the file, so that caused a deadlock. Oops.

Sponsored-by: Luke Shumaker on Patreon
Utility/MagicWormhole.hs

index a4128d1d5c0329ef2dcae6759e7e7cc143359905..8aa950ef7d1bf0d713026565cd310139619e83a8 100644 (file)
@@ -120,16 +120,21 @@ sendFile f (CodeObserver observer) ps = do
                return (inout || inerr)
   where
        p = wormHoleProcess (ps ++ [Param "send", File f])
-       findcode ph h = findcode' =<< getwords ph h []
+       findcode ph h = hGetLineUntilExitOrEOF ph h >>= \case
+               Nothing -> return False
+               Just l -> ifM (findcode' (words l))
+                       ( drain ph h >> return True
+                       , findcode ph h
+                       )
        findcode' [] = return False
        findcode' (w:ws) = case mkCode w of
                Just code -> do
                        _ <- tryPutMVar observer code
                        return True
                Nothing -> findcode' ws
-       getwords ph h c = hGetLineUntilExitOrEOF ph h >>= \case
-               Nothing -> return $ concatMap words $ reverse c
-               Just l -> getwords ph h (l:c)
+       drain ph h = hGetLineUntilExitOrEOF ph h >>= \case
+               Just _ -> drain ph h
+               Nothing -> return ()
 
 -- | Receives a file. Once the receive is under way, the Code will be
 -- read from the CodeProducer, and fed to wormhole on stdin.