packages feed

cabal-install-0.6.2: Distribution/Compat/TempFile.hs

{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -cpp #-}
{-# OPTIONS_NHC98 -cpp #-}
{-# OPTIONS_JHC -fcpp #-}
-- #hide
module Distribution.Compat.TempFile (
  createTempDirectory,
  ) where

import System.FilePath        ((</>))
import System.Posix.Internals (mkdir, c_getpid)
import Foreign.C              (withCString, getErrno, eEXIST, errnoToIOError)

createTempDirectory :: FilePath -> String -> IO FilePath
createTempDirectory dir template = do
  pid <- c_getpid
  findTempName pid
  where
    findTempName x = do
      let dirpath = dir </> template ++ show x
      res <- withCString dirpath $ \s -> mkdir s 0o700
      if res == 0
        then return dirpath
        else do
          errno <- getErrno
          if errno == eEXIST
            then findTempName (x+1)
            else ioError (errnoToIOError "createTempDirectory" errno Nothing (Just dir))