    {-# LINE 1 "libraries/unix/System/Posix/IO.hsc" #-}

    {-# LINE 2 "libraries/unix/System/Posix/IO.hsc" #-}
    {-# LANGUAGE Safe #-}

    {-# LINE 6 "libraries/unix/System/Posix/IO.hsc" #-}
    -----------------------------------------------------------------------------
    -- |
    -- Module      :  System.Posix.IO
    -- Copyright   :  (c) The University of Glasgow 2002
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  libraries@haskell.org
    -- Stability   :  provisional
    -- Portability :  non-portable (requires POSIX)
    --
    -- POSIX IO support.  These types and functions correspond to the unix
    -- functions open(2), close(2), etc.  For more portable functions
    -- which are more like fopen(3) and friends from stdio.h, see
    -- "System.IO".
    --
    -----------------------------------------------------------------------------

    module System.Posix.IO (
        -- * Input \/ Output

        -- ** Standard file descriptors
        stdInput, stdOutput, stdError,

        -- ** Opening and closing files
        OpenMode(..),
        OpenFileFlags(..), defaultFileFlags,
        openFd, createFile,
        closeFd,

        -- ** Reading\/writing data
        -- |Programmers using the 'fdRead' and 'fdWrite' API should be aware that
        -- EAGAIN exceptions may occur for non-blocking IO!

        fdRead, fdWrite,
        fdReadBuf, fdWriteBuf,

        -- ** Seeking
        fdSeek,

        -- ** File options
        FdOption(..),
        queryFdOption,
        setFdOption,

        -- ** Locking
        FileLock,
        LockRequest(..),
        getLock,  setLock,
        waitToSetLock,

        -- ** Pipes
        createPipe,

        -- ** Duplicating file descriptors
        dup, dupTo,

        -- ** Converting file descriptors to\/from Handles
        handleToFd,
        fdToHandle,

      ) where

    import System.Posix.Types
    import System.Posix.Error
    import System.Posix.IO.Common
    import System.Posix.Internals ( withFilePath )

    -- |Open and optionally create this file.  See 'System.Posix.Files'
    -- for information on how to use the 'FileMode' type.
    openFd :: FilePath
           -> OpenMode
           -> Maybe FileMode -- ^Just x => creates the file with the given modes, Nothing => the file must exist.
           -> OpenFileFlags
           -> IO Fd
    openFd name how maybe_mode flags = do
       withFilePath name $ \str -> do
         throwErrnoPathIfMinus1Retry "openFd" name $
           open_ str how maybe_mode flags

    -- |Create and open this file in WriteOnly mode.  A special case of
    -- 'openFd'.  See 'System.Posix.Files' for information on how to use
    -- the 'FileMode' type.

    createFile :: FilePath -> FileMode -> IO Fd
    createFile name mode
      = openFd name WriteOnly (Just mode) defaultFileFlags{ trunc=True }