{-# LANGUAGE CPP #-} {-# LANGUAGE ForeignFunctionInterface #-} {-| This module makes the operations exported by @System.Posix.Temp@ available on all platforms. On POSIX systems it re-exports operations from @System.Posix.Temp@, on other platforms it emulates the operations as far as possible. -} module System.PosixCompat.Temp ( mkstemp ) where #ifndef mingw32_HOST_OS -- Re-export unix package import System.Posix.Temp #elif defined(__GLASGOW_HASKELL__) -- Windows w/ GHC, we have fdToHandle so we -- can use our own implementation of mkstemp. import System.IO (Handle) import Foreign.C (CInt(..), CString, withCString, peekCString, throwErrnoIfMinus1) import GHC.IO.Handle.FD (fdToHandle) -- | 'mkstemp' - make a unique filename and open it for -- reading\/writing. -- The returned 'FilePath' is the (possibly relative) path of -- the created file, which is padded with 6 random characters. mkstemp :: String -> IO (FilePath, Handle) mkstemp template = do withCString template $ \ ptr -> do fd <- throwErrnoIfMinus1 "mkstemp" (c_mkstemp ptr) name <- peekCString ptr h <- fdToHandle (fromIntegral fd) return (name, h) foreign import ccall unsafe "unixcompat_mkstemp" c_mkstemp :: CString -> IO CInt #else -- Windows w/o GHC, we don't have fdToHandle :( import System.IO (Handle) import System.IO.Error (mkIOError, illegalOperationErrorType) mkstemp :: String -> IO (FilePath, Handle) mkstemp _ = ioError $ mkIOError illegalOperationErrorType x Nothing Nothing where x = "System.PosixCompat.Temp.mkstemp: not supported" #endif