import Foreign
import Foreign.C
-import Data.Bits
+-- import Data.Bits
import Data.Maybe
#if !defined(HTYPE_TCFLAG_T)
#endif
#ifdef __HUGS__
-{-# CFILES cbits/PrelIOUtils.c cbits/dirUtils.c cbits/consUtils.c #-}
+{-# CFILES cbits/PrelIOUtils.c cbits/consUtils.c #-}
#endif
-- ---------------------------------------------------------------------------
-- Types
-type CDir = ()
-type CDirent = ()
type CFLock = ()
type CGroup = ()
type CLconv = ()
-- ---------------------------------------------------------------------------
-- Turning on non-blocking for a file descriptor
-setNonBlockingFD :: FD -> IO ()
+setNonBlockingFD :: FD -> Bool -> IO ()
#if !defined(mingw32_HOST_OS) && !defined(__MINGW32__)
-setNonBlockingFD fd = do
+setNonBlockingFD fd set = do
flags <- throwErrnoIfMinus1Retry "setNonBlockingFD"
(c_fcntl_read fd const_f_getfl)
-- An error when setting O_NONBLOCK isn't fatal: on some systems
-- there are certain file handles on which this will fail (eg. /dev/null
-- on FreeBSD) so we throw away the return code from fcntl_write.
- unless (testBit flags (fromIntegral o_NONBLOCK)) $ do
- c_fcntl_write fd const_f_setfl (fromIntegral (flags .|. o_NONBLOCK))
+ let flags' | set = flags .|. o_NONBLOCK
+ | otherwise = flags .&. complement o_NONBLOCK
+ unless (flags == flags') $ do
+ c_fcntl_write fd const_f_setfl (fromIntegral flags')
return ()
#else
-- bogus defns for win32
-setNonBlockingFD _ = return ()
+setNonBlockingFD _ _ = return ()
#endif
foreign import ccall unsafe "HsBase.h close"
c_close :: CInt -> IO CInt
-foreign import ccall unsafe "HsBase.h closedir"
- c_closedir :: Ptr CDir -> IO CInt
-
foreign import ccall unsafe "HsBase.h creat"
c_creat :: CString -> CMode -> IO CInt
foreign import ccall unsafe "__hscore_open"
c_open :: CFilePath -> CInt -> CMode -> IO CInt
-foreign import ccall unsafe "HsBase.h opendir"
- c_opendir :: CString -> IO (Ptr CDir)
-
-foreign import ccall unsafe "HsBase.h __hscore_mkdir"
- mkdir :: CString -> CInt -> IO CInt
-
foreign import ccall unsafe "HsBase.h read"
- c_read :: CInt -> Ptr CChar -> CSize -> IO CSsize
+ c_read :: CInt -> Ptr Word8 -> CSize -> IO CSsize
-foreign import ccall unsafe "HsBase.h rewinddir"
- c_rewinddir :: Ptr CDir -> IO ()
+foreign import ccall safe "read"
+ c_safe_read :: CInt -> Ptr Word8 -> CSize -> IO CSsize
foreign import ccall unsafe "__hscore_stat"
c_stat :: CFilePath -> Ptr CStat -> IO CInt
c_umask :: CMode -> IO CMode
foreign import ccall unsafe "HsBase.h write"
- c_write :: CInt -> Ptr CChar -> CSize -> IO CSsize
+ c_write :: CInt -> Ptr Word8 -> CSize -> IO CSsize
+
+foreign import ccall safe "write"
+ c_safe_write :: CInt -> Ptr Word8 -> CSize -> IO CSsize
foreign import ccall unsafe "HsBase.h __hscore_ftruncate"
c_ftruncate :: CInt -> COff -> IO CInt
c_waitpid :: CPid -> Ptr CInt -> CInt -> IO CPid
#endif
--- traversing directories
-foreign import ccall unsafe "dirUtils.h __hscore_readdir"
- readdir :: Ptr CDir -> Ptr (Ptr CDirent) -> IO CInt
-
-foreign import ccall unsafe "HsBase.h __hscore_free_dirent"
- freeDirEnt :: Ptr CDirent -> IO ()
-
-foreign import ccall unsafe "HsBase.h __hscore_end_of_dir"
- end_of_dir :: CInt
-
-foreign import ccall unsafe "HsBase.h __hscore_d_name"
- d_name :: Ptr CDirent -> IO CString
-
-- POSIX flags only:
foreign import ccall unsafe "HsBase.h __hscore_o_rdonly" o_RDONLY :: CInt
foreign import ccall unsafe "HsBase.h __hscore_o_wronly" o_WRONLY :: CInt