Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Jun 2008 13:19:42 GMT
From:      Gabor Kovesdan <gabor@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 144094 for review
Message-ID:  <200806251319.m5PDJgv1099579@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=144094

Change 144094 by gabor@gabor_server on 2008/06/25 13:18:43

	- Show a warning on recursive directories
	- Better check for -d and -D behaviour
	
	Obtained from:	NetBSD Project

Affected files ...

.. //depot/projects/soc2008/gabor_textproc/grep/grep.c#49 edit
.. //depot/projects/soc2008/gabor_textproc/grep/util.c#41 edit

Differences ...

==== //depot/projects/soc2008/gabor_textproc/grep/grep.c#49 (text+ko) ====

@@ -343,7 +343,6 @@
 {
 	int		 c, lastc, prevoptind, newarg, i;
 	char		*ep;
-	struct stat	*finfo = 0;
 	unsigned long long l;
 
 	setlocale(LC_ALL, "");
@@ -611,22 +610,7 @@
 	if (dirbehave == DIR_RECURSE)
 		c = grep_tree(argv);
 	else
-		for (c = 0; argc--; ++argv) {
-			if (devbehave == DEV_SKIP) {
-				finfo = grep_malloc(sizeof(struct stat));
-				if (stat(*argv, finfo) == -1)
-					err(2, NULL);
-				if (S_ISBLK(finfo->st_mode) ||
-				    S_ISCHR(finfo->st_mode) ||
-				    S_ISFIFO(finfo->st_mode) ||
-				    S_ISSOCK(finfo->st_mode)) {
-					free(finfo);
-					continue;
-				} else
-					free(finfo);
-			}
-			c+= procfile(*argv);
-		}
+		c+= procfile(*argv);
 
 #ifndef WITHOUT_NLS
 	catclose(catalog);

==== //depot/projects/soc2008/gabor_textproc/grep/util.c#41 (text+ko) ====

@@ -85,28 +85,13 @@
 			errx(2, "%s: %s", p->fts_path, strerror(p->fts_errno));
 			break;
 		case FTS_DP:
+		case FTS_D:
+			break;
+		case FTS_DC:
+			warnx("warning: %s: recursive directory loop",
+				p->fts_path);
 			break;
 		default:
-			if ((devbehave == DEV_SKIP) || (dirbehave == DIR_RECURSE) || (dirbehave == DIR_SKIP)) {
-				struct stat	*finfo;
-
-				finfo = grep_malloc(sizeof(struct stat));
-				if (stat(p->fts_path, finfo) == -1)
-					err(2, NULL);
-
-				if ((devbehave == DEV_SKIP) && (S_ISBLK(finfo->st_mode) ||
-				    S_ISCHR(finfo->st_mode) ||
-				    S_ISFIFO(finfo->st_mode) ||
-				    S_ISSOCK(finfo->st_mode))) {
-					free(finfo);
-					break;
-				}
-				if (((dirbehave == DIR_RECURSE) || (dirbehave == DIR_SKIP)) && S_ISDIR(finfo->st_mode)) {
-					free(finfo);
-					break;
-				}
-				free(finfo);
-			}
 			c += procfile(p->fts_path);
 			break;
 		}
@@ -122,6 +107,8 @@
 {
 	struct str	 ln;
 	struct file	*f;
+	struct stat	 sb;
+	mode_t		 s;
 	int		 c, t, nottext;
 
 	if (mflag && (mcount <= 0))
@@ -134,6 +121,16 @@
 			fn = getstr(1);
 		f = grep_stdin_open();
 	} else {
+		if (stat(fn, &sb))
+			err(2, NULL);
+		else {
+			s = sb.st_mode & S_IFMT;
+			if (s == S_IFDIR && dirbehave == DIR_SKIP)
+				return (0);
+			if ((s == S_IFIFO || s == S_IFCHR || s == S_IFBLK
+				|| s == S_IFSOCK) && devbehave == DEV_SKIP)
+					return (0);
+		}
 		f = grep_open(fn);
 	}
 	if (f == NULL) {



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