aboutsummaryrefslogtreecommitdiff
path: root/coreutils/dd.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-10-14 17:43:41 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-10-14 17:43:41 +0200
commit7eabffafa5b6faaaa87ff8ba0efbf637aaa364e8 (patch)
treeea5aeb122d13f8fa14d5fe2d0d7692f053914c07 /coreutils/dd.c
parent04bb6b6a5af24f9a458132a5d002c54f901ae323 (diff)
downloadbusybox-w32-7eabffafa5b6faaaa87ff8ba0efbf637aaa364e8.tar.gz
busybox-w32-7eabffafa5b6faaaa87ff8ba0efbf637aaa364e8.tar.bz2
busybox-w32-7eabffafa5b6faaaa87ff8ba0efbf637aaa364e8.zip
dd: use correct multiplication factor and simplify code
function old new delta dd_output_status 332 364 +32 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils/dd.c')
-rw-r--r--coreutils/dd.c26
1 files changed, 7 insertions, 19 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c
index f2e1a1683..8bba62ce1 100644
--- a/coreutils/dd.c
+++ b/coreutils/dd.c
@@ -49,9 +49,9 @@ struct globals {
49static void dd_output_status(int UNUSED_PARAM cur_signal) 49static void dd_output_status(int UNUSED_PARAM cur_signal)
50{ 50{
51#if ENABLE_FEATURE_DD_THIRD_STATUS_LINE 51#if ENABLE_FEATURE_DD_THIRD_STATUS_LINE
52 unsigned long long total; 52 double seconds;
53 unsigned long long diff_scaled; 53 unsigned long long bytes_sec;
54 unsigned long long diff_us = monotonic_us(); /* before fprintf */ 54 unsigned long long now_us = monotonic_us(); /* before fprintf */
55#endif 55#endif
56 56
57 /* Deliberately using %u, not %d */ 57 /* Deliberately using %u, not %d */
@@ -72,24 +72,12 @@ static void dd_output_status(int UNUSED_PARAM cur_signal)
72 * (echo DONE) | ./busybox dd >/dev/null 72 * (echo DONE) | ./busybox dd >/dev/null
73 * (sleep 1; echo DONE) | ./busybox dd >/dev/null 73 * (sleep 1; echo DONE) | ./busybox dd >/dev/null
74 */ 74 */
75 diff_us -= G.begin_time_us; 75 seconds = (now_us - G.begin_time_us) / 1000000.0;
76 /* We need to calculate "(total * 1000000) / usec" without overflow. 76 bytes_sec = G.total_bytes / seconds;
77 * this would work too, but is bigger than integer code below.
78 * total = G.total_bytes * (double)1000000 / (diff_us ? diff_us : 1);
79 */
80 diff_scaled = diff_us;
81 total = G.total_bytes;
82 while (total > MAXINT(unsigned long long) / (1024 * 1024)) {
83 total >>= 1;
84 diff_scaled >>= 1;
85 }
86 total *= (1024 * 1024); /* should be 1000000, but it's +45 bytes */
87 if (diff_scaled > 1)
88 total /= diff_scaled;
89 fprintf(stderr, "%f seconds, %sB/s\n", 77 fprintf(stderr, "%f seconds, %sB/s\n",
90 diff_us / 1000000.0, 78 seconds,
91 /* show fractional digit, use suffixes */ 79 /* show fractional digit, use suffixes */
92 make_human_readable_str(total, 1, 0) 80 make_human_readable_str(bytes_sec, 1, 0)
93 ); 81 );
94#endif 82#endif
95} 83}