From d4217c5a129464cec638c56f06a679830d64ff71 Mon Sep 17 00:00:00 2001 From: Guillaume Ranquet Date: Wed, 6 Sep 2023 16:07:59 +0200 Subject: [PATCH] split: catch broken pipe error for round robin strategy The broken pipe error is not handled in the case of the round robin strategy (typically used with --filter). Align to the other strategies to silence that error in that use case too. fixes #5191 Signed-off-by: Guillaume Ranquet --- src/uu/split/src/split.rs | 14 ++++++++++---- tests/by-util/test_split.rs | 12 ++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/uu/split/src/split.rs b/src/uu/split/src/split.rs index 517031791..4a1624d07 100644 --- a/src/uu/split/src/split.rs +++ b/src/uu/split/src/split.rs @@ -1282,7 +1282,7 @@ fn split_into_n_chunks_by_line_round_robin( settings: &Settings, reader: &mut R, num_chunks: u64, -) -> UResult<()> +) -> std::io::Result<()> where R: BufRead, { @@ -1293,7 +1293,7 @@ where settings.suffix_length, settings.suffix_type, settings.suffix_start, - )?; + ).map_err(|e| io::Error::new(ErrorKind::Other, format!("{e}")))?; // Create one writer for each chunk. This will create each // of the underlying files (if not in `--filter` mode). @@ -1301,7 +1301,7 @@ where for _ in 0..num_chunks { let filename = filename_iterator .next() - .ok_or_else(|| USimpleError::new(1, "output file suffixes exhausted"))?; + .ok_or_else(|| io::Error::new(ErrorKind::Other, "output file suffixes exhausted"))?; let writer = settings.instantiate_current_writer(filename.as_str())?; writers.push(writer); } @@ -1346,7 +1346,13 @@ fn split(settings: &Settings) -> UResult<()> { kth_chunk_by_line(settings, &mut reader, chunk_number, num_chunks) } Strategy::Number(NumberType::RoundRobin(num_chunks)) => { - split_into_n_chunks_by_line_round_robin(settings, &mut reader, num_chunks) + match split_into_n_chunks_by_line_round_robin(settings, &mut reader, num_chunks) { + Ok(_) => Ok(()), + Err(e) => match e.kind() { + ErrorKind::BrokenPipe => Ok(()), + _ => Err(USimpleError::new(1, format!("{e}"))), + }, + } } Strategy::Number(_) => Err(USimpleError::new(1, "-n mode not yet fully implemented")), Strategy::Lines(chunk_size) => { diff --git a/tests/by-util/test_split.rs b/tests/by-util/test_split.rs index 0b7bbfec6..cb7775781 100644 --- a/tests/by-util/test_split.rs +++ b/tests/by-util/test_split.rs @@ -299,6 +299,18 @@ fn test_filter_command_fails() { .fails(); } +#[test] +#[cfg(unix)] +fn test_filter_broken_pipe() { + let (at, mut ucmd) = at_and_ucmd!(); + let name = "filter-big-input"; + + RandomFile::new(&at, name).add_lines(1024 * 10); + ucmd + .args(&["--filter=head -c1 > /dev/null", "-n", "r/1", name]) + .succeeds(); +} + #[test] fn test_split_lines_number() { // Test if stdout/stderr for '--lines' option is correct