svn commit: r322291 - in head/usr.bin/du: . tests

Kyle Evans kevans at FreeBSD.org
Wed Aug 9 01:19:21 UTC 2017


Author: kevans
Date: Wed Aug  9 01:19:19 2017
New Revision: 322291
URL: https://svnweb.freebsd.org/changeset/base/322291

Log:
  du(1): Add --si option to display in terms of powers of 1000
  
  Reviewed by:	cem (earlier version), emaste
  Approved by:	emaste (mentor)
  Differential Revision:	https://reviews.freebsd.org/D11748

Modified:
  head/usr.bin/du/du.1
  head/usr.bin/du/du.c
  head/usr.bin/du/tests/du_test.sh

Modified: head/usr.bin/du/du.1
==============================================================================
--- head/usr.bin/du/du.1	Wed Aug  9 01:14:29 2017	(r322290)
+++ head/usr.bin/du/du.1	Wed Aug  9 01:19:19 2017	(r322291)
@@ -28,7 +28,7 @@
 .\"	@(#)du.1	8.2 (Berkeley) 4/1/94
 .\" $FreeBSD$
 .\"
-.Dd November 4, 2012
+.Dd August 8, 2017
 .Dt DU 1
 .Os
 .Sh NAME
@@ -63,9 +63,10 @@ Calculate block counts in
 .Ar blocksize
 byte blocks.
 This is different from the
-.Fl h, k, m
+.Fl h, k, m,
+.Fl Fl si
 and
-.Fl  g
+.Fl g
 options or setting
 .Ev BLOCKSIZE
 and gives an estimate of how much space the examined file hierarchy would
@@ -101,7 +102,7 @@ Display block counts in 1073741824-byte (1 GiB) blocks
 .Dq Human-readable
 output.
 Use unit suffixes: Byte, Kilobyte, Megabyte,
-Gigabyte, Terabyte and Petabyte.
+Gigabyte, Terabyte and Petabyte based on powers of 1024.
 .It Fl k
 Display block counts in 1024-byte (1 kiB) blocks.
 .It Fl l
@@ -131,6 +132,11 @@ This option exists solely for conformance with
 Display an entry for each specified file.
 (Equivalent to
 .Fl d Li 0 )
+.It Fl Fl si
+.Dq Human-readable
+output.
+Use unit suffixes: Byte, Kilobyte, Megabyte,
+Gigabyte, Terabyte and Petabyte based on powers of 1000.
 .It Fl t Ar threshold
 Display only entries for which size exceeds
 .Ar threshold .
@@ -166,9 +172,9 @@ options override each other and the command's actions 
 by the last one specified.
 .Pp
 The
-.Fl h, k
+.Fl h, k, m
 and
-.Fl m
+.Fl Fl si
 options all override each other; the last one specified determines
 the block counts used.
 .Sh ENVIRONMENT
@@ -177,17 +183,17 @@ the block counts used.
 If the environment variable
 .Ev BLOCKSIZE
 is set, and the
-.Fl h, k
+.Fl h, k, m
 or
-.Fl m
+.Fl Fl si
 options are not specified, the block counts will be displayed in units of
 that block size.
 If
 .Ev BLOCKSIZE
 is not set, and the
-.Fl h, k
+.Fl h, k, m
 or
-.Fl m
+.Fl Fl si
 options are not specified, the block counts will be displayed in 512-byte
 blocks.
 .El

Modified: head/usr.bin/du/du.c
==============================================================================
--- head/usr.bin/du/du.c	Wed Aug  9 01:14:29 2017	(r322290)
+++ head/usr.bin/du/du.c	Wed Aug  9 01:19:19 2017	(r322291)
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <fnmatch.h>
 #include <fts.h>
+#include <getopt.h>
 #include <libutil.h>
 #include <locale.h>
 #include <stdint.h>
@@ -60,6 +61,11 @@ __FBSDID("$FreeBSD$");
 #include <sysexits.h>
 #include <unistd.h>
 
