mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-29 03:57:44 +00:00
dd: correctly account for partial record written
Correct the accounting for partial records written by `dd` to the output file. After this commit, if fewer than `obs` bytes are written, then that is counted as a partial record. For example, $ printf 'abc' | dd bs=2 status=noxfer > /dev/null 1+1 records in 1+1 records out That is, one complete record and one partial record are read from the input, one complete record and one partial record are written to the output. Previously, `dd` reported two complete records and zero partial records written to the output in this case.
This commit is contained in:
parent
4009bf9a89
commit
3ada6af19d
2 changed files with 16 additions and 9 deletions
|
@ -334,16 +334,13 @@ where
|
||||||
let mut bytes_total = 0;
|
let mut bytes_total = 0;
|
||||||
|
|
||||||
for chunk in buf.chunks(self.obs) {
|
for chunk in buf.chunks(self.obs) {
|
||||||
match self.write(chunk)? {
|
let wlen = self.write(chunk)?;
|
||||||
wlen if wlen < chunk.len() => {
|
if wlen < self.obs {
|
||||||
writes_partial += 1;
|
writes_partial += 1;
|
||||||
bytes_total += wlen;
|
} else {
|
||||||
}
|
writes_complete += 1;
|
||||||
wlen => {
|
|
||||||
writes_complete += 1;
|
|
||||||
bytes_total += wlen;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
bytes_total += wlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(WriteStat {
|
Ok(WriteStat {
|
||||||
|
|
|
@ -692,5 +692,15 @@ fn test_seek_do_not_overwrite() {
|
||||||
assert_eq!(at.read("outfile"), "a2");
|
assert_eq!(at.read("outfile"), "a2");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_partial_records_out() {
|
||||||
|
new_ucmd!()
|
||||||
|
.args(&["bs=2", "status=noxfer"])
|
||||||
|
.pipe_in("abc")
|
||||||
|
.succeeds()
|
||||||
|
.stdout_is("abc")
|
||||||
|
.stderr_is("1+1 records in\n1+1 records out\n");
|
||||||
|
}
|
||||||
|
|
||||||
// conv=[ascii,ebcdic,ibm], conv=[ucase,lcase], conv=[block,unblock], conv=sync
|
// conv=[ascii,ebcdic,ibm], conv=[ucase,lcase], conv=[block,unblock], conv=sync
|
||||||
// TODO: Move conv tests from unit test module
|
// TODO: Move conv tests from unit test module
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue