Implement from scratch a -l option for du(1), to match the same option

of the GNU utility.  The default behavior of our original `du' is to
count hardlinked files only once for each invocation of the utility.
With the new -l option they count towards the final size every time
they are found.

PR:		bin/117944
Submitted by:	keramida
Reviewed by:	des, obrien
MFC after:	2 weeks
This commit is contained in:
Giorgos Keramidas 2008-02-25 19:06:43 +00:00
parent 5b62538f7f
commit fe5628d3c1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=176561
2 changed files with 23 additions and 11 deletions

View File

@ -32,7 +32,7 @@
.\" @(#)du.1 8.2 (Berkeley) 4/1/94
.\" $FreeBSD$
.\"
.Dd May 6, 2006
.Dd February 25, 2008
.Dt DU 1
.Os
.Sh NAME
@ -43,6 +43,7 @@
.Op Fl H | L | P
.Op Fl a | s | d Ar depth
.Op Fl c
.Op Fl l
.Op Fl h | k | m
.Op Fl n
.Op Fl x
@ -94,6 +95,15 @@ directories deep.
Display a grand total.
.It Fl k
Display block counts in 1024-byte (1-Kbyte) blocks.
.It Fl l
If a file has multiple hard links, count its size many times.
The default behavior of
.Nm
is to count files with multiple hard links only once.
When the
.Fl l
option is specified, the hard link checks are disabled, and these files
are counted (and displayed) as many times as they are found.
.It Fl m
Display block counts in 1048576-byte (1-Mbyte) blocks.
.It Fl n
@ -120,11 +130,6 @@ or
.Fl L
options are specified, storage used by any symbolic links which are
followed is not counted or displayed.
.Pp
Files having multiple hard links are counted (and displayed) a single
time per
.Nm
execution.
.Sh ENVIRONMENT
.Bl -tag -width BLOCKSIZE
.It Ev BLOCKSIZE

View File

@ -90,20 +90,22 @@ main(int argc, char *argv[])
int ftsoptions;
int listall;
int depth;
int Hflag, Lflag, Pflag, aflag, sflag, dflag, cflag, hflag, ch, notused, rval;
int Hflag, Lflag, Pflag, aflag, sflag, dflag, cflag;
int hflag, lflag, ch, notused, rval;
char **save;
static char dot[] = ".";
setlocale(LC_ALL, "");
Hflag = Lflag = Pflag = aflag = sflag = dflag = cflag = hflag = 0;
Hflag = Lflag = Pflag = aflag = sflag = dflag = cflag = hflag =
lflag = 0;
save = argv;
ftsoptions = 0;
depth = INT_MAX;
SLIST_INIT(&ignores);
while ((ch = getopt(argc, argv, "HI:LPasd:chkmnrx")) != -1)
while ((ch = getopt(argc, argv, "HI:LPasd:chklmnrx")) != -1)
switch (ch) {
case 'H':
Hflag = 1;
@ -150,6 +152,9 @@ main(int argc, char *argv[])
if (setenv("BLOCKSIZE", "1024", 1) == -1)
warn("setenv: cannot set BLOCKSIZE=1024");
break;
case 'l':
lflag = 1;
break;
case 'm':
hflag = 0;
if (setenv("BLOCKSIZE", "1048576", 1) == -1)
@ -261,7 +266,8 @@ main(int argc, char *argv[])
if (ignorep(p))
break;
if (p->fts_statp->st_nlink > 1 && linkchk(p))
if (lflag == 0 &&
p->fts_statp->st_nlink > 1 && linkchk(p))
break;
if (listall || p->fts_level == 0) {
@ -447,7 +453,8 @@ static void
usage(void)
{
(void)fprintf(stderr,
"usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] [-h | -k | -m] [-n] [-x] [-I mask] [file ...]\n");
"usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] "
"[-l] [-h | -k | -m] [-n] [-x] [-I mask] [file ...]\n");
exit(EX_USAGE);
}