64 lines
1.8 KiB
Haskell
64 lines
1.8 KiB
Haskell
{-# LANGUAGE CPP #-}
|
|
#if __GLASGOW_HASKELL__ >= 709
|
|
{-# LANGUAGE Safe #-}
|
|
#else
|
|
{-# LANGUAGE Trustworthy #-}
|
|
#endif
|
|
-----------------------------------------------------------------------------
|
|
-- |
|
|
-- Module : System.Posix.Error
|
|
-- Copyright : (c) The University of Glasgow 2002
|
|
-- License : BSD-style (see the file libraries/base/LICENSE)
|
|
--
|
|
-- Maintainer : libraries@haskell.org
|
|
-- Stability : provisional
|
|
-- Portability : non-portable (requires POSIX)
|
|
--
|
|
-- POSIX error support
|
|
--
|
|
-----------------------------------------------------------------------------
|
|
|
|
module System.Posix.Error (
|
|
throwErrnoPath,
|
|
throwErrnoPathIf,
|
|
throwErrnoPathIf_,
|
|
throwErrnoPathIfRetry,
|
|
throwErrnoPathIfNull,
|
|
throwErrnoPathIfNullRetry,
|
|
throwErrnoPathIfMinus1,
|
|
throwErrnoPathIfMinus1_,
|
|
throwErrnoPathIfMinus1Retry,
|
|
throwErrnoPathIfMinus1Retry_
|
|
) where
|
|
|
|
import Foreign hiding (void)
|
|
import Foreign.C
|
|
import Control.Monad
|
|
|
|
throwErrnoPathIfMinus1Retry :: (Eq a, Num a)
|
|
=> String -> FilePath -> IO a -> IO a
|
|
throwErrnoPathIfMinus1Retry loc path f =
|
|
throwErrnoPathIfRetry (== -1) loc path f
|
|
|
|
throwErrnoPathIfMinus1Retry_ :: (Eq a, Num a)
|
|
=> String -> FilePath -> IO a -> IO ()
|
|
throwErrnoPathIfMinus1Retry_ loc path f =
|
|
void $ throwErrnoPathIfRetry (== -1) loc path f
|
|
|
|
throwErrnoPathIfNullRetry :: String -> FilePath -> IO (Ptr a) -> IO (Ptr a)
|
|
throwErrnoPathIfNullRetry loc path f =
|
|
throwErrnoPathIfRetry (== nullPtr) loc path f
|
|
|
|
throwErrnoPathIfRetry :: (a -> Bool) -> String -> FilePath -> IO a -> IO a
|
|
throwErrnoPathIfRetry pr loc path f =
|
|
do
|
|
res <- f
|
|
if pr res
|
|
then do
|
|
err <- getErrno
|
|
if err == eINTR
|
|
then throwErrnoPathIfRetry pr loc path f
|
|
else throwErrnoPath loc path
|
|
else return res
|
|
|