svn commit: r189831 - stable/7/usr.bin/du
Max Laier
mlaier at FreeBSD.org
Sat Mar 14 14:03:04 PDT 2009
Author: mlaier
Date: Sat Mar 14 21:03:03 2009
New Revision: 189831
URL: http://svn.freebsd.org/changeset/base/189831
Log:
MFC:
- r184733, r184742
Add -A and -B options
- r184654, r184656
style(9) changes
- r173387, r173431 (by kevlo)
Check return value for setenv()
In effect sync head and releng/7.
Modified:
stable/7/usr.bin/du/ (props changed)
stable/7/usr.bin/du/du.1
stable/7/usr.bin/du/du.c
Modified: stable/7/usr.bin/du/du.1
==============================================================================
--- stable/7/usr.bin/du/du.1 Sat Mar 14 20:40:06 2009 (r189830)
+++ stable/7/usr.bin/du/du.1 Sat Mar 14 21:03:03 2009 (r189831)
@@ -32,7 +32,7 @@
.\" @(#)du.1 8.2 (Berkeley) 4/1/94
.\" $FreeBSD$
.\"
-.Dd February 25, 2008
+.Dd November 6, 2008
.Dt DU 1
.Os
.Sh NAME
@@ -40,11 +40,12 @@
.Nd display disk usage statistics
.Sh SYNOPSIS
.Nm
+.Op Fl A
.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 h | k | m | B Ar blocksize
.Op Fl n
.Op Fl x
.Op Fl I Ar mask
@@ -60,6 +61,25 @@ the current directory is displayed.
.Pp
The options are as follows:
.Bl -tag -width indent
+.It Fl A
+Display the apparent size instead of the disk usage.
+This can be helpful when operating on compressed volumes or sparse files.
+.It Fl B Ar blocksize
+Calculate block counts in
+.Ar blocksize
+byte blocks.
+This is different from the
+.Fl k, m
+options or setting
+.Ev BLOCKSIZE
+and gives an estimate of how much space the examined file hierachy would
+require on a filesystem with the given
+.Ar blocksize .
+Unless in
+.Fl A
+mode,
+.Ar blocksize
+is rounded up to the next multiple of 512.
.It Fl H
Symbolic links on the command line are followed, symbolic links in file
hierarchies are not followed.
@@ -136,14 +156,19 @@ followed is not counted or displayed.
If the environment variable
.Ev BLOCKSIZE
is set, and the
-.Fl k
-option is not specified, the block counts will be displayed in units of that
-size block.
+.Fl k, m
+or
+.Fl h
+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 k
-option is not specified, the block counts will be displayed in 512-byte blocks.
+.Fl k, m
+or
+.Fl h
+options are not specified, the block counts will be displayed in 512-byte
+blocks.
.El
.Sh SEE ALSO
.Xr df 1 ,
Modified: stable/7/usr.bin/du/du.c
==============================================================================
--- stable/7/usr.bin/du/du.c Sat Mar 14 20:40:06 2009 (r189830)
+++ stable/7/usr.bin/du/du.c Sat Mar 14 21:03:03 2009 (r189831)
@@ -73,20 +73,21 @@ struct ignentry {
static int linkchk(FTSENT *);
static void usage(void);
-void prthumanval(int64_t);
-void ignoreadd(const char *);
-void ignoreclean(void);
-int ignorep(FTSENT *);
-
-int nodumpflag = 0;
+static void prthumanval(int64_t);
+static void ignoreadd(const char *);
+static void ignoreclean(void);
+static int ignorep(FTSENT *);
+
+static int nodumpflag = 0;
+static int Aflag;
+static long blocksize, cblocksize;
int
main(int argc, char *argv[])
{
FTS *fts;
FTSENT *p;
- off_t savednumber = 0;
- long blocksize;
+ off_t savednumber, curblocks;
int ftsoptions;
int listall;
int depth;
@@ -98,75 +99,91 @@ main(int argc, char *argv[])
setlocale(LC_ALL, "");
Hflag = Lflag = Pflag = aflag = sflag = dflag = cflag = hflag =
- lflag = 0;
+ lflag = Aflag = 0;
save = argv;
ftsoptions = 0;
+ savednumber = 0;
+ cblocksize = DEV_BSIZE;
+ blocksize = 0;
depth = INT_MAX;
SLIST_INIT(&ignores);
- while ((ch = getopt(argc, argv, "HI:LPasd:chklmnrx")) != -1)
+ while ((ch = getopt(argc, argv, "AB:HI:LPasd:chklmnrx")) != -1)
switch (ch) {
- case 'H':
- Hflag = 1;
- break;
- case 'I':
- ignoreadd(optarg);
- break;
- case 'L':
- if (Pflag)
- usage();
- Lflag = 1;
- break;
- case 'P':
- if (Lflag)
- usage();
- Pflag = 1;
- break;
- case 'a':
- aflag = 1;
- break;
- case 's':
- sflag = 1;
- break;
- case 'd':
- dflag = 1;
- errno = 0;
- depth = atoi(optarg);
- if (errno == ERANGE || depth < 0) {
- warnx("invalid argument to option d: %s", optarg);
- usage();
- }
- break;
- case 'c':
- cflag = 1;
- break;
- case 'h':
- setenv("BLOCKSIZE", "512", 1);
- hflag = 1;
- break;
- case 'k':
- hflag = 0;
- setenv("BLOCKSIZE", "1024", 1);
- break;
- case 'l':
- lflag = 1;
- break;
- case 'm':
- hflag = 0;
- setenv("BLOCKSIZE", "1048576", 1);
- break;
- case 'n':
- nodumpflag = 1;
- break;
- case 'r': /* Compatibility. */
- break;
- case 'x':
- ftsoptions |= FTS_XDEV;
- break;
- case '?':
- default:
+ case 'A':
+ Aflag = 1;
+ break;
+ case 'B':
+ errno = 0;
+ cblocksize = atoi(optarg);
+ if (errno == ERANGE || cblocksize <= 0) {
+ warnx("invalid argument to option B: %s",
+ optarg);
+ usage();
+ }
+ break;
+ case 'H':
+ Hflag = 1;
+ break;
+ case 'I':
+ ignoreadd(optarg);
+ break;
+ case 'L':
+ if (Pflag)
+ usage();
+ Lflag = 1;
+ break;
+ case 'P':
+ if (Lflag)
usage();
+ Pflag = 1;
+ break;
+ case 'a':
+ aflag = 1;
+ break;
+ case 's':
+ sflag = 1;
+ break;
+ case 'd':
+ dflag = 1;
+ errno = 0;
+ depth = atoi(optarg);
+ if (errno == ERANGE || depth < 0) {
+ warnx("invalid argument to option d: %s",
+ optarg);
+ usage();
+ }
+ break;
+ case 'c':
+ cflag = 1;
+ break;
+ case 'h':
+ hflag = 1;
+ break;
+ case 'k':
+ hflag = 0;
+ blocksize = 1024;
+ break;
+ case 'l':
+ lflag = 1;
+ break;
+ case 'm':
+ hflag = 0;
+ blocksize = 1048576;
+ break;
+ case 'n':
+ nodumpflag = 1;
+ break;
+ case 'r': /* Compatibility. */
+ break;
+ case 'x':
+ ftsoptions |= FTS_XDEV;
+ break;
+ case '?':
+ default:
+ usage();
+ /* NOTREACHED */
}
argc -= optind;
@@ -200,6 +217,9 @@ main(int argc, char *argv[])
if (Pflag)
ftsoptions |= FTS_PHYSICAL;
+ if (!Aflag && (cblocksize % DEV_BSIZE) != 0)
+ cblocksize = howmany(cblocksize, DEV_BSIZE) * DEV_BSIZE;
+
listall = 0;
if (aflag) {
@@ -218,8 +238,13 @@ main(int argc, char *argv[])
argv[1] = NULL;
}
- (void) getbsize(¬used, &blocksize);
- blocksize /= 512;
+ if (blocksize == 0)
+ (void)getbsize(¬used, &blocksize);
+
+ if (!Aflag) {
+ cblocksize /= DEV_BSIZE;
+ blocksize /= DEV_BSIZE;
+ }
rval = 0;
@@ -228,57 +253,65 @@ main(int argc, char *argv[])
while ((p = fts_read(fts)) != NULL) {
switch (p->fts_info) {
- case FTS_D: /* Ignore. */
- if (ignorep(p))
- fts_set(fts, p, FTS_SKIP);
- break;
- case FTS_DP:
- if (ignorep(p))
- break;
-
- p->fts_parent->fts_bignum +=
- p->fts_bignum += p->fts_statp->st_blocks;
-
- if (p->fts_level <= depth) {
- if (hflag) {
- (void) prthumanval(howmany(p->fts_bignum, blocksize));
- (void) printf("\t%s\n", p->fts_path);
- } else {
- (void) printf("%jd\t%s\n",
- (intmax_t)howmany(p->fts_bignum, blocksize),
+ case FTS_D: /* Ignore. */
+ if (ignorep(p))
+ fts_set(fts, p, FTS_SKIP);
+ break;
+ case FTS_DP:
+ if (ignorep(p))
+ break;
+
+ curblocks = Aflag ?
+ howmany(p->fts_statp->st_size, cblocksize) :
+ howmany(p->fts_statp->st_blocks, cblocksize);
+ p->fts_parent->fts_bignum += p->fts_bignum +=
+ curblocks;
+
+ if (p->fts_level <= depth) {
+ if (hflag) {
+ prthumanval(p->fts_bignum);
+ (void)printf("\t%s\n", p->fts_path);
+ } else {
+ (void)printf("%jd\t%s\n",
+ (intmax_t)howmany(p->fts_bignum *
+ cblocksize, blocksize),
p->fts_path);
- }
}
- break;
- case FTS_DC: /* Ignore. */
- break;
- case FTS_DNR: /* Warn, continue. */
- case FTS_ERR:
- case FTS_NS:
- warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
- rval = 1;
- break;
- default:
- if (ignorep(p))
- break;
-
- if (lflag == 0 &&
- p->fts_statp->st_nlink > 1 && linkchk(p))
- break;
-
- if (listall || p->fts_level == 0) {
- if (hflag) {
- (void) prthumanval(howmany(p->fts_statp->st_blocks,
- blocksize));
- (void) printf("\t%s\n", p->fts_path);
- } else {
- (void) printf("%jd\t%s\n",
- (intmax_t)howmany(p->fts_statp->st_blocks, blocksize),
- p->fts_path);
- }
+ }
+ break;
+ case FTS_DC: /* Ignore. */
+ break;
+ case FTS_DNR: /* Warn, continue. */
+ case FTS_ERR:
+ case FTS_NS:
+ warnx("%s: %s", p->fts_path, strerror(p->fts_errno));
+ rval = 1;
+ break;
+ default:
+ if (ignorep(p))
+ break;
+
+ if (lflag == 0 && p->fts_statp->st_nlink > 1 &&
+ linkchk(p))
+ break;
+
+ curblocks = Aflag ?
+ howmany(p->fts_statp->st_size, cblocksize) :
+ howmany(p->fts_statp->st_blocks, cblocksize);
+
+ if (listall || p->fts_level == 0) {
+ if (hflag) {
+ prthumanval(curblocks);
+ (void)printf("\t%s\n", p->fts_path);
+ } else {
+ (void)printf("%jd\t%s\n",
+ (intmax_t)howmany(curblocks *
+ cblocksize, blocksize),
+ p->fts_path);
}
+ }
- p->fts_parent->fts_bignum += p->fts_statp->st_blocks;
+ p->fts_parent->fts_bignum += curblocks;
}
savednumber = p->fts_parent->fts_bignum;
}
@@ -288,10 +321,11 @@ main(int argc, char *argv[])
if (cflag) {
if (hflag) {
- (void) prthumanval(howmany(savednumber, blocksize));
- (void) printf("\ttotal\n");
+ prthumanval(savednumber);
+ (void)printf("\ttotal\n");
} else {
- (void) printf("%jd\ttotal\n", (intmax_t)howmany(savednumber, blocksize));
+ (void)printf("%jd\ttotal\n", (intmax_t)howmany(
+ savednumber * cblocksize, blocksize));
}
}
@@ -344,7 +378,8 @@ linkchk(FTSENT *p)
free_list = le->next;
free(le);
}
- new_buckets = malloc(new_size * sizeof(new_buckets[0]));
+ new_buckets = malloc(new_size *
+ sizeof(new_buckets[0]));
}
if (new_buckets == NULL) {
@@ -432,12 +467,14 @@ linkchk(FTSENT *p)
return (0);
}
-void
+static void
prthumanval(int64_t bytes)
{
char buf[5];
- bytes *= DEV_BSIZE;
+ bytes *= cblocksize;
+ if (!Aflag)
+ bytes *= DEV_BSIZE;
humanize_number(buf, sizeof(buf), bytes, "", HN_AUTOSCALE,
HN_B | HN_NOSPACE | HN_DECIMAL);
@@ -449,12 +486,13 @@ static void
usage(void)
{
(void)fprintf(stderr,
- "usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] "
- "[-l] [-h | -k | -m] [-n] [-x] [-I mask] [file ...]\n");
+ "usage: du [-A] [-H | -L | -P] [-a | -s | -d depth] [-c] "
+ "[-l] [-h | -k | -m | -B bsize] [-n] [-x] [-I mask] "
+ "[file ...]\n");
exit(EX_USAGE);
}
-void
+static void
ignoreadd(const char *mask)
{
struct ignentry *ign;
@@ -468,7 +506,7 @@ ignoreadd(const char *mask)
SLIST_INSERT_HEAD(&ignores, ign, next);
}
-void
+static void
ignoreclean(void)
{
struct ignentry *ign;
@@ -481,7 +519,7 @@ ignoreclean(void)
}
}
-int
+static int
ignorep(FTSENT *ent)
{
struct ignentry *ign;
More information about the svn-src-stable-7
mailing list