Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 28 Apr 2001 19:42:59 +0300
From:      Peter Pentchev <roam@orbitel.bg>
To:        audit@FreeBSD.org
Subject:   du(1) -I option to ignore files/dirs
Message-ID:  <20010428194259.J415@ringworld.oblivion.bg>

next in thread | raw e-mail | index | archive | help
Hi,

And just when -arch thought they'd gotten rid of me and my du(1) patches.. ;)

Well, since no one had any real objections to adding the -I flag, other than
'no one else is doing that' (so why can't we?), and as several people agreed
that there was no easy (or moderately hard) way to do this with other utils,
here's an updated patch that properly uses slist's instead of the constant-
sized arrays in the previous version.

G'luck,
Peter

-- 
I am jealous of the first word in this sentence.

Index: src/usr.bin/du/du.1
===================================================================
RCS file: /home/ncvs/src/usr.bin/du/du.1,v
retrieving revision 1.18
diff -u -r1.18 du.1
--- src/usr.bin/du/du.1	2000/11/20 19:20:41	1.18
+++ src/usr.bin/du/du.1	2001/04/28 16:42:25
@@ -41,6 +41,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Fl P | Fl H | Fl L
+.Op Fl I Ar mask
 .Op Fl a | s | d Ar depth
 .Op Fl c
 .Op Fl h | k
@@ -72,6 +73,9 @@
 hierarchies are not followed.
 .It Fl L
 Symbolic links on the command line and in file hierarchies are followed.
+.It Fl I Ar mask
+Ignore files and directories matching the specified
+.Ar mask .
 .It Fl a
 Display an entry for each file in a file hierarchy.
 .It Fl h
Index: src/usr.bin/du/du.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/du/du.c,v
retrieving revision 1.19
diff -u -r1.19 du.c
--- src/usr.bin/du/du.c	2000/03/26 14:21:57	1.19
+++ src/usr.bin/du/du.c	2001/04/28 16:42:26
@@ -50,10 +50,12 @@
 
 
 #include <sys/param.h>
+#include <sys/queue.h>
 #include <sys/stat.h>
 
 #include <err.h>
 #include <errno.h>
+#include <fnmatch.h>
 #include <fts.h>
 #include <math.h>
 #include <stdio.h>
@@ -88,10 +90,19 @@
 
 int unitp [] = { NONE, KILO, MEGA, GIGA, TERA, PETA };
 
+SLIST_HEAD(ignhead, ignentry) ignores;
+struct ignentry {
+	char			*mask;
+	SLIST_ENTRY(ignentry)	next;
+};
+
 int		linkchk __P((FTSENT *));
 static void	usage __P((void));
 void		prthumanval __P((double));
 unit_t		unit_adjust __P((double *));
+void		ignoreadd __P((const char *));
+void		ignoreclean __P((void));
+int		ignorep __P((FTSENT *));
 
 int
 main(argc, argv)
@@ -112,12 +123,16 @@
 	save = argv;
 	ftsoptions = 0;
 	depth = INT_MAX;
+	SLIST_INIT(&ignores);
 	
-	while ((ch = getopt(argc, argv, "HLPasd:chkrx")) != -1)
+	while ((ch = getopt(argc, argv, "HI:LPasd:chkrx")) != -1)
 		switch (ch) {
 			case 'H':
 				Hflag = 1;
 				break;
+			case 'I':
+				ignoreadd(optarg);
+				break;
 			case 'L':
 				if (Pflag)
 					usage();
@@ -224,8 +239,13 @@
 	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_number +=
 				    p->fts_number += p->fts_statp->st_blocks;
 				
@@ -249,6 +269,9 @@
 				rval = 1;
 				break;
 			default:
+				if (ignorep(p))
+					break;
+
 				if (p->fts_statp->st_nlink > 1 && linkchk(p))
 					break;
 				
@@ -281,6 +304,7 @@
 		}
 	}
 
+	ignoreclean();
 	exit(rval);
 }
 
@@ -366,6 +390,48 @@
 usage()
 {
 	(void)fprintf(stderr,
-		"usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] [-h | -k] [-x] [file ...]\n");
+		"usage: du [-H | -L | -P] [-a | -s | -d depth] [-c] [-h | -k] [-x] [-I mask] [file ...]\n");
 	exit(EX_USAGE);
+}
+
+void
+ignoreadd(mask)
+	const char *mask;
+{
+	struct ignentry *ign;
+
+	ign = calloc(1, sizeof(*ign));
+	if (ign == NULL)
+		errx(1, "cannot allocate memory");
+	ign->mask = strdup(mask);
+	if (ign->mask == NULL)
+		errx(1, "cannot allocate memory");
+	SLIST_INSERT_HEAD(&ignores, ign, next);
+}
+
+void
+ignoreclean()
+{
+	struct ignentry *ign;
+	
+	while (!SLIST_EMPTY(&ignores)) {
+		ign = SLIST_FIRST(&ignores);
+		SLIST_REMOVE_HEAD(&ignores, next);
+		free(ign->mask);
+		free(ign);
+	}
+}
+
+int
+ignorep(ent)
+	FTSENT *ent;
+{
+	struct ignentry *ign;
+
+	if (SLIST_EMPTY(&ignores))
+		return 0;
+	SLIST_FOREACH(ign, &ignores, next)
+		if (fnmatch(ign->mask, ent->fts_name, 0) != FNM_NOMATCH)
+			return 1;
+	return 0;
 }

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010428194259.J415>