a55d5fea17aa262ed26c07517994abb8e6640e80
[packages/unix.git] / System / Posix / Temp.hsc
1 {-# LANGUAGE ForeignFunctionInterface #-}
2 #if __GLASGOW_HASKELL__ >= 701
3 {-# LANGUAGE Trustworthy #-}
4 #endif
5 -----------------------------------------------------------------------------
6 -- |
7 -- Module      :  System.Posix.Temp
8 -- Copyright   :  (c) Volker Stolz <vs@foldr.org>
9 -- License     :  BSD-style (see the file libraries/base/LICENSE)
10 --
11 -- Maintainer  :  vs@foldr.org
12 -- Stability   :  provisional
13 -- Portability :  non-portable (requires POSIX)
14 --
15 -- POSIX environment support
16 --
17 -----------------------------------------------------------------------------
18
19 module System.Posix.Temp (
20
21     mkstemp
22
23 {- Not ported (yet?):
24     tmpfile: can we handle FILE*?
25     tmpnam: ISO C, should go in base?
26     tempname: dito
27 -}
28
29 ) where
30
31 #include "HsUnix.h"
32
33 import System.IO
34 import System.Posix.IO
35 import System.Posix.Types
36 import Foreign.C
37
38 #if __GLASGOW_HASKELL__ > 700
39 import System.Posix.Internals (withFilePath, peekFilePath)
40 #elif __GLASGOW_HASKELL__ > 611
41 import System.Posix.Internals (withFilePath)
42
43 peekFilePath :: CString -> IO FilePath
44 peekFilePath = peekCString
45 #else
46 withFilePath :: FilePath -> (CString -> IO a) -> IO a
47 withFilePath = withCString
48
49 peekFilePath :: CString -> IO FilePath
50 peekFilePath = peekCString
51 #endif
52
53 -- |'mkstemp' - make a unique filename and open it for
54 -- reading\/writing (only safe on GHC & Hugs).
55 -- The returned 'FilePath' is the (possibly relative) path of
56 -- the created file, which is padded with 6 random characters.
57 mkstemp :: String -> IO (FilePath, Handle)
58 mkstemp template = do
59 #if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
60   withFilePath template $ \ ptr -> do
61     fd <- throwErrnoIfMinus1 "mkstemp" (c_mkstemp ptr)
62     name <- peekFilePath ptr
63     h <- fdToHandle (Fd fd)
64     return (name, h)
65 #else
66   name <- mktemp (template ++ "XXXXXX")
67   h <- openFile name ReadWriteMode
68   return (name, h)
69
70 -- |'mktemp' - make a unique file name
71 -- This function should be considered deprecated
72
73 mktemp :: String -> IO String
74 mktemp template = do
75   withFilePath template $ \ ptr -> do
76     ptr <- throwErrnoIfNull "mktemp" (c_mktemp ptr)
77     peekFilePath ptr
78
79 foreign import ccall unsafe "mktemp"
80   c_mktemp :: CString -> IO CString
81 #endif
82
83 foreign import ccall unsafe "HsUnix.h __hscore_mkstemp"
84   c_mkstemp :: CString -> IO CInt
85