# kevy-sys

The network-boundary layer for [kevy](https://crates.io/crates/kevy) —
a tiny, zero-dependency, pure-Rust wrapper over the sockets and readiness
poller the kevy server needs.

This is one of kevy's three OS-boundary crates. The other two are
publishable, general-purpose crates:

- [`kevy-uring`](https://crates.io/crates/kevy-uring) — pure-Rust
  io_uring (Linux completion engine), carved out of this crate.
- [`kevy-madvise`](https://crates.io/crates/kevy-madvise) — pure-Rust
  `madvise(MADV_HUGEPAGE)` hint, also carved out.

`kevy-sys` is **server-internal** — its API surface is hand-curated to the
exact subset of sockets / pollers kevy's reactor uses. A third party
would compare against `libc` / `nix` / `rustix` / `mio` and find it
missing too much; it's not a generic foundation, it's the OS-boundary
piece of the kevy server.

- **Sockets** — `tcp_listen` / `tcp_listen_reuseport`, non-blocking I/O,
  `TCP_NODELAY`, owned fds that close on drop.
- **Readiness poller** — one API over **kqueue** (macOS) and **epoll** (Linux).
- **Cross-thread `Waker`** — a self-pipe to wake a blocked poller.
- Cross-platform `sockaddr_in` / `kevent` / `epoll_event` layouts (incl.
  the x86_64 packed `epoll_event`).

```rust,no_run
use kevy_sys::{Poller, tcp_listen};

let listener = tcp_listen([127, 0, 0, 1], 6379, 1024)?;
listener.set_nonblocking()?;
let poller = Poller::new()?;
poller.add(listener.raw(), true, false)?;
# Ok::<(), std::io::Error>(())
```

## Safety

`unsafe` is confined to the `ffi` module and its wrappers; the public API
is safe. See the crate docs' *Safety* section for the ABI invariants.

## License

Licensed under either of [MIT](LICENSE-MIT) or
[Apache-2.0](LICENSE-APACHE) at your option.
