posish

Safe Rust bindings to POSIX-ish libc APIs and syscalls

A Bytecode Alliance project

Github Actions CI Status crates.io page docs.rs docs

posish provides efficient memory-safe and [I/O-safe] wrappers to "POSIX-ish" libc APIs and syscalls, with configurable backends. It uses Rust references, slices, and return values instead of raw pointers, and [io-lifetimes] instead of raw file descriptors, providing memory safety and [I/O safety]. It uses Results for reporting errors, [bitflags] instead of bare integer flags, an [Arg] trait with optimizations to efficiently accept any Rust string type, and several other efficient conveniences.

posish is low-level and does not support Windows; for higher-level and more portable APIs built on this functionality, see the [system-interface], [cap-std], and [fs-set-times] crates, for example.

Posish currently has two backends are available: libc and linux_raw.

The libc backend is enabled by default and uses the widely-used [libc] crate which provides bindings to native libc libraries and is portable to many OS's.

The linux_raw backend can be enabled by setting the RUSTFLAGS environment variable to --cfg linux_raw, and uses raw Linux system calls and vDSO calls. This only supports Linux, currently on x86-64, x86, and aarch64. It supports stable as well as nightly Rust. - By being implemented entirely in Rust, avoiding libc, errno, and pthread cancellation, and employing some specialized optimizations, most functions in linux_raw compile down to very efficient code. On nightly Rust, they can often be fully inlined into user code. - Most functions in linux_raw preserve memory and I/O safety all the way down to the syscalls. - linux_raw uses a 64-bit time_t type on all platforms, avoiding the [y2038 bug].