27 个版本
0.7.0-rc2 | 2023 年 8 月 15 日 |
---|---|
0.7.0-rc1 | 2023 年 1 月 22 日 |
0.6.4 | 2023 年 1 月 21 日 |
0.6.3 | 2022 年 10 月 21 日 |
0.1.2 | 2018 年 2 月 6 日 |
972 在 Unix API
337,878 每月下载量
用于 152 个 crate (17 个直接使用)
230KB
5K SLoC
neli
Rust 的类型安全 netlink 库
从版本 0.4.0 开始,自动生成文档和示例的完整性将成为重点。如果有缺失或不确定的地方,请提出问题!
API 文档
API 文档可以在 这里 找到
目标
这个库旨在尽可能覆盖 netlink 子系统,并为任何不在该库支持范围内的功能提供扩展 neli 的方法。
这也是一个纯 Rust 实现,旨在利用 Rust 的惯用法特性。
使用 neli
的示例
在 Github 的 examples/
子目录中有可工作代码的示例。运行 cargo build --examples
来构建示例。
工作流程通常遵循创建套接字、然后发送和接收请求/响应格式中的消息的模式
use std::error::Error;
use neli::{
consts::{genl::*, nl::*, socket::*},
err::RouterError,
genl::{Genlmsghdr, GenlmsghdrBuilder, Nlattr},
nl::{NlmsghdrBuilder, NlPayload},
router::synchronous::NlRouter,
types::{Buffer, GenlBuffer},
utils::Groups,
};
const GENL_VERSION: u8 = 1;
fn request_response() -> Result<(), Box<dyn Error>> {
let (socket, _) = NlRouter::connect(
NlFamily::Generic,
None,
Groups::empty(),
)?;
let recv = socket.send::<_, _, NlTypeWrapper, Genlmsghdr<CtrlCmd, CtrlAttr>>(
GenlId::Ctrl,
NlmF::DUMP,
NlPayload::Payload(
GenlmsghdrBuilder::<_, CtrlAttr, _>::default()
.cmd(CtrlCmd::Getfamily)
.version(GENL_VERSION)
.build()?
),
)?;
for msg in recv {
let msg = msg?;
// Do things with response here...
}
Ok(())
}
或者订阅 netlink 的事件通知流
use std::error::Error;
use neli::{
consts::{genl::*, nl::*, socket::*},
err::RouterError,
genl::Genlmsghdr,
router::synchronous::NlRouter,
utils::Groups,
};
fn subscribe_to_mcast() -> Result<(), Box<dyn Error>> {
let (s, multicast) = NlRouter::connect(
NlFamily::Generic,
None,
Groups::empty(),
)?;
let id = s.resolve_nl_mcast_group(
"my_family_name",
"my_multicast_group_name",
)?;
s.add_mcast_membership(Groups::new_groups(&[id]))?;
for next in multicast {
// Do stuff here with parsed packets...
// like printing a debug representation of them:
println!("{:?}", next?);
}
Ok(())
}
贡献
您的贡献将根据 neli 的 许可证 进行许可。我希望尽可能简单,所以在贡献之前请阅读许可证文件,确保您对在 BSD 3-Clause 许可证下发布贡献感到舒适。
wherever possible,请为新功能添加测试。如果我看到有缺失,我可能会在合并前要求这么做。
请不仅在新功能的高级层面,而且还要在模块的 //!
注释中记录新功能,以提供高级文档和功能概述。
在提交PR之前,请查看你正在更改的模块的文档。我目前正在为每个模块添加一个“设计决策”部分。如果你想知道为什么我以这种方式做某事,它应该在那里。这样,如果你有更好的方法,请告诉我!我总是乐于学习。我的希望是这也能在事前澄清一些关于为什么我这样做的问题,并使你的贡献者生活更容易。
Git钩子
我提供了Git钩子来模拟CI运行的一部分。如果你想启用这些,它们可能会在查看CI之前捕获一些错误。如果你想启用这些,请运行 git config core.hookspath .githooks
。你的提交会在创建提交之前进行检查。
PR目标分支
PR步骤
- 对于非破坏性的错误修复和改进,请针对
main
。 - 对于破坏性变更,请针对下一个版本发布分支 - 这看起来像
v[NEXT_VERSION]-dev
- 请将你的更改的简要描述包括在CHANGELOG文件中
- 一旦PR被审查并批准,请将其rebase到目标分支
- 对于不太熟悉git的人,它可能看起来像这样
gitrebase[TARGET_BRANCH] [YOUR_BRANCH]
- 这是一个破坏性操作,所以在做之前请务必仔细检查:
git push -f origin [YOUR_BRANCH]
- 对于不太熟悉git的人,它可能看起来像这样
依赖关系
~2–11MB
~121K SLoC