3 个版本
0.2.2 | 2022年1月1日 |
---|---|
0.2.1 | 2022年1月1日 |
0.2.0 | 2021年12月31日 |
0.1.2 |
|
0.1.0 |
|
在 Rust 模式 中排名第 2478
每月下载量 37 次
在 initd 中使用
29KB
320 行代码(不包括注释)
precisej-printable-errno
nix
的系统调用错误可打印格式。**目前正在开发中**
是什么?
precisej-printable-errno
是一个简单的库,它为每个 [Errno] 添加了附加可打印错误消息的可能性。它还允许你添加一个整数错误代码,可以用它来退出应用程序。
此库旨在供使用 nix
的 Rust 友好型绑定来调用 libc 系统函数的底层应用程序使用。
注意:precisej-printable-errno
的作者与 nix-rust
维护者之间没有关系。
在哪里?
任何 nix
支持的系统都应该由 precisej-printable-errno
支持。要使用此库,请添加 precisej-printable-errno = "$LIB_VERSION"
(将 $LIB_VERSION
替换为 crates.io 中可用的最新版本)。
目前使用 precisej-printable-errno
的项目
- initd
如果你是另一个 Rust 项目的作者,正在使用此库,并希望在这里被提及,请与我联系。
为什么?
在编写 initd 时,我发现没有直接的方法来传递退出代码,于是求助于在 main() 函数中调用一个返回 i32
的函数,然后使用返回的错误代码调用 std::process::exit。这既不灵活又绕过了 Rust 优秀的 Result 处理。因此我决定创建包含错误消息和退出代码的特殊 Error 结构体,由于我觉得这很有用,所以我决定将其转换为库包。
我没有找到如何使用其他库(如 anyhow
)做类似的事情。如果有人找到了更好的、同样轻量级的替代方案,请与我联系。
为什么不是 Termination?
截至2021-12-10,std::process::Termination 是不稳定的,并且需要 termination_trait_lib
功能,该功能只能在 Rust 的夜间版本中激活。并非所有程序都可以使用夜间版本(例如,initd
在其代码库中拒绝使用不稳定的功能),为此这个 crate 存在。
并非这个库的所有功能都可以用 std::process::Termination 来复制,因此即使对于夜间 Rust 的用户,这个库也仍然有用,尽管有些不便捷。未来版本的 precisej-printable-errno
将可选地包含一个针对 [ExitError] 的 std::process::Termination 实现,作为夜间用户感兴趣的非默认功能。
如何实现?
/* use ... */
const PROGRAM_NAME: &'static str = "example-program";
pub fn main() {
if let Err(e) = start() {
e.eprint_and_exit()
}
}
pub fn start() -> Result<(), ExitError<&'static str>> {
let init_file = open("/sbin/init", OFlag::O_RDONLY, Mode::empty())
.printable(PROGRAM_NAME, "unable to open /sbin/init")
.bail(1)?;
let mut buf = [0; 1024];
read(init_file, &mut buf)
.printable(PROGRAM_NAME, "unable to read first KB of /sbin/init")
.bail(2)?;
drop(buf);
open("/path/to/nonexistent/file", OFlag::O_RDONLY, Mode::empty())
.printable(PROGRAM_NAME, "unable to open /path/to/nonexistent/file")
.bail(3)?;
// That last call should have caused the process to exit with
// code 3 and the following error message:
//
// example-program: unable to open /path/to/nonexistent/file: No such file or directory
Ok(())
}
许可证:MIT
依赖项
~1.5MB
~36K SLoC