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:
kevans 2018-09-13 14:54:46 +00:00
parent be73db354f
commit 313939fafc

View File

@ -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;