- System.Posix.Internals.FDType.RawDevice: new constructor.
- System.Posix.Internals.fdType: map block devices to RawDevice
(but left character devices as still being Streams).
- GHC.IOBase.isReadWriteHandleType: new HandleType predicate.
- GHC.Handle.hIsSeekable: RawDevices are seekable.
- GHC.Handle.openFd: handle RawDevices.
=> opening of block devices via std IO opening actions
(open{Binary}File, openFd etc.) should now work better.
Merge to STABLE.
ioException (IOError Nothing InappropriateType "openFile"
"is a directory" Nothing)
- Stream
- | ReadWriteHandle <- ha_type -> mkDuplexHandle fd is_socket filepath binary
- | otherwise -> mkFileHandle fd is_socket filepath ha_type binary
-
-- regular files need to be locked
RegularFile -> do
#ifndef mingw32_HOST_OS
"file is locked" Nothing)
#endif
mkFileHandle fd is_socket filepath ha_type binary
-
+ -- Stream or RawDevice
+ Stream -> mkIt ha_type
+ RawDevice -> mkIt ha_type
+ _ ->
+ ioException (IOError Nothing UnsupportedOperation "openFd"
+ "unknown file type" Nothing)
+ where
+ mkIt ht
+ | isReadWriteHandleType ht = mkDuplexHandle fd is_socket filepath binary
+ | otherwise = mkFileHandle fd is_socket filepath ht binary
fdToHandle :: FD -> IO Handle
fdToHandle fd = do
SemiClosedHandle -> ioe_closedHandle
AppendHandle -> return False
_ -> do t <- fdType (haFD handle_)
- return (t == RegularFile
- && (haIsBin handle_
- || tEXT_MODE_SEEK_ALLOWED))
+ return ((t == RegularFile || t == RawDevice)
+ && (haIsBin handle_ || tEXT_MODE_SEEK_ALLOWED))
-- -----------------------------------------------------------------------------
-- Changing echo status (Non-standard GHC extensions)
-- Handles, file descriptors,
FilePath,
Handle(..), Handle__(..), HandleType(..), IOMode(..), FD,
- isReadableHandleType, isWritableHandleType, showHandle,
+ isReadableHandleType, isWritableHandleType, isReadWriteHandleType, showHandle,
-- Buffers
Buffer(..), RawBuffer, BufferState(..), BufferList(..), BufferMode(..),
isWritableHandleType ReadWriteHandle = True
isWritableHandleType _ = False
+isReadWriteHandleType ReadWriteHandle{} = True
+isReadWriteHandleType _ = False
+
-- | File and directory names are values of type 'String', whose precise
-- meaning is operating system dependent. Files can be opened, yielding a
-- handle which can then be used to operate on the contents of that file.
c_size <- st_size p_stat :: IO COff
return (fromIntegral c_size)
-data FDType = Directory | Stream | RegularFile
+data FDType = Directory | Stream | RegularFile | RawDevice
deriving (Eq)
fileType :: FilePath -> IO FDType
| s_isfifo c_mode || s_issock c_mode || s_ischr c_mode
-> return Stream
| s_isreg c_mode -> return RegularFile
+ -- Q: map char devices to RawDevice too?
+ | s_isblk c_mode -> return RawDevice
| otherwise -> ioError ioe_unknownfiletype