Never close std file descriptors. This works around a "problem" in
GHCi: if the program reaches EOF on stdin, it might close it, which in
turn causes the interactive shell to fall over with a "bad file
descriptor" error when it tries to read from stdin.
#undef DEBUG
-- -----------------------------------------------------------------------------
#undef DEBUG
-- -----------------------------------------------------------------------------
--- $Id: PrelHandle.hs,v 1.8 2001/12/27 11:30:10 sof Exp $
+-- $Id: PrelHandle.hs,v 1.9 2002/01/28 13:47:05 simonmar Exp $
--
-- (c) The University of Glasgow, 1994-2001
--
--
-- (c) The University of Glasgow, 1994-2001
--
case haType handle_ of
ClosedHandle -> return handle_
_ -> do
case haType handle_ of
ClosedHandle -> return handle_
_ -> do
- let fd = fromIntegral (haFD handle_)
+ let fd = haFD handle_
+ c_fd = fromIntegral fd
+
flushWriteBufferOnly handle_
flushWriteBufferOnly handle_
- -- close the file descriptor, but not when this is the read side
- -- of a duplex handle.
+ -- close the file descriptor, but not when this is the read
+ -- side of a duplex handle, and not when this is one of the
+ -- std file handles.
case haOtherSide handle_ of
case haOtherSide handle_ of
- Nothing -> throwErrnoIfMinus1Retry_ "hClose"
+ Nothing ->
+ when (fd /= fd_stdin && fd /= fd_stdout && fd /= fd_stderr) $
+ throwErrnoIfMinus1Retry_ "hClose"
- (closeFd (haIsStream handle_) fd)
+ (closeFd (haIsStream handle_) c_fd)
#endif
Just _ -> return ()
#endif
Just _ -> return ()
writeIORef (haBuffers handle_) BufferListNil
-- unlock it
writeIORef (haBuffers handle_) BufferListNil
-- unlock it
-- we must set the fd to -1, because the finalizer is going
-- to run eventually and try to close/unlock it.
-- we must set the fd to -1, because the finalizer is going
-- to run eventually and try to close/unlock it.