1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 03:27:44 +00:00

reduce cognitive complexity by splitting away part of dd_copy

This commit is contained in:
Ulrich Hornung 2024-02-28 22:17:50 +01:00 committed by Sylvestre Ledru
parent 43b2b3fbaa
commit a626899416
2 changed files with 27 additions and 18 deletions

View file

@ -86,8 +86,10 @@ struct Settings {
/// A timer which triggers on a given interval /// A timer which triggers on a given interval
/// ///
/// After being constructed with [`Alarm::with_interval`], [`Alarm::is_triggered`] /// After being constructed with [`Alarm::with_interval`], [`Alarm::get_trigger`]
/// will return true once per the given [`Duration`]. /// will return [`TRIGGER_TIMER`] once per the given [`Duration`].
/// Alarm can be manually triggered with closure returned by [`Alarm::manual_trigger_fn`].
/// [`Alarm::get_trigger`] will return [`TRIGGER_SIGNAL`] in this case.
/// ///
/// Can be cloned, but the trigger status is shared across all instances so only /// Can be cloned, but the trigger status is shared across all instances so only
/// the first caller each interval will yield true. /// the first caller each interval will yield true.
@ -933,6 +935,27 @@ impl<'a> BlockWriter<'a> {
} }
} }
fn flush_caches_full_length(i: &Input, o: &Output) -> std::io::Result<()> {
// TODO Better error handling for overflowing `len`.
if i.settings.iflags.nocache {
let offset = 0;
#[allow(clippy::useless_conversion)]
let len = i.src.len()?.try_into().unwrap();
i.discard_cache(offset, len);
}
// Similarly, discard the system cache for the output file.
//
// TODO Better error handling for overflowing `len`.
if i.settings.oflags.nocache {
let offset = 0;
#[allow(clippy::useless_conversion)]
let len = o.dst.len()?.try_into().unwrap();
o.discard_cache(offset, len);
}
Ok(())
}
/// Copy the given input data to this output, consuming both. /// Copy the given input data to this output, consuming both.
/// ///
/// This method contains the main loop for the `dd` program. Bytes /// This method contains the main loop for the `dd` program. Bytes
@ -992,22 +1015,7 @@ fn dd_copy(mut i: Input, o: Output) -> std::io::Result<()> {
// requests that we inform the system that we no longer // requests that we inform the system that we no longer
// need the contents of the input file in a system cache. // need the contents of the input file in a system cache.
// //
// TODO Better error handling for overflowing `len`. flush_caches_full_length(&i, &o)?;
if i.settings.iflags.nocache {
let offset = 0;
#[allow(clippy::useless_conversion)]
let len = i.src.len()?.try_into().unwrap();
i.discard_cache(offset, len);
}
// Similarly, discard the system cache for the output file.
//
// TODO Better error handling for overflowing `len`.
if i.settings.oflags.nocache {
let offset = 0;
#[allow(clippy::useless_conversion)]
let len = o.dst.len()?.try_into().unwrap();
o.discard_cache(offset, len);
}
return finalize( return finalize(
BlockWriter::Unbuffered(o), BlockWriter::Unbuffered(o),
rstat, rstat,

View file

@ -443,6 +443,7 @@ pub(crate) fn gen_prog_updater(
} }
} }
/// signal handler listens for SIGUSR1 signal and runs provided closure.
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
pub(crate) struct SignalHandler { pub(crate) struct SignalHandler {
handle: Handle, handle: Handle,