On Sun, Jan 26, 2020 at 11:59:33AM -0500, David Goerger wrote:
> This diff teaches du(1) the -m flag, report disk usage in megabytes.
> This brings us in line with implementations in the other BSDs, Linux,
> and Illumos.
Why is it needed? -k is required by POSIX, adding arguments for
megabytes, gigabytes, terabytes, petabytes etc seems silly when
there is already 512 byte blocks, kilobytes and -h output.
>
> Other base utilities where this flag might be useful include df(1)
> and quot(8), although it doesn't appear to be universally adopted
> among the other implementations. That said I can definitely cook
> up a diff if others would find the flag useful elsewhere. In
> particular I think the flag would be useful in quot(8), but that
> tool has an unfortunate legacy, discouraged option "-h" which
> conflicts with -k/-m/-h semantics elsewhere in base, such that
> adding "-m" to quot(8) might only invite confusion.
>
> Many thanks to florian@ for a first-pass review on bsd.network, and
> for encouraging me to check out what the other BSDs and utilities in
> base do, so that we maintain consistency across the ecosystem.
>
> This is my first patch submission---any pointers for improvement would
> be greatly appreciated! Thanks!
>
> (diff below and also attached as "du-megabytes.diff" in case my mail
> client mangles formatting; hopefully I got this right!)
>
> ---
>
> Index: du.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/du/du.1,v
> retrieving revision 1.35
> diff -u -p -r1.35 du.1
> --- du.1 2 Sep 2019 21:18:41 -0000 1.35
> +++ du.1 25 Jan 2020 20:52:11 -0000
> @@ -38,7 +38,7 @@
> .Nd display disk usage statistics
> .Sh SYNOPSIS
> .Nm du
> -.Op Fl achkrsx
> +.Op Fl achkmrsx
> .Op Fl H | L | P
> .Op Fl d Ar depth
> .Op Ar
> @@ -86,6 +86,10 @@ By default, all sizes are reported in 51
> The
> .Fl k
> option causes the numbers to be reported in kilobyte counts.
> +.It Fl m
> +Similar to
> +.Fl k ,
> +but report disk usage in megabytes.
> .It Fl L
> All symbolic links are followed.
> .It Fl P
> Index: du.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/du/du.c,v
> retrieving revision 1.32
> diff -u -p -r1.32 du.c
> --- du.c 24 Aug 2016 03:13:45 -0000 1.32
> +++ du.c 25 Jan 2020 20:52:31 -0000
> @@ -61,7 +61,7 @@ main(int argc, char *argv[])
> long blocksize;
> int64_t totalblocks;
> int ftsoptions, listfiles, maxdepth;
> - int Hflag, Lflag, cflag, hflag, kflag;
> + int Hflag, Lflag, cflag, hflag, kflag, mflag;
> int ch, notused, rval;
> char **save;
> const char *errstr;
> @@ -70,11 +70,11 @@ main(int argc, char *argv[])
> err(1, "pledge");
>
> save = argv;
> - Hflag = Lflag = cflag = hflag = kflag = listfiles = 0;
> + Hflag = Lflag = cflag = hflag = kflag = listfiles = mflag = 0;
> totalblocks = 0;
> ftsoptions = FTS_PHYSICAL;
> maxdepth = -1;
> - while ((ch = getopt(argc, argv, "HLPacd:hkrsx")) != -1)
> + while ((ch = getopt(argc, argv, "HLPacd:hkmrsx")) != -1)
> switch (ch) {
> case 'H':
> Hflag = 1;
> @@ -103,10 +103,17 @@ main(int argc, char *argv[])
> case 'h':
> hflag = 1;
> kflag = 0;
> + mflag = 0;
> break;
> case 'k':
> kflag = 1;
> hflag = 0;
> + mflag = 0;
> + break;
> + case 'm':
> + kflag = 0;
> + hflag = 0;
> + mflag = 1;
> break;
> case 's':
> maxdepth = 0;
> @@ -155,6 +162,8 @@ main(int argc, char *argv[])
> blocksize = 512;
> else if (kflag)
> blocksize = 1024;
> + else if (mflag)
> + blocksize = 1048576;
> else
> (void)getbsize(¬used, &blocksize);
> blocksize /= 512;
> @@ -320,6 +329,6 @@ usage(void)
> {
>
> (void)fprintf(stderr,
> - "usage: du [-achkrsx] [-H | -L | -P] [-d depth] [file ...]\n");
> + "usage: du [-achkmrsx] [-H | -L | -P] [-d depth] [file ...]\n");
> exit(1);
> }
> Index: du.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/du/du.1,v
> retrieving revision 1.35
> diff -u -p -r1.35 du.1
> --- du.1 2 Sep 2019 21:18:41 -0000 1.35
> +++ du.1 25 Jan 2020 20:52:11 -0000
> @@ -38,7 +38,7 @@
> .Nd display disk usage statistics
> .Sh SYNOPSIS
> .Nm du
> -.Op Fl achkrsx
> +.Op Fl achkmrsx
> .Op Fl H | L | P
> .Op Fl d Ar depth
> .Op Ar
> @@ -86,6 +86,10 @@ By default, all sizes are reported in 51
> The
> .Fl k
> option causes the numbers to be reported in kilobyte counts.
> +.It Fl m
> +Similar to
> +.Fl k ,
> +but report disk usage in megabytes.
> .It Fl L
> All symbolic links are followed.
> .It Fl P
> Index: du.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/du/du.c,v
> retrieving revision 1.32
> diff -u -p -r1.32 du.c
> --- du.c 24 Aug 2016 03:13:45 -0000 1.32
> +++ du.c 25 Jan 2020 20:52:31 -0000
> @@ -61,7 +61,7 @@ main(int argc, char *argv[])
> long blocksize;
> int64_t totalblocks;
> int ftsoptions, listfiles, maxdepth;
> - int Hflag, Lflag, cflag, hflag, kflag;
> + int Hflag, Lflag, cflag, hflag, kflag, mflag;
> int ch, notused, rval;
> char **save;
> const char *errstr;
> @@ -70,11 +70,11 @@ main(int argc, char *argv[])
> err(1, "pledge");
>
> save = argv;
> - Hflag = Lflag = cflag = hflag = kflag = listfiles = 0;
> + Hflag = Lflag = cflag = hflag = kflag = listfiles = mflag = 0;
> totalblocks = 0;
> ftsoptions = FTS_PHYSICAL;
> maxdepth = -1;
> - while ((ch = getopt(argc, argv, "HLPacd:hkrsx")) != -1)
> + while ((ch = getopt(argc, argv, "HLPacd:hkmrsx")) != -1)
> switch (ch) {
> case 'H':
> Hflag = 1;
> @@ -103,10 +103,17 @@ main(int argc, char *argv[])
> case 'h':
> hflag = 1;
> kflag = 0;
> + mflag = 0;
> break;
> case 'k':
> kflag = 1;
> hflag = 0;
> + mflag = 0;
> + break;
> + case 'm':
> + kflag = 0;
> + hflag = 0;
> + mflag = 1;
> break;
> case 's':
> maxdepth = 0;
> @@ -155,6 +162,8 @@ main(int argc, char *argv[])
> blocksize = 512;
> else if (kflag)
> blocksize = 1024;
> + else if (mflag)
> + blocksize = 1048576;
> else
> (void)getbsize(¬used, &blocksize);
> blocksize /= 512;
> @@ -320,6 +329,6 @@ usage(void)
> {
>
> (void)fprintf(stderr,
> - "usage: du [-achkrsx] [-H | -L | -P] [-d depth] [file ...]\n");
> + "usage: du [-achkmrsx] [-H | -L | -P] [-d depth] [file ...]\n");
> exit(1);
> }