#error #nix #errno #libc #error-handling #error-message

precisej-printable-errno

nix 系统调用错误的可打印格式

3 个版本

0.2.2 2022年1月1日
0.2.1 2022年1月1日
0.2.0 2021年12月31日
0.1.2 2021年12月29日
0.1.0 2021年10月4日

Rust 模式 中排名第 2478

每月下载量 37
initd 中使用

MIT 许可证

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