System.Posix.Temp: pad input filenames with 6 Xs
authorgwern0@gmail.com <unknown>
Tue, 19 Jan 2010 00:30:22 +0000 (00:30 +0000)
committergwern0@gmail.com <unknown>
Tue, 19 Jan 2010 00:30:22 +0000 (00:30 +0000)
If the argument doesn't terminate in capital Xs, the C mkstemp will simply bomb out
with zero warning. This was not documented.
By arbitrarily sticking a bunch of Xes at the end of all arguments, we guarantee that
this exception will not be thrown, the type signature will not change, and no existing
code can break (since if it was manually avoiding the exception by adding "XXX" itself,
the temp files will now be simply 3 random characters longer, nothing worse).

System/Posix/Temp.hsc

index 824f917..8acfe59 100644 (file)
@@ -35,7 +35,7 @@ import Foreign.C
 -- |'mkstemp' - make a unique filename and open it for
 -- reading\/writing (only safe on GHC & Hugs).
 -- The returned 'FilePath' is the (possibly relative) path of
--- the created file.
+-- the created file, which is padded with 6 random characters.
 mkstemp :: String -> IO (FilePath, Handle)
 mkstemp template = do
 #if defined(__GLASGOW_HASKELL__) || defined(__HUGS__)
@@ -45,7 +45,7 @@ mkstemp template = do
     h <- fdToHandle (Fd fd)
     return (name, h)
 #else
-  name <- mktemp template
+  name <- mktemp (template ++ "XXXXXX")
   h <- openFile name ReadWriteMode
   return (name, h)