>Number:         144192
>Category:       bin
>Synopsis:       [patch] support for thresholds in du(1)
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Mon Feb 22 01:30:02 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Gleb Kurtsou
>Release:        
>Organization:
>Environment:
FreeBSD tops 9.0-CURRENT FreeBSD 9.0-CURRENT #17 r203556+e02bf32: Mon Feb 22 
03:04:35 EET 2010     r...@tops:/usr/obj/freebsd-src/local/sys/TOPS  amd64
>Description:
Patch has already been discussed on freebsd-hackers@:
http://lists.freebsd.org/pipermail/freebsd-hackers/2010-February/030581.html

Submitting PR so it doesn't get lost. Attached version is a bit different from 
original patch, I've change variable types to int64_t as suggested by Xin Li.

>How-To-Repeat:

>Fix:


Patch attached with submission follows:

diff --git a/usr.bin/du/du.1 b/usr.bin/du/du.1
index af2ff84..b0e1748 100644
--- a/usr.bin/du/du.1
+++ b/usr.bin/du/du.1
@@ -42,7 +42,7 @@
 .Nm
 .Op Fl A
 .Op Fl H | L | P
-.Op Fl a | s | d Ar depth
+.Op Fl a | s | d Ar depth | t Ar threshold
 .Op Fl c
 .Op Fl l
 .Op Fl h | k | m | B Ar blocksize
@@ -107,6 +107,14 @@ This option exists solely for conformance with
 Display an entry for each specified file.
 (Equivalent to
 .Fl d Li 0 )
+.It Fl t Ar threshold
+Display only entries for which size exceeds
+.Ar threshold .
+If
+.Ar threshold
+is negative, display only entries for which size is less then absolute
+value of
+.Ar threshold .
 .It Fl d Ar depth
 Display an entry for all files and directories
 .Ar depth
diff --git a/usr.bin/du/du.c b/usr.bin/du/du.c
index 63677f5..761a1ab 100644
--- a/usr.bin/du/du.c
+++ b/usr.bin/du/du.c
@@ -90,6 +90,7 @@ main(int argc, char *argv[])
        FTS             *fts;
        FTSENT          *p;
        off_t           savednumber, curblocks;
+       off_t           threshold, threshold_sign;
        int             ftsoptions;
        int             listall;
        int             depth;
@@ -106,12 +107,14 @@ main(int argc, char *argv[])
        save = argv;
        ftsoptions = 0;
        savednumber = 0;
+       threshold = 0;
+       threshold_sign = 1;
        cblocksize = DEV_BSIZE;
        blocksize = 0;
        depth = INT_MAX;
        SLIST_INIT(&ignores);
 
-       while ((ch = getopt(argc, argv, "AB:HI:LPasd:chklmnrx")) != -1)
+       while ((ch = getopt(argc, argv, "AB:HI:LPasd:chklmnrt:x")) != -1)
                switch (ch) {
                case 'A':
                        Aflag = 1;
@@ -179,6 +182,14 @@ main(int argc, char *argv[])
                        break;
                case 'r':                /* Compatibility. */
                        break;
+               case 't' :
+                       if (expand_number(optarg, &threshold) != 0 ||
+                           threshold == 0) {
+                               warnx("invalid threshold: %s", optarg);
+                               usage();
+                       } else if (threshold < 0)
+                               threshold_sign = -1;
+                       break;
                case 'x':
                        ftsoptions |= FTS_XDEV;
                        break;
@@ -248,6 +259,10 @@ main(int argc, char *argv[])
                blocksize /= DEV_BSIZE;
        }
 
+       if (threshold != 0)
+               threshold = howmany(threshold / DEV_BSIZE * cblocksize,
+                   blocksize);
+
        rval = 0;
 
        (void)signal(SIGINFO, siginfo);
@@ -271,7 +286,9 @@ main(int argc, char *argv[])
                        p->fts_parent->fts_bignum += p->fts_bignum +=
                            curblocks;
 
-                       if (p->fts_level <= depth) {
+                       if (p->fts_level <= depth && threshold <=
+                           threshold_sign * howmany(p->fts_bignum *
+                           cblocksize, blocksize)) {
                                if (hflag) {
                                        prthumanval(p->fts_bignum);
                                        (void)printf("\t%s\n", p->fts_path);


>Release-Note:
>Audit-Trail:
>Unformatted:
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "[email protected]"

Reply via email to