Skip to content

Commit 9efa5a3

Browse files
xtqqczzeoech3
andcommitted
tee: merge logic of flush into write
Co-authored-by: oech3 <79379754+oech3@users.noreply.github.com>
1 parent 6a3d089 commit 9efa5a3

File tree

1 file changed

+25
-34
lines changed

1 file changed

+25
-34
lines changed

src/uu/tee/src/tee.rs

Lines changed: 25 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ impl MultiWriter {
164164
Ok(0) => return Ok(()), // end of file
165165
Ok(received) => {
166166
self.write_all(&buffer[..received])?;
167-
self.flush()?; // avoid buffering
168167
}
169168
Err(e) if e.kind() != ErrorKind::Interrupted => return Err(e),
170169
_ => {}
@@ -177,8 +176,6 @@ impl MultiWriter {
177176
Ok(0) => return Ok(()), // end of file
178177
Ok(received) => {
179178
self.write_all(&buffer[..received])?;
180-
// avoid buffering
181-
self.flush()?;
182179
}
183180
Err(e) if e.kind() != ErrorKind::Interrupted => return Err(e),
184181
_ => {}
@@ -228,42 +225,36 @@ impl Write for MultiWriter {
228225
let mode = self.output_error_mode.clone();
229226
let mut errors = 0;
230227
self.writers.retain_mut(|writer| {
231-
writer
232-
.write_all(buf)
233-
.map_err(|f| {
234-
let _ = process_error(mode.as_ref(), f, writer, &mut errors)
235-
.map_err(|e| aborted.get_or_insert(e));
236-
})
237-
.is_ok()
228+
let res = (|| {
229+
writer.write_all(buf)?;
230+
writer.flush()
231+
})();
232+
match res {
233+
Ok(()) => true,
234+
Err(e) => {
235+
if let Err(e) = process_error(mode.as_ref(), e, writer, &mut errors) {
236+
aborted.get_or_insert(e);
237+
}
238+
false
239+
}
240+
}
238241
});
239242
self.ignored_errors += errors;
240-
if let Some(e) = aborted {
241-
Err(e)
242-
} else if self.writers.is_empty() {
243-
// This error kind will never be raised by the standard
244-
// library, so we can use it for early termination of
245-
// `copy`
246-
Err(Error::from(ErrorKind::Other))
247-
} else {
248-
Ok(buf.len())
249-
}
243+
aborted.map_or(
244+
if self.writers.is_empty() {
245+
// This error kind will never be raised by the standard
246+
// library, so we can use it for early termination of
247+
// `copy`
248+
Err(Error::from(ErrorKind::Other))
249+
} else {
250+
Ok(buf.len())
251+
},
252+
Err,
253+
)
250254
}
251255

252256
fn flush(&mut self) -> Result<()> {
253-
let mut aborted = None;
254-
let mode = self.output_error_mode.clone();
255-
let mut errors = 0;
256-
self.writers.retain_mut(|writer| {
257-
writer
258-
.flush()
259-
.map_err(|e| {
260-
let _ = process_error(mode.as_ref(), e, writer, &mut errors)
261-
.map_err(|e| aborted.get_or_insert(e));
262-
})
263-
.is_ok()
264-
});
265-
self.ignored_errors += errors;
266-
aborted.map_or(Ok(()), Err)
257+
Ok(())
267258
}
268259
}
269260

0 commit comments

Comments
 (0)