view README.md @ 26:0feab4f4c2ce

Relax version requirements and update MSRV The MSRV was accidentally increased without documentation. Increase itself is fine since it satisfies "latest stable Debian" condition but given there are soundness issues this relaxes the version requirements to work on 1.48 and also documents it.
author Martin Habovstiak <martin.habovstiak@gmail.com>
date Fri, 28 Feb 2025 23:10:11 +0100
parents f6334887e3c8
children
line wrap: on
line source

# systemd socket

A convenience crate for optionally supporting systemd socket activation.

## About

The goal of this crate is to make socket activation with systemd in your project trivial.
It provides a replacement for `std::net::SocketAddr` that allows parsing the bind address from string just like the one from `std`
but on top of that also allows `systemd://socket_name` format that tells it to use systemd activation with given socket name.
Then it provides a method to bind the address which will return the socket from systemd if available.

The provided type supports conversions from various types of strings and also `serde` and `parse_arg` via feature flag.
Thanks to this the change to your code should be minimal - parsing will continue to work, it'll just allow a new format.
You only need to change the code to use `SocketAddr::bind()` instead of `TcpListener::bind()` for binding.

You also don't need to worry about conditional compilation to ensure OS compatibility.
This crate handles that for you by disabling systemd on non-linux systems.

Further, the crate also provides methods for binding `tokio` 0.2, 0.3, and `async_std` sockets if the appropriate features are
activated.

## Example

```rust
use systemd_socket::SocketAddr;
use std::convert::TryFrom;
use std::io::Write;

let mut args = std::env::args_os();
let program_name = args.next().expect("unknown program name");
let socket_addr = args.next().expect("missing socket address");
let socket_addr = SocketAddr::try_from(socket_addr).expect("failed to parse socket address");
let socket = socket_addr.bind().expect("failed to bind socket");

loop {
    let _ = socket
    .accept()
    .expect("failed to accept connection")
    .0
    .write_all(b"Hello world!")
    .map_err(|err| eprintln!("Failed to send {}", err));
}
```

## Features

* `enable_systemd` - on by default, the existence of this feature can allow your users to turn
  off systemd support if they don't need it. Note that it's already disabled on non-linux
  systems, so you don't need to care about that.
* `serde` - implements `serde::Deserialize` for `SocketAddr`
* `parse_arg` - implements `parse_arg::ParseArg` for `SocketAddr`
* `tokio` - adds `bind_tokio` method to `SocketAddr`
* `tokio_0_2` - adds `bind_tokio_0_2` method to `SocketAddr`
* `tokio_0_3` - adds `bind_tokio_0_3` method to `SocketAddr`
* `async_std` - adds `bind_async_std` method to `SocketAddr`

## MSRV

This crate must always compile with the latest Rust available in the latest Debian stable.
That is currently Rust 1.48.1. (Debian 11 - Bullseye)

## License

MITNFA