-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | POSIX functionality
--   
--   This package gives you access to the set of operating system services
--   standardised by POSIX 1003.1b (or the IEEE Portable Operating System
--   Interface for Computing Environments - IEEE Std. 1003.1).
--   
--   The package is not supported under Windows (except under Cygwin).
@package unix
@version 2.7.0.1


-- | DLOpen and friend Derived from GModule.chs by M.Weber &amp;
--   M.Chakravarty which is part of c2hs I left the API more or less the
--   same, mostly the flags are different.
module System.Posix.DynamicLinker.Prim
c_dlopen :: CString -> CInt -> IO (Ptr ())
c_dlsym :: Ptr () -> CString -> IO (FunPtr a)
c_dlerror :: IO CString
c_dlclose :: (Ptr ()) -> IO CInt
haveRtldNext :: Bool
haveRtldLocal :: Bool
packRTLDFlags :: [RTLDFlags] -> CInt
data RTLDFlags
RTLD_LAZY :: RTLDFlags
RTLD_NOW :: RTLDFlags
RTLD_GLOBAL :: RTLDFlags
RTLD_LOCAL :: RTLDFlags
packDL :: DL -> Ptr ()

-- | Flags for <a>dlsym</a>. Notice that <a>Next</a> might not be available
--   on your particular platform!
data DL
Null :: DL
Next :: DL
Default :: DL
DLHandle :: (Ptr ()) -> DL
instance Show RTLDFlags
instance Read RTLDFlags
instance Show DL

module System.Posix.Process.Internals
pPrPr_disableITimers :: IO ()
c_execvpe :: CString -> Ptr CString -> Ptr CString -> IO CInt
decipherWaitStatus :: CInt -> IO ProcessStatus

-- | The exit status of a process
data ProcessStatus

-- | the process exited by calling <tt>exit()</tt> or returning from
--   <tt>main</tt>
Exited :: ExitCode -> ProcessStatus

-- | the process was terminated by a signal, the <tt>Bool</tt> is
--   <tt>True</tt> if a core dump was produced
--   
--   <i>Since: 2.7.0.0</i>
Terminated :: Signal -> Bool -> ProcessStatus

-- | the process was stopped by a signal
Stopped :: Signal -> ProcessStatus
instance Eq ProcessStatus
instance Ord ProcessStatus
instance Show ProcessStatus


-- | POSIX error support
module System.Posix.Error

-- | as <a>throwErrno</a>, but exceptions include the given path when
--   appropriate.
throwErrnoPath :: String -> FilePath -> IO a

-- | as <a>throwErrnoIf</a>, but exceptions include the given path when
--   appropriate.
throwErrnoPathIf :: (a -> Bool) -> String -> FilePath -> IO a -> IO a

-- | as <a>throwErrnoIf_</a>, but exceptions include the given path when
--   appropriate.
throwErrnoPathIf_ :: (a -> Bool) -> String -> FilePath -> IO a -> IO ()
throwErrnoPathIfRetry :: (a -> Bool) -> String -> FilePath -> IO a -> IO a

-- | as <a>throwErrnoIfNull</a>, but exceptions include the given path when
--   appropriate.
throwErrnoPathIfNull :: String -> FilePath -> IO (Ptr a) -> IO (Ptr a)
throwErrnoPathIfNullRetry :: String -> FilePath -> IO (Ptr a) -> IO (Ptr a)

-- | as <a>throwErrnoIfMinus1</a>, but exceptions include the given path
--   when appropriate.
throwErrnoPathIfMinus1 :: (Eq a, Num a) => String -> FilePath -> IO a -> IO a

-- | as <a>throwErrnoIfMinus1_</a>, but exceptions include the given path
--   when appropriate.
throwErrnoPathIfMinus1_ :: (Eq a, Num a) => String -> FilePath -> IO a -> IO ()
throwErrnoPathIfMinus1Retry :: (Eq a, Num a) => String -> FilePath -> IO a -> IO a
throwErrnoPathIfMinus1Retry_ :: (Eq a, Num a) => String -> FilePath -> IO a -> IO ()


-- | Internal stuff: support for ByteString FilePaths
module System.Posix.ByteString.FilePath

-- | A literal POSIX file path
type RawFilePath = ByteString
withFilePath :: RawFilePath -> (CString -> IO a) -> IO a
peekFilePath :: CString -> IO RawFilePath
peekFilePathLen :: CStringLen -> IO RawFilePath
throwErrnoPathIfMinus1Retry :: (Eq a, Num a) => String -> RawFilePath -> IO a -> IO a
throwErrnoPathIfMinus1Retry_ :: (Eq a, Num a) => String -> RawFilePath -> IO a -> IO ()
throwErrnoPathIfNullRetry :: String -> RawFilePath -> IO (Ptr a) -> IO (Ptr a)
throwErrnoPathIfRetry :: (a -> Bool) -> String -> RawFilePath -> IO a -> IO a

-- | as <a>throwErrno</a>, but exceptions include the given path when
--   appropriate.
throwErrnoPath :: String -> RawFilePath -> IO a

-- | as <a>throwErrnoIf</a>, but exceptions include the given path when
--   appropriate.
throwErrnoPathIf :: (a -> Bool) -> String -> RawFilePath -> IO a -> IO a

-- | as <a>throwErrnoIf_</a>, but exceptions include the given path when
--   appropriate.
throwErrnoPathIf_ :: (a -> Bool) -> String -> RawFilePath -> IO a -> IO ()

-- | as <a>throwErrnoIfNull</a>, but exceptions include the given path when
--   appropriate.
throwErrnoPathIfNull :: String -> RawFilePath -> IO (Ptr a) -> IO (Ptr a)

-- | as <a>throwErrnoIfMinus1</a>, but exceptions include the given path
--   when appropriate.
throwErrnoPathIfMinus1 :: (Eq a, Num a) => String -> RawFilePath -> IO a -> IO a

-- | as <a>throwErrnoIfMinus1_</a>, but exceptions include the given path
--   when appropriate.
throwErrnoPathIfMinus1_ :: (Eq a, Num a) => String -> RawFilePath -> IO a -> IO ()


-- | Dynamic linker support through dlopen()
module System.Posix.DynamicLinker.ByteString
dlopen :: RawFilePath -> [RTLDFlags] -> IO DL

-- | <a>dlsym</a> returns the address binding of the symbol described in
--   <tt>symbol</tt>, as it occurs in the shared object identified by
--   <tt>source</tt>.
dlsym :: DL -> String -> IO (FunPtr a)
dlerror :: IO String
dlclose :: DL -> IO ()
withDL :: RawFilePath -> [RTLDFlags] -> (DL -> IO a) -> IO a
withDL_ :: RawFilePath -> [RTLDFlags] -> (DL -> IO a) -> IO ()

-- | <a>undl</a> obtains the raw handle. You mustn't do something like
--   <tt>withDL mod flags $ liftM undl &gt;&gt;= p -&gt; use p</tt>
undl :: DL -> Ptr ()


-- | POSIX Terminal support
module System.Posix.Terminal.ByteString
data TerminalAttributes

-- | <tt>getTerminalAttributes fd</tt> calls <tt>tcgetattr</tt> to obtain
--   the <tt>TerminalAttributes</tt> associated with <tt>Fd</tt>
--   <tt>fd</tt>.
getTerminalAttributes :: Fd -> IO TerminalAttributes
data TerminalState
Immediately :: TerminalState
WhenDrained :: TerminalState
WhenFlushed :: TerminalState

-- | <tt>setTerminalAttributes fd attr ts</tt> calls <tt>tcsetattr</tt> to
--   change the <tt>TerminalAttributes</tt> associated with <tt>Fd</tt>
--   <tt>fd</tt> to <tt>attr</tt>, when the terminal is in the state
--   indicated by <tt>ts</tt>.
setTerminalAttributes :: Fd -> TerminalAttributes -> TerminalState -> IO ()
data TerminalMode
InterruptOnBreak :: TerminalMode
MapCRtoLF :: TerminalMode
IgnoreBreak :: TerminalMode
IgnoreCR :: TerminalMode
IgnoreParityErrors :: TerminalMode
MapLFtoCR :: TerminalMode
CheckParity :: TerminalMode
StripHighBit :: TerminalMode
StartStopInput :: TerminalMode
StartStopOutput :: TerminalMode
MarkParityErrors :: TerminalMode
ProcessOutput :: TerminalMode
LocalMode :: TerminalMode
ReadEnable :: TerminalMode
TwoStopBits :: TerminalMode
HangupOnClose :: TerminalMode
EnableParity :: TerminalMode
OddParity :: TerminalMode
EnableEcho :: TerminalMode
EchoErase :: TerminalMode
EchoKill :: TerminalMode
EchoLF :: TerminalMode
ProcessInput :: TerminalMode
ExtendedFunctions :: TerminalMode
KeyboardInterrupts :: TerminalMode
NoFlushOnInterrupt :: TerminalMode
BackgroundWriteInterrupt :: TerminalMode
withoutMode :: TerminalAttributes -> TerminalMode -> TerminalAttributes
withMode :: TerminalAttributes -> TerminalMode -> TerminalAttributes
terminalMode :: TerminalMode -> TerminalAttributes -> Bool
bitsPerByte :: TerminalAttributes -> Int
withBits :: TerminalAttributes -> Int -> TerminalAttributes
data ControlCharacter
EndOfFile :: ControlCharacter
EndOfLine :: ControlCharacter
Erase :: ControlCharacter
Interrupt :: ControlCharacter
Kill :: ControlCharacter
Quit :: ControlCharacter
Start :: ControlCharacter
Stop :: ControlCharacter
Suspend :: ControlCharacter
controlChar :: TerminalAttributes -> ControlCharacter -> Maybe Char
withCC :: TerminalAttributes -> (ControlCharacter, Char) -> TerminalAttributes
withoutCC :: TerminalAttributes -> ControlCharacter -> TerminalAttributes
inputTime :: TerminalAttributes -> Int
withTime :: TerminalAttributes -> Int -> TerminalAttributes
minInput :: TerminalAttributes -> Int
withMinInput :: TerminalAttributes -> Int -> TerminalAttributes
data BaudRate
B0 :: BaudRate
B50 :: BaudRate
B75 :: BaudRate
B110 :: BaudRate
B134 :: BaudRate
B150 :: BaudRate
B200 :: BaudRate
B300 :: BaudRate
B600 :: BaudRate
B1200 :: BaudRate
B1800 :: BaudRate
B2400 :: BaudRate
B4800 :: BaudRate
B9600 :: BaudRate
B19200 :: BaudRate
B38400 :: BaudRate
B57600 :: BaudRate
B115200 :: BaudRate
inputSpeed :: TerminalAttributes -> BaudRate
withInputSpeed :: TerminalAttributes -> BaudRate -> TerminalAttributes
outputSpeed :: TerminalAttributes -> BaudRate
withOutputSpeed :: TerminalAttributes -> BaudRate -> TerminalAttributes

-- | <tt>sendBreak fd duration</tt> calls <tt>tcsendbreak</tt> to transmit
--   a continuous stream of zero-valued bits on <tt>Fd</tt> <tt>fd</tt> for
--   the specified implementation-dependent <tt>duration</tt>.
sendBreak :: Fd -> Int -> IO ()

-- | <tt>drainOutput fd</tt> calls <tt>tcdrain</tt> to block until all
--   output written to <tt>Fd</tt> <tt>fd</tt> has been transmitted.
drainOutput :: Fd -> IO ()
data QueueSelector
InputQueue :: QueueSelector
OutputQueue :: QueueSelector
BothQueues :: QueueSelector

-- | <tt>discardData fd queues</tt> calls <tt>tcflush</tt> to discard
--   pending input and/or output for <tt>Fd</tt> <tt>fd</tt>, as indicated
--   by the <tt>QueueSelector</tt> <tt>queues</tt>.
discardData :: Fd -> QueueSelector -> IO ()
data FlowAction

-- | TCOOFF
SuspendOutput :: FlowAction

-- | TCOON
RestartOutput :: FlowAction

-- | TCIOFF
TransmitStop :: FlowAction

-- | TCION
TransmitStart :: FlowAction

-- | <tt>controlFlow fd action</tt> calls <tt>tcflow</tt> to control the
--   flow of data on <tt>Fd</tt> <tt>fd</tt>, as indicated by
--   <tt>action</tt>.
controlFlow :: Fd -> FlowAction -> IO ()

-- | <tt>getTerminalProcessGroupID fd</tt> calls <tt>tcgetpgrp</tt> to
--   obtain the <tt>ProcessGroupID</tt> of the foreground process group
--   associated with the terminal attached to <tt>Fd</tt> <tt>fd</tt>.
getTerminalProcessGroupID :: Fd -> IO ProcessGroupID

-- | <tt>setTerminalProcessGroupID fd pgid</tt> calls <tt>tcsetpgrp</tt> to
--   set the <tt>ProcessGroupID</tt> of the foreground process group
--   associated with the terminal attached to <tt>Fd</tt> <tt>fd</tt> to
--   <tt>pgid</tt>.
setTerminalProcessGroupID :: Fd -> ProcessGroupID -> IO ()

-- | <tt>queryTerminal fd</tt> calls <tt>isatty</tt> to determine whether
--   or not <tt>Fd</tt> <tt>fd</tt> is associated with a terminal.
queryTerminal :: Fd -> IO Bool

-- | <tt>getTerminalName fd</tt> calls <tt>ttyname</tt> to obtain a name
--   associated with the terminal for <tt>Fd</tt> <tt>fd</tt>. If
--   <tt>fd</tt> is associated with a terminal, <tt>getTerminalName</tt>
--   returns the name of the terminal.
getTerminalName :: Fd -> IO RawFilePath

