From owner-svn-src-all@FreeBSD.ORG Wed Jul 25 21:59:11 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 936E7106564A; Wed, 25 Jul 2012 21:59:11 +0000 (UTC) (envelope-from jilles@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 734998FC0A; Wed, 25 Jul 2012 21:59:11 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q6PLxBff004259; Wed, 25 Jul 2012 21:59:11 GMT (envelope-from jilles@svn.freebsd.org) Received: (from jilles@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q6PLxB5o004252; Wed, 25 Jul 2012 21:59:11 GMT (envelope-from jilles@svn.freebsd.org) Message-Id: <201207252159.q6PLxB5o004252@svn.freebsd.org> From: Jilles Tjoelker Date: Wed, 25 Jul 2012 21:59:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r238780 - head/usr.bin/find X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Jul 2012 21:59:11 -0000 Author: jilles Date: Wed Jul 25 21:59:10 2012 New Revision: 238780 URL: http://svn.freebsd.org/changeset/base/238780 Log: find: Implement real -ignore_readdir_race. If -ignore_readdir_race is present, [ENOENT] errors caused by deleting a file after find has read its name from a directory are ignored. Formerly, -ignore_readdir_race did nothing. PR: bin/169723 Submitted by: Valery Khromov and Andrey Ignatov Modified: head/usr.bin/find/extern.h head/usr.bin/find/find.1 head/usr.bin/find/find.c head/usr.bin/find/function.c head/usr.bin/find/main.c head/usr.bin/find/option.c Modified: head/usr.bin/find/extern.h ============================================================================== --- head/usr.bin/find/extern.h Wed Jul 25 21:32:55 2012 (r238779) +++ head/usr.bin/find/extern.h Wed Jul 25 21:59:10 2012 (r238780) @@ -58,6 +58,7 @@ creat_f c_flags; creat_f c_follow; creat_f c_fstype; creat_f c_group; +creat_f c_ignore_readdir_race; creat_f c_inum; creat_f c_links; creat_f c_ls; @@ -111,7 +112,8 @@ exec_f f_size; exec_f f_type; exec_f f_user; -extern int ftsoptions, isdeprecated, isdepth, isoutput, issort, isxargs; +extern int ftsoptions, ignore_readdir_race, isdeprecated, isdepth, isoutput; +extern int issort, isxargs; extern int mindepth, maxdepth; extern int regexp_flags; extern time_t now; Modified: head/usr.bin/find/find.1 ============================================================================== --- head/usr.bin/find/find.1 Wed Jul 25 21:32:55 2012 (r238779) +++ head/usr.bin/find/find.1 Wed Jul 25 21:59:10 2012 (r238780) @@ -31,7 +31,7 @@ .\" @(#)find.1 8.7 (Berkeley) 5/9/95 .\" $FreeBSD$ .\" -.Dd June 13, 2012 +.Dd July 25, 2012 .Dt FIND 1 .Os .Sh NAME @@ -470,7 +470,9 @@ is numeric and there is no such group na .Ar gname is treated as a group ID. .It Ic -ignore_readdir_race -This option is for GNU find compatibility and is ignored. +Ignore errors because a file or a directory is deleted +after reading the name from a directory. +This option does not affect errors occurring on starting points. .It Ic -ilname Ar pattern Like .Ic -lname , @@ -618,7 +620,9 @@ is equivalent to .It Ic -nogroup True if the file belongs to an unknown group. .It Ic -noignore_readdir_race -This option is for GNU find compatibility and is ignored. +Turn off the effect of +.Ic -ignore_readdir_race . +This is default behaviour. .It Ic -noleaf This option is for GNU find compatibility. In GNU find it disables an optimization not relevant to Modified: head/usr.bin/find/find.c ============================================================================== --- head/usr.bin/find/find.c Wed Jul 25 21:32:55 2012 (r238779) +++ head/usr.bin/find/find.c Wed Jul 25 21:59:10 2012 (r238780) @@ -197,8 +197,12 @@ find_execute(PLAN *plan, char *paths[]) continue; break; case FTS_DNR: - case FTS_ERR: case FTS_NS: + if (ignore_readdir_race && + entry->fts_errno == ENOENT && entry->fts_level > 0) + continue; + /* FALLTHROUGH */ + case FTS_ERR: (void)fflush(stdout); warnx("%s: %s", entry->fts_path, strerror(entry->fts_errno)); @@ -228,7 +232,7 @@ find_execute(PLAN *plan, char *paths[]) for (p = plan; p && (p->execute)(p, entry); p = p->next); } finish_execplus(); - if (errno) + if (errno && (!ignore_readdir_race || errno != ENOENT)) err(1, "fts_read"); return (rval); } Modified: head/usr.bin/find/function.c ============================================================================== --- head/usr.bin/find/function.c Wed Jul 25 21:32:55 2012 (r238779) +++ head/usr.bin/find/function.c Wed Jul 25 21:59:10 2012 (r238780) @@ -975,6 +975,25 @@ c_group(OPTION *option, char ***argvp) } /* + * -ignore_readdir_race functions -- + * + * Always true. Ignore errors which occur if a file or a directory + * in a starting point gets deleted between reading the name and calling + * stat on it while find is traversing the starting point. + */ + +PLAN * +c_ignore_readdir_race(OPTION *option, char ***argvp __unused) +{ + if (strcmp(option->name, "-ignore_readdir_race") == 0) + ignore_readdir_race = 1; + else + ignore_readdir_race = 0; + + return palloc(option); +} + +/* * -inum n functions -- * * True if the file has inode # n. Modified: head/usr.bin/find/main.c ============================================================================== --- head/usr.bin/find/main.c Wed Jul 25 21:32:55 2012 (r238779) +++ head/usr.bin/find/main.c Wed Jul 25 21:59:10 2012 (r238780) @@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$"); time_t now; /* time find was run */ int dotfd; /* starting directory */ int ftsoptions; /* options for the ftsopen(3) call */ +int ignore_readdir_race = 0; /* ignore readdir race */ int isdeprecated; /* using deprecated syntax */ int isdepth; /* do directories on post-order visit */ int isoutput; /* user specified output operator */ Modified: head/usr.bin/find/option.c ============================================================================== --- head/usr.bin/find/option.c Wed Jul 25 21:32:55 2012 (r238779) +++ head/usr.bin/find/option.c Wed Jul 25 21:59:10 2012 (r238780) @@ -88,7 +88,7 @@ static OPTION const options[] = { { "-fstype", c_fstype, f_fstype, 0 }, { "-gid", c_group, f_group, 0 }, { "-group", c_group, f_group, 0 }, - { "-ignore_readdir_race",c_simple, f_always_true,0 }, + { "-ignore_readdir_race",c_ignore_readdir_race, f_always_true,0 }, { "-ilname", c_name, f_name, F_LINK | F_IGNCASE }, { "-iname", c_name, f_name, F_IGNCASE }, { "-inum", c_inum, f_inum, 0 }, @@ -127,7 +127,7 @@ static OPTION const options[] = { { "-newermm", c_newer, f_newer, 0 }, { "-newermt", c_newer, f_newer, F_TIME2_T }, { "-nogroup", c_nogroup, f_nogroup, 0 }, - { "-noignore_readdir_race",c_simple, f_always_true,0 }, + { "-noignore_readdir_race",c_ignore_readdir_race, f_always_true,0 }, { "-noleaf", c_simple, f_always_true, 0 }, { "-not", c_simple, f_not, 0 }, { "-nouser", c_nouser, f_nouser, 0 },