diff --git a/src/uu/ptx/src/ptx.rs b/src/uu/ptx/src/ptx.rs index 00d4f611e..5cb54e5d7 100644 --- a/src/uu/ptx/src/ptx.rs +++ b/src/uu/ptx/src/ptx.rs @@ -633,7 +633,8 @@ fn write_traditional_output( let mut writer: BufWriter> = BufWriter::new(if output_filename == "-" { Box::new(stdout()) } else { - let file = File::create(output_filename).map_err_context(String::new)?; + let file = File::create(output_filename) + .map_err_context(|| output_filename.maybe_quote().to_string())?; Box::new(file) }); @@ -673,8 +674,11 @@ fn write_traditional_output( return Err(PtxError::DumbFormat.into()); } }; - writeln!(writer, "{output_line}").map_err_context(String::new)?; + writeln!(writer, "{output_line}").map_err_context(|| "write failed".into())?; } + + writer.flush().map_err_context(|| "write failed".into())?; + Ok(()) } diff --git a/tests/by-util/test_ptx.rs b/tests/by-util/test_ptx.rs index 6f7f34d17..c6faddda4 100644 --- a/tests/by-util/test_ptx.rs +++ b/tests/by-util/test_ptx.rs @@ -163,3 +163,14 @@ fn test_format() { .succeeds() .stdout_only("\\xx {}{}{a}{}{}\n"); } + +#[cfg(target_os = "linux")] +#[test] +fn test_failed_write_is_reported() { + new_ucmd!() + .arg("-G") + .pipe_in("hello") + .set_stdout(std::fs::File::create("/dev/full").unwrap()) + .fails() + .stderr_is("ptx: write failed: No space left on device\n"); +}