-- | <tt>getControllingTerminalName</tt> calls <tt>ctermid</tt> to obtain a
--   name associated with the controlling terminal for the process. If a
--   controlling terminal exists, <tt>getControllingTerminalName</tt>
--   returns the name of the controlling terminal.
getControllingTerminalName :: IO RawFilePath

-- | <tt>openPseudoTerminal</tt> creates a pseudoterminal (pty) pair, and
--   returns the newly created pair as a (<tt>master</tt>, <tt>slave</tt>)
--   tuple.
openPseudoTerminal :: IO (Fd, Fd)

-- | <tt>getSlaveTerminalName</tt> calls <tt>ptsname</tt> to obtain the
--   name of the slave terminal associated with a pseudoterminal pair. The
--   file descriptor to pass in must be that of the master.
getSlaveTerminalName :: Fd -> IO RawFilePath


-- | POSIX process support. See also the System.Cmd and System.Process
--   modules in the process package.
module System.Posix.Process.ByteString

-- | <a>forkProcess</a> corresponds to the POSIX <tt>fork</tt> system call.
--   The <a>IO</a> action passed as an argument is executed in the child
--   process; no other threads will be copied to the child process. On
--   success, <a>forkProcess</a> returns the child's <a>ProcessID</a> to
--   the parent process; in case of an error, an exception is thrown.
--   
--   The exception masking state of the executed action is inherited (c.f.
--   <tt>forkIO</tt>), see also <a>forkProcessWithUnmask</a> (<i>since:
--   2.7.0.0</i>).
--   
--   <a>forkProcess</a> comes with a giant warning: since any other running
--   threads are not copied into the child process, it's easy to go wrong:
--   e.g. by accessing some shared resource that was held by another thread
--   in the parent.
forkProcess :: IO () -> IO ProcessID

-- | Variant of <a>forkProcess</a> in the style of
--   <tt>forkIOWithUnmask</tt>.
--   
--   <i>Since: 2.7.0.0</i>
forkProcessWithUnmask :: ((forall a. IO a -> IO a) -> IO ()) -> IO ProcessID

-- | <tt><a>executeFile</a> cmd args env</tt> calls one of the
--   <tt>execv*</tt> family, depending on whether or not the current PATH
--   is to be searched for the command, and whether or not an environment
--   is provided to supersede the process's current environment. The
--   basename (leading directory names suppressed) of the command is passed
--   to <tt>execv*</tt> as <tt>arg[0]</tt>; the argument list passed to
--   <a>executeFile</a> therefore begins with <tt>arg[1]</tt>.
executeFile :: RawFilePath -> Bool -> [ByteString] -> Maybe [(ByteString, ByteString)] -> IO a

-- | <tt><a>exitImmediately</a> status</tt> calls <tt>_exit</tt> to
--   terminate the process with the indicated exit <tt>status</tt>. The
--   operation never returns.
exitImmediately :: ExitCode -> IO ()

-- | <a>getProcessID</a> calls <tt>getpid</tt> to obtain the
--   <a>ProcessID</a> for the current process.
getProcessID :: IO ProcessID

-- | <a>getProcessID</a> calls <tt>getppid</tt> to obtain the
--   <a>ProcessID</a> for the parent of the current process.
getParentProcessID :: IO ProcessID

-- | <a>getProcessGroupID</a> calls <tt>getpgrp</tt> to obtain the
--   <a>ProcessGroupID</a> for the current process.
getProcessGroupID :: IO ProcessGroupID

-- | <tt><a>getProcessGroupIDOf</a> pid</tt> calls <tt>getpgid</tt> to
--   obtain the <a>ProcessGroupID</a> for process <tt>pid</tt>.
getProcessGroupIDOf :: ProcessID -> IO ProcessGroupID

-- | <tt><a>createProcessGroupFor</a> pid</tt> calls <tt>setpgid</tt> to
--   make process <tt>pid</tt> a new process group leader.
createProcessGroupFor :: ProcessID -> IO ProcessGroupID

-- | <tt><a>joinProcessGroup</a> pgid</tt> calls <tt>setpgid</tt> to set
--   the <a>ProcessGroupID</a> of the current process to <tt>pgid</tt>.
joinProcessGroup :: ProcessGroupID -> IO ()

-- | <tt><a>setProcessGroupIDOf</a> pid pgid</tt> calls <tt>setpgid</tt> to
--   set the <tt>ProcessGroupIDOf</tt> for process <tt>pid</tt> to
--   <tt>pgid</tt>.
setProcessGroupIDOf :: ProcessID -> ProcessGroupID -> IO ()

-- | <a>createSession</a> calls <tt>setsid</tt> to create a new session
--   with the current process as session leader.
createSession :: IO ProcessGroupID
data ProcessTimes
ProcessTimes :: ClockTick -> ClockTick -> ClockTick -> ClockTick -> ClockTick -> ProcessTimes
elapsedTime :: ProcessTimes -> ClockTick
userTime :: ProcessTimes -> ClockTick
systemTime :: ProcessTimes -> ClockTick
childUserTime :: ProcessTimes -> ClockTick
childSystemTime :: ProcessTimes -> ClockTick

-- | <a>getProcessTimes</a> calls <tt>times</tt> to obtain time-accounting
--   information for the current process and its children.
getProcessTimes :: IO ProcessTimes
nice :: Int -> IO ()
getProcessPriority :: ProcessID -> IO Int
getProcessGroupPriority :: ProcessGroupID -> IO Int
getUserPriority :: UserID -> IO Int
setProcessPriority :: ProcessID -> Int -> IO ()
setProcessGroupPriority :: ProcessGroupID -> Int -> IO ()
setUserPriority :: UserID -> Int -> IO ()

-- | The exit status of a process
data ProcessStatus

-- | the process exited by calling <tt>exit()</tt> or returning from
--   <tt>main</tt>
Exited :: ExitCode -> ProcessStatus

-- | the process was terminated by a signal, the <tt>Bool</tt> is
--   <tt>True</tt> if a core dump was produced
--   
--   <i>Since: 2.7.0.0</i>
Terminated :: Signal -> Bool -> ProcessStatus

-- | the process was stopped by a signal
Stopped :: Signal -> ProcessStatus

-- | <tt><a>getProcessStatus</a> blk stopped pid</tt> calls
--   <tt>waitpid</tt>, returning <tt><a>Just</a> tc</tt>, the
--   <a>ProcessStatus</a> for process <tt>pid</tt> if it is available,
--   <a>Nothing</a> otherwise. If <tt>blk</tt> is <a>False</a>, then
--   <tt>WNOHANG</tt> is set in the options for <tt>waitpid</tt>, otherwise
--   not. If <tt>stopped</tt> is <a>True</a>, then <tt>WUNTRACED</tt> is
--   set in the options for <tt>waitpid</tt>, otherwise not.
getProcessStatus :: Bool -> Bool -> ProcessID -> IO (Maybe ProcessStatus)

-- | <tt><a>getAnyProcessStatus</a> blk stopped</tt> calls
--   <tt>waitpid</tt>, returning <tt><a>Just</a> (pid, tc)</tt>, the
--   <a>ProcessID</a> and <a>ProcessStatus</a> for any child process if a
--   child process has exited, or <a>Nothing</a> if there are child
--   processes but none have exited. If there are no child processes, then
--   <a>getAnyProcessStatus</a> raises an <tt>isDoesNotExistError</tt>
--   exception.
--   
--   If <tt>blk</tt> is <a>False</a>, then <tt>WNOHANG</tt> is set in the
--   options for <tt>waitpid</tt>, otherwise not. If <tt>stopped</tt> is
--   <a>True</a>, then <tt>WUNTRACED</tt> is set in the options for
--   <tt>waitpid</tt>, otherwise not.
getAnyProcessStatus :: Bool -> Bool -> IO (Maybe (ProcessID, ProcessStatus))

-- | <tt><a>getGroupProcessStatus</a> blk stopped pgid</tt> calls
--   <tt>waitpid</tt>, returning <tt><a>Just</a> (pid, tc)</tt>, the
--   <a>ProcessID</a> and <a>ProcessStatus</a> for any process in group
--   <tt>pgid</tt> if one is available, or <a>Nothing</a> if there are
--   child processes but none have exited. If there are no child processes,
--   then <a>getGroupProcessStatus</a> raises an
--   <tt>isDoesNotExistError</tt> exception.
--   
--   If <tt>blk</tt> is <a>False</a>, then <tt>WNOHANG</tt> is set in the
--   options for <tt>waitpid</tt>, otherwise not. If <tt>stopped</tt> is
--   <a>True</a>, then <tt>WUNTRACED</tt> is set in the options for
--   <tt>waitpid</tt>, otherwise not.
getGroupProcessStatus :: Bool -> Bool -> ProcessGroupID -> IO (Maybe (ProcessID, ProcessStatus))

-- | <tt><a>createProcessGroup</a> pid</tt> calls <tt>setpgid</tt> to make
--   process <tt>pid</tt> a new process group leader. This function is
--   currently deprecated, and might be changed to making the current
--   process a new process group leader in future versions.

-- | <i>Deprecated: This function is scheduled to be replaced by something
--   different in the future, we therefore recommend that you do not use
--   this version and use <a>createProcessGroupFor</a> instead.</i>
createProcessGroup :: ProcessID -> IO ProcessGroupID

-- | <tt><a>setProcessGroupID</a> pid pgid</tt> calls <tt>setpgid</tt> to
--   set the <a>ProcessGroupID</a> for process <tt>pid</tt> to
--   <tt>pgid</tt>. This function is currently deprecated, and might be
--   changed to setting the <a>ProcessGroupID</a> for the current process
--   in future versions.

-- | <i>Deprecated: This function is scheduled to be replaced by something
--   different in the future, we therefore recommend that you do not use
--   this version and use <a>setProcessGroupIDOf</a> instead.</i>
setProcessGroupID :: ProcessID -> ProcessGroupID -> IO ()


-- | POSIX environment support
module System.Posix.Env.ByteString

-- | <a>getEnv</a> looks up a variable in the environment.
getEnv :: ByteString -> IO (Maybe ByteString)

-- | <a>getEnvDefault</a> is a wrapper around <a>getEnv</a> where the
--   programmer can specify a fallback if the variable is not found in the
--   environment.
getEnvDefault :: ByteString -> ByteString -> IO ByteString
getEnvironmentPrim :: IO [ByteString]

-- | <a>getEnvironment</a> retrieves the entire environment as a list of
--   <tt>(key,value)</tt> pairs.
getEnvironment :: IO [(ByteString, ByteString)]

-- | <a>putEnv</a> function takes an argument of the form
--   <tt>name=value</tt> and is equivalent to
--   <tt>setEnv(key,value,True{-overwrite-})</tt>.
putEnv :: ByteString -> IO ()

-- | The <a>setEnv</a> function inserts or resets the environment variable
--   name in the current environment list. If the variable <tt>name</tt>
--   does not exist in the list, it is inserted with the given value. If
--   the variable does exist, the argument <tt>overwrite</tt> is tested; if
--   <tt>overwrite</tt> is <tt>False</tt>, the variable is not reset,
--   otherwise it is reset to the given value.
setEnv :: ByteString -> ByteString -> Bool -> IO ()

-- | The <a>unsetEnv</a> function deletes all instances of the variable
--   name from the environment.
unsetEnv :: ByteString -> IO ()

-- | Computation <a>getArgs</a> returns a list of the program's command
--   line arguments (not including the program name), as
--   <a>ByteString</a>s.
--   
--   Unlike <a>getArgs</a>, this function does no Unicode decoding of the
--   arguments; you get the exact bytes that were passed to the program by
--   the OS. To interpret the arguments as text, some Unicode decoding
--   should be applied.
getArgs :: IO [ByteString]


-- | 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 <a>System.IO</a>.
module System.Posix.IO.ByteString
stdInput :: Fd
stdOutput :: Fd
stdError :: Fd
data OpenMode
ReadOnly :: OpenMode
WriteOnly :: OpenMode
ReadWrite :: OpenMode

-- | Correspond to some of the int flags from C's fcntl.h.
data OpenFileFlags
OpenFileFlags :: Bool -> Bool -> Bool -> Bool -> Bool -> OpenFileFlags

-- | O_APPEND
append :: OpenFileFlags -> Bool

-- | O_EXCL
exclusive :: OpenFileFlags -> Bool

-- | O_NOCTTY
noctty :: OpenFileFlags -> Bool

-- | O_NONBLOCK
nonBlock :: OpenFileFlags -> Bool

-- | O_TRUNC
trunc :: OpenFileFlags -> Bool

-- | Default values for the <a>OpenFileFlags</a> type. False for each of
--   append, exclusive, noctty, nonBlock, and trunc.
defaultFileFlags :: OpenFileFlags

-- | Open and optionally create this file. See <a>Files</a> for information
--   on how to use the <a>FileMode</a> type.
openFd :: RawFilePath -> OpenMode -> Maybe FileMode -> OpenFileFlags -> IO Fd

-- | Create and open this file in WriteOnly mode. A special case of
--   <a>openFd</a>. See <a>Files</a> for information on how to use the
--   <a>FileMode</a> type.
createFile :: RawFilePath -> FileMode -> IO Fd

-- | Close this file descriptor. May throw an exception if this is an
--   invalid descriptor.
closeFd :: Fd -> IO ()

-- | Read data from an <a>Fd</a> and convert it to a <a>String</a> using
--   the locale encoding. Throws an exception if this is an invalid
--   descriptor, or EOF has been reached.
fdRead :: Fd -> ByteCount -> IO (String, ByteCount)

-- | Write a <a>String</a> to an <a>Fd</a> using the locale encoding.
fdWrite :: Fd -> String -> IO ByteCount

