PR/22405 -- extend du(1) to report inode usage. Patch provided by

Jonathan Perkin.

OK by wiz@
This commit is contained in:
shattered 2012-03-11 11:23:20 +00:00
parent 7a488c1ecf
commit 575f4d696a
2 changed files with 31 additions and 16 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: du.1,v 1.21 2006/09/24 07:19:16 wiz Exp $
.\" $NetBSD: du.1,v 1.22 2012/03/11 11:23:20 shattered Exp $
.\"
.\" Copyright (c) 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@ -29,7 +29,7 @@
.\"
.\" @(#)du.1 8.2 (Berkeley) 4/1/94
.\"
.Dd September 24, 2006
.Dd March 4, 2012
.Dt DU 1
.Os
.Sh NAME
@ -39,12 +39,12 @@
.Nm
.Op Fl H | Fl L | Fl P
.Op Fl a | Fl d Ar depth | Fl s
.Op Fl cghkmnrx
.Op Fl cghikmnrx
.Op Ar file ...
.Sh DESCRIPTION
The
.Nm
utility displays the file system block usage for each file argument
utility displays the file system usage for each file argument
and for each directory in the file hierarchy rooted in each directory
argument.
If no file is specified, the block usage of the hierarchy rooted in
@ -79,6 +79,9 @@ flag is specified, the numbers will be displayed in "human-readable"
format.
Use unit suffixes: B (Byte), K (Kilobyte), M (Megabyte), G (Gigabyte),
T (Terabyte) and P (Petabyte).
.It Fl i
Output inode usage instead of blocks.
All "human-readable" options are ignored.
.It Fl k
By default,
.Nm

View File

@ -1,4 +1,4 @@
/* $NetBSD: du.c,v 1.35 2011/09/01 13:37:33 joerg Exp $ */
/* $NetBSD: du.c,v 1.36 2012/03/11 11:23:20 shattered Exp $ */
/*
* Copyright (c) 1989, 1993, 1994
@ -42,7 +42,7 @@ __COPYRIGHT("@(#) Copyright (c) 1989, 1993, 1994\
#if 0
static char sccsid[] = "@(#)du.c 8.5 (Berkeley) 5/4/95";
#else
__RCSID("$NetBSD: du.c,v 1.35 2011/09/01 13:37:33 joerg Exp $");
__RCSID("$NetBSD: du.c,v 1.36 2012/03/11 11:23:20 shattered Exp $");
#endif
#endif /* not lint */
@ -54,6 +54,7 @@ __RCSID("$NetBSD: du.c,v 1.35 2011/09/01 13:37:33 joerg Exp $");
#include <err.h>
#include <errno.h>
#include <fts.h>
#include <inttypes.h>
#include <util.h>
#include <stdio.h>
#include <stdlib.h>
@ -61,11 +62,14 @@ __RCSID("$NetBSD: du.c,v 1.35 2011/09/01 13:37:33 joerg Exp $");
#include <unistd.h>
#include <limits.h>
/* Count inodes or file size */
#define COUNT (iflag ? 1 : p->fts_statp->st_blocks)
static int linkchk(dev_t, ino_t);
static void prstat(const char *, int64_t);
__dead static void usage(void);
static int hflag;
static int hflag, iflag;
static long blocksize;
int
@ -83,7 +87,7 @@ main(int argc, char *argv[])
totalblocks = 0;
ftsoptions = FTS_PHYSICAL;
depth = INT_MAX;
while ((ch = getopt(argc, argv, "HLPacd:ghkmnrsx")) != -1)
while ((ch = getopt(argc, argv, "HLPacd:ghikmnrsx")) != -1)
switch (ch) {
case 'H':
Hflag = 1;
@ -118,6 +122,9 @@ main(int argc, char *argv[])
case 'h':
hflag = 1;
break;
case 'i':
iflag = 1;
break;
case 'k':
blocksize = 1024;
gkmflag = 1;
@ -206,9 +213,9 @@ main(int argc, char *argv[])
break;
case FTS_DP:
p->fts_parent->fts_number +=
p->fts_number += p->fts_statp->st_blocks;
p->fts_number += COUNT;
if (cflag)
totalblocks += p->fts_statp->st_blocks;
totalblocks += COUNT;
/*
* If listing each directory, or not listing files
* or directories and this is post-order of the
@ -235,10 +242,10 @@ main(int argc, char *argv[])
* the root of a traversal, display the total.
*/
if (listfiles || !p->fts_level)
prstat(p->fts_path, p->fts_statp->st_blocks);
p->fts_parent->fts_number += p->fts_statp->st_blocks;
prstat(p->fts_path, COUNT);
p->fts_parent->fts_number += COUNT;
if (cflag)
totalblocks += p->fts_statp->st_blocks;
totalblocks += COUNT;
}
}
if (errno)
@ -251,6 +258,11 @@ main(int argc, char *argv[])
static void
prstat(const char *fname, int64_t blocks)
{
if (iflag) {
(void)printf("%" PRId64 "\t%s\n", blocks, fname);
return;
}
if (hflag) {
char buf[5];
int64_t sz = blocks * 512;
@ -260,8 +272,8 @@ prstat(const char *fname, int64_t blocks)
(void)printf("%s\t%s\n", buf, fname);
} else
(void)printf("%lld\t%s\n",
(long long)howmany(blocks, (int64_t)blocksize),
(void)printf("%" PRId64 "\t%s\n",
howmany(blocks, (int64_t)blocksize),
fname);
}
@ -345,6 +357,6 @@ usage(void)
{
(void)fprintf(stderr,
"usage: du [-H | -L | -P] [-a | -d depth | -s] [-cghkmnrx] [file ...]\n");
"usage: du [-H | -L | -P] [-a | -d depth | -s] [-cghikmnrx] [file ...]\n");
exit(1);
}