#socket-activation #api-bindings #linux #async-await #systmed

systemd_socket

可选支持systemd套接字激活的便捷库

3个版本

0.1.2 2024年7月13日
0.1.1 2020年12月22日
0.1.0 2020年12月3日

204 in Unix APIs

Download history 123/week @ 2024-07-11 17/week @ 2024-07-18 3/week @ 2024-07-25

143 monthly downloads

MITNFA license

37KB
481 lines

systemd套接字

可选支持systemd套接字激活的便捷库。

关于

该库的目的是让项目中的systemd套接字激活变得简单。它提供了一个用于从字符串解析绑定地址的替代品,就像来自std的地址一样,但除此之外还允许使用systemd://socket_name格式的地址,告诉它使用给定套接字名的systemd激活。然后它提供了一个绑定地址的方法,如果可用,将返回来自systemd的套接字。

提供的类型支持从各种字符串类型转换,还支持通过功能标志启用serdeparse_arg。因此,对您代码的更改应该是最小的——解析将继续工作,它将只允许新的格式。您只需将代码更改为使用SocketAddr::bind()而不是TcpListener::bind()进行绑定即可。

您也不必担心条件编译以确保操作系统兼容性。此库会为您处理这个问题,通过在非Linux系统上禁用systemd。

此外,如果启用了适当的功能,该库还提供绑定tokio 0.2、0.3和async_std套接字的方法。

示例

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));
}

功能

  • enable_systemd - 默认启用,此功能的存在允许用户在不需要的情况下关闭systemd支持。请注意,在非Linux系统上已禁用,因此您不必担心。
  • serde - 为SocketAddr实现serde::Deserialize
  • parse_arg - 为SocketAddr实现parse_arg::ParseArg
  • tokio - 为 SocketAddr 添加 bind_tokio 方法
  • tokio_0_2 - 为 SocketAddr 添加 bind_tokio_0_2 方法
  • tokio_0_3 - 为 SocketAddr 添加 bind_tokio_0_3 方法
  • async_std - 为 SocketAddr 添加 bind_async_std 方法

MSRV

此crate必须始终使用最新版本的Rust在最新的Debian稳定版中编译。目前是Rust 1.41.1。(Debian 10 - Buster)

许可证

MITNFA

依赖关系

~0.3–12MB
~135K SLoC