-- | Read data from an <a>Fd</a> into memory. This is exactly equivalent to
--   the POSIX <tt>read</tt> function.
fdReadBuf :: Fd -> Ptr Word8 -> ByteCount -> IO ByteCount

-- | Write data from memory to an <a>Fd</a>. This is exactly equivalent to
--   the POSIX <tt>write</tt> function.
fdWriteBuf :: Fd -> Ptr Word8 -> ByteCount -> IO ByteCount

-- | May throw an exception if this is an invalid descriptor.
fdSeek :: Fd -> SeekMode -> FileOffset -> IO FileOffset
data FdOption

-- | O_APPEND
AppendOnWrite :: FdOption

-- | FD_CLOEXEC
CloseOnExec :: FdOption

-- | O_NONBLOCK
NonBlockingRead :: FdOption

-- | O_SYNC
SynchronousWrites :: FdOption

-- | May throw an exception if this is an invalid descriptor.
queryFdOption :: Fd -> FdOption -> IO Bool

-- | May throw an exception if this is an invalid descriptor.
setFdOption :: Fd -> FdOption -> Bool -> IO ()
type FileLock = (LockRequest, SeekMode, FileOffset, FileOffset)
data LockRequest
ReadLock :: LockRequest
WriteLock :: LockRequest
Unlock :: LockRequest

-- | May throw an exception if this is an invalid descriptor.
getLock :: Fd -> FileLock -> IO (Maybe (ProcessID, FileLock))

-- | May throw an exception if this is an invalid descriptor.
setLock :: Fd -> FileLock -> IO ()

-- | May throw an exception if this is an invalid descriptor.
waitToSetLock :: Fd -> FileLock -> IO ()

-- | The <a>createPipe</a> function creates a pair of connected file
--   descriptors. The first component is the fd to read from, the second is
--   the write end. Although pipes may be bidirectional, this behaviour is
--   not portable and programmers should use two separate pipes for this
--   purpose. May throw an exception if this is an invalid descriptor.
createPipe :: IO (Fd, Fd)

-- | May throw an exception if this is an invalid descriptor.
dup :: Fd -> IO Fd

-- | May throw an exception if this is an invalid descriptor.
dupTo :: Fd -> Fd -> IO Fd

-- | Extracts the <a>Fd</a> from a <a>Handle</a>. This function has the
--   side effect of closing the <a>Handle</a> and flushing its write
--   buffer, if necessary.
handleToFd :: Handle -> IO Fd

-- | Converts an <a>Fd</a> into a <a>Handle</a> that can be used with the
--   standard Haskell IO library (see <a>System.IO</a>).
fdToHandle :: Fd -> IO Handle


-- | Functions defined by the POSIX standards for manipulating and querying
--   the file system. Names of underlying POSIX functions are indicated
--   whenever possible. A more complete documentation of the POSIX
--   functions together with a more detailed description of different error
--   conditions are usually available in the system's manual pages or from
--   <a>http://www.unix.org/version3/online.html</a> (free registration
--   required).
--   
--   When a function that calls an underlying POSIX function fails, the
--   errno code is converted to an <a>IOError</a> using
--   <a>errnoToIOError</a>. For a list of which errno codes may be
--   generated, consult the POSIX documentation for the underlying
--   function.
module System.Posix.Files.ByteString

-- | Combines the two file modes into one that contains modes that appear
--   in either.
unionFileModes :: FileMode -> FileMode -> FileMode

-- | Combines two file modes into one that only contains modes that appear
--   in both.
intersectFileModes :: FileMode -> FileMode -> FileMode

-- | No permissions.
nullFileMode :: FileMode

-- | Owner has read permission.
ownerReadMode :: FileMode

-- | Owner has write permission.
ownerWriteMode :: FileMode

-- | Owner has execute permission.
ownerExecuteMode :: FileMode

-- | Owner has read, write and execute permission.
ownerModes :: FileMode

-- | Group has read permission.
groupReadMode :: FileMode

-- | Group has write permission.
groupWriteMode :: FileMode

-- | Group has execute permission.
groupExecuteMode :: FileMode

-- | Group has read, write and execute permission.
groupModes :: FileMode

-- | Others have read permission.
otherReadMode :: FileMode

-- | Others have write permission.
otherWriteMode :: FileMode

-- | Others have execute permission.
otherExecuteMode :: FileMode

-- | Others have read, write and execute permission.
otherModes :: FileMode

-- | Set user ID on execution.
setUserIDMode :: FileMode

-- | Set group ID on execution.
setGroupIDMode :: FileMode

-- | Owner, group and others have read and write permission.
stdFileMode :: FileMode

-- | Owner, group and others have read, write and execute permission.
accessModes :: FileMode
fileTypeModes :: FileMode
blockSpecialMode :: FileMode
characterSpecialMode :: FileMode
namedPipeMode :: FileMode
regularFileMode :: FileMode
directoryMode :: FileMode
symbolicLinkMode :: FileMode
socketMode :: FileMode

-- | <tt>setFileMode path mode</tt> changes permission of the file given by
--   <tt>path</tt> to <tt>mode</tt>. This operation may fail with
--   <a>throwErrnoPathIfMinus1_</a> if <tt>path</tt> doesn't exist or if
--   the effective user ID of the current process is not that of the file's
--   owner.
--   
--   Note: calls <tt>chmod</tt>.
setFileMode :: RawFilePath -> FileMode -> IO ()

-- | <tt>setFdMode fd mode</tt> acts like <tt>setFileMode</tt> but uses a
--   file descriptor <tt>fd</tt> instead of a <a>FilePath</a>.
--   
--   Note: calls <tt>fchmod</tt>.
setFdMode :: Fd -> FileMode -> IO ()

-- | <tt>setFileCreationMask mode</tt> sets the file mode creation mask to
--   <tt>mode</tt>. Modes set by this operation are subtracted from files
--   and directories upon creation. The previous file creation mask is
--   returned.
--   
--   Note: calls <tt>umask</tt>.
setFileCreationMask :: FileMode -> IO FileMode

-- | <tt>fileAccess name read write exec</tt> checks if the file (or other
--   file system object) <tt>name</tt> can be accessed for reading, writing
--   and/or executing. To check a permission set the corresponding argument
--   to <a>True</a>.
--   
--   Note: calls <tt>access</tt>.
fileAccess :: RawFilePath -> Bool -> Bool -> Bool -> IO Bool

-- | Checks for the existence of the file.
--   
--   Note: calls <tt>access</tt>.
fileExist :: RawFilePath -> IO Bool

-- | POSIX defines operations to get information, such as owner,
--   permissions, size and access times, about a file. This information is
--   represented by the <a>FileStatus</a> type.
--   
--   Note: see <tt>chmod</tt>.
data FileStatus

-- | <tt>getFileStatus path</tt> calls gets the <tt>FileStatus</tt>
--   information (user ID, size, access times, etc.) for the file
--   <tt>path</tt>.
--   
--   Note: calls <tt>stat</tt>.
getFileStatus :: RawFilePath -> IO FileStatus

-- | <tt>getFdStatus fd</tt> acts as <tt>getFileStatus</tt> but uses a file
--   descriptor <tt>fd</tt>.
--   
--   Note: calls <tt>fstat</tt>.
getFdStatus :: Fd -> IO FileStatus

-- | Acts as <a>getFileStatus</a> except when the <a>RawFilePath</a> refers
--   to a symbolic link. In that case the <tt>FileStatus</tt> information
--   of the symbolic link itself is returned instead of that of the file it
--   points to.
--   
--   Note: calls <tt>lstat</tt>.
getSymbolicLinkStatus :: RawFilePath -> IO FileStatus

-- | ID of the device on which this file resides.
deviceID :: FileStatus -> DeviceID

-- | inode number
fileID :: FileStatus -> FileID

-- | File mode (such as permissions).
fileMode :: FileStatus -> FileMode

-- | Number of hard links to this file.
linkCount :: FileStatus -> LinkCount

-- | ID of owner.
fileOwner :: FileStatus -> UserID

-- | ID of group.
fileGroup :: FileStatus -> GroupID

-- | Describes the device that this file represents.
specialDeviceID :: FileStatus -> DeviceID

-- | Size of the file in bytes. If this file is a symbolic link the size is
--   the length of the pathname it contains.
fileSize :: FileStatus -> FileOffset

-- | Time of last access.
accessTime :: FileStatus -> EpochTime

-- | Time of last modification.
modificationTime :: FileStatus -> EpochTime

-- | Time of last status change (i.e. owner, group, link count, mode,
--   etc.).
statusChangeTime :: FileStatus -> EpochTime

-- | Time of last access in sub-second resolution.
accessTimeHiRes :: FileStatus -> POSIXTime

-- | Time of last modification in sub-second resolution.
modificationTimeHiRes :: FileStatus -> POSIXTime

-- | Time of last status change (i.e. owner, group, link count, mode, etc.)
--   in sub-second resolution.
statusChangeTimeHiRes :: FileStatus -> POSIXTime

-- | Checks if this file is a block device.
isBlockDevice :: FileStatus -> Bool

-- | Checks if this file is a character device.
isCharacterDevice :: FileStatus -> Bool

-- | Checks if this file is a named pipe device.
isNamedPipe :: FileStatus -> Bool

-- | Checks if this file is a regular file device.
isRegularFile :: FileStatus -> Bool

-- | Checks if this file is a directory device.
isDirectory :: FileStatus -> Bool

-- | Checks if this file is a symbolic link device.
isSymbolicLink :: FileStatus -> Bool

-- | Checks if this file is a socket device.
isSocket :: FileStatus -> Bool

-- | <tt>createNamedPipe fifo mode</tt> creates a new named pipe,
--   <tt>fifo</tt>, with permissions based on <tt>mode</tt>. May fail with
--   <a>throwErrnoPathIfMinus1_</a> if a file named <tt>name</tt> already
--   exists or if the effective user ID of the current process doesn't have
--   permission to create the pipe.
--   
--   Note: calls <tt>mkfifo</tt>.
createNamedPipe :: RawFilePath -> FileMode -> IO ()

-- | <tt>createDevice path mode dev</tt> creates either a regular or a
--   special file depending on the value of <tt>mode</tt> (and
--   <tt>dev</tt>). <tt>mode</tt> will normally be either
--   <a>blockSpecialMode</a> or <a>characterSpecialMode</a>. May fail with
--   <a>throwErrnoPathIfMinus1_</a> if a file named <tt>name</tt> already
--   exists or if the effective user ID of the current process doesn't have
--   permission to create the file.
--   
--   Note: calls <tt>mknod</tt>.
createDevice :: RawFilePath -> FileMode -> DeviceID -> IO ()

-- | <tt>createLink old new</tt> creates a new path, <tt>new</tt>, linked
--   to an existing file, <tt>old</tt>.
--   
--   Note: calls <tt>link</tt>.
createLink :: RawFilePath -> RawFilePath -> IO ()

-- | <tt>removeLink path</tt> removes the link named <tt>path</tt>.
--   
--   Note: calls <tt>unlink</tt>.
removeLink :: RawFilePath -> IO ()

-- | <tt>createSymbolicLink file1 file2</tt> creates a symbolic link named
--   <tt>file2</tt> which points to the file <tt>file1</tt>.
--   
--   Symbolic links are interpreted at run-time as if the contents of the
--   link had been substituted into the path being followed to find a file
--   or directory.
--   
--   Note: calls <tt>symlink</tt>.
createSymbolicLink :: RawFilePath -> RawFilePath -> IO ()

-- | Reads the <tt>RawFilePath</tt> pointed to by the symbolic link and
--   returns it.
--   
--   Note: calls <tt>readlink</tt>.
readSymbolicLink :: RawFilePath -> IO RawFilePath

-- | <tt>rename old new</tt> renames a file or directory from <tt>old</tt>
--   to <tt>new</tt>.
--   
--   Note: calls <tt>rename</tt>.
rename :: RawFilePath -> RawFilePath -> IO ()

-- | <tt>setOwnerAndGroup path uid gid</tt> changes the owner and group of
--   <tt>path</tt> to <tt>uid</tt> and <tt>gid</tt>, respectively.
--   
--   If <tt>uid</tt> or <tt>gid</tt> is specified as -1, then that ID is
--   not changed.
--   
--   Note: calls <tt>chown</tt>.
setOwnerAndGroup :: RawFilePath -> UserID -> GroupID -> IO ()

-- | Acts as <tt>setOwnerAndGroup</tt> but uses a file descriptor instead
--   of a <a>FilePath</a>.
--   
--   Note: calls <tt>fchown</tt>.
setFdOwnerAndGroup :: Fd -> UserID -> GroupID -> IO ()

-- | Acts as <a>setOwnerAndGroup</a> but does not follow symlinks (and thus
--   changes permissions on the link itself).
--   
--   Note: calls <tt>lchown</tt>.
setSymbolicLinkOwnerAndGroup :: RawFilePath -> UserID -> GroupID -> IO ()

-- | <tt>setFileTimes path atime mtime</tt> sets the access and
--   modification times associated with file <tt>path</tt> to
--   <tt>atime</tt> and <tt>mtime</tt>, respectively.
--   
--   Note: calls <tt>utime</tt>.
setFileTimes :: RawFilePath -> EpochTime -> EpochTime -> IO ()

-- | Like <a>setFileTimes</a> but timestamps can have sub-second
--   resolution.
--   
--   Note: calls <tt>utimensat</tt> or <tt>utimes</tt>.
setFileTimesHiRes :: RawFilePath -> POSIXTime -> POSIXTime -> IO ()

-- | Like <tt>setFileTimesHiRes</tt> but uses a file descriptor instead of
--   a path. This operation is not supported on all platforms. On these
--   platforms, this function will raise an exception.
--   
--   Note: calls <tt>futimens</tt> or <tt>futimes</tt>.
--   
--   <i>Since: 2.7.0.0</i>
setFdTimesHiRes :: Fd -> POSIXTime -> POSIXTime -> IO ()

