dd(1): Correct padding in status=progress
Output padding is specified via outlen, which is set using the return value of fprintf. Because it's printing that padding plus a trailing byte, it grows by one each iteration rather than reflecting actual length. Additionally, iec was sized improperly for scaling up similarly to si. Fixing this revealed that the humanize_number(3) call to populate persec was using the wrong width. Submitted by: Thomas Hurst <tom@hur.st> Reviewed by: imp Approved by: re (kib) Differential Revision: https://reviews.freebsd.org/D16960
This commit is contained in:
parent
13ea074dc3
commit
ac5d5b054f
@ -111,7 +111,7 @@ progress(void)
|
|||||||
{
|
{
|
||||||
static int outlen;
|
static int outlen;
|
||||||
char si[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
|
char si[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
|
||||||
char iec[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
|
char iec[4 + 1 + 3 + 1]; /* 123 <space> <suffix> NUL */
|
||||||
char persec[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
|
char persec[4 + 1 + 2 + 1]; /* 123 <space> <suffix> NUL */
|
||||||
char *buf;
|
char *buf;
|
||||||
double secs;
|
double secs;
|
||||||
@ -121,11 +121,11 @@ progress(void)
|
|||||||
HN_DECIMAL | HN_DIVISOR_1000);
|
HN_DECIMAL | HN_DIVISOR_1000);
|
||||||
humanize_number(iec, sizeof(iec), (int64_t)st.bytes, "B", HN_AUTOSCALE,
|
humanize_number(iec, sizeof(iec), (int64_t)st.bytes, "B", HN_AUTOSCALE,
|
||||||
HN_DECIMAL | HN_IEC_PREFIXES);
|
HN_DECIMAL | HN_IEC_PREFIXES);
|
||||||
humanize_number(persec, sizeof(iec), (int64_t)(st.bytes / secs), "B",
|
humanize_number(persec, sizeof(persec), (int64_t)(st.bytes / secs), "B",
|
||||||
HN_AUTOSCALE, HN_DECIMAL | HN_DIVISOR_1000);
|
HN_AUTOSCALE, HN_DECIMAL | HN_DIVISOR_1000);
|
||||||
asprintf(&buf, " %'ju bytes (%s, %s) transferred %.3fs, %s/s",
|
asprintf(&buf, " %'ju bytes (%s, %s) transferred %.3fs, %s/s",
|
||||||
(uintmax_t)st.bytes, si, iec, secs, persec);
|
(uintmax_t)st.bytes, si, iec, secs, persec);
|
||||||
outlen = fprintf(stderr, "%-*s\r", outlen, buf);
|
outlen = fprintf(stderr, "%-*s\r", outlen, buf) - 1;
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
free(buf);
|
free(buf);
|
||||||
need_progress = 0;
|
need_progress = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user