{-# LANGUAGE CPP #-}

module Erebos.Storage.Platform (
    createFileExclusive,
) where

import System.IO
import System.Posix.Files
import System.Posix.IO

createFileExclusive :: FilePath -> IO Handle
createFileExclusive :: FilePath -> IO Handle
createFileExclusive FilePath
path = Fd -> IO Handle
fdToHandle (Fd -> IO Handle) -> IO Fd -> IO Handle
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< do
#if MIN_VERSION_unix(2,8,0)
    FilePath -> OpenMode -> OpenFileFlags -> IO Fd
openFd FilePath
path OpenMode
WriteOnly OpenFileFlags
defaultFileFlags
        { creat = Just $ unionFileModes ownerReadMode ownerWriteMode
        , exclusive = True
        }
#else
    openFd path WriteOnly (Just $ unionFileModes ownerReadMode ownerWriteMode) (defaultFileFlags { exclusive = True })
#endif