The Posix library
Posix librarylibraries, Posix
The Posix interface gives you access to the set of OS
services standardised by POSIX 1003.1b (or the IEEE Portable
Operating System Interface for Computing Environments - IEEE Std.
1003.1). The interface is accessed by import Posix and
adding on your command-line.
Posix data types
Posix, data types
data ByteCount -- instances of : Eq Ord Num Real Integral Ix Enum Show
A ByteCount is a primitive of type unsigned. At a minimum,
an conforming implementation must support values in the range
[0, UINT_MAX].
data ClockTick -- instances of : Eq Ord Num Real Integral Ix Enum Show
A ClockTick is a primitive of type clock_t, which
is used to measure intervals of time in fractions of a second. The
resolution is determined by getSysVar ClockTick.
data DeviceID -- instances of : Eq Ord Num Real Integral Ix Enum Show
A DeviceID is a primitive of type dev_t. It must
be an arithmetic type.
data EpochTime -- instances of : Eq Ord Num Real Integral Ix Enum Show
A EpochTime is a primitive of type time_t, which is
used to measure seconds since the Epoch. At a minimum, the implementation
must support values in the range [0, INT_MAX].
data FileID -- instances of : Eq Ord Num Real Integral Ix Enum Show
A FileID is a primitive of type ino_t. It must
be an arithmetic type.
data FileMode -- instances of : Eq Ord Num Real Integral Ix Enum Show
A FileMode is a primitive of type mode_t.
It must be an arithmetic type.
data FileOffset -- instances of : Eq Ord Num Real Integral Ix Enum Show
A FileOffset is a primitive of type off_t. It must
be an arithmetic type.
data GroupID -- instances of : Eq Ord Num Real Integral Ix Enum Show
A GroupID is a primitive of type gid_t. It must
be an arithmetic type.
data Limit -- instances of : Eq Ord Num Real Integral Ix Enum Show
A Limit is a primitive of type long.
At a minimum, the implementation must support values in the range
[LONG_MIN, LONG_MAX].
data LinkCount -- instances of : Eq Ord Num Real Integral Ix Enum Show
A LinkCount is a primitive of type nlink_t. It must
be an arithmetic type.
data ProcessID -- instances of : Eq Ord Num Real Integral Ix Enum Show
type ProcessGroupID = ProcessID
A ProcessID is a primitive of type pid_t. It
must be a signed arithmetic type.
data UserID -- instances of : Eq Ord Num Real Integral Ix Enum Show
A UserID is a primitive of type uid_t. It
must be an arithmetic type.
data DirStream
A DirStream is a primitive of type DIR *.
data FileStatus
A FileStatus is a primitive of type struct stat.
data GroupEntry
A GroupEntry is a primitive of type struct group.
data ProcessTimes
ProcessTimes is a primitive structure containing a
clock_t and a struct tms.
data SignalSet
An SignalSet is a primitive of type sigset_t.
data SystemID
A SystemID is a primitive of type struct utsname.
data TerminalAttributes
TerminalAttributes is a primitive of type struct termios.
data UserEntry
A UserEntry is a primitive of type struct passwd.
data BaudRate = B0 | B50 | B75 | B110 | B134 | B150 | B200 | B300 | B600
| B1200 | B1800 | B2400 | B4800 | B9600 | B19200 | B38400
deriving (Eq, Show)
data Fd
intToFd :: Int -> Fd -- use with care.
data FdOption = AppendOnWrite
| CloseOnExec
| NonBlockingRead
data ControlCharacter = EndOfFile
| EndOfLine
| Erase
| Interrupt
| Kill
| Quit
| Suspend
| Start
| Stop
type ErrorCode = Int
type FileLock = (LockRequest, SeekMode, FileOffset, FileOffset)
-- whence start length
data FlowAction = SuspendOutput | RestartOutput | TransmitStop | TransmitStart
data Handler = Default | Ignore | Catch (IO ())
data LockRequest = ReadLock | WriteLock | Unlock
deriving (Eq, Show)
data OpenMode = ReadOnly | WriteOnly | ReadWrite
data PathVar = LinkLimit
| InputLineLimit
| InputQueueLimit
| FileNameLimit
| PathNameLimit
| PipeBufferLimit
| SetOwnerAndGroupIsRestricted
| FileNamesAreNotTruncated
data QueueSelector = InputQueue | OutputQueue | BothQueues
type Signal = Int
data SysVar = ArgumentLimit
| ChildLimit
| ClockTick
| GroupLimit
| OpenFileLimit
| PosixVersion
| HasSavedIDs
| HasJobControl
data TerminalMode = InterruptOnBreak -- BRKINT
| MapCRtoLF -- ICRNL
| IgnoreBreak -- IGNBRK
| IgnoreCR -- IGNCR
| IgnoreParityErrors -- IGNPAR
| MapLFtoCR -- INLCR
| CheckParity -- INPCK
| StripHighBit -- ISTRIP
| StartStopInput -- IXOFF
| StartStopOutput -- IXON
| MarkParityErrors -- PARMRK
| ProcessOutput -- OPOST
| LocalMode -- CLOCAL
| ReadEnable -- CREAD
| TwoStopBits -- CSTOPB
| HangupOnClose -- HUPCL
| EnableParity -- PARENB
| OddParity -- PARODD
| EnableEcho -- ECHO
| EchoErase -- ECHOE
| EchoKill -- ECHOK
| EchoLF -- ECHONL
| ProcessInput -- ICANON
| ExtendedFunctions -- IEXTEN
| KeyboardInterrupts -- ISIG
| NoFlushOnInterrupt -- NOFLSH
| BackgroundWriteInterrupt -- TOSTOP
data TerminalState = Immediately | WhenDrained | WhenFlushed
data ProcessStatus = Exited ExitCode
| Terminated Signal
| Stopped Signal
deriving (Eq, Show)
Posix Process Primitives
forkProcess :: IO (Maybe ProcessID)
forkProcess calls fork, returning
Just pid to the parent, where pid is the
ProcessID of the child, and returning Nothing to the
child.
executeFile :: FilePath -- Command
-> Bool -- Search PATH?
-> [String] -- Arguments
-> Maybe [(String, String)] -- Environment
-> IO ()
executeFile cmd args env calls one of the
execv* 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 execv* as arg[0];
the argument list passed to executeFile therefore begins with arg[1].
Search PATH? Supersede environ? Call
~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~ ~~~~~~~
False False execv
False True execve
True False execvp
True True execvpe*
Note that execvpe is not provided by the POSIX standard, and must
be written by hand. Care must be taken to ensure that the search path
is extracted from the original environment, and not from the
environment to be passed on to the new image.
NOTE: In general, sharing open files between parent and child
processes is potential bug farm, and should be avoided unless you
really depend on this `feature' of POSIX' fork() semantics. Using
Haskell, there's the extra complication that arguments to
executeFile might come from files that are read lazily (using
hGetContents, or some such.) If this is the case, then for your own
sanity, please ensure that the arguments to executeFile have been
fully evaluated before calling forkProcess (followed by
executeFile.) Consider yourself warned :-)
A successful executeFile overlays the current process image with
a new one, so it only returns on failure.
runProcess :: FilePath -- Command
-> [String] -- Arguments
-> Maybe [(String, String)] -- Environment (Nothing -> Inherited)
-> Maybe FilePath -- Working directory (Nothing -> inherited)
-> Maybe Handle -- stdin (Nothing -> inherited)
-> Maybe Handle -- stdout (Nothing -> inherited)
-> Maybe Handle -- stderr (Nothing -> inherited)
-> IO ()
runProcess is our candidate for the high-level OS-independent
primitive.
runProcess cmd args env wd inhdl outhdl errhdl runs cmd
(searching the current PATH) with arguments args. If
env is Just pairs, the command is executed with the
environment specified by pairs of variables and values;
otherwise, the command is executed with the current environment. If
wd is Just dir, the command is executed with working
directory dir; otherwise, the command is executed in the current
working directory. If {in,out,errhdl} is Just handle, the
command is executed with the Fd for std{in,out,err}
attached to the specified handle; otherwise, the Fd for
std{in,out,err} is left unchanged.
getProcessStatus :: Bool -- Block?
-> Bool -- Stopped processes?
-> ProcessID
-> IO (Maybe ProcessStatus)
getProcessStatus blk stopped pid calls waitpid, returning
Just tc, the ProcessStatus for process pid if it is
available, Nothing otherwise. If blk is False, then
WNOHANG is set in the options for waitpid, otherwise not.
If stopped is True, then WUNTRACED is set in the
options for waitpid, otherwise not.
getGroupProcessStatus :: Bool -- Block?
-> Bool -- Stopped processes?
-> ProcessGroupID
-> IO (Maybe (ProcessID, ProcessStatus))
getGroupProcessStatus blk stopped pgid calls waitpid,
returning Just (pid, tc), the ProcessID and
ProcessStatus for any process in group pgid if one is
available, Nothing otherwise. If blk is False, then
WNOHANG is set in the options for waitpid, otherwise not.
If stopped is True, then WUNTRACED is set in the
options for waitpid, otherwise not.
getAnyProcessStatus :: Bool -- Block?
-> Bool -- Stopped processes?
-> IO (Maybe (ProcessID, ProcessStatus))
getAnyProcessStatus blk stopped calls waitpid, returning
Just (pid, tc), the ProcessID and ProcessStatus for any
child process if one is available, Nothing otherwise. If
blk is False, then WNOHANG is set in the options for
waitpid, otherwise not. If stopped is True, then
WUNTRACED is set in the options for waitpid, otherwise not.
exitImmediately :: ExitCode -> IO ()
exitImmediately status calls _exit to terminate the process
with the indicated exit status.
The operation never returns.
getEnvironment :: IO [(String, String)]
getEnvironment parses the environment variable mapping provided by
environ, returning (variable, value) pairs.
The operation never fails.
setEnvironment :: [(String, String)] -> IO ()
setEnvironment replaces the process environment with the provided
mapping of (variable, value) pairs.
getEnvVar :: String -> IO String
getEnvVar var returns the value associated with variable var
in the current environment (identical functionality provided through
standard Haskell library function System.getEnv).
The operation may fail with:
NoSuchThing
The variable has no mapping in the current environment.
setEnvVar :: String -> String -> IO ()
setEnvVar var val sets the value associated with variable var
in the current environment to be val. Any previous mapping is
superseded.
removeEnvVar :: String -> IO ()
removeEnvVar var removes any value associated with variable var
in the current environment. Deleting a variable for which there is no mapping
does not generate an error.
nullSignal :: Signal
nullSignal = 0
backgroundRead, sigTTIN :: Signal
backgroundWrite, sigTTOU :: Signal
continueProcess, sigCONT :: Signal
floatingPointException, sigFPE :: Signal
illegalInstruction, sigILL :: Signal
internalAbort, sigABRT :: Signal
keyboardSignal, sigINT :: Signal
keyboardStop, sigTSTP :: Signal
keyboardTermination, sigQUIT :: Signal
killProcess, sigKILL :: Signal
lostConnection, sigHUP :: Signal
openEndedPipe, sigPIPE :: Signal
processStatusChanged, sigCHLD :: Signal
realTimeAlarm, sigALRM :: Signal
segmentationViolation, sigSEGV :: Signal
softwareStop, sigSTOP :: Signal
softwareTermination, sigTERM :: Signal
userDefinedSignal1, sigUSR1 :: Signal
userDefinedSignal2, sigUSR2 :: Signal
signalProcess :: Signal -> ProcessID -> IO ()
signalProcess int pid calls kill to signal
process pid with interrupt signal int.
raiseSignal :: Signal -> IO ()
raiseSignal int calls kill to signal the current process
with interrupt signal int.
signalProcessGroup :: Signal -> ProcessGroupID -> IO ()
signalProcessGroup int pgid calls kill to signal
all processes in group pgid with interrupt signal int.
setStoppedChildFlag :: Bool -> IO Bool
setStoppedChildFlag bool sets a flag which controls whether or
not the NOCLDSTOP option will be used the next time a signal
handler is installed for SIGCHLD. If bool is True (the
default), NOCLDSTOP will not be used; otherwise it will be. The
operation never fails.
queryStoppedChildFlag :: IO Bool
queryStoppedChildFlag queries the flag which
controls whether or not the NOCLDSTOP option will be used
the next time a signal handler is installed for SIGCHLD.
If NOCLDSTOP will be used, it returns False;
otherwise (the default) it returns True.
The operation never fails.
emptySignalSet :: SignalSet
fullSignalSet :: SignalSet
addSignal :: Signal -> SignalSet -> SignalSet
deleteSignal :: Signal -> SignalSet -> SignalSet
inSignalSet :: Signal -> SignalSet -> Bool
installHandler :: Signal
-> Handler
-> Maybe SignalSet -- other signals to block
-> IO Handler -- old handler
installHandler int handler iset calls sigaction to install an
interrupt handler for signal int. If handler is Default,
SIG_DFL is installed; if handler is Ignore, SIG_IGN is
installed; if handler is Catch action, a handler is installed
which will invoke action in a new thread when (or shortly after) the
signal is received. See for details on how to communicate between
threads.
If iset is Just s, then the sa_mask of the sigaction structure
is set to s; otherwise it is cleared. The previously installed
signal handler for int is returned.
getSignalMask :: IO SignalSet
getSignalMask calls sigprocmask to determine the
set of interrupts which are currently being blocked.
setSignalMask :: SignalSet -> IO SignalSet
setSignalMask mask calls sigprocmask with
SIG_SETMASK to block all interrupts in mask. The
previous set of blocked interrupts is returned.
blockSignals :: SignalSet -> IO SignalSet
setSignalMask mask calls sigprocmask with
SIG_BLOCK to add all interrupts in mask to the
set of blocked interrupts. The previous set of blocked interrupts is returned.
unBlockSignals :: SignalSet -> IO SignalSet
setSignalMask mask calls sigprocmask with
SIG_UNBLOCK to remove all interrupts in mask from the
set of blocked interrupts. The previous set of blocked interrupts is returned.
getPendingSignals :: IO SignalSet
getPendingSignals calls sigpending to obtain
the set of interrupts which have been received but are currently blocked.
awaitSignal :: Maybe SignalSet -> IO ()
awaitSignal iset suspends execution until an interrupt is received.
If iset is Just s, awaitSignal calls sigsuspend, installing
s as the new signal mask before suspending execution; otherwise, it
calls pause. awaitSignal returns on receipt of a signal. If you
have installed any signal handlers with installHandler, it may be
wise to call yield directly after awaitSignal to ensure that the
signal handler runs as promptly.
scheduleAlarm :: Int -> IO Int
scheduleAlarm i calls alarm to schedule a real time
alarm at least i seconds in the future.
sleep :: Int -> IO ()
sleep i calls sleep to suspend execution of the
program until at least i seconds have elapsed or a signal is
received.
Posix Process Environment
Posix, process environment
getProcessID :: IO ProcessID
getProcessID calls getpid to obtain the ProcessID for
the current process.
getParentProcessID :: IO ProcessID
getProcessID calls getppid to obtain the ProcessID for
the parent of the current process.
getRealUserID :: IO UserID
getRealUserID calls getuid to obtain the real UserID
associated with the current process.
getEffectiveUserID :: IO UserID
getRealUserID calls geteuid to obtain the effective
UserID associated with the current process.
setUserID :: UserID -> IO ()
setUserID uid calls setuid to set the real, effective, and
saved set-user-id associated with the current process to uid.
getLoginName :: IO String
getLoginName calls getlogin to obtain the login name
associated with the current process.
getRealGroupID :: IO GroupID
getRealGroupID calls getgid to obtain the real GroupID
associated with the current process.
getEffectiveGroupID :: IO GroupID
getEffectiveGroupID calls getegid to obtain the effective
GroupID associated with the current process.
setGroupID :: GroupID -> IO ()
setGroupID gid calls setgid to set the real, effective, and
saved set-group-id associated with the current process to gid.
getGroups :: IO [GroupID]
getGroups calls getgroups to obtain the list of
supplementary GroupIDs associated with the current process.
getEffectiveUserName :: IO String
getEffectiveUserName calls cuserid to obtain a name
associated with the effective UserID of the process.
getProcessGroupID :: IO ProcessGroupID
getProcessGroupID calls getpgrp to obtain the
ProcessGroupID for the current process.
createProcessGroup :: ProcessID -> IO ProcessGroupID
createProcessGroup pid calls setpgid to make
process pid a new process group leader.
joinProcessGroup :: ProcessGroupID -> IO ProcessGroupID
joinProcessGroup pgid calls setpgid to set the
ProcessGroupID of the current process to pgid.
setProcessGroupID :: ProcessID -> ProcessGroupID -> IO ()
setProcessGroupID pid pgid calls setpgid to set the
ProcessGroupID for process pid to pgid.
createSession :: IO ProcessGroupID
createSession calls setsid to create a new session
with the current process as session leader.
systemName :: SystemID -> String
nodeName :: SystemID -> String
release :: SystemID -> String
version :: SystemID -> String
machine :: SystemID -> String
getSystemID :: IO SystemID
getSystemID calls uname to obtain information
about the current operating system.
> epochTime :: IO EpochTime
epochTime calls time to obtain the number of
seconds that have elapsed since the epoch (Jan 01 00:00:00 GMT 1970).
elapsedTime :: ProcessTimes -> ClockTick
userTime :: ProcessTimes -> ClockTick
systemTime :: ProcessTimes -> ClockTick
childUserTime :: ProcessTimes -> ClockTick
childSystemTime :: ProcessTimes -> ClockTick
getProcessTimes :: IO ProcessTimes
getProcessTimes calls times to obtain time-accounting
information for the current process and its children.
getControllingTerminalName :: IO FilePath
getControllingTerminalName calls ctermid to obtain
a name associated with the controlling terminal for the process. If a
controlling terminal exists,
getControllingTerminalName returns the name of the
controlling terminal.
The operation may fail with:
NoSuchThing
There is no controlling terminal, or its name cannot be determined.
SystemError
Various other causes.
getTerminalName :: Fd -> IO FilePath
getTerminalName fd calls ttyname to obtain a name associated
with the terminal for Fdfd. If fd is associated
with a terminal, getTerminalName returns the name of the
terminal.
The operation may fail with:
InappropriateType
The channel is not associated with a terminal.
NoSuchThing
The channel is associated with a terminal, but it has no name.
SystemError
Various other causes.
queryTerminal :: Fd -> IO Bool
queryTerminal fd calls isatty to determine whether or
not Fdfd is associated with a terminal.
getSysVar :: SysVar -> IO Limit
getSysVar var calls sysconf to obtain the
dynamic value of the requested configurable system limit or option.
For defined system limits, getSysVar returns the associated
value. For defined system options, the result of getSysVar
is undefined, but not failure.
The operation may fail with:
NoSuchThing
The requested system limit or option is undefined.
Posix operations on files and directories
Posix, files and directories
openDirStream :: FilePath -> IO DirStream
openDirStream dir calls opendir to obtain a
directory stream for dir.
readDirStream :: DirStream -> IO String
readDirStream dp calls readdir to obtain the
next directory entry (struct dirent) for the open directory
stream dp, and returns the d_name member of that
structure.
The operation may fail with:
EOF
End of file has been reached.
SystemError
Various other causes.
rewindDirStream :: DirStream -> IO ()
rewindDirStream dp calls rewinddir to reposition
the directory stream dp at the beginning of the directory.
closeDirStream :: DirStream -> IO ()
closeDirStream dp calls closedir to close
the directory stream dp.
getWorkingDirectory :: IO FilePath
getWorkingDirectory calls getcwd to obtain the name
of the current working directory.
changeWorkingDirectory :: FilePath -> IO ()
changeWorkingDirectory dir calls chdir to change
the current working directory to dir.
nullFileMode :: FileMode -- ---------
ownerReadMode :: FileMode -- r--------
ownerWriteMode :: FileMode -- -w-------
ownerExecuteMode :: FileMode -- --x------
groupReadMode :: FileMode -- ---r-----
groupWriteMode :: FileMode -- ----w----
groupExecuteMode :: FileMode -- -----x---
otherReadMode :: FileMode -- ------r--
otherWriteMode :: FileMode -- -------w-
otherExecuteMode :: FileMode -- --------x
setUserIDMode :: FileMode -- --S------
setGroupIDMode :: FileMode -- -----S---
stdFileMode :: FileMode -- rw-rw-rw-
ownerModes :: FileMode -- rwx------
groupModes :: FileMode -- ---rwx---
otherModes :: FileMode -- ------rwx
accessModes :: FileMode -- rwxrwxrwx
unionFileModes :: FileMode -> FileMode -> FileMode
intersectFileModes :: FileMode -> FileMode -> FileMode
stdInput :: Fd
stdInput = intToFd 0
stdOutput :: Fd
stdOutput = intToFd 1
stdError :: Fd
stdError = intToFd 2
data OpenFileFlags =
OpenFileFlags {
append :: Bool,
exclusive :: Bool,
noctty :: Bool,
nonBlock :: Bool,
trunc :: Bool
}
openFd :: FilePath
-> OpenMode
-> Maybe FileMode -- Just x => O_CREAT, Nothing => must exist
-> OpenFileFlags
-> IO Fd
openFd path acc mode (OpenFileFlags app excl noctty nonblock trunc) calls
open to obtain a Fd for the file path with access
mode acc. If mode is Just m, the O_CREAT flag is
set and the file's permissions will be based on m if it does not
already exist; otherwise, the O_CREAT flag is not set. The
arguments app, excl, noctty, nonblock, and
trunc control whether or not the flags O_APPEND,
O_EXCL, O_NOCTTY, O_NONBLOCK, and O_TRUNC are set,
respectively.
createFile :: FilePath -> FileMode -> IO Fd
createFile path mode calls creat to obtain a Fd
for file path, which will be created with permissions based on
mode if it does not already exist.
setFileCreationMask :: FileMode -> IO FileMode
setFileCreationMask mode calls umask to set
the process's file creation mask to mode. The previous file
creation mask is returned.
createLink :: FilePath -> FilePath -> IO ()
createLink old new calls link to create a
new path, new, linked to an existing file, old.
createDirectory :: FilePath -> FileMode -> IO ()
createDirectory dir mode calls mkdir to
create a new directory, dir, with permissions based on
mode.
createNamedPipe :: FilePath -> FileMode -> IO ()
createNamedPipe fifo mode calls mkfifo to
create a new named pipe, fifo, with permissions based on
mode.
removeLink :: FilePath -> IO ()
removeLink path calls unlink to remove the link
named path.
removeDirectory :: FilePath -> IO ()
removeDirectory dir calls rmdir to remove the
directory named dir.
rename :: FilePath -> FilePath -> IO ()
rename old new calls rename to rename a
file or directory from old to new.
fileMode :: FileStatus -> FileMode
fileID :: FileStatus -> FileID
deviceID :: FileStatus -> DeviceID
linkCount :: FileStatus -> LinkCount
fileOwner :: FileStatus -> UserID
fileGroup :: FileStatus -> GroupID
fileSize :: FileStatus -> FileOffset
accessTime :: FileStatus -> EpochTime
modificationTime :: FileStatus -> EpochTime
statusChangeTime :: FileStatus -> EpochTime
isDirectory :: FileStatus -> Bool
isCharacterDevice :: FileStatus -> Bool
isBlockDevice :: FileStatus -> Bool
isRegularFile :: FileStatus -> Bool
isNamedPipe :: FileStatus -> Bool
getFileStatus :: FilePath -> IO FileStatus
getFileStatus path calls stat to get the
FileStatus information for the file path.
getFdStatus :: Fd -> IO FileStatus
getFdStatus fd calls fstat to get the
FileStatus information for the file associated with
Fdfd.
queryAccess :: FilePath -> Bool -> Bool -> Bool -> IO Bool
queryAccess path r w x calls access to test the access
permissions for file path. The three arguments, r, w,
and x control whether or not access is called with
R_OK, W_OK, and X_OK respectively.
queryFile :: FilePath -> IO Bool
queryFile path calls access with F_OK to test for the
existence for file path.
setFileMode :: FilePath -> FileMode -> IO ()
setFileMode path mode calls chmod to set the
permission bits associated with file path to mode.
setOwnerAndGroup :: FilePath -> UserID -> GroupID -> IO ()
setOwnerAndGroup path uid gid calls chown to
set the UserID and GroupID associated with file
path to uid and gid, respectively.
setFileTimes :: FilePath -> EpochTime -> EpochTime -> IO ()
setFileTimes path atime mtime calls utime to
set the access and modification times associated with file
path to atime and mtime, respectively.
touchFile :: FilePath -> IO ()
touchFile path calls utime to
set the access and modification times associated with file
path to the current time.
getPathVar :: PathVar -> FilePath -> IO Limit
getPathVar var path calls pathconf to obtain the
dynamic value of the requested configurable file limit or option associated
with file or directory path. For
defined file limits, getPathVar returns the associated
value. For defined file options, the result of getPathVar
is undefined, but not failure.
The operation may fail with:
NoSuchThing
The requested file limit or option is undefined.
SystemError
Various other causes.
getFdVar :: PathVar -> Fd -> IO Limit
getFdVar var fd calls fpathconf to obtain the
dynamic value of the requested configurable file limit or option associated
with the file or directory attached to the open channel fd.
For defined file limits, getFdVar returns the associated
value. For defined file options, the result of getFdVar
is undefined, but not failure.
The operation may fail with:
NoSuchThing
The requested file limit or option is undefined.
SystemError
Various other causes.
Posix Input and Output Primitives
Posix, input/output
createPipe :: IO (Fd, Fd)
createPipe calls pipe to create a pipe and returns a pair of
Fds, the first for reading and the second for writing.
dup :: Fd -> IO Fd
dup fd calls dup to duplicate Fdfd to
another Fd.
dupTo :: Fd -> Fd -> IO ()
dupTo src dst calls dup2 to duplicate Fdsrc to Fddst.
fdClose :: Fd -> IO ()
fdClose fd calls close to close Fdfd.
fdRead :: Fd -> ByteCount -> IO (String, ByteCount)
fdRead fd nbytes calls read to read at most nbytes
bytes from Fdfd, and returns the result as a string
paired with the number of bytes actually read.
The operation may fail with:
EOF
End of file has been reached.
SystemError
Various other causes.
fdWrite :: Fd -> String -> IO ByteCount
fdWrite fd s calls write to write
the string s to Fdfd as a
contiguous sequence of bytes. It returns the number of bytes successfully
written.
queryFdOption :: FdOption -> Fd -> IO Bool
getFdOption opt fd calls fcntl to determine whether or
not the flag associated with FdOptionopt is set for
Fdfd.
setFdOption :: Fd -> FdOption -> Bool -> IO ()
setFdOption fd opt val calls fcntl to set the flag
associated with FdOptionopt on Fdfd to
val.
getLock :: Fd -> FileLock -> IO (Maybe (ProcessID, FileLock))
getLock fd lock calls fcntl to get the first FileLock
for Fdfd which blocks the FileLocklock. If
no such FileLock exists, getLock returns Nothing.
Otherwise, it returns Just (pid, block), where block is the
blocking FileLock and pid is the ProcessID of the
process holding the blocking FileLock.
setLock :: Fd -> FileLock -> IO ()
setLock fd lock calls fcntl with F_SETLK to set or
clear a lock segment for Fdfd as indicated by the
FileLocklock. setLock does not block, but fails with
SystemError if the request cannot be satisfied immediately.
waitToSetLock :: Fd -> FileLock -> IO ()
waitToSetLock fd lock calls fcntl with F_SETLKW to set
or clear a lock segment for Fdfd as indicated by the
FileLocklock. If the request cannot be satisfied
immediately, waitToSetLock blocks until the request can be
satisfied.
fdSeek :: Fd -> SeekMode -> FileOffset -> IO FileOffset
fdSeek fd whence offset calls lseek to position the
Fdfd at the given offset from the starting location
indicated by whence. It returns the resulting offset from the
start of the file in bytes.
Posix, Device- and Class-Specific Functions
Posix, device and class-specific functions
terminalMode :: TerminalMode -> TerminalAttributes -> Bool
withMode :: TerminalAttributes -> TerminalMode -> TerminalAttributes
withoutMode :: TerminalAttributes -> TerminalMode -> TerminalAttributes
bitsPerByte :: TerminalAttributes -> Int
withBits :: TerminalAttributes -> Int -> TerminalAttributes
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
inputSpeed :: TerminalAttributes -> BaudRate
withInputSpeed :: TerminalAttributes -> BaudRate -> TerminalAttributes
outputSpeed :: TerminalAttributes -> BaudRate
withOutputSpeed :: TerminalAttributes -> BaudRate -> TerminalAttributes
getTerminalAttributes :: Fd -> IO TerminalAttributes
getTerminalAttributes fd calls tcgetattr to obtain
the TerminalAttributes associated with Fdfd.
setTerminalAttributes :: Fd
-> TerminalAttributes
-> TerminalState
-> IO ()
setTerminalAttributes fd attr ts calls tcsetattr to change
the TerminalAttributes associated with Fdfd to
attr, when the terminal is in the state indicated by ts.
sendBreak :: Fd -> Int -> IO ()
sendBreak fd duration calls tcsendbreak to transmit a
continuous stream of zero-valued bits on Fdfd for the
specified implementation-dependent duration.
drainOutput :: Fd -> IO ()
drainOutput fd calls tcdrain to block until all output
written to Fdfd has been transmitted.
discardData :: Fd -> QueueSelector -> IO ()
discardData fd queues calls tcflush to discard
pending input and/or output for Fdfd,
as indicated by the QueueSelectorqueues.
controlFlow :: Fd -> FlowAction -> IO ()
controlFlow fd action calls tcflow to control the
flow of data on Fdfd, as indicated by
action.
getTerminalProcessGroupID :: Fd -> IO ProcessGroupID
getTerminalProcessGroupID fd calls tcgetpgrp to
obtain the ProcessGroupID of the foreground process group
associated with the terminal attached to Fdfd.
setTerminalProcessGroupID :: Fd -> ProcessGroupID -> IO ()
setTerminalProcessGroupID fd pgid calls tcsetpgrp to
set the ProcessGroupID of the foreground process group
associated with the terminal attached to Fdfd to pgid.
Posix System Databases
Posix, system databases
groupName :: GroupEntry -> String
groupID :: GroupEntry -> GroupID
groupMembers :: GroupEntry -> [String]
getGroupEntryForID :: GroupID -> IO GroupEntry
getGroupEntryForID gid calls getgrgid to obtain
the GroupEntry information associated with GroupIDgid.
The operation may fail with:
NoSuchThing
There is no group entry for the GroupID.
getGroupEntryForName :: String -> IO GroupEntry
getGroupEntryForName name calls getgrnam to obtain
the GroupEntry information associated with the group called
name.
The operation may fail with:
NoSuchThing
There is no group entry for the name.
userName :: UserEntry -> String
userID :: UserEntry -> UserID
userGroupID :: UserEntry -> GroupID
homeDirectory :: UserEntry -> String
userShell :: UserEntry -> String
getUserEntryForID :: UserID -> IO UserEntry
getUserEntryForID gid calls getpwuid to obtain
the UserEntry information associated with UserIDuid.
The operation may fail with:
NoSuchThing
There is no user entry for the UserID.
getUserEntryForName :: String -> IO UserEntry
getUserEntryForName name calls getpwnam to obtain
the UserEntry information associated with the user login
name.
The operation may fail with:
NoSuchThing
There is no user entry for the name.
POSIX Errors
Posix, errors
getErrorCode :: IO ErrorCode
getErrorCode returns the current value of the external
variable errno. It never fails.
setErrorCode :: ErrorCode -> IO ()
setErrorCode err sets the external
variable errno to err. It never fails.
noError :: ErrorCode
noError = 0
argumentListTooLong, e2BIG :: ErrorCode
badFd, eBADF :: ErrorCode
brokenPipe, ePIPE :: ErrorCode
directoryNotEmpty, eNOTEMPTY :: ErrorCode
execFormatError, eNOEXEC :: ErrorCode
fileAlreadyExists, eEXIST :: ErrorCode
fileTooLarge, eFBIG :: ErrorCode
filenameTooLong, eNAMETOOLONG :: ErrorCode
improperLink, eXDEV :: ErrorCode
inappropriateIOControlOperation, eNOTTY :: ErrorCode
inputOutputError, eIO :: ErrorCode
interruptedOperation, eINTR :: ErrorCode
invalidArgument, eINVAL :: ErrorCode
invalidSeek, eSPIPE :: ErrorCode
isADirectory, eISDIR :: ErrorCode
noChildProcess, eCHILD :: ErrorCode
noLocksAvailable, eNOLCK :: ErrorCode
noSpaceLeftOnDevice, eNOSPC :: ErrorCode
noSuchOperationOnDevice, eNODEV :: ErrorCode
noSuchDeviceOrAddress, eNXIO :: ErrorCode
noSuchFileOrDirectory, eNOENT :: ErrorCode
noSuchProcess, eSRCH :: ErrorCode
notADirectory, eNOTDIR :: ErrorCode
notEnoughMemory, eNOMEM :: ErrorCode
operationNotImplemented, eNOSYS :: ErrorCode
operationNotPermitted, ePERM :: ErrorCode
permissionDenied, eACCES :: ErrorCode
readOnlyFileSystem, eROFS :: ErrorCode
resourceBusy, eBUSY :: ErrorCode
resourceDeadlockAvoided, eDEADLK :: ErrorCode
resourceTemporarilyUnavailable, eAGAIN :: ErrorCode
tooManyLinks, eMLINK :: ErrorCode
tooManyOpenFiles, eMFILE :: ErrorCode
tooManyOpenFilesInSystem, eNFILE :: ErrorCode