c5f8906814d463fba527020689542adacccd3ce1
[packages/unix.git] / System / Posix / Temp / ByteString.hsc
1 {-# LANGUAGE ForeignFunctionInterface #-}
2 #if __GLASGOW_HASKELL__ >= 701
3 {-# LANGUAGE Trustworthy #-}
4 #endif
5 -----------------------------------------------------------------------------
6 -- |
7 -- Module      :  System.Posix.Temp.ByteString
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.ByteString (
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        (Handle)
34 import System.Posix.IO
35 import System.Posix.Types
36
37 import Foreign.C hiding (
38      throwErrnoPath,
39      throwErrnoPathIf,
40      throwErrnoPathIf_,
41      throwErrnoPathIfNull,
42      throwErrnoPathIfMinus1,
43      throwErrnoPathIfMinus1_ )
44
45 import System.Posix.ByteString.FilePath
46
47 import Data.ByteString (ByteString)
48
49
50 -- |'mkstemp' - make a unique filename and open it for
51 -- reading\/writing (only safe on GHC & Hugs).
52 -- The returned 'RawFilePath' is the (possibly relative) path of
53 -- the created file, which is padded with 6 random characters.
54 mkstemp :: ByteString -> IO (RawFilePath, Handle)
55 mkstemp template = do
56 #if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
57   withFilePath template $ \ ptr -> do
58     fd <- throwErrnoIfMinus1 "mkstemp" (c_mkstemp ptr)
59     name <- peekFilePath ptr
60     h <- fdToHandle (Fd fd)
61     return (name, h)
62 #else
63   name <- mktemp (template ++ "XXXXXX")
64   h <- openFile name ReadWriteMode
65   return (name, h)
66
67 -- |'mktemp' - make a unique file name
68 -- This function should be considered deprecated
69
70 mktemp :: ByteString -> IO RawFilePath
71 mktemp template = do
72   withFilePath template $ \ ptr -> do
73     ptr <- throwErrnoIfNull "mktemp" (c_mktemp ptr)
74     peekFilePath ptr
75
76 foreign import ccall unsafe "mktemp"
77   c_mktemp :: CString -> IO CString
78 #endif
79
80 foreign import ccall unsafe "HsUnix.h __hscore_mkstemp"
81   c_mkstemp :: CString -> IO CInt
82