-- | Like <a>setFileTimesHiRes</a> but does not follow symbolic links. This
--   operation is not supported on all platforms. On these platforms, this
--   function will raise an exception.
--   
--   Note: calls <tt>utimensat</tt> or <tt>lutimes</tt>.
setSymbolicLinkTimesHiRes :: RawFilePath -> POSIXTime -> POSIXTime -> IO ()

-- | <tt>touchFile path</tt> sets the access and modification times
--   associated with file <tt>path</tt> to the current time.
--   
--   Note: calls <tt>utime</tt>.
touchFile :: RawFilePath -> IO ()

-- | Like <tt>touchFile</tt> but uses a file descriptor instead of a path.
--   This operation is not supported on all platforms. On these platforms,
--   this function will raise an exception.
--   
--   Note: calls <tt>futimes</tt>.
--   
--   <i>Since: 2.7.0.0</i>
touchFd :: Fd -> IO ()

-- | Like <a>touchFile</a> but does not follow symbolic links. This
--   operation is not supported on all platforms. On these platforms, this
--   function will raise an exception.
--   
--   Note: calls <tt>lutimes</tt>.
touchSymbolicLink :: RawFilePath -> IO ()

-- | Truncates the file down to the specified length. If the file was
--   larger than the given length before this operation was performed the
--   extra is lost.
--   
--   Note: calls <tt>truncate</tt>.
setFileSize :: RawFilePath -> FileOffset -> IO ()

-- | Acts as <tt>setFileSize</tt> but uses a file descriptor instead of a
--   <a>FilePath</a>.
--   
--   Note: calls <tt>ftruncate</tt>.
setFdSize :: Fd -> FileOffset -> IO ()
data PathVar
FileSizeBits :: PathVar
LinkLimit :: PathVar
InputLineLimit :: PathVar
InputQueueLimit :: PathVar
FileNameLimit :: PathVar
PathNameLimit :: PathVar
PipeBufferLimit :: PathVar
SymbolicLinkLimit :: PathVar
SetOwnerAndGroupIsRestricted :: PathVar
FileNamesAreNotTruncated :: PathVar
VDisableChar :: PathVar
AsyncIOAvailable :: PathVar
PrioIOAvailable :: PathVar
SyncIOAvailable :: PathVar

-- | <tt>getPathVar var path</tt> obtains the dynamic value of the
--   requested configurable file limit or option associated with file or
--   directory <tt>path</tt>. For defined file limits, <tt>getPathVar</tt>
--   returns the associated value. For defined file options, the result of
--   <tt>getPathVar</tt> is undefined, but not failure.
--   
--   Note: calls <tt>pathconf</tt>.
getPathVar :: RawFilePath -> PathVar -> IO Limit

-- | <tt>getFdPathVar var fd</tt> obtains the dynamic value of the
--   requested configurable file limit or option associated with the file
--   or directory attached to the open channel <tt>fd</tt>. For defined
--   file limits, <tt>getFdPathVar</tt> returns the associated value. For
--   defined file options, the result of <tt>getFdPathVar</tt> is
--   undefined, but not failure.
--   
--   Note: calls <tt>fpathconf</tt>.
getFdPathVar :: Fd -> PathVar -> IO Limit


-- | String-based POSIX directory support
module System.Posix.Directory.ByteString

-- | <tt>createDirectory dir mode</tt> calls <tt>mkdir</tt> to create a new
--   directory, <tt>dir</tt>, with permissions based on <tt>mode</tt>.
createDirectory :: RawFilePath -> FileMode -> IO ()
removeDirectory :: RawFilePath -> IO ()
data DirStream

-- | <tt>openDirStream dir</tt> calls <tt>opendir</tt> to obtain a
--   directory stream for <tt>dir</tt>.
openDirStream :: RawFilePath -> IO DirStream

-- | <tt>readDirStream dp</tt> calls <tt>readdir</tt> to obtain the next
--   directory entry (<tt>struct dirent</tt>) for the open directory stream
--   <tt>dp</tt>, and returns the <tt>d_name</tt> member of that structure.
readDirStream :: DirStream -> IO RawFilePath

-- | <tt>rewindDirStream dp</tt> calls <tt>rewinddir</tt> to reposition the
--   directory stream <tt>dp</tt> at the beginning of the directory.
rewindDirStream :: DirStream -> IO ()

-- | <tt>closeDirStream dp</tt> calls <tt>closedir</tt> to close the
--   directory stream <tt>dp</tt>.
closeDirStream :: DirStream -> IO ()
data DirStreamOffset
tellDirStream :: DirStream -> IO DirStreamOffset
seekDirStream :: DirStream -> DirStreamOffset -> IO ()

-- | <tt>getWorkingDirectory</tt> calls <tt>getcwd</tt> to obtain the name
--   of the current working directory.
getWorkingDirectory :: IO RawFilePath

-- | <tt>changeWorkingDirectory dir</tt> calls <tt>chdir</tt> to change the
--   current working directory to <tt>dir</tt>.
changeWorkingDirectory :: RawFilePath -> IO ()
changeWorkingDirectoryFd :: Fd -> IO ()


-- | Dynamic linker support through dlopen()
module System.Posix.DynamicLinker
dlopen :: FilePath -> [RTLDFlags] -> IO DL

-- | <a>dlsym</a> returns the address binding of the symbol described in
--   <tt>symbol</tt>, as it occurs in the shared object identified by
--   <tt>source</tt>.
dlsym :: DL -> String -> IO (FunPtr a)
dlerror :: IO String
dlclose :: DL -> IO ()
withDL :: String -> [RTLDFlags] -> (DL -> IO a) -> IO a
withDL_ :: String -> [RTLDFlags] -> (DL -> IO a) -> IO ()

-- | <a>undl</a> obtains the raw handle. You mustn't do something like
--   <tt>withDL mod flags $ liftM undl &gt;&gt;= p -&gt; use p</tt>
undl :: DL -> Ptr ()


-- | DLOpen support, old API Derived from GModule.chs by M.Weber &amp;
--   M.Chakravarty which is part of c2hs I left the API more or less the
--   same, mostly the flags are different.
module System.Posix.DynamicLinker.Module
data Module
moduleOpen :: String -> [RTLDFlags] -> IO Module
moduleSymbol :: Module -> String -> IO (FunPtr a)
moduleClose :: Module -> IO ()
moduleError :: IO String
withModule :: Maybe String -> String -> [RTLDFlags] -> (Module -> IO a) -> IO a
withModule_ :: Maybe String -> String -> [RTLDFlags] -> (Module -> IO a) -> IO ()


-- | DLOpen support, old API Derived from GModule.chs by M.Weber &amp;
--   M.Chakravarty which is part of c2hs I left the API more or less the
--   same, mostly the flags are different.
module System.Posix.DynamicLinker.Module.ByteString
data Module
moduleOpen :: RawFilePath -> [RTLDFlags] -> IO Module
moduleSymbol :: Module -> String -> IO (FunPtr a)
moduleClose :: Module -> IO ()
moduleError :: IO String
withModule :: Maybe String -> String -> [RTLDFlags] -> (Module -> IO a) -> IO a
withModule_ :: Maybe String -> String -> [RTLDFlags] -> (Module -> IO a) -> IO ()


-- | POSIX shared memory support.
module System.Posix.SharedMem
data ShmOpenFlags
ShmOpenFlags :: Bool -> Bool -> Bool -> Bool -> ShmOpenFlags

-- | If true, open the shm object read-write rather than read-only.
shmReadWrite :: ShmOpenFlags -> Bool

-- | If true, create the shm object if it does not exist.
shmCreate :: ShmOpenFlags -> Bool

-- | If true, throw an exception if the shm object already exists.
shmExclusive :: ShmOpenFlags -> Bool

-- | If true, wipe the contents of the shm object after opening it.
shmTrunc :: ShmOpenFlags -> Bool

-- | Open a shared memory object with the given name, flags, and mode.
shmOpen :: String -> ShmOpenFlags -> FileMode -> IO Fd

-- | Delete the shared memory object with the given name.
shmUnlink :: String -> IO ()


-- | POSIX named semaphore support.
module System.Posix.Semaphore
data OpenSemFlags
OpenSemFlags :: Bool -> Bool -> OpenSemFlags

-- | If true, create the semaphore if it does not yet exist.
semCreate :: OpenSemFlags -> Bool

-- | If true, throw an exception if the semaphore already exists.
semExclusive :: OpenSemFlags -> Bool
data Semaphore

-- | Open a named semaphore with the given name, flags, mode, and initial
--   value.
semOpen :: String -> OpenSemFlags -> FileMode -> Int -> IO Semaphore

-- | Delete the semaphore with the given name.
semUnlink :: String -> IO ()

-- | Lock the semaphore, blocking until it becomes available. Since this is
--   done through a system call, this will block the *entire runtime*, not
--   just the current thread. If this is not the behaviour you want, use
--   semThreadWait instead.
semWait :: Semaphore -> IO ()

-- | Attempt to lock the semaphore without blocking. Immediately return
--   False if it is not available.
semTryWait :: Semaphore -> IO Bool

-- | Poll the semaphore until it is available, then lock it. Unlike
--   semWait, this will block only the current thread rather than the
--   entire process.
semThreadWait :: Semaphore -> IO ()

-- | Unlock the semaphore.
semPost :: Semaphore -> IO ()

-- | Return the semaphore's current value.
semGetValue :: Semaphore -> IO Int


-- | POSIX resource support
module System.Posix.Resource
data ResourceLimit
ResourceLimitInfinity :: ResourceLimit
ResourceLimitUnknown :: ResourceLimit
ResourceLimit :: Integer -> ResourceLimit
data ResourceLimits
ResourceLimits :: ResourceLimit -> ResourceLimit -> ResourceLimits
softLimit :: ResourceLimits -> ResourceLimit
hardLimit :: ResourceLimits -> ResourceLimit
data Resource
ResourceCoreFileSize :: Resource
ResourceCPUTime :: Resource
ResourceDataSize :: Resource
ResourceFileSize :: Resource
ResourceOpenFiles :: Resource
ResourceStackSize :: Resource
ResourceTotalMemory :: Resource
getResourceLimit :: Resource -> IO ResourceLimits
setResourceLimit :: Resource -> ResourceLimits -> IO ()
instance Eq Resource
instance Eq ResourceLimit
instance Eq ResourceLimits


-- | POSIX user/group support
module System.Posix.User

-- | <tt>getRealUserID</tt> calls <tt>getuid</tt> to obtain the real
--   <tt>UserID</tt> associated with the current process.
getRealUserID :: IO UserID

-- | <tt>getRealGroupID</tt> calls <tt>getgid</tt> to obtain the real
--   <tt>GroupID</tt> associated with the current process.
getRealGroupID :: IO GroupID

-- | <tt>getEffectiveUserID</tt> calls <tt>geteuid</tt> to obtain the
--   effective <tt>UserID</tt> associated with the current process.
getEffectiveUserID :: IO UserID

-- | <tt>getEffectiveGroupID</tt> calls <tt>getegid</tt> to obtain the
--   effective <tt>GroupID</tt> associated with the current process.
getEffectiveGroupID :: IO GroupID

-- | <tt>getGroups</tt> calls <tt>getgroups</tt> to obtain the list of
--   supplementary <tt>GroupID</tt>s associated with the current process.
getGroups :: IO [GroupID]

-- | <tt>getLoginName</tt> calls <tt>getlogin</tt> to obtain the login name
--   associated with the current process.
getLoginName :: IO String

-- | <tt>getEffectiveUserName</tt> gets the name associated with the
--   effective <tt>UserID</tt> of the process.
getEffectiveUserName :: IO String
data GroupEntry
GroupEntry :: String -> String -> GroupID -> [String] -> GroupEntry

-- | The name of this group (gr_name)
groupName :: GroupEntry -> String

-- | The password for this group (gr_passwd)
groupPassword :: GroupEntry -> String

-- | The unique numeric ID for this group (gr_gid)
groupID :: GroupEntry -> GroupID

-- | A list of zero or more usernames that are members (gr_mem)
groupMembers :: GroupEntry -> [String]

-- | <tt>getGroupEntryForID gid</tt> calls <tt>getgrgid_r</tt> to obtain
--   the <tt>GroupEntry</tt> information associated with <tt>GroupID</tt>
--   <tt>gid</tt>. This operation may fail with <a>isDoesNotExistError</a>
--   if no such group exists.
getGroupEntryForID :: GroupID -> IO GroupEntry

-- | <tt>getGroupEntryForName name</tt> calls <tt>getgrnam_r</tt> to obtain
--   the <tt>GroupEntry</tt> information associated with the group called
--   <tt>name</tt>. This operation may fail with <a>isDoesNotExistError</a>
--   if no such group exists.
getGroupEntryForName :: String -> IO GroupEntry

-- | <tt>getAllGroupEntries</tt> returns all group entries on the system by
--   repeatedly calling <tt>getgrent</tt>
getAllGroupEntries :: IO [GroupEntry]
data UserEntry
UserEntry :: String -> String -> UserID -> GroupID -> String -> String -> String -> UserEntry

-- | Textual name of this user (pw_name)
userName :: UserEntry -> String

-- | Password -- may be empty or fake if shadow is in use (pw_passwd)
userPassword :: UserEntry -> String

-- | Numeric ID for this user (pw_uid)
userID :: UserEntry -> UserID

-- | Primary group ID (pw_gid)
userGroupID :: UserEntry -> GroupID

-- | Usually the real name for the user (pw_gecos)
userGecos :: UserEntry -> String

-- | Home directory (pw_dir)
homeDirectory :: UserEntry -> String

