-{-# OPTIONS_GHC -fno-implicit-prelude -#include "HsBase.h" #-}
+{-# LANGUAGE CPP, NoImplicitPrelude, ForeignFunctionInterface #-}
+{-# OPTIONS_GHC -#include "HsBase.h" #-}
+
-----------------------------------------------------------------------------
-- |
-- Module : Foreign.C.Error
#include "HsBaseConfig.h"
#endif
--- system dependent imports
--- ------------------------
-
--- GHC allows us to get at the guts inside IO errors/exceptions
---
-#if __GLASGOW_HASKELL__
-import GHC.IOBase (IOException(..), IOErrorType(..))
-#endif /* __GLASGOW_HASKELL__ */
-
-
--- regular imports
--- ---------------
-
-import Foreign.Storable
import Foreign.Ptr
import Foreign.C.Types
import Foreign.C.String
import Data.Maybe
#if __GLASGOW_HASKELL__
-import GHC.IOBase
+import GHC.IO
+import GHC.IO.Exception
+import GHC.IO.Handle.Types
import GHC.Num
import GHC.Base
#elif __HUGS__
import System.IO ( Handle )
import System.IO.Error ( IOError, ioError )
import System.IO.Unsafe ( unsafePerformIO )
+import Foreign.Storable ( Storable(poke,peek) )
#endif
#ifdef __HUGS__
else throwErrno loc
else return res
--- | as 'throwErrnoIfRetry', but checks for operations that would block and
--- executes an alternative action before retrying in that case.
+-- | as 'throwErrnoIfRetry', but additionally if the operation
+-- yields the error code 'eAGAIN' or 'eWOULDBLOCK', an alternative
+-- action is executed before retrying.
--
throwErrnoIfRetryMayBlock
:: (a -> Bool) -- ^ predicate to apply to the result value
if err == eINTR
then throwErrnoIfRetryMayBlock pred loc f on_block
else if err == eWOULDBLOCK || err == eAGAIN
- then do on_block; throwErrnoIfRetryMayBlock pred loc f on_block
+ then do _ <- on_block
+ throwErrnoIfRetryMayBlock pred loc f on_block
else throwErrno loc
else return res
-- conversion of an "errno" value into IO error
-- --------------------------------------------
--- | Construct a Haskell 98 I\/O error based on the given 'Errno' value.
+-- | Construct an 'IOError' based on the given 'Errno' value.
-- The optional information can be used to improve the accuracy of
-- error messages.
--
errnoToIOError loc errno maybeHdl maybeName = unsafePerformIO $ do
str <- strerror errno >>= peekCString
#if __GLASGOW_HASKELL__
- return (IOError maybeHdl errType loc str maybeName)
+ return (IOError maybeHdl errType loc str (Just errno') maybeName)
where
+ Errno errno' = errno
errType
| errno == eOK = OtherError
| errno == e2BIG = ResourceExhausted