avoid throwing exception when the handle is closed

The handle could get closed eg, by cleanupProcess being called,
which forces the process to exit and closes all its handles.

At this point, the test case in https://git-annex.branchable.com/bugs/Buggy_external_special_remote_stalls_after_7245a9e/
is fixed.
This commit is contained in:
Joey Hess 2020-11-18 15:10:35 -04:00
parent b021e2322f
commit 682829c200
No known key found for this signature in database
GPG key ID: DB12DB0FF05F8F38

View file

@ -232,8 +232,8 @@ cleanupProcess (mb_stdin, mb_stdout, mb_stderr, pid) = do
#endif
{- | Like hGetLine, reads a line from the Handle. Returns Nothing if end of
- file is reached, or if the process has exited and there is nothing more
- buffered to read from the handle.
- file is reached, or the handle is closed, or if the process has exited
- and there is nothing more buffered to read from the handle.
-
- This is useful to protect against situations where the process might
- have transferred the handle being read to another process, and so
@ -284,9 +284,14 @@ hGetLineUntilExitOrEOF ph h = go []
waitforinputorerror t = hWaitForInput h t
`catchNonAsync` const (pure True)
getchar = catchIOErrorType EOF
(const (pure Nothing))
(Just <$> hGetChar h)
getchar =
catcherr EOF $
-- If the handle is closed, reading from it is
-- an IllegalOperation.
catcherr IllegalOperation $
Just <$> hGetChar h
where
catcherr t = catchIOErrorType t (const (pure Nothing))
getloop buf cont =
getchar >>= \case