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`.