-- | Default shell (pw_shell)
userShell :: UserEntry -> String

-- | <tt>getUserEntryForID gid</tt> calls <tt>getpwuid_r</tt> to obtain the
--   <tt>UserEntry</tt> information associated with <tt>UserID</tt>
--   <tt>uid</tt>. This operation may fail with <a>isDoesNotExistError</a>
--   if no such user exists.
getUserEntryForID :: UserID -> IO UserEntry

-- | <tt>getUserEntryForName name</tt> calls <tt>getpwnam_r</tt> to obtain
--   the <tt>UserEntry</tt> information associated with the user login
--   <tt>name</tt>. This operation may fail with <a>isDoesNotExistError</a>
--   if no such user exists.
getUserEntryForName :: String -> IO UserEntry

-- | <tt>getAllUserEntries</tt> returns all user entries on the system by
--   repeatedly calling <tt>getpwent</tt>
getAllUserEntries :: IO [UserEntry]

-- | <tt>setUserID uid</tt> calls <tt>setuid</tt> to set the real,
--   effective, and saved set-user-id associated with the current process
--   to <tt>uid</tt>.
setUserID :: UserID -> IO ()

-- | <tt>setGroupID gid</tt> calls <tt>setgid</tt> to set the real,
--   effective, and saved set-group-id associated with the current process
--   to <tt>gid</tt>.
setGroupID :: GroupID -> IO ()

-- | <tt>setEffectiveUserID uid</tt> calls <tt>seteuid</tt> to set the
--   effective user-id associated with the current process to <tt>uid</tt>.
--   This does not update the real user-id or set-user-id.
setEffectiveUserID :: UserID -> IO ()

-- | <tt>setEffectiveGroupID uid</tt> calls <tt>setegid</tt> to set the
--   effective group-id associated with the current process to
--   <tt>gid</tt>. This does not update the real group-id or set-group-id.
setEffectiveGroupID :: GroupID -> IO ()

-- | <tt>setGroups</tt> calls <tt>setgroups</tt> to set the list of
--   supplementary <tt>GroupID</tt>s associated with the current process.
setGroups :: [GroupID] -> IO ()
instance Show GroupEntry
instance Read GroupEntry
instance Eq GroupEntry
instance Show UserEntry
instance Read UserEntry
instance Eq UserEntry


-- | POSIX Time support
module System.Posix.Time

-- | <tt>epochTime</tt> calls <tt>time</tt> to obtain the number of seconds
--   that have elapsed since the epoch (Jan 01 00:00:00 GMT 1970).
epochTime :: IO EpochTime


-- | POSIX Terminal support
module System.Posix.Terminal
data TerminalAttributes

-- | <tt>getTerminalAttributes fd</tt> calls <tt>tcgetattr</tt> to obtain
--   the <tt>TerminalAttributes</tt> associated with <tt>Fd</tt>
--   <tt>fd</tt>.
getTerminalAttributes :: Fd -> IO TerminalAttributes
data TerminalState
Immediately :: TerminalState
WhenDrained :: TerminalState
WhenFlushed :: TerminalState

-- | <tt>setTerminalAttributes fd attr ts</tt> calls <tt>tcsetattr</tt> to
--   change the <tt>TerminalAttributes</tt> associated with <tt>Fd</tt>
--   <tt>fd</tt> to <tt>attr</tt>, when the terminal is in the state
--   indicated by <tt>ts</tt>.
setTerminalAttributes :: Fd -> TerminalAttributes -> TerminalState -> IO ()
data TerminalMode
InterruptOnBreak :: TerminalMode
MapCRtoLF :: TerminalMode
IgnoreBreak :: TerminalMode
IgnoreCR :: TerminalMode
IgnoreParityErrors :: TerminalMode
MapLFtoCR :: TerminalMode
CheckParity :: TerminalMode
StripHighBit :: TerminalMode
StartStopInput :: TerminalMode
StartStopOutput :: TerminalMode
MarkParityErrors :: TerminalMode
ProcessOutput :: TerminalMode
LocalMode :: TerminalMode
ReadEnable :: TerminalMode
TwoStopBits :: TerminalMode
HangupOnClose :: TerminalMode
EnableParity :: TerminalMode
OddParity :: TerminalMode
EnableEcho :: TerminalMode
EchoErase :: TerminalMode
EchoKill :: TerminalMode
EchoLF :: TerminalMode
ProcessInput :: TerminalMode
ExtendedFunctions :: TerminalMode
KeyboardInterrupts :: TerminalMode
NoFlushOnInterrupt :: TerminalMode
BackgroundWriteInterrupt :: TerminalMode
withoutMode :: TerminalAttributes -> TerminalMode -> TerminalAttributes
withMode :: TerminalAttributes -> TerminalMode -> TerminalAttributes
terminalMode :: TerminalMode -> TerminalAttributes -> Bool
bitsPerByte :: TerminalAttributes -> Int
withBits :: TerminalAttributes -> Int -> TerminalAttributes
data ControlCharacter
EndOfFile :: ControlCharacter
EndOfLine :: ControlCharacter
Erase :: ControlCharacter
Interrupt :: ControlCharacter
Kill :: ControlCharacter
Quit :: ControlCharacter
Start :: ControlCharacter
Stop :: ControlCharacter
Suspend :: ControlCharacter
controlChar :: TerminalAttributes -> ControlCharacter -> Maybe Char
withCC :: TerminalAttributes -> (ControlCharacter, Char) -> TerminalAttributes
withoutCC :: TerminalAttributes -> ControlCharacter -> TerminalAttributes
inputTime :: TerminalAttributes -> Int
withTime :: TerminalAttributes -> Int -> TerminalAttributes
minInput :: TerminalAttributes -> Int
withMinInput :: TerminalAttributes -> Int -> TerminalAttributes
data BaudRate
B0 :: BaudRate
B50 :: BaudRate
B75 :: BaudRate
B110 :: BaudRate
B134 :: BaudRate
B150 :: BaudRate
B200 :: BaudRate
B300 :: BaudRate
B600 :: BaudRate
B1200 :: BaudRate
B1800 :: BaudRate
B2400 :: BaudRate
B4800 :: BaudRate
B9600 :: BaudRate
B19200 :: BaudRate
B38400 :: BaudRate
B57600 :: BaudRate
B115200 :: BaudRate
inputSpeed :: TerminalAttributes -> BaudRate
withInputSpeed :: TerminalAttributes -> BaudRate -> TerminalAttributes
outputSpeed :: TerminalAttributes -> BaudRate
withOutputSpeed :: TerminalAttributes -> BaudRate -> TerminalAttributes

-- | <tt>sendBreak fd duration</tt> calls <tt>tcsendbreak</tt> to transmit
--   a continuous stream of zero-valued bits on <tt>Fd</tt> <tt>fd</tt> for
--   the specified implementation-dependent <tt>duration</tt>.
sendBreak :: Fd -> Int -> IO ()

-- | <tt>drainOutput fd</tt> calls <tt>tcdrain</tt> to block until all
--   output written to <tt>Fd</tt> <tt>fd</tt> has been transmitted.
drainOutput :: Fd -> IO ()
data QueueSelector
InputQueue :: QueueSelector
OutputQueue :: QueueSelector
BothQueues :: QueueSelector

-- | <tt>discardData fd queues</tt> calls <tt>tcflush</tt> to discard
--   pending input and/or output for <tt>Fd</tt> <tt>fd</tt>, as indicated
--   by the <tt>QueueSelector</tt> <tt>queues</tt>.
discardData :: Fd -> QueueSelector -> IO ()
data FlowAction

-- | TCOOFF
SuspendOutput :: FlowAction

-- | TCOON
RestartOutput :: FlowAction

-- | TCIOFF
TransmitStop :: FlowAction

-- | TCION
TransmitStart :: FlowAction

-- | <tt>controlFlow fd action</tt> calls <tt>tcflow</tt> to control the
--   flow of data on <tt>Fd</tt> <tt>fd</tt>, as indicated by
--   <tt>action</tt>.
controlFlow :: Fd -> FlowAction -> IO ()

-- | <tt>getTerminalProcessGroupID fd</tt> calls <tt>tcgetpgrp</tt> to
--   obtain the <tt>ProcessGroupID</tt> of the foreground process group
--   associated with the terminal attached to <tt>Fd</tt> <tt>fd</tt>.
getTerminalProcessGroupID :: Fd -> IO ProcessGroupID

-- | <tt>setTerminalProcessGroupID fd pgid</tt> calls <tt>tcsetpgrp</tt> to
--   set the <tt>ProcessGroupID</tt> of the foreground process group
--   associated with the terminal attached to <tt>Fd</tt> <tt>fd</tt> to
--   <tt>pgid</tt>.
setTerminalProcessGroupID :: Fd -> ProcessGroupID -> IO ()

-- | <tt>queryTerminal fd</tt> calls <tt>isatty</tt> to determine whether
--   or not <tt>Fd</tt> <tt>fd</tt> is associated with a terminal.
queryTerminal :: Fd -> IO Bool

-- | <tt>getTerminalName fd</tt> calls <tt>ttyname</tt> to obtain a name
--   associated with the terminal for <tt>Fd</tt> <tt>fd</tt>. If
--   <tt>fd</tt> is associated with a terminal, <tt>getTerminalName</tt>
--   returns the name of the terminal.
getTerminalName :: Fd -> IO FilePath

-- | <tt>getControllingTerminalName</tt> calls <tt>ctermid</tt> to obtain a
--   name associated with the controlling terminal for the process. If a
--   controlling terminal exists, <tt>getControllingTerminalName</tt>
--   returns the name of the controlling terminal.
getControllingTerminalName :: IO FilePath

-- | <tt>openPseudoTerminal</tt> creates a pseudoterminal (pty) pair, and
--   returns the newly created pair as a (<tt>master</tt>, <tt>slave</tt>)
--   tuple.
openPseudoTerminal :: IO (Fd, Fd)

-- | <tt>getSlaveTerminalName</tt> calls <tt>ptsname</tt> to obtain the
--   name of the slave terminal associated with a pseudoterminal pair. The
--   file descriptor to pass in must be that of the master.
getSlaveTerminalName :: Fd -> IO FilePath


-- | POSIX process support. See also the System.Cmd and System.Process
--   modules in the process package.
module System.Posix.Process

-- | <a>forkProcess</a> corresponds to the POSIX <tt>fork</tt> system call.
--   The <a>IO</a> action passed as an argument is executed in the child
--   process; no other threads will be copied to the child process. On
--   success, <a>forkProcess</a> returns the child's <a>ProcessID</a> to
--   the parent process; in case of an error, an exception is thrown.
--   
--   The exception masking state of the executed action is inherited (c.f.
--   <tt>forkIO</tt>), see also <a>forkProcessWithUnmask</a> (<i>since:
--   2.7.0.0</i>).
--   
--   <a>forkProcess</a> comes with a giant warning: since any other running
--   threads are not copied into the child process, it's easy to go wrong:
--   e.g. by accessing some shared resource that was held by another thread
--   in the parent.
forkProcess :: IO () -> IO ProcessID

-- | Variant of <a>forkProcess</a> in the style of
--   <tt>forkIOWithUnmask</tt>.
--   
--   <i>Since: 2.7.0.0</i>
forkProcessWithUnmask :: ((forall a. IO a -> IO a) -> IO ()) -> IO ProcessID

-- | <tt><a>executeFile</a> cmd args env</tt> calls one of the
--   <tt>execv*</tt> family, depending on whether or not the current PATH
--   is to be searched for the command, and whether or not an environment
--   is provided to supersede the process's current environment. The
--   basename (leading directory names suppressed) of the command is passed
--   to <tt>execv*</tt> as <tt>arg[0]</tt>; the argument list passed to
--   <a>executeFile</a> therefore begins with <tt>arg[1]</tt>.
executeFile :: FilePath -> Bool -> [String] -> Maybe [(String, String)] -> IO a

-- | <tt><a>exitImmediately</a> status</tt> calls <tt>_exit</tt> to
--   terminate the process with the indicated exit <tt>status</tt>. The
--   operation never returns.
exitImmediately :: ExitCode -> IO ()

-- | <a>getProcessID</a> calls <tt>getpid</tt> to obtain the
--   <a>ProcessID</a> for the current process.
getProcessID :: IO ProcessID

-- | <a>getProcessID</a> calls <tt>getppid</tt> to obtain the
--   <a>ProcessID</a> for the parent of the current process.
getParentProcessID :: IO ProcessID

-- | <a>getProcessGroupID</a> calls <tt>getpgrp</tt> to obtain the
--   <a>ProcessGroupID</a> for the current process.
getProcessGroupID :: IO ProcessGroupID

-- | <tt><a>getProcessGroupIDOf</a> pid</tt> calls <tt>getpgid</tt> to
--   obtain the <a>ProcessGroupID</a> for process <tt>pid</tt>.
getProcessGroupIDOf :: ProcessID -> IO ProcessGroupID

-- | <tt><a>createProcessGroupFor</a> pid</tt> calls <tt>setpgid</tt> to
--   make process <tt>pid</tt> a new process group leader.
createProcessGroupFor :: ProcessID -> IO ProcessGroupID

-- | <tt><a>joinProcessGroup</a> pgid</tt> calls <tt>setpgid</tt> to set
--   the <a>ProcessGroupID</a> of the current process to <tt>pgid</tt>.
joinProcessGroup :: ProcessGroupID -> IO ()

-- | <tt><a>setProcessGroupIDOf</a> pid pgid</tt> calls <tt>setpgid</tt> to
--   set the <tt>ProcessGroupIDOf</tt> for process <tt>pid</tt> to
--   <tt>pgid</tt>.
setProcessGroupIDOf :: ProcessID -> ProcessGroupID -> IO ()

