From 7ef434a6d74a4200239f2f2a65aa9a8d2564b755 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Fri, 16 Feb 2024 09:59:51 +0100 Subject: [PATCH] feat: Add nix-util crate with Context wrapper (cherry picked from commit 6c8e116e8bbaecce2b77fd9e0db89f366b57f9b6) --- rust/Cargo.lock | 14 ++++++++++ rust/Cargo.toml | 1 + rust/nix-util/Cargo.toml | 10 +++++++ rust/nix-util/src/context.rs | 54 ++++++++++++++++++++++++++++++++++++ rust/nix-util/src/lib.rs | 1 + 5 files changed, 80 insertions(+) create mode 100644 rust/nix-util/Cargo.toml create mode 100644 rust/nix-util/src/context.rs create mode 100644 rust/nix-util/src/lib.rs diff --git a/rust/Cargo.lock b/rust/Cargo.lock index b987df7..9ae3c80 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -11,6 +11,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "anyhow" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" + [[package]] name = "bindgen" version = "0.69.4" @@ -166,6 +172,14 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "nix-util" +version = "0.1.0" +dependencies = [ + "anyhow", + "nix-c-raw", +] + [[package]] name = "nixops4" version = "0.1.0" diff --git a/rust/Cargo.toml b/rust/Cargo.toml index d4737e3..32f4bfb 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ "nix-c-raw", + "nix-util", ] resolver = "2" diff --git a/rust/nix-util/Cargo.toml b/rust/nix-util/Cargo.toml new file mode 100644 index 0000000..db15880 --- /dev/null +++ b/rust/nix-util/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "nix-util" +version = "0.1.0" +edition = "2021" + +[lib] + +[dependencies] +anyhow = "1.0.79" +nix-c-raw = { path = "../nix-c-raw" } diff --git a/rust/nix-util/src/context.rs b/rust/nix-util/src/context.rs new file mode 100644 index 0000000..a74fab0 --- /dev/null +++ b/rust/nix-util/src/context.rs @@ -0,0 +1,54 @@ +use anyhow::{bail, Result}; +use nix_c_raw as raw; +use std::ptr::null_mut; +use std::ptr::NonNull; + +pub struct Context { + inner: NonNull, +} + +impl Context { + pub fn new() -> Self { + let ctx = unsafe { raw::nix_c_context_create() }; + if ctx.is_null() { + panic!("nix_c_context_create returned a null pointer"); + } + let ctx = Context { + inner: NonNull::new(ctx).unwrap(), + }; + ctx + } + pub fn ptr(&self) -> *mut raw::nix_c_context { + self.inner.as_ptr() + } + pub fn check_err(&self) -> Result<()> { + let err = unsafe { raw::nix_err_code(self.inner.as_ptr()) }; + if err != raw::NIX_OK.try_into().unwrap() { + // msgp is a borrowed pointer, so we don't need to free it + let msgp = unsafe { raw::nix_err_msg(null_mut(), self.inner.as_ptr(), null_mut()) }; + // Turn the i8 pointer into a Rust string by copying + let msg: &str = unsafe { core::ffi::CStr::from_ptr(msgp).to_str()? }; + bail!("{}", msg); + } + Ok(()) + } +} + +impl Drop for Context { + fn drop(&mut self) { + unsafe { + raw::nix_c_context_free(self.inner.as_ptr()); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn context_new_and_drop() { + // don't crash + let _c = Context::new(); + } +} diff --git a/rust/nix-util/src/lib.rs b/rust/nix-util/src/lib.rs new file mode 100644 index 0000000..9efb2ab --- /dev/null +++ b/rust/nix-util/src/lib.rs @@ -0,0 +1 @@ +pub mod context;