From d0b8f5f0813e09f1968157b4eb1ace4c80749c2a Mon Sep 17 00:00:00 2001 From: Toni Peter <mail@tonipeter.de> Date: Wed, 20 Nov 2024 10:21:48 +0100 Subject: [PATCH] Implement unlink. --- rust/src/nasl/builtin/sys/mod.rs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/rust/src/nasl/builtin/sys/mod.rs b/rust/src/nasl/builtin/sys/mod.rs index 5b9d15571..ef42d8461 100644 --- a/rust/src/nasl/builtin/sys/mod.rs +++ b/rust/src/nasl/builtin/sys/mod.rs @@ -18,6 +18,8 @@ pub enum SysError { ReadFileMetadata(io::Error), #[error("Unable to write file. {0}")] WriteFile(io::Error), + #[error("Unable to remove file. {0}")] + RemoveFile(io::Error), #[error("Error while trying to find the path for the command '{0}'")] FindCommandPath(String), #[error("Command '{0}' not found.")] @@ -95,10 +97,19 @@ async fn fwrite(data: &str, file: &Path) -> Result<usize, FnError> { #[nasl_function] async fn file_stat(path: &Path) -> Result<u64, FnError> { - let metadata = std::fs::metadata(path).map_err(|e| SysError::ReadFileMetadata(e))?; + let metadata = tokio::fs::metadata(path) + .await + .map_err(|e| SysError::ReadFileMetadata(e))?; Ok(metadata.len()) } +#[nasl_function] +async fn unlink(path: &Path) -> Result<(), FnError> { + tokio::fs::remove_file(path) + .await + .map_err(|e| SysError::RemoveFile(e).into()) +} + #[nasl_function] async fn get_tmp_dir() -> PathBuf { env::temp_dir() @@ -108,18 +119,19 @@ function_set! { Sys, async_stateless, ( - (pread, "pread"), - (fread, "fread"), - (file_stat, "file_stat"), - (find_in_path, "find_in_path"), - (fwrite, "fwrite"), - (get_tmp_dir, "get_tmp_dir"), + pread, + fread, + file_stat, + find_in_path, + fwrite, + get_tmp_dir, + unlink, ) } #[cfg(test)] mod tests { - use crate::nasl::test_prelude::*; + use crate::nasl::{builtin::sys::SysError, test_prelude::*}; #[tokio::test] async fn pread() { @@ -146,6 +158,8 @@ mod tests { t.ok(r#"fwrite(file: file, data: "foo");"#, 3); t.ok(r#"fread(file);"#, "foo"); t.ok(r#"file_stat(file);"#, 3); + t.run(r#"unlink(file);"#); + check_err_matches!(t, r#"file_stat(file);"#, SysError::ReadFileMetadata(_)); t.async_verify().await; } }