+#define SI_OPT	(CHAR_MAX + 1)
+
+#define UNITS_2		1
+#define UNITS_SI	2
+
 static SLIST_HEAD(ignhead, ignentry) ignores;
 struct ignentry {
 	char			*mask;
@@ -75,10 +81,16 @@ static int	ignorep(FTSENT *);
 static void	siginfo(int __unused);
 
 static int	nodumpflag = 0;
-static int	Aflag;
+static int	Aflag, hflag;
 static long	blocksize, cblocksize;
 static volatile sig_atomic_t info;
 
+static const struct option long_options[] =
+{
+	{ "si", no_argument, NULL, SI_OPT },
+	{ NULL, no_argument, NULL, 0 },
+};
+
 int
 main(int argc, char *argv[])
 {
@@ -89,14 +101,13 @@ main(int argc, char *argv[])
 	int		ftsoptions;
 	int		depth;
 	int		Hflag, Lflag, aflag, sflag, dflag, cflag;
-	int		hflag, lflag, ch, notused, rval;
+	int		lflag, ch, notused, rval;
 	char 		**save;
 	static char	dot[] = ".";
 
 	setlocale(LC_ALL, "");
 
-	Hflag = Lflag = aflag = sflag = dflag = cflag = hflag =
-	    lflag = Aflag = 0;
+	Hflag = Lflag = aflag = sflag = dflag = cflag = lflag = Aflag = 0;
 
 	save = argv;
 	ftsoptions = FTS_PHYSICAL;
@@ -108,7 +119,8 @@ main(int argc, char *argv[])
 	depth = INT_MAX;
 	SLIST_INIT(&ignores);
 
-	while ((ch = getopt(argc, argv, "AB:HI:LPasd:cghklmnrt:x")) != -1)
+	while ((ch = getopt_long(argc, argv, "+AB:HI:LPasd:cghklmnrt:x",
+	    long_options, NULL)) != -1)
 		switch (ch) {
 		case 'A':
 			Aflag = 1;
@@ -160,7 +172,7 @@ main(int argc, char *argv[])
 			blocksize = 1073741824;
 			break;
 		case 'h':
-			hflag = 1;
+			hflag = UNITS_2;
 			break;
 		case 'k':
 			hflag = 0;
@@ -189,6 +201,9 @@ main(int argc, char *argv[])
 		case 'x':
 			ftsoptions |= FTS_XDEV;
 			break;
+		case SI_OPT:
+			hflag = UNITS_SI;
+			break;
 		case '?':
 		default:
 			usage();
@@ -270,7 +285,7 @@ main(int argc, char *argv[])
 			if (p->fts_level <= depth && threshold <=
 			    threshold_sign * howmany(p->fts_bignum *
 			    cblocksize, blocksize)) {
-				if (hflag) {
+				if (hflag > 0) {
 					prthumanval(p->fts_bignum);
 					(void)printf("\t%s\n", p->fts_path);
 				} else {
@@ -306,7 +321,7 @@ main(int argc, char *argv[])
 			    howmany(p->fts_statp->st_blocks, cblocksize);
 
 			if (aflag || p->fts_level == 0) {
-				if (hflag) {
+				if (hflag > 0) {
 					prthumanval(curblocks);
 					(void)printf("\t%s\n", p->fts_path);
 				} else {
@@ -326,7 +341,7 @@ main(int argc, char *argv[])
 		err(1, "fts_read");
 
 	if (cflag) {
-		if (hflag) {
+		if (hflag > 0) {
 			prthumanval(savednumber);
 			(void)printf("\ttotal\n");
 		} else {
@@ -474,13 +489,16 @@ static void
 prthumanval(int64_t bytes)
 {
 	char buf[5];
+	int flags;
 
 	bytes *= cblocksize;
+	flags = HN_B | HN_NOSPACE | HN_DECIMAL;
 	if (!Aflag)
 		bytes *= DEV_BSIZE;
+	if (hflag == UNITS_SI)
+		flags |= HN_DIVISOR_1000;
 
-	humanize_number(buf, sizeof(buf), bytes, "", HN_AUTOSCALE,
-	    HN_B | HN_NOSPACE | HN_DECIMAL);
+	humanize_number(buf, sizeof(buf), bytes, "", HN_AUTOSCALE, flags);
 
 	(void)printf("%4s", buf);
 }

Modified: head/usr.bin/du/tests/du_test.sh
==============================================================================
--- head/usr.bin/du/tests/du_test.sh	Wed Aug  9 01:14:29 2017	(r322290)
+++ head/usr.bin/du/tests/du_test.sh	Wed Aug  9 01:19:19 2017	(r322291)
@@ -141,6 +141,20 @@ m_flag_body()
 	atf_check -o inline:'1\tA\n1\tB\n1024\tC\n' du -Am A B C
 }
 
+atf_test_case si_flag
+si_flag_head()
+{
+	atf_set "descr" "Verify --si output"
+}
+si_flag_body()
+{
+	atf_check truncate -s 1500000 A
+	atf_check truncate -s 1572864 B
+
+	atf_check -o inline:'1.4M\tA\n1.5M\tB\n' du -Ah A B
+	atf_check -o inline:'1.5M\tA\n1.6M\tB\n' du -A --si A B
+}
+
 atf_init_test_cases()
 {
 	atf_add_test_case A_flag
@@ -150,4 +164,5 @@ atf_init_test_cases()
 	atf_add_test_case h_flag
 	atf_add_test_case k_flag
 	atf_add_test_case m_flag
+	atf_add_test_case si_flag
 }


More information about the svn-src-all mailing list