mkstemps
authorDeian Stefan <deian@cs.stanford.edu>
Fri, 6 Jan 2012 03:38:13 +0000 (19:38 -0800)
committerDavid Terei <davidterei@gmail.com>
Mon, 9 Jan 2012 22:24:11 +0000 (14:24 -0800)
System/Posix/Temp.hsc
System/Posix/Temp/ByteString.hsc
cbits/HsUnix.c
include/HsUnix.h

index 9989ca0..8ab789c 100644 (file)
@@ -17,7 +17,7 @@
 -----------------------------------------------------------------------------
 
 module System.Posix.Temp (
-        mkstemp, mkdtemp
+        mkstemp, mkstemps, mkdtemp
     ) where
 
 #include "HsUnix.h"
@@ -69,6 +69,27 @@ mkstemp template' = do
   return (name, h)
 #endif
 
+#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
+-- |'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
+-- the created file, which contains  6 random characters in between
+-- the prefix and suffix.
+mkstemps :: String -> String -> IO (FilePath, Handle)
+mkstemps prefix suffix = do
+  let template = prefix ++ "XXXXXX" ++ suffix
+      lenOfsuf :: CInt
+      lenOfsuf = fromIntegral $ length suffix
+  withFilePath template $ \ ptr -> do
+    fd <- throwErrnoIfMinus1 "mkstemps" (c_mkstemps ptr lenOfsuf)
+    name <- peekFilePath ptr
+    h <- fdToHandle (Fd fd)
+    return (name, h)
+
+foreign import ccall unsafe "HsUnix.h __hscore_mkstemps"
+  c_mkstemps :: CString -> CInt -> IO CInt
+#endif
+
 -- | Make a unique directory. The returned 'FilePath' is the path of the
 -- created directory, which is padded with 6 random characters. The argument is
 -- the desired prefix of the filepath of the temporary directory to be created.
index a13e45a..02aca28 100644 (file)
@@ -17,7 +17,7 @@
 -----------------------------------------------------------------------------
 
 module System.Posix.Temp.ByteString (
-        mkstemp, mkdtemp
+        mkstemp, mkstemps, mkdtemp
     ) where
 
 #include "HsUnix.h"
@@ -60,6 +60,27 @@ mkstemp template' = do
   return (name, h)
 #endif
 
+#if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
+-- |'mkstemps' - make a unique filename with a given prefix and suffix 
+-- and open it for reading\/writing (only safe on GHC & Hugs).
+-- The returned 'RawFilePath' is the (possibly relative) path of
+-- the created file, which contains  6 random characters in between
+-- the prefix and suffix.
+mkstemps :: ByteString -> ByteString -> IO (RawFilePath, Handle)
+mkstemps prefix suffix = do
+  let template = prefix `B.append` (BC.pack "XXXXXX") `B.append` suffix
+      lenOfsuf :: CInt
+      lenOfsuf = fromIntegral $ B.length suffix
+  withFilePath template $ \ ptr -> do
+    fd <- throwErrnoIfMinus1 "mkstemps" (c_mkstemps ptr lenOfsuf)
+    name <- peekFilePath ptr
+    h <- fdToHandle (Fd fd)
+    return (name, h)
+
+foreign import ccall unsafe "HsUnix.h __hscore_mkstemps"
+  c_mkstemps :: CString -> CInt -> IO CInt
+#endif
+
 -- | Make a unique directory. The returned 'RawFilePath' is the path of the
 -- created directory, which is padded with 6 random characters. The argument is
 -- the desired prefix of the filepath of the temporary directory to be created.
index d6366fc..bb3a3c7 100644 (file)
@@ -135,6 +135,9 @@ int __hscore_mkstemp(char *filetemplate) {
 char *__hscore_mkdtemp(char *filetemplate) {
     return (mkdtemp(filetemplate));
 }
+int __hscore_mkstemps(char *filetemplate, int suffixlen) {
+    return (mkstemps(filetemplate, suffixlen));
+}
 #endif
 
 #if !defined(__MINGW32__) && !defined(irix_HOST_OS)
index eecbfe8..7cee73a 100644 (file)
@@ -175,6 +175,7 @@ int __hsunix_push_module(int fd, const char *module);
 
 #if !defined(__MINGW32__)
 int __hscore_mkstemp(char *filetemplate);
+int __hscore_mkstemps(char *filetemplate, int suffixlen);
 char *__hscore_mkdtemp(char *filetemplate);
 #endif