aboutsummaryrefslogtreecommitdiffhomepage
path: root/System/Posix/Temp.hsc
diff options
context:
space:
mode:
Diffstat (limited to 'System/Posix/Temp.hsc')
-rw-r--r--System/Posix/Temp.hsc28
1 files changed, 20 insertions, 8 deletions
diff --git a/System/Posix/Temp.hsc b/System/Posix/Temp.hsc
index 8ab789c..b40e513 100644
--- a/System/Posix/Temp.hsc
+++ b/System/Posix/Temp.hsc
@@ -6,9 +6,10 @@
-- |
-- Module : System.Posix.Temp
-- Copyright : (c) Volker Stolz <vs@foldr.org>
+-- Deian Stefan <deian@cs.stanford.edu>
-- License : BSD-style (see the file libraries/base/LICENSE)
--
--- Maintainer : libraries@haskell.org
+-- Maintainer : libraries@haskell.org, vs@foldr.org, deian@cs.stanford.edu
-- Stability : provisional
-- Portability : non-portable (requires POSIX)
--
@@ -22,6 +23,7 @@ module System.Posix.Temp (
#include "HsUnix.h"
+import Control.Exception (throwIO)
import System.IO
import System.Posix.IO
import System.Posix.Types
@@ -70,6 +72,10 @@ mkstemp template' = do
#endif
#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
+foreign import ccall unsafe "HsUnix.h __hscore_mkstemp"
+ c_mkstemp :: CString -> IO CInt
+#endif
+
-- |'mkstemps' - make a unique filename with a given prefix and suffix
-- and open it for reading\/writing (only safe on GHC & Hugs).
-- The returned 'FilePath' is the (possibly relative) path of
@@ -77,6 +83,7 @@ mkstemp template' = do
-- the prefix and suffix.
mkstemps :: String -> String -> IO (FilePath, Handle)
mkstemps prefix suffix = do
+#if HAVE_MKSTEMPS
let template = prefix ++ "XXXXXX" ++ suffix
lenOfsuf :: CInt
lenOfsuf = fromIntegral $ length suffix
@@ -85,7 +92,11 @@ mkstemps prefix suffix = do
name <- peekFilePath ptr
h <- fdToHandle (Fd fd)
return (name, h)
+#else
+ throwIO . userError $ "mkstemps: System does not have a mkstemp C function."
+#endif
+#if HAVE_MKSTEMPS
foreign import ccall unsafe "HsUnix.h __hscore_mkstemps"
c_mkstemps :: CString -> CInt -> IO CInt
#endif
@@ -99,7 +110,7 @@ foreign import ccall unsafe "HsUnix.h __hscore_mkstemps"
mkdtemp :: String -> IO FilePath
mkdtemp template' = do
let template = template' ++ "XXXXXX"
-#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
+#if HAVE_MKDTEMP
withFilePath template $ \ ptr -> do
_ <- throwErrnoIfNull "mkdtemp" (c_mkdtemp ptr)
name <- peekFilePath ptr
@@ -108,7 +119,14 @@ mkdtemp template' = do
name <- mktemp template
h <- createDirectory name (toEnum 0o700)
return name
+#endif
+
+#if HAVE_MKDTEMP
+foreign import ccall unsafe "HsUnix.h __hscore_mkdtemp"
+ c_mkdtemp :: CString -> IO CString
+#endif
+#if (!defined(__GLASGOW_HASKELL__) && !defined(__HUGS__)) || !HAVE_MKDTEMP
-- | Make a unique file name It is required that the template have six trailing
-- \'X\'s. This function should be considered deprecated.
{-# WARNING mktemp "This function is unsafe; use mkstemp instead" #-}
@@ -122,9 +140,3 @@ foreign import ccall unsafe "mktemp"
c_mktemp :: CString -> IO CString
#endif
-foreign import ccall unsafe "HsUnix.h __hscore_mkstemp"
- c_mkstemp :: CString -> IO CInt
-
-foreign import ccall unsafe "HsUnix.h __hscore_mkdtemp"
- c_mkdtemp :: CString -> IO CString
-