Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/zenhack/haskell-unix-simple
https://github.com/zenhack/haskell-unix-simple
Last synced: 2 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/zenhack/haskell-unix-simple
- Owner: zenhack
- License: mit
- Created: 2021-01-08T06:14:40.000Z (almost 4 years ago)
- Default Branch: master
- Last Pushed: 2023-02-05T07:56:23.000Z (almost 2 years ago)
- Last Synced: 2024-09-22T13:05:09.569Z (3 months ago)
- Language: Haskell
- Size: 32.2 KB
- Stars: 5
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
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`
* For functions that take an array of `struct iovec` as an input,
we provide several variants, e.g. for `writev` we provide:
* `writev :: Fd -> [BS.ByteString] -> EIO CSize`
* `writevBuf :: Fd -> Ptr CIOVec -> CInt -> EIO CSsize`
* `writevVec :: Fd -> SMV.IOVector CIOVec -> EIO CSize`
(How to support readv is still an open design question).
* 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`.