From cf50952325495889d75165acb7e6c1be37a68c4d Mon Sep 17 00:00:00 2001 From: Jan Verbeek Date: Mon, 31 Mar 2025 13:19:55 +0200 Subject: [PATCH] tail: Flush `BufWriter` --- src/uu/tail/src/chunks.rs | 2 +- src/uu/tail/src/follow/files.rs | 8 ++++---- src/uu/tail/src/tail.rs | 4 ++-- tests/by-util/test_tail.rs | 10 ++++++++++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/uu/tail/src/chunks.rs b/src/uu/tail/src/chunks.rs index e8ee761ed..b9bf54594 100644 --- a/src/uu/tail/src/chunks.rs +++ b/src/uu/tail/src/chunks.rs @@ -319,7 +319,7 @@ impl BytesChunkBuffer { Ok(()) } - pub fn print(&self, mut writer: impl Write) -> UResult<()> { + pub fn print(&self, writer: &mut impl Write) -> UResult<()> { for chunk in &self.chunks { writer.write_all(chunk.get_buffer())?; } diff --git a/src/uu/tail/src/follow/files.rs b/src/uu/tail/src/follow/files.rs index 21af5eb28..509d84d84 100644 --- a/src/uu/tail/src/follow/files.rs +++ b/src/uu/tail/src/follow/files.rs @@ -12,7 +12,7 @@ use crate::text; use std::collections::HashMap; use std::collections::hash_map::Keys; use std::fs::{File, Metadata}; -use std::io::{BufRead, BufReader, BufWriter, stdout}; +use std::io::{BufRead, BufReader, BufWriter, Write, stdout}; use std::path::{Path, PathBuf}; use uucore::error::UResult; @@ -146,9 +146,9 @@ impl FileHandling { self.header_printer.print(display_name.as_str()); } - let stdout = stdout(); - let writer = BufWriter::new(stdout.lock()); - chunks.print(writer)?; + let mut writer = BufWriter::new(stdout().lock()); + chunks.print(&mut writer)?; + writer.flush()?; self.last.replace(path.to_owned()); self.update_metadata(path, None); diff --git a/src/uu/tail/src/tail.rs b/src/uu/tail/src/tail.rs index 11af1a685..3cbc34f8d 100644 --- a/src/uu/tail/src/tail.rs +++ b/src/uu/tail/src/tail.rs @@ -399,8 +399,7 @@ fn bounded_tail(file: &mut File, settings: &Settings) { } fn unbounded_tail(reader: &mut BufReader, settings: &Settings) -> UResult<()> { - let stdout = stdout(); - let mut writer = BufWriter::new(stdout.lock()); + let mut writer = BufWriter::new(stdout().lock()); match &settings.mode { FilterMode::Lines(Signum::Negative(count), sep) => { let mut chunks = chunks::LinesChunkBuffer::new(*sep, *count); @@ -459,6 +458,7 @@ fn unbounded_tail(reader: &mut BufReader, settings: &Settings) -> UR } _ => {} } + writer.flush()?; Ok(()) } diff --git a/tests/by-util/test_tail.rs b/tests/by-util/test_tail.rs index 76a93b7c6..ff0bc7141 100644 --- a/tests/by-util/test_tail.rs +++ b/tests/by-util/test_tail.rs @@ -4847,3 +4847,13 @@ fn test_child_when_run_with_stderr_to_stdout() { .fails() .stdout_only(expected_stdout); } + +#[cfg(target_os = "linux")] +#[test] +fn test_failed_write_is_reported() { + new_ucmd!() + .pipe_in("hello") + .set_stdout(std::fs::File::create("/dev/full").unwrap()) + .fails() + .stderr_is("tail: No space left on device\n"); +}