-- | <a>createSession</a> calls <tt>setsid</tt> to create a new session
--   with the current process as session leader.
createSession :: IO ProcessGroupID
data ProcessTimes
ProcessTimes :: ClockTick -> ClockTick -> ClockTick -> ClockTick -> ClockTick -> ProcessTimes
elapsedTime :: ProcessTimes -> ClockTick
userTime :: ProcessTimes -> ClockTick
systemTime :: ProcessTimes -> ClockTick
childUserTime :: ProcessTimes -> ClockTick
childSystemTime :: ProcessTimes -> ClockTick

-- | <a>getProcessTimes</a> calls <tt>times</tt> to obtain time-accounting
--   information for the current process and its children.
getProcessTimes :: IO ProcessTimes
nice :: Int -> IO ()
getProcessPriority :: ProcessID -> IO Int
getProcessGroupPriority :: ProcessGroupID -> IO Int
getUserPriority :: UserID -> IO Int
setProcessPriority :: ProcessID -> Int -> IO ()
setProcessGroupPriority :: ProcessGroupID -> Int -> IO ()
setUserPriority :: UserID -> Int -> IO ()

-- | The exit status of a process
data ProcessStatus

-- | the process exited by calling <tt>exit()</tt> or returning from
--   <tt>main</tt>
Exited :: ExitCode -> ProcessStatus

-- | the process was terminated by a signal, the <tt>Bool</tt> is
--   <tt>True</tt> if a core dump was produced
--   
--   <i>Since: 2.7.0.0</i>
Terminated :: Signal -> Bool -> ProcessStatus

-- | the process was stopped by a signal
Stopped :: Signal -> ProcessStatus

-- | <tt><a>getProcessStatus</a> blk stopped pid</tt> calls
--   <tt>waitpid</tt>, returning <tt><a>Just</a> tc</tt>, the
--   <a>ProcessStatus</a> for process <tt>pid</tt> if it is available,
--   <a>Nothing</a> otherwise. If <tt>blk</tt> is <a>False</a>, then
--   <tt>WNOHANG</tt> is set in the options for <tt>waitpid</tt>, otherwise
--   not. If <tt>stopped</tt> is <a>True</a>, then <tt>WUNTRACED</tt> is
--   set in the options for <tt>waitpid</tt>, otherwise not.
getProcessStatus :: Bool -> Bool -> ProcessID -> IO (Maybe ProcessStatus)

-- | <tt><a>getAnyProcessStatus</a> blk stopped</tt> calls
--   <tt>waitpid</tt>, returning <tt><a>Just</a> (pid, tc)</tt>, the
--   <a>ProcessID</a> and <a>ProcessStatus</a> for any child process if a
--   child process has exited, or <a>Nothing</a> if there are child
--   processes but none have exited. If there are no child processes, then
--   <a>getAnyProcessStatus</a> raises an <tt>isDoesNotExistError</tt>
--   exception.
--   
--   If <tt>blk</tt> is <a>False</a>, then <tt>WNOHANG</tt> is set in the
--   options for <tt>waitpid</tt>, otherwise not. If <tt>stopped</tt> is
--   <a>True</a>, then <tt>WUNTRACED</tt> is set in the options for
--   <tt>waitpid</tt>, otherwise not.
getAnyProcessStatus :: Bool -> Bool -> IO (Maybe (ProcessID, ProcessStatus))

-- | <tt><a>getGroupProcessStatus</a> blk stopped pgid</tt> calls
--   <tt>waitpid</tt>, returning <tt><a>Just</a> (pid, tc)</tt>, the
--   <a>ProcessID</a> and <a>ProcessStatus</a> for any process in group
--   <tt>pgid</tt> if one is available, or <a>Nothing</a> if there are
--   child processes but none have exited. If there are no child processes,
--   then <a>getGroupProcessStatus</a> raises an
--   <tt>isDoesNotExistError</tt> exception.
--   
--   If <tt>blk</tt> is <a>False</a>, then <tt>WNOHANG</tt> is set in the
--   options for <tt>waitpid</tt>, otherwise not. If <tt>stopped</tt> is
--   <a>True</a>, then <tt>WUNTRACED</tt> is set in the options for
--   <tt>waitpid</tt>, otherwise not.
getGroupProcessStatus :: Bool -> Bool -> ProcessGroupID -> IO (Maybe (ProcessID, ProcessStatus))

-- | <tt><a>createProcessGroup</a> pid</tt> calls <tt>setpgid</tt> to make
--   process <tt>pid</tt> a new process group leader. This function is
--   currently deprecated, and might be changed to making the current
--   process a new process group leader in future versions.

-- | <i>Deprecated: This function is scheduled to be replaced by something
--   different in the future, we therefore recommend that you do not use
--   this version and use <a>createProcessGroupFor</a> instead.</i>
createProcessGroup :: ProcessID -> IO ProcessGroupID

-- | <tt><a>setProcessGroupID</a> pid pgid</tt> calls <tt>setpgid</tt> to
--   set the <a>ProcessGroupID</a> for process <tt>pid</tt> to
--   <tt>pgid</tt>. This function is currently deprecated, and might be
--   changed to setting the <a>ProcessGroupID</a> for the current process
--   in future versions.

-- | <i>Deprecated: This function is scheduled to be replaced by something
--   different in the future, we therefore recommend that you do not use
--   this version and use <a>setProcessGroupIDOf</a> instead.</i>
setProcessGroupID :: ProcessID -> ProcessGroupID -> IO ()


-- | 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 <a>System.IO</a>.
module System.Posix.IO
stdInput :: Fd
stdOutput :: Fd
stdError :: Fd
data OpenMode
ReadOnly :: OpenMode
WriteOnly :: OpenMode
ReadWrite :: OpenMode

-- | Correspond to some of the int flags from C's fcntl.h.
data OpenFileFlags
OpenFileFlags :: Bool -> Bool -> Bool -> Bool -> Bool -> OpenFileFlags

-- | O_APPEND
append :: OpenFileFlags -> Bool

-- | O_EXCL
exclusive :: OpenFileFlags -> Bool

-- | O_NOCTTY
noctty :: OpenFileFlags -> Bool

-- | O_NONBLOCK
nonBlock :: OpenFileFlags -> Bool

-- | O_TRUNC
trunc :: OpenFileFlags -> Bool

-- | Default values for the <a>OpenFileFlags</a> type. False for each of
--   append, exclusive, noctty, nonBlock, and trunc.
defaultFileFlags :: OpenFileFlags

-- | Open and optionally create this file. See <a>Files</a> for information
--   on how to use the <a>FileMode</a> type.
openFd :: FilePath -> OpenMode -> Maybe FileMode -> OpenFileFlags -> IO Fd

-- | Create and open this file in WriteOnly mode. A special case of
--   <a>openFd</a>. See <a>Files</a> for information on how to use the
--   <a>FileMode</a> type.
createFile :: FilePath -> FileMode -> IO Fd

-- | Close this file descriptor. May throw an exception if this is an
--   invalid descriptor.
closeFd :: Fd -> IO ()

-- | Read data from an <a>Fd</a> and convert it to a <a>String</a> using
--   the locale encoding. Throws an exception if this is an invalid
--   descriptor, or EOF has been reached.
fdRead :: Fd -> ByteCount -> IO (String, ByteCount)

-- | Write a <a>String</a> to an <a>Fd</a> using the locale encoding.
fdWrite :: Fd -> String -> IO ByteCount

-- | Read data from an <a>Fd</a> into memory. This is exactly equivalent to
--   the POSIX <tt>read</tt> function.
fdReadBuf :: Fd -> Ptr Word8 -> ByteCount -> IO ByteCount

-- | Write data from memory to an <a>Fd</a>. This is exactly equivalent to
--   the POSIX <tt>write</tt> function.
fdWriteBuf :: Fd -> Ptr Word8 -> ByteCount -> IO ByteCount

-- | May throw an exception if this is an invalid descriptor.
fdSeek :: Fd -> SeekMode -> FileOffset -> IO FileOffset
data FdOption

-- | O_APPEND
AppendOnWrite :: FdOption

-- | FD_CLOEXEC
CloseOnExec :: FdOption

-- | O_NONBLOCK
NonBlockingRead :: FdOption

-- | O_SYNC
SynchronousWrites :: FdOption

-- | May throw an exception if this is an invalid descriptor.
queryFdOption :: Fd -> FdOption -> IO Bool

-- | May throw an exception if this is an invalid descriptor.
setFdOption :: Fd -> FdOption -> Bool -> IO ()
type FileLock = (LockRequest, SeekMode, FileOffset, FileOffset)
data LockRequest
ReadLock :: LockRequest
WriteLock :: LockRequest
Unlock :: LockRequest

-- | May throw an exception if this is an invalid descriptor.
getLock :: Fd -> FileLock -> IO (Maybe (ProcessID, FileLock))

-- | May throw an exception if this is an invalid descriptor.
setLock :: Fd -> FileLock -> IO ()

-- | May throw an exception if this is an invalid descriptor.
waitToSetLock :: Fd -> FileLock -> IO ()

-- | The <a>createPipe</a> function creates a pair of connected file
--   descriptors. The first component is the fd to read from, the second is
--   the write end. Although pipes may be bidirectional, this behaviour is
--   not portable and programmers should use two separate pipes for this
--   purpose. May throw an exception if this is an invalid descriptor.
createPipe :: IO (Fd, Fd)

-- | May throw an exception if this is an invalid descriptor.
dup :: Fd -> IO Fd

-- | May throw an exception if this is an invalid descriptor.
dupTo :: Fd -> Fd -> IO Fd

-- | Extracts the <a>Fd</a> from a <a>Handle</a>. This function has the
--   side effect of closing the <a>Handle</a> and flushing its write
--   buffer, if necessary.
handleToFd :: Handle -> IO Fd

-- | Converts an <a>Fd</a> into a <a>Handle</a> that can be used with the
--   standard Haskell IO library (see <a>System.IO</a>).
fdToHandle :: Fd -> IO Handle


-- | POSIX temporary file and directory creation functions.
module System.Posix.Temp

-- | Make a unique filename and open it for reading/writing. The returned
--   <a>FilePath</a> is the (possibly relative) path of the created file,
--   which is padded with 6 random characters. The argument is the desired
--   prefix of the filepath of the temporary file to be created.
--   
--   If you aren't using GHC or Hugs then this function simply wraps mktemp
--   and so shouldn't be considered safe.
mkstemp :: String -> IO (FilePath, Handle)

-- | Make a unique filename with a given prefix and suffix and open it for
--   reading/writing. The returned <a>FilePath</a> is the (possibly
--   relative) path of the created file, which contains 6 random characters
--   in between the prefix and suffix. The first argument is the desired
--   prefix of the filepath of the temporary file to be created. The second
--   argument is the suffix of the temporary file to be created.
--   
--   If you are using as system that doesn't support the mkstemps glibc
--   function (supported in glibc &gt; 2.11) then this function simply
--   throws an error.
mkstemps :: String -> String -> IO (FilePath, Handle)

-- | Make a unique directory. The returned <a>FilePath</a> 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.
--   
--   If you are using as system that doesn't support the mkdtemp glibc
--   function (supported in glibc &gt; 2.1.91) then this function uses
--   mktemp and so shouldn't be considered safe.
mkdtemp :: String -> IO FilePath


-- | POSIX temporary file and directory creation functions.
module System.Posix.Temp.ByteString

-- | Make a unique filename and open it for reading/writing. The returned
--   <a>RawFilePath</a> is the (possibly relative) path of the created
--   file, which is padded with 6 random characters. The argument is the
--   desired prefix of the filepath of the temporary file to be created.
--   
--   If you aren't using GHC or Hugs then this function simply wraps mktemp
--   and so shouldn't be considered safe.
mkstemp :: ByteString -> IO (RawFilePath, Handle)

-- | <a>mkstemps</a> - make a unique filename with a given prefix and
--   suffix and open it for reading/writing (only safe on GHC &amp; Hugs).
--   The returned <a>RawFilePath</a> 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)

-- | Make a unique directory. The returned <a>RawFilePath</a> 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.
--   
--   If you aren't using GHC or Hugs then this function simply wraps mktemp
--   and so shouldn't be considered safe.
mkdtemp :: ByteString -> IO RawFilePath


-- | POSIX miscellaneous stuff, mostly from unistd.h
module System.Posix.Unistd
data SystemID
SystemID :: String -> String -> String -> String -> String -> SystemID
systemName :: SystemID -> String
nodeName :: SystemID -> String
release :: SystemID -> String
version :: SystemID -> String
machine :: SystemID -> String
getSystemID :: IO SystemID
data SysVar
ArgumentLimit :: SysVar
ChildLimit :: SysVar
ClockTick :: SysVar
GroupLimit :: SysVar
OpenFileLimit :: SysVar
PosixVersion :: SysVar
HasSavedIDs :: SysVar
HasJobControl :: SysVar
getSysVar :: SysVar -> IO Integer

-- | Sleep for the specified duration (in seconds). Returns the time
--   remaining (if the sleep was interrupted by a signal, for example).
--   
--   <i>GHC Note</i>: <a>threadDelay</a> is a better choice. Since GHC uses
--   signals for its internal clock, a call to <a>sleep</a> will usually be
--   interrupted immediately. That makes <a>sleep</a> unusable in a program
--   compiled with GHC, unless the RTS timer is disabled (with <tt>+RTS
--   -V0</tt>). Furthermore, without the <tt>-threaded</tt> option,
--   <a>sleep</a> will block all other user threads. Even with the
--   <tt>-threaded</tt> option, <a>sleep</a> requires a full OS thread to
--   itself. <a>threadDelay</a> has none of these shortcomings.

