This patch makes dd(1) output change from e.g.

$ dd if=/dev/sd0c of=/dev/null bs=512 count=16000                        
16000+0 records in
16000+0 records out
8192000 bytes transferred in 3.002 secs (2728488 bytes/sec)

to

$ obj/dd if=/dev/sd0c of=/dev/null bs=512 count=16000
16000+0 records in
16000+0 records out
8192000 bytes (7.8MB) transferred in 3.009 seconds (2.6MB/s)

Any interest?

Index: Makefile
===================================================================
RCS file: /cvs/src/bin/dd/Makefile,v
retrieving revision 1.5
diff -u -p -r1.5 Makefile
--- Makefile    29 May 1998 04:34:20 -0000      1.5
+++ Makefile    23 Aug 2011 18:43:43 -0000
@@ -2,5 +2,7 @@
 
 PROG=  dd
 SRCS=  args.c conv.c conv_tab.c dd.c misc.c position.c
+DPADD= ${LIBUTIL}
+LDADD= -lutil
 
 .include <bsd.prog.mk>
Index: misc.c
===================================================================
RCS file: /cvs/src/bin/dd/misc.c,v
retrieving revision 1.16
diff -u -p -r1.16 misc.c
--- misc.c      27 Oct 2009 23:59:21 -0000      1.16
+++ misc.c      23 Aug 2011 18:43:43 -0000
@@ -45,6 +45,7 @@
 #include <errno.h>
 #include <time.h>
 #include <unistd.h>
+#include <util.h>
 
 #include "dd.h"
 #include "extern.h"
@@ -57,6 +58,7 @@ summary(void)
        struct iovec iov[4];
        double microsecs;
        int i = 0;
+       char sizebuf[FMT_SCALED_STRSIZE], ratebuf[FMT_SCALED_STRSIZE];
 
        (void)gettimeofday(&nowtv, (struct timezone *)NULL);
        timersub(&nowtv, &st.startv, &nowtv);
@@ -85,10 +87,19 @@ summary(void)
                iov[i].iov_base = buf[2];
                iov[i++].iov_len = strlen(buf[2]);
        }
+
+       strlcpy(sizebuf, "?", sizeof sizebuf);
+       fmt_scaled(st.bytes, sizebuf);
+       sizebuf[strcspn(sizebuf, "B")] = '\0';
+
+       strlcpy(ratebuf, "?", sizeof ratebuf);
+       fmt_scaled(st.bytes * 1000000.0 / microsecs, ratebuf);
+       ratebuf[strcspn(ratebuf, "B")] = '\0';
+
        (void)snprintf(buf[3], sizeof(buf[3]),
-           "%qd bytes transferred in %ld.%03ld secs (%0.0f bytes/sec)\n",
-           (long long)st.bytes, nowtv.tv_sec, nowtv.tv_usec / 1000,
-           ((double)st.bytes * 1000000) / microsecs);
+           "%qd bytes (%sB) transferred in %ld.%03ld seconds (%sB/s)\n",
+           (long long)st.bytes, sizebuf, nowtv.tv_sec, nowtv.tv_usec / 1000,
+           ratebuf);
 
        iov[i].iov_base = buf[3];
        iov[i++].iov_len = strlen(buf[3]);

Reply via email to