From a5e7d718a371c59249e849c20ba86ce4d3b71f02 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Wed, 25 Dec 2019 10:21:53 -0600 Subject: [PATCH] Simplify the SysctlStorage API Automatically compute how many bytes were read. --- src/sysctl.rs | 12 +++++++----- tests/random/src/lib.rs | 8 +++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/sysctl.rs b/src/sysctl.rs index 71b054a1..78394035 100644 --- a/src/sysctl.rs +++ b/src/sysctl.rs @@ -12,7 +12,7 @@ use crate::user_ptr::{UserSlicePtr, UserSlicePtrWriter}; pub trait SysctlStorage: Sync { fn store_value(&self, data: &[u8]) -> (usize, error::KernelResult<()>); - fn read_value(&self, data: &mut UserSlicePtrWriter) -> (usize, error::KernelResult<()>); + fn read_value(&self, data: &mut UserSlicePtrWriter) -> error::KernelResult<()>; } fn trim_whitespace(mut data: &[u8]) -> &[u8] { @@ -37,7 +37,7 @@ where (*self).store_value(data) } - fn read_value(&self, data: &mut UserSlicePtrWriter) -> (usize, error::KernelResult<()>) { + fn read_value(&self, data: &mut UserSlicePtrWriter) -> error::KernelResult<()> { (*self).read_value(data) } } @@ -58,13 +58,13 @@ impl SysctlStorage for atomic::AtomicBool { (data.len(), result) } - fn read_value(&self, data: &mut UserSlicePtrWriter) -> (usize, error::KernelResult<()>) { + fn read_value(&self, data: &mut UserSlicePtrWriter) -> error::KernelResult<()> { let value = if self.load(atomic::Ordering::Relaxed) { b"1\n" } else { b"0\n" }; - (value.len(), data.write(value)) + data.write(value) } } @@ -106,7 +106,9 @@ unsafe extern "C" fn proc_handler( storage.store_value(&data) } else { let mut writer = data.writer(); - storage.read_value(&mut writer) + let starting_len = writer.len(); + let res = storage.read_value(&mut writer); + (starting_len - writer.len(), res) }; *len = bytes_processed; *ppos += *len as bindings::loff_t; diff --git a/tests/random/src/lib.rs b/tests/random/src/lib.rs index 251a1ece..1cf7d6e0 100644 --- a/tests/random/src/lib.rs +++ b/tests/random/src/lib.rs @@ -15,12 +15,10 @@ impl SysctlStorage for EntropySource { fn read_value( &self, data: &mut linux_kernel_module::user_ptr::UserSlicePtrWriter, - ) -> (usize, linux_kernel_module::KernelResult<()>) { + ) -> linux_kernel_module::KernelResult<()> { let mut storage = vec![0; data.len()]; - if let Err(e) = random::getrandom(&mut storage) { - return (0, Err(e)); - } - (storage.len(), data.write(&storage)) + random::getrandom(&mut storage)?; + data.write(&storage) } }