A straightforward wrapping of unix APIs for Haskell.
I wrote this package because state of posix API support in Haskell is
somewhat unsatisfactory in a few ways:
- There are many syscalls not covered by the
unix package
- The
unix package needlessly renames syscalls, making them harder to
find for people familiar with the posix API. For example, lstat has
been renamed to getSymbolicLinkStatus
- There are a large number of packages that fill in various holes, but
you have to scrape them together.
The goal of this package then, is to provide a one-stop-shop for unix
API bindings, with a straightforward mapping to the underlying C API.
At the time of writing there are many syscalls missing, but in theory
most things belong here. Patches welcome; see the section below re:
how to add a syscall.
General Conventions
- Function names are the same as the underlying system calls, so there
is no guesswork.
- Wrappers automatically retry on
EINTR where appropriate (this is
safe for most system calls, but not all, e.g. close on Linux).
- The basic versions of the syscalls return
IO (Either Errno a),
rather than raising an exception.
- Each system call also has a variant suffixed with
Exn that throws
exceptions.
- We define a type alias
type EIO a = IO (Either Errno a) for
convenience.
- For flags, we add newtype wrappers, and they can be combined with
their
SemiGroup instances, e.g.
open "hello.txt" (o_CREAT <> o_RDWR) 0o600
- Flags are named the same as the C constant, but with the first
character lower-cased.
- For functions that take a buffer, we instead accept a
ByteString
when the buffer is read, or return one when it is written, e.g.
read :: Fd -> Int -> EIO BS.ByteString
write :: Fd -> BS.ByteString -> EIO CSsize
- We also provide variants suffixed with
Buf, that take a pointer and
size:
readBuf :: Fd -> Ptr Word8 -> CSize -> EIO CSsize
- We provide a
CString type for functions which accept strings as
arguments. This type is an instance of IsString, so you can use
string literals if you enable OverloadedStrings, or use the
fromString function to convert. The conversion uses utf-8 encoding.
- For some calls we also add obvious convenience helpers, e.g.
readFull and writeFull, which wrap read and write and handle
short reads and writes for the caller.
Contributing
Adding a syscall
To add a new system call:
- Add the appropriate declaration to
Unix.C, following conventions
established by the examples in that file.
- Add a wrapper following the general conventions in
Unix.