-- | <i>Warning: This function has several shortcomings (see
--   documentation). Please consider using Control.Concurrent.threadDelay
--   instead.</i>
sleep :: Int -> IO Int

-- | Sleep for the specified duration (in microseconds).
--   
--   <i>GHC Note</i>: <a>threadDelay</a> is a better choice. Without the
--   <tt>-threaded</tt> option, <a>usleep</a> will block all other user
--   threads. Even with the <tt>-threaded</tt> option, <a>usleep</a>
--   requires a full OS thread to itself. <a>threadDelay</a> has neither of
--   these shortcomings.
usleep :: Int -> IO ()

-- | Sleep for the specified duration (in nanoseconds)
--   
--   <i>GHC Note</i>: the comment for <a>usleep</a> also applies here.
nanosleep :: Integer -> IO ()


-- | Functions defined by the POSIX standards for manipulating and querying
--   the file system. Names of underlying POSIX functions are indicated
--   whenever possible. A more complete documentation of the POSIX
--   functions together with a more detailed description of different error
--   conditions are usually available in the system's manual pages or from
--   <a>http://www.unix.org/version3/online.html</a> (free registration
--   required).
--   
--   When a function that calls an underlying POSIX function fails, the
--   errno code is converted to an <a>IOError</a> using
--   <a>errnoToIOError</a>. For a list of which errno codes may be
--   generated, consult the POSIX documentation for the underlying
--   function.
module System.Posix.Files

-- | Combines the two file modes into one that contains modes that appear
--   in either.
unionFileModes :: FileMode -> FileMode -> FileMode

-- | Combines two file modes into one that only contains modes that appear
--   in both.
intersectFileModes :: FileMode -> FileMode -> FileMode

-- | No permissions.
nullFileMode :: FileMode

-- | Owner has read permission.
ownerReadMode :: FileMode

-- | Owner has write permission.
ownerWriteMode :: FileMode

-- | Owner has execute permission.
ownerExecuteMode :: FileMode

-- | Owner has read, write and execute permission.
ownerModes :: FileMode

-- | Group has read permission.
groupReadMode :: FileMode

-- | Group has write permission.
groupWriteMode :: FileMode

-- | Group has execute permission.
groupExecuteMode :: FileMode

-- | Group has read, write and execute permission.
groupModes :: FileMode

-- | Others have read permission.
otherReadMode :: FileMode

-- | Others have write permission.
otherWriteMode :: FileMode

-- | Others have execute permission.
otherExecuteMode :: FileMode

-- | Others have read, write and execute permission.
otherModes :: FileMode

-- | Set user ID on execution.
setUserIDMode :: FileMode

-- | Set group ID on execution.
setGroupIDMode :: FileMode

-- | Owner, group and others have read and write permission.
stdFileMode :: FileMode

-- | Owner, group and others have read, write and execute permission.
accessModes :: FileMode
fileTypeModes :: FileMode
blockSpecialMode :: FileMode
characterSpecialMode :: FileMode
namedPipeMode :: FileMode
regularFileMode :: FileMode
directoryMode :: FileMode
symbolicLinkMode :: FileMode
socketMode :: FileMode

-- | <tt>setFileMode path mode</tt> changes permission of the file given by
--   <tt>path</tt> to <tt>mode</tt>. This operation may fail with
--   <a>throwErrnoPathIfMinus1_</a> if <tt>path</tt> doesn't exist or if
--   the effective user ID of the current process is not that of the file's
--   owner.
--   
--   Note: calls <tt>chmod</tt>.
setFileMode :: FilePath -> FileMode -> IO ()

-- | <tt>setFdMode fd mode</tt> acts like <tt>setFileMode</tt> but uses a
--   file descriptor <tt>fd</tt> instead of a <a>FilePath</a>.
--   
--   Note: calls <tt>fchmod</tt>.
setFdMode :: Fd -> FileMode -> IO ()

-- | <tt>setFileCreationMask mode</tt> sets the file mode creation mask to
--   <tt>mode</tt>. Modes set by this operation are subtracted from files
--   and directories upon creation. The previous file creation mask is
--   returned.
--   
--   Note: calls <tt>umask</tt>.
setFileCreationMask :: FileMode -> IO FileMode

-- | <tt>fileAccess name read write exec</tt> checks if the file (or other
--   file system object) <tt>name</tt> can be accessed for reading, writing
--   and/or executing. To check a permission set the corresponding argument
--   to <a>True</a>.
--   
--   Note: calls <tt>access</tt>.
fileAccess :: FilePath -> Bool -> Bool -> Bool -> IO Bool

-- | Checks for the existence of the file.
--   
--   Note: calls <tt>access</tt>.
fileExist :: FilePath -> IO Bool

-- | POSIX defines operations to get information, such as owner,
--   permissions, size and access times, about a file. This information is
--   represented by the <a>FileStatus</a> type.
--   
--   Note: see <tt>chmod</tt>.
data FileStatus

-- | <tt>getFileStatus path</tt> calls gets the <tt>FileStatus</tt>
--   information (user ID, size, access times, etc.) for the file
--   <tt>path</tt>.
--   
--   Note: calls <tt>stat</tt>.
getFileStatus :: FilePath -> IO FileStatus

-- | <tt>getFdStatus fd</tt> acts as <tt>getFileStatus</tt> but uses a file
--   descriptor <tt>fd</tt>.
--   
--   Note: calls <tt>fstat</tt>.
getFdStatus :: Fd -> IO FileStatus

-- | Acts as <a>getFileStatus</a> except when the <a>FilePath</a> refers to
--   a symbolic link. In that case the <tt>FileStatus</tt> information of
--   the symbolic link itself is returned instead of that of the file it
--   points to.
--   
--   Note: calls <tt>lstat</tt>.
getSymbolicLinkStatus :: FilePath -> IO FileStatus

-- | ID of the device on which this file resides.
deviceID :: FileStatus -> DeviceID

-- | inode number
fileID :: FileStatus -> FileID

-- | File mode (such as permissions).
fileMode :: FileStatus -> FileMode

-- | Number of hard links to this file.
linkCount :: FileStatus -> LinkCount

-- | ID of owner.
fileOwner :: FileStatus -> UserID

-- | ID of group.
fileGroup :: FileStatus -> GroupID

-- | Describes the device that this file represents.
specialDeviceID :: FileStatus -> DeviceID

-- | Size of the file in bytes. If this file is a symbolic link the size is
--   the length of the pathname it contains.
fileSize :: FileStatus -> FileOffset

-- | Time of last access.
accessTime :: FileStatus -> EpochTime

-- | Time of last modification.
modificationTime :: FileStatus -> EpochTime

-- | Time of last status change (i.e. owner, group, link count, mode,
--   etc.).
statusChangeTime :: FileStatus -> EpochTime

-- | Time of last access in sub-second resolution.
accessTimeHiRes :: FileStatus -> POSIXTime

-- | Time of last modification in sub-second resolution.
modificationTimeHiRes :: FileStatus -> POSIXTime

-- | Time of last status change (i.e. owner, group, link count, mode, etc.)
--   in sub-second resolution.
statusChangeTimeHiRes :: FileStatus -> POSIXTime

-- | Checks if this file is a block device.
isBlockDevice :: FileStatus -> Bool

-- | Checks if this file is a character device.
isCharacterDevice :: FileStatus -> Bool

-- | Checks if this file is a named pipe device.
isNamedPipe :: FileStatus -> Bool

-- | Checks if this file is a regular file device.
isRegularFile :: FileStatus -> Bool

-- | Checks if this file is a directory device.
isDirectory :: FileStatus -> Bool

-- | Checks if this file is a symbolic link device.
isSymbolicLink :: FileStatus -> Bool

-- | Checks if this file is a socket device.
isSocket :: FileStatus -> Bool

-- | <tt>createNamedPipe fifo mode</tt> creates a new named pipe,
--   <tt>fifo</tt>, with permissions based on <tt>mode</tt>. May fail with
--   <a>throwErrnoPathIfMinus1_</a> if a file named <tt>name</tt> already
--   exists or if the effective user ID of the current process doesn't have
--   permission to create the pipe.
--   
--   Note: calls <tt>mkfifo</tt>.
createNamedPipe :: FilePath -> FileMode -> IO ()

-- | <tt>createDevice path mode dev</tt> creates either a regular or a
--   special file depending on the value of <tt>mode</tt> (and
--   <tt>dev</tt>). <tt>mode</tt> will normally be either
--   <a>blockSpecialMode</a> or <a>characterSpecialMode</a>. May fail with
--   <a>throwErrnoPathIfMinus1_</a> if a file named <tt>name</tt> already
--   exists or if the effective user ID of the current process doesn't have
--   permission to create the file.
--   
--   Note: calls <tt>mknod</tt>.
createDevice :: FilePath -> FileMode -> DeviceID -> IO ()

-- | <tt>createLink old new</tt> creates a new path, <tt>new</tt>, linked
--   to an existing file, <tt>old</tt>.
--   
--   Note: calls <tt>link</tt>.
createLink :: FilePath -> FilePath -> IO ()

-- | <tt>removeLink path</tt> removes the link named <tt>path</tt>.
--   
--   Note: calls <tt>unlink</tt>.
removeLink :: FilePath -> IO ()

-- | <tt>createSymbolicLink file1 file2</tt> creates a symbolic link named
--   <tt>file2</tt> which points to the file <tt>file1</tt>.
--   
--   Symbolic links are interpreted at run-time as if the contents of the
--   link had been substituted into the path being followed to find a file
--   or directory.
--   
--   Note: calls <tt>symlink</tt>.
createSymbolicLink :: FilePath -> FilePath -> IO ()

-- | Reads the <tt>FilePath</tt> pointed to by the symbolic link and
--   returns it.
--   
--   Note: calls <tt>readlink</tt>.
readSymbolicLink :: FilePath -> IO FilePath

-- | <tt>rename old new</tt> renames a file or directory from <tt>old</tt>
--   to <tt>new</tt>.
--   
--   Note: calls <tt>rename</tt>.
rename :: FilePath -> FilePath -> IO ()

-- | <tt>setOwnerAndGroup path uid gid</tt> changes the owner and group of
--   <tt>path</tt> to <tt>uid</tt> and <tt>gid</tt>, respectively.
--   
--   If <tt>uid</tt> or <tt>gid</tt> is specified as -1, then that ID is
--   not changed.
--   
--   Note: calls <tt>chown</tt>.
setOwnerAndGroup :: FilePath -> UserID -> GroupID -> IO ()

-- | Acts as <tt>setOwnerAndGroup</tt> but uses a file descriptor instead
--   of a <a>FilePath</a>.
--   
--   Note: calls <tt>fchown</tt>.
setFdOwnerAndGroup :: Fd -> UserID -> GroupID -> IO ()

-- | Acts as <a>setOwnerAndGroup</a> but does not follow symlinks (and thus
--   changes permissions on the link itself).
--   
--   Note: calls <tt>lchown</tt>.
setSymbolicLinkOwnerAndGroup :: FilePath -> UserID -> GroupID -> IO ()

-- | <tt>setFileTimes path atime mtime</tt> sets the access and
--   modification times associated with file <tt>path</tt> to
--   <tt>atime</tt> and <tt>mtime</tt>, respectively.
--   
--   Note: calls <tt>utime</tt>.
setFileTimes :: FilePath -> EpochTime -> EpochTime -> IO ()

-- | Like <a>setFileTimes</a> but timestamps can have sub-second
--   resolution.
--   
--   Note: calls <tt>utimensat</tt> or <tt>utimes</tt>.
--   
--   <i>Since: 2.7.0.0</i>
setFileTimesHiRes :: FilePath -> POSIXTime -> POSIXTime -> IO ()

-- | Like <tt>setFileTimesHiRes</tt> but uses a file descriptor instead of
--   a path. This operation is not supported on all platforms. On these
--   platforms, this function will raise an exception.
--   
--   Note: calls <tt>futimens</tt> or <tt>futimes</tt>.
--   
--   <i>Since: 2.7.0.0</i>
setFdTimesHiRes :: Fd -> POSIXTime -> POSIXTime -> IO ()

-- | Like <a>setFileTimesHiRes</a> but does not follow symbolic links. This
--   operation is not supported on all platforms. On these platforms, this
--   function will raise an exception.
--   
--   Note: calls <tt>utimensat</tt> or <tt>lutimes</tt>.
--   
--   <i>Since: 2.7.0.0</i>
setSymbolicLinkTimesHiRes :: FilePath -> POSIXTime -> POSIXTime -> IO ()

-- | <tt>touchFile path</tt> sets the access and modification times
--   associated with file <tt>path</tt> to the current time.
--   
--   Note: calls <tt>utime</tt>.
touchFile :: FilePath -> IO ()

-- | Like <tt>touchFile</tt> but uses a file descriptor instead of a path.
--   This operation is not supported on all platforms. On these platforms,
--   this function will raise an exception.
--   
--   Note: calls <tt>futimes</tt>.
--   
--   <i>Since: 2.7.0.0</i>
touchFd :: Fd -> IO ()

-- | Like <a>touchFile</a> but does not follow symbolic links. This
--   operation is not supported on all platforms. On these platforms, this
--   function will raise an exception.
--   
--   Note: calls <tt>lutimes</tt>.
--   
--   <i>Since: 2.7.0.0</i>
touchSymbolicLink :: FilePath -> IO ()

-- | Truncates the file down to the specified length. If the file was
--   larger than the given length before this operation was performed the
--   extra is lost.
--   
--   Note: calls <tt>truncate</tt>.
setFileSize :: FilePath -> FileOffset -> IO ()

-- | Acts as <tt>setFileSize</tt> but uses a file descriptor instead of a
--   <a>FilePath</a>.
--   
--   Note: calls <tt>ftruncate</tt>.
setFdSize :: Fd -> FileOffset -> IO ()
data PathVar
FileSizeBits :: PathVar
LinkLimit :: PathVar
InputLineLimit :: PathVar
InputQueueLimit :: PathVar
FileNameLimit :: PathVar
PathNameLimit :: PathVar
PipeBufferLimit :: PathVar
SymbolicLinkLimit :: PathVar
SetOwnerAndGroupIsRestricted :: PathVar
FileNamesAreNotTruncated :: PathVar
VDisableChar :: PathVar
AsyncIOAvailable :: PathVar
PrioIOAvailable :: PathVar
SyncIOAvailable :: PathVar

-- | <tt>getPathVar var path</tt> obtains the dynamic value of the
--   requested configurable file limit or option associated with file or
--   directory <tt>path</tt>. For defined file limits, <tt>getPathVar</tt>
--   returns the associated value. For defined file options, the result of
--   <tt>getPathVar</tt> is undefined, but not failure.
--   
--   Note: calls <tt>pathconf</tt>.
getPathVar :: FilePath -> PathVar -> IO Limit

-- | <tt>getFdPathVar var fd</tt> obtains the dynamic value of the
--   requested configurable file limit or option associated with the file
--   or directory attached to the open channel <tt>fd</tt>. For defined
--   file limits, <tt>getFdPathVar</tt> returns the associated value. For
--   defined file options, the result of <tt>getFdPathVar</tt> is
--   undefined, but not failure.
--   
--   Note: calls <tt>fpathconf</tt>.
getFdPathVar :: Fd -> PathVar -> IO Limit


-- | String-based POSIX directory support
module System.Posix.Directory

-- | <tt>createDirectory dir mode</tt> calls <tt>mkdir</tt> to create a new
--   directory, <tt>dir</tt>, with permissions based on <tt>mode</tt>.
createDirectory :: FilePath -> FileMode -> IO ()
removeDirectory :: FilePath -> IO ()
data DirStream

-- | <tt>openDirStream dir</tt> calls <tt>opendir</tt> to obtain a
--   directory stream for <tt>dir</tt>.
openDirStream :: FilePath -> IO DirStream

-- | <tt>readDirStream dp</tt> calls <tt>readdir</tt> to obtain the next
--   directory entry (<tt>struct dirent</tt>) for the open directory stream
--   <tt>dp</tt>, and returns the <tt>d_name</tt> member of that structure.
readDirStream :: DirStream -> IO FilePath

-- | <tt>rewindDirStream dp</tt> calls <tt>rewinddir</tt> to reposition the
--   directory stream <tt>dp</tt> at the beginning of the directory.
rewindDirStream :: DirStream -> IO ()

-- | <tt>closeDirStream dp</tt> calls <tt>closedir</tt> to close the
--   directory stream <tt>dp</tt>.
closeDirStream :: DirStream -> IO ()
data DirStreamOffset
tellDirStream :: DirStream -> IO DirStreamOffset
seekDirStream :: DirStream -> DirStreamOffset -> IO ()

-- | <tt>getWorkingDirectory</tt> calls <tt>getcwd</tt> to obtain the name
--   of the current working directory.
getWorkingDirectory :: IO FilePath

-- | <tt>changeWorkingDirectory dir</tt> calls <tt>chdir</tt> to change the
--   current working directory to <tt>dir</tt>.
changeWorkingDirectory :: FilePath -> IO ()
changeWorkingDirectoryFd :: Fd -> IO ()


-- | POSIX signal support
module System.Posix.Signals
type Signal = CInt
nullSignal :: Signal
internalAbort :: Signal
sigABRT :: CInt
realTimeAlarm :: Signal
sigALRM :: CInt
busError :: Signal
sigBUS :: CInt
processStatusChanged :: Signal
sigCHLD :: CInt
continueProcess :: Signal
sigCONT :: CInt
floatingPointException :: Signal
sigFPE :: CInt
lostConnection :: Signal
sigHUP :: CInt
illegalInstruction :: Signal
sigILL :: CInt
keyboardSignal :: Signal
sigINT :: CInt
killProcess :: Signal
sigKILL :: CInt
openEndedPipe :: Signal
sigPIPE :: CInt
keyboardTermination :: Signal
sigQUIT :: CInt
segmentationViolation :: Signal
sigSEGV :: CInt
softwareStop :: Signal
sigSTOP :: CInt
softwareTermination :: Signal
sigTERM :: CInt
keyboardStop :: Signal
sigTSTP :: CInt
backgroundRead :: Signal
sigTTIN :: CInt
backgroundWrite :: Signal
sigTTOU :: CInt
userDefinedSignal1 :: Signal
sigUSR1 :: CInt
userDefinedSignal2 :: Signal
sigUSR2 :: CInt
pollableEvent :: Signal
sigPOLL :: CInt
profilingTimerExpired :: Signal
sigPROF :: CInt
badSystemCall :: Signal
sigSYS :: CInt
breakpointTrap :: Signal
sigTRAP :: CInt
urgentDataAvailable :: Signal
sigURG :: CInt
virtualTimerExpired :: Signal
sigVTALRM :: CInt
cpuTimeLimitExceeded :: Signal
sigXCPU :: CInt
fileSizeLimitExceeded :: Signal
sigXFSZ :: CInt

-- | <tt>raiseSignal int</tt> calls <tt>kill</tt> to signal the current
--   process with interrupt signal <tt>int</tt>.
raiseSignal :: Signal -> IO ()

-- | <tt>signalProcess int pid</tt> calls <tt>kill</tt> to signal process
--   <tt>pid</tt> with interrupt signal <tt>int</tt>.
signalProcess :: Signal -> ProcessID -> IO ()

-- | <tt>signalProcessGroup int pgid</tt> calls <tt>kill</tt> to signal all
--   processes in group <tt>pgid</tt> with interrupt signal <tt>int</tt>.
signalProcessGroup :: Signal -> ProcessGroupID -> IO ()

-- | The actions to perform when a signal is received.
data Handler
Default :: Handler
Ignore :: Handler
Catch :: (IO ()) -> Handler
CatchOnce :: (IO ()) -> Handler

-- | <i>Since: 2.7.0.0</i>
CatchInfo :: (SignalInfo -> IO ()) -> Handler

-- | <i>Since: 2.7.0.0</i>
CatchInfoOnce :: (SignalInfo -> IO ()) -> Handler

-- | Information about a received signal (derived from <tt>siginfo_t</tt>).
--   
--   <i>Since: 2.7.0.0</i>
data SignalInfo
SignalInfo :: Signal -> Errno -> SignalSpecificInfo -> SignalInfo
siginfoSignal :: SignalInfo -> Signal
siginfoError :: SignalInfo -> Errno
siginfoSpecific :: SignalInfo -> SignalSpecificInfo

-- | Information specific to a particular type of signal (derived from
--   <tt>siginfo_t</tt>).
--   
--   <i>Since: 2.7.0.0</i>
data SignalSpecificInfo
NoSignalSpecificInfo :: SignalSpecificInfo
SigChldInfo :: ProcessID -> UserID -> ProcessStatus -> SignalSpecificInfo
siginfoPid :: SignalSpecificInfo -> ProcessID
siginfoUid :: SignalSpecificInfo -> UserID
siginfoStatus :: SignalSpecificInfo -> ProcessStatus

-- | <tt>installHandler int handler iset</tt> calls <tt>sigaction</tt> to
--   install an interrupt handler for signal <tt>int</tt>. If
--   <tt>handler</tt> is <tt>Default</tt>, <tt>SIG_DFL</tt> is installed;
--   if <tt>handler</tt> is <tt>Ignore</tt>, <tt>SIG_IGN</tt> is installed;
--   if <tt>handler</tt> is <tt>Catch action</tt>, a handler is installed
--   which will invoke <tt>action</tt> in a new thread when (or shortly
--   after) the signal is received. If <tt>iset</tt> is <tt>Just s</tt>,
--   then the <tt>sa_mask</tt> of the <tt>sigaction</tt> structure is set
--   to <tt>s</tt>; otherwise it is cleared. The previously installed
--   signal handler for <tt>int</tt> is returned
installHandler :: Signal -> Handler -> Maybe SignalSet -> IO Handler
data SignalSet
emptySignalSet :: SignalSet
fullSignalSet :: SignalSet

-- | A set of signals reserved for use by the implementation. In GHC, this
--   will normally include either <a>sigVTALRM</a> or <a>sigALRM</a>.
reservedSignals :: SignalSet
addSignal :: Signal -> SignalSet -> SignalSet
deleteSignal :: Signal -> SignalSet -> SignalSet
inSignalSet :: Signal -> SignalSet -> Bool

-- | <tt>getSignalMask</tt> calls <tt>sigprocmask</tt> to determine the set
--   of interrupts which are currently being blocked.
getSignalMask :: IO SignalSet

-- | <tt>setSignalMask mask</tt> calls <tt>sigprocmask</tt> with
--   <tt>SIG_SETMASK</tt> to block all interrupts in <tt>mask</tt>.
setSignalMask :: SignalSet -> IO ()

-- | <tt>blockSignals mask</tt> calls <tt>sigprocmask</tt> with
--   <tt>SIG_BLOCK</tt> to add all interrupts in <tt>mask</tt> to the set
--   of blocked interrupts.
blockSignals :: SignalSet -> IO ()

-- | <tt>unblockSignals mask</tt> calls <tt>sigprocmask</tt> with
--   <tt>SIG_UNBLOCK</tt> to remove all interrupts in <tt>mask</tt> from
--   the set of blocked interrupts.
unblockSignals :: SignalSet -> IO ()

-- | <tt>scheduleAlarm i</tt> calls <tt>alarm</tt> to schedule a real time
--   alarm at least <tt>i</tt> seconds in the future.
scheduleAlarm :: Int -> IO Int

-- | <tt>getPendingSignals</tt> calls <tt>sigpending</tt> to obtain the set
--   of interrupts which have been received but are currently blocked.
getPendingSignals :: IO SignalSet

-- | <tt>awaitSignal iset</tt> suspends execution until an interrupt is
--   received. If <tt>iset</tt> is <tt>Just s</tt>, <tt>awaitSignal</tt>
--   calls <tt>sigsuspend</tt>, installing <tt>s</tt> as the new signal
--   mask before suspending execution; otherwise, it calls
--   <tt>sigsuspend</tt> with current signal mask. Note that RTS scheduler
--   signal (either <a>virtualTimerExpired</a> or <a>realTimeAlarm</a>)
--   could cause premature termination of this call. It might be necessary
--   to block that signal before invocation of <tt>awaitSignal</tt> with
--   <a>blockSignals</a> <a>reservedSignals</a>.
--   
--   <tt>awaitSignal</tt> returns when signal was received and processed by
--   a signal handler, or if the signal could not be caught. If you have
--   installed any signal handlers with <tt>installHandler</tt>, it may be
--   wise to call <tt>yield</tt> directly after <tt>awaitSignal</tt> to
--   ensure that the signal handler runs as promptly as possible.
awaitSignal :: Maybe SignalSet -> IO ()

-- | Tells the system whether or not to set the <tt>SA_NOCLDSTOP</tt> flag
--   when installing new signal handlers.
setStoppedChildFlag :: Bool -> IO Bool

-- | Queries the current state of the stopped child flag.
queryStoppedChildFlag :: IO Bool
instance Typeable Handler


-- | POSIX support with ByteString file paths and environment strings.
--   
--   This module exports exactly the same API as <a>System.Posix</a>,
--   except that all file paths and environment strings are represented by
--   <tt>ByteString</tt> instead of <a>String</a>. The <a>System.Posix</a>
--   API implicitly translates all file paths and environment strings using
--   the locale encoding, whereas this version of the API does no encoding
--   or decoding and works directly in terms of raw bytes.
--   
--   Note that if you do need to interpret file paths or environment
--   strings as text, then some Unicode encoding or decoding should be
--   applied first.
module System.Posix.ByteString

-- | A literal POSIX file path
type RawFilePath = ByteString


-- | non-POSIX signal support commonly available
module System.Posix.Signals.Exts
windowChange :: Signal
sigWINCH :: CInt


-- | POSIX environment support
module System.Posix.Env

-- | <a>getEnv</a> looks up a variable in the environment.
getEnv :: String -> IO (Maybe String)

-- | <a>getEnvDefault</a> is a wrapper around <a>getEnv</a> where the
--   programmer can specify a fallback if the variable is not found in the
--   environment.
getEnvDefault :: String -> String -> IO String
getEnvironmentPrim :: IO [String]

-- | <a>getEnvironment</a> retrieves the entire environment as a list of
--   <tt>(key,value)</tt> pairs.
getEnvironment :: IO [(String, String)]

-- | <a>setEnvironment</a> resets the entire environment to the given list
--   of <tt>(key,value)</tt> pairs.
setEnvironment :: [(String, String)] -> IO ()

-- | <a>putEnv</a> function takes an argument of the form
--   <tt>name=value</tt> and is equivalent to
--   <tt>setEnv(key,value,True{-overwrite-})</tt>.
putEnv :: String -> IO ()

-- | The <a>setEnv</a> function inserts or resets the environment variable
--   name in the current environment list. If the variable <tt>name</tt>
--   does not exist in the list, it is inserted with the given value. If
--   the variable does exist, the argument <tt>overwrite</tt> is tested; if
--   <tt>overwrite</tt> is <tt>False</tt>, the variable is not reset,
--   otherwise it is reset to the given value.
setEnv :: String -> String -> Bool -> IO ()

-- | The <a>unsetEnv</a> function deletes all instances of the variable
--   name from the environment.
unsetEnv :: String -> IO ()

-- | The <a>clearEnv</a> function clears the environment of all name-value
--   pairs.
clearEnv :: IO ()


-- | POSIX support
module System.Posix
