find(1): Sync with FreeBSD.
authorSascha Wildner <saw@online.de>
Sat, 16 Jun 2012 21:20:13 +0000 (23:20 +0200)
committerSascha Wildner <saw@online.de>
Sat, 16 Jun 2012 21:20:13 +0000 (23:20 +0200)
The only things left out were inode creation time related, ACL related
and locale specific affirmation for -ok.

New primaries: -d, -gid, -ignore_readdir_race, -ilname -iwholename, lname,
-mount, -noignore_readdir_race, -noleaf, -quit, -samefile, -true, -uid and
-wholename.

Some of the new primaries are aliases of existing ones, and some others
exist just for GNU find compatibility and have no function.

For further information refer to the manual page.

usr.bin/find/Makefile
usr.bin/find/extern.h
usr.bin/find/find.1
usr.bin/find/find.c
usr.bin/find/find.h
usr.bin/find/function.c
usr.bin/find/getdate.y
usr.bin/find/ls.c
usr.bin/find/main.c
usr.bin/find/operator.c
usr.bin/find/option.c

index b07cd87..0990787 100644 (file)
@@ -1,11 +1,9 @@
 #      @(#)Makefile    8.1 (Berkeley) 6/6/93
-# $FreeBSD: src/usr.bin/find/Makefile,v 1.17 2002/04/15 19:27:41 obrien Exp $
-# $DragonFly: src/usr.bin/find/Makefile,v 1.6 2008/11/03 00:25:45 pavalos Exp $
+# $FreeBSD: src/usr.bin/find/Makefile,v 1.20 2010/02/10 07:15:21 ed Exp $
 
 PROG=  find
 SRCS=  find.c function.c ls.c main.c misc.c operator.c option.c \
        getdate.y
-CFLAGS+=-DHAVE_SYS_TIMEB_H -I${.CURDIR}
 YFLAGS=
 
 .include <bsd.prog.mk>
index b59a021..5953c30 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -31,8 +27,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)extern.h    8.3 (Berkeley) 4/16/94
- *     $FreeBSD: src/usr.bin/find/extern.h,v 1.22 2004/07/29 03:29:44 tjr Exp $
- *     $DragonFly: src/usr.bin/find/extern.h,v 1.4 2005/02/13 23:49:53 cpressey Exp $
+ *     $FreeBSD: src/usr.bin/find/extern.h,v 1.26 2010/12/11 08:32:16 joel Exp $
  */
 
 #include <sys/cdefs.h>
@@ -44,12 +39,12 @@ PLAN        *find_formplan(char **);
 PLAN   *not_squish(PLAN *);
 PLAN   *or_squish(PLAN *);
 PLAN   *paren_squish(PLAN *);
-struct timeb;
-time_t  get_date(char *, struct timeb *);
+time_t  get_date(char *);
 struct stat;
 void    printlong(char *, char *, struct stat *);
 int     queryuser(char **);
 OPTION *lookup_option(const char *);
+void    finish_execplus(void);
 
 creat_f        c_Xmin;
 creat_f        c_Xtime;
@@ -73,6 +68,7 @@ creat_f       c_nouser;
 creat_f        c_perm;
 creat_f        c_print;
 creat_f        c_regex;
+creat_f        c_samefile;
 creat_f        c_simple;
 creat_f        c_size;
 creat_f        c_type;
@@ -88,6 +84,7 @@ exec_f        f_depth;
 exec_f f_empty;
 exec_f f_exec;
 exec_f f_expr;
+exec_f f_false;
 exec_f f_flags;
 exec_f f_fstype;
 exec_f f_group;
@@ -106,6 +103,7 @@ exec_f      f_perm;
 exec_f f_print;
 exec_f f_print0;
 exec_f f_prune;
+exec_f f_quit;
 exec_f f_regex;
 exec_f f_size;
 exec_f f_type;
index 2e473d6..5d64867 100644 (file)
 .\" 2. Redistributions in binary form must reproduce the above copyright
 .\"    notice, this list of conditions and the following disclaimer in the
 .\"    documentation and/or other materials provided with the distribution.
-.\" 3. All advertising materials mentioning features or use of this software
-.\"    must display the following acknowledgement:
-.\"    This product includes software developed by the University of
-.\"    California, Berkeley and its contributors.
 .\" 4. Neither the name of the University nor the names of its contributors
 .\"    may be used to endorse or promote products derived from this software
 .\"    without specific prior written permission.
 .\" SUCH DAMAGE.
 .\"
 .\"    @(#)find.1      8.7 (Berkeley) 5/9/95
-.\" $FreeBSD: src/usr.bin/find/find.1,v 1.71 2005/01/11 10:32:51 ru Exp $
-.\" $DragonFly: src/usr.bin/find/find.1,v 1.4 2007/04/20 08:04:20 swildner Exp $
+.\" $FreeBSD: src/usr.bin/find/find.1,v 1.97 2012/06/13 21:53:40 jilles Exp $
 .\"
-.Dd May 3, 2001
+.Dd June 16, 2012
 .Dt FIND 1
 .Os
 .Sh NAME
 .Nm
 .Op Fl H | Fl L | Fl P
 .Op Fl EXdsx
-.Op Fl f Ar pathname
-.Op Ar pathname ...
-.Ar expression
+.Op Fl f Ar path
+.Ar path ...
+.Op Ar expression
+.Nm
+.Op Fl H | Fl L | Fl P
+.Op Fl EXdsx
+.Fl f Ar path
+.Op Ar path ...
+.Op Ar expression
 .Sh DESCRIPTION
 The
 .Nm
 utility recursively descends the directory tree for each
-.Ar pathname
+.Ar path
 listed, evaluating an
 .Ar expression
 (composed of the
@@ -70,7 +71,7 @@ Interpret regular expressions followed by
 .Ic -regex
 and
 .Ic -iregex
-options as extended (modern) regular expressions rather than basic
+primaries as extended (modern) regular expressions rather than basic
 regular expressions (BRE's).
 The
 .Xr re_format 7
@@ -125,34 +126,15 @@ as an effective alternative.
 .It Fl d
 Cause
 .Nm
-to perform a depth-first traversal, i.e., directories
-are visited in post-order and all entries in a directory will be acted
-on before the directory itself.
-By default,
-.Nm
-visits directories in pre-order, i.e., before their contents.
-Note, the default is
-.Em not
-a breadth-first traversal.
+to perform a depth-first traversal.
 .Pp
-This option is equivalent to the
+This option is a BSD-specific equivalent of the
 .Ic -depth
-primary of
+primary specified by
 .St -p1003.1-2001 .
-.Fl d
-can be useful when
-.Nm
-is used with
-.Xr cpio 1
-to process files that are contained in directories with unusual permissions.
-It ensures that you have write permission while you are placing files in a
-directory, then sets the directory's permissions as the last thing.
-.It Fl f
-Specify a file hierarchy for
-.Nm
-to traverse.
-File hierarchies may also be specified as the operands immediately
-following the options.
+Refer to its description under
+.Sx PRIMARIES
+for more information.
 .It Fl s
 Cause
 .Nm
@@ -174,6 +156,17 @@ This option is equivalent to the deprecated
 primary.
 .El
 .Sh PRIMARIES
+All primaries which take a numeric argument allow the number to be
+preceded by a plus sign
+.Pq Dq Li +
+or a minus sign
+.Pq Dq Li - .
+A preceding plus sign means
+.Dq more than n ,
+a preceding minus sign means
+.Dq less than n
+and neither means
+.Dq exactly n .
 .Bl -tag -width indent
 .It Ic -amin Ar n
 True if the difference between the file last access time and the time
@@ -251,6 +244,12 @@ units.
 Please refer to the
 .Ic -atime
 primary description for information on supported time units.
+.It Ic -d
+Non-portable, BSD-specific version of
+.Ic depth .
+GNU find implements this as a primary in mistaken emulation of
+.Fx
+.Xr find 1 .
 .It Ic -delete
 Delete found files and/or directories.
 Always returns true.
@@ -264,11 +263,37 @@ character in its pathname relative to
 .Dq Pa \&.
 for security reasons.
 Depth-first traversal processing is implied by this option.
+The
+.Ic -delete
+primary will fail to delete a directory if it is not empty.
+Following symlinks is incompatible with this option.
 .It Ic -depth
 Always true;
-same as the
+same as the non-portable
 .Fl d
 option.
+Cause
+.Nm
+to perform a depth-first traversal, i.e., directories
+are visited in post-order and all entries in a directory will be acted
+on before the directory itself.
+By default,
+.Nm
+visits directories in pre-order, i.e., before their contents.
+Note, the default is
+.Em not
+a breadth-first traversal.
+.Pp
+The
+.Ic -depth
+primary
+can be useful when
+.Nm
+is used with
+.Xr cpio 1
+to process files that are contained in directories with unusual permissions.
+It ensures that you have write permission while you are placing files in a
+directory, then sets the directory's permissions as the last thing.
 .It Ic -depth Ar n
 True if the depth of the file relative to the starting point of the traversal
 is
@@ -323,6 +348,15 @@ The filename substituted for
 the string
 .Dq Li {}
 is not qualified.
+.It Ic -execdir Ar utility Oo Ar argument ... Oc Li {} +
+Same as
+.Ic -execdir ,
+except that
+.Dq Li {}
+is replaced with as many pathnames as possible for each invocation of
+.Ar utility .
+This behaviour is similar to that of
+.Xr xargs 1 .
 .It Ic -flags Oo Cm - Ns | Ns Cm + Oc Ns Ar flags , Ns Ar notflags
 The flags are specified using symbolic names (see
 .Xr chflags 1 ) .
@@ -371,12 +405,9 @@ bits match those of
 True if the file is contained in a file system of type
 .Ar type .
 The
-.Xr sysctl 8
+.Xr lsvfs 1
 command can be used to find out the types of file systems
-that are available on the system:
-.Pp
-.Dl "sysctl vfs"
-.Pp
+that are available on the system.
 In addition, there are two pseudo-types,
 .Dq Li local
 and
@@ -386,6 +417,15 @@ the
 .Nm
 is being executed and the latter matches any file system which is
 mounted read-only.
+.It Ic -gid Ar gname
+The same thing as
+.Ar -group Ar gname
+for compatibility with GNU find.
+GNU find imposes a restriction that
+.Ar gname
+is numeric, while
+.Xr find 1
+does not.
 .It Ic -group Ar gname
 True if the file belongs to the group
 .Ar gname .
@@ -394,6 +434,13 @@ If
 is numeric and there is no such group name, then
 .Ar gname
 is treated as a group ID.
+.It Ic -ignore_readdir_race
+This option is for GNU find compatibility and is ignored.
+.It Ic -ilname Ar pattern
+Like
+.Ic -lname ,
+but the match is case insensitive.
+This is a GNU find extension.
 .It Ic -iname Ar pattern
 Like
 .Ic -name ,
@@ -409,23 +456,33 @@ but the match is case insensitive.
 Like
 .Ic -regex ,
 but the match is case insensitive.
+.It Ic -iwholename Ar pattern
+The same thing as
+.Ic -ipath ,
+for GNU find compatibility.
 .It Ic -links Ar n
 True if the file has
 .Ar n
 links.
+.It Ic -lname Ar pattern
+Like
+.Ic -name ,
+but the contents of the symbolic link are matched instead of the file
+name.
+This is a GNU find extension.
 .It Ic -ls
 This primary always evaluates to true.
 The following information for the current file is written to standard output:
 its inode number, size in 512-byte blocks, file permissions, number of hard
 links, owner, group, size in bytes, last modification time, and pathname.
-If the file is a block or character special file, the major and minor numbers
+If the file is a block or character special file, the device number
 will be displayed instead of the size in bytes.
 If the file is a symbolic link, the pathname of the linked-to file will be
 displayed preceded by
 .Dq Li -> .
 The format is identical to that produced by
 .Bk -words
-.Nm ls Fl dgils .
+.Dq Nm ls Fl dgils .
 .Ek
 .It Ic -maxdepth Ar n
 Always true; descend at most
@@ -435,7 +492,7 @@ If any
 .Ic -maxdepth
 primary is specified, it applies to the entire expression even if it would
 not normally be evaluated.
-.Ic -maxdepth Li 0
+.Dq Ic -maxdepth Li 0
 limits the whole search to the command line arguments.
 .It Ic -mindepth Ar n
 Always true; do not apply any tests or actions at levels less than
@@ -444,7 +501,7 @@ If any
 .Ic -mindepth
 primary is specified, it applies to the entire expression even if it would
 not normally be evaluated.
-.Ic -mindepth Li 1
+.Dq Ic -mindepth Li 1
 processes all but the command line arguments.
 .It Ic -mmin Ar n
 True if the difference between the file last modification time and the time
@@ -455,6 +512,10 @@ minutes.
 .It Ic -mnewer Ar file
 Same as
 .Ic -newer .
+.It Ic -mount
+The same thing as
+.Ic -xdev ,
+for GNU find compatibility.
 .It Ic -mtime Ar n Ns Op Cm smhdw
 If no units are specified, this primary evaluates to
 true if the difference between the file last modification time and the time
@@ -491,17 +552,17 @@ True if the current file has a more recent last modification time than
 .Ar file .
 .It Ic -newer Ns Ar X Ns Ar Y Ar file
 True if the current file has a more recent last access time
-.Ar ( X Ns = Ns Cm a ) ,
+.Pq Ar X Ns = Ns Cm a ,
 change time
-.Ar ( X Ns = Ns Cm c ) ,
+.Pq Ar X Ns = Ns Cm c ,
 or modification time
-.Ar ( X Ns = Ns Cm m )
+.Pq Ar X Ns = Ns Cm m
 than the last access time
-.Ar ( Y Ns = Ns Cm a ) ,
+.Pq Ar Y Ns = Ns Cm a ,
 change time
-.Ar ( Y Ns = Ns Cm c ) ,
+.Pq Ar Y Ns = Ns Cm c ,
 or modification time
-.Ar ( Y Ns = Ns Cm m )
+.Pq Ar Y Ns = Ns Cm m
 of
 .Ar file .
 In addition, if
@@ -517,6 +578,13 @@ is equivalent to
 .Ic -newer .
 .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.
+.It Ic -noleaf
+This option is for GNU find compatibility.
+In GNU find it disables an optimization not relevant to
+.Xr find 1 ,
+so it is ignored.
 .It Ic -nouser
 True if the file belongs to an unknown user.
 .It Ic -ok Ar utility Oo Ar argument ... Oc Li \&;
@@ -614,7 +682,8 @@ is specified, the given expression shall be effectively replaced by
 .It Ic -print0
 This primary always evaluates to true.
 It prints the pathname of the current file to standard output, followed by an
-.Tn ASCII NUL
+.Tn ASCII
+.Dv NUL
 character (character code 0).
 .It Ic -prune
 This primary always evaluates to true.
@@ -640,7 +709,15 @@ but not
 .Dq Li xyzzy
 or
 .Dq Li /foo/ .
-.It Ic -size Ar n Ns Op Cm c
+.It Ic -samefile Ar name
+True if the file is a hard link to
+.Ar name .
+If the command option
+.Ic -L
+is specified, it is also true if the file is a symbolic link and
+points to
+.Ar name .
+.It Ic -size Ar n Ns Op Cm ckMGTP
 True if the file's size, rounded up, in 512-byte blocks is
 .Ar n .
 If
@@ -651,6 +728,24 @@ then the primary is true if the
 file's size is
 .Ar n
 bytes (characters).
+Similarly if
+.Ar n
+is followed by a scale indicator then the file's size is compared to
+.Ar n
+scaled as:
+.Pp
+.Bl -tag -width indent -compact
+.It Cm k
+kilobytes (1024 bytes)
+.It Cm M
+megabytes (1024 kilobytes)
+.It Cm G
+gigabytes (1024 megabytes)
+.It Cm T
+terabytes (1024 gigabytes)
+.It Cm P
+petabytes (1024 terabytes)
+.El
 .It Ic -type Ar t
 True if the file is of the specified type.
 Possible file types are as follows:
@@ -671,6 +766,15 @@ FIFO
 .It Cm s
 socket
 .El
+.It Ic -uid Ar uname
+The same thing as
+.Ar -user Ar uname
+for compatibility with GNU find.
+GNU find imposes a restriction that
+.Ar uname
+is numeric, while
+.Xr find 1
+does not.
 .It Ic -user Ar uname
 True if the file belongs to the user
 .Ar uname .
@@ -679,36 +783,32 @@ If
 is numeric and there is no such user name, then
 .Ar uname
 is treated as a user ID.
+.It Ic -wholename Ar pattern
+The same thing as
+.Ic -path ,
+for GNU find compatibility.
 .El
-.Pp
-All primaries which take a numeric argument allow the number to be
-preceded by a plus sign
-.Pq Dq Li +
-or a minus sign
-.Pq Dq Li - .
-A preceding plus sign means
-.Dq more than n ,
-a preceding minus sign means
-.Dq less than n
-and neither means
-.Dq exactly n .
 .Sh OPERATORS
 The primaries may be combined using the following operators.
 The operators are listed in order of decreasing precedence.
 .Pp
-.Bl -tag -width "( expression )" -compact
+.Bl -tag -width indent -compact
 .It Cm \&( Ar expression Cm \&)
 This evaluates to true if the parenthesized expression evaluates to
 true.
 .Pp
 .It Cm \&! Ar expression
-.It Cm -false Ar expression
 .It Cm -not Ar expression
 This is the unary
 .Tn NOT
 operator.
 It evaluates to true if the expression is false.
 .Pp
+.It Cm -false
+Always false.
+.It Cm -true
+Always true.
+.Pp
 .It Ar expression Cm -and Ar expression
 .It Ar expression expression
 The
@@ -737,40 +837,52 @@ All operands and primaries must be separate arguments to
 Primaries which themselves take arguments expect each argument
 to be a separate argument to
 .Nm .
+.Sh ENVIRONMENT
+The
+.Ev LANG , LC_ALL , LC_COLLATE , LC_CTYPE , LC_MESSAGES
+and
+.Ev LC_TIME
+environment variables affect the execution of the
+.Nm
+utility as described in
+.Xr environ 7 .
 .Sh EXAMPLES
 The following examples are shown as given to the shell:
 .Bl -tag -width indent
-.It Li "find / \e! -name \*q*.c\*q"
+.It Li "find / \e! -name \*q*.c\*q -print"
 Print out a list of all the files whose names do not end in
 .Pa .c .
-.It Li "find / -newer ttt -user wnj"
+.It Li "find / -newer ttt -user wnj -print"
 Print out a list of all the files owned by user
 .Dq wnj
 that are newer
 than the file
 .Pa ttt .
-.It Li "find / \e! \e( -newer ttt -user wnj \e)"
+.It Li "find / \e! \e( -newer ttt -user wnj \e) -print"
 Print out a list of all the files which are not both newer than
 .Pa ttt
 and owned by
 .Dq wnj .
-.It Li "find / \e( -newer ttt -or -user wnj \e)"
+.It Li "find / \e( -newer ttt -or -user wnj \e) -print"
 Print out a list of all the files that are either owned by
 .Dq wnj
 or that are newer than
 .Pa ttt .
-.It Li "find / -newerct '1 minute ago'"
+.It Li "find / -newerct '1 minute ago' -print"
 Print out a list of all the files whose inode change time is more
 recent than the current time minus one minute.
 .It Li "find / -type f -exec echo {} \e;"
 Use the
 .Xr echo 1
 command to print out a list of all the files.
-.It Li "find /usr/src -name CVS -prune -o -depth +6"
+.It Li "find -L /usr/ports/packages -type l -exec rm -- {} +"
+Delete all broken symbolic links in
+.Pa /usr/ports/packages .
+.It Li "find /usr/src -name CVS -prune -o -depth +6 -print"
 Find files and directories that are at least seven levels deep
 in the working directory
 .Pa /usr/src .
-.It Li "find /usr/src -name CVS -prune -o -mindepth 7"
+.It Li "find /usr/src -name CVS -prune -o -mindepth 7 -print"
 Is not equivalent to the previous example, since
 .Ic -prune
 is not evaluated below level seven.
@@ -789,6 +901,7 @@ section below for details.
 .Xr chmod 1 ,
 .Xr cvs 1 ,
 .Xr locate 1 ,
+.Xr lsvfs 1 ,
 .Xr whereis 1 ,
 .Xr which 1 ,
 .Xr xargs 1 ,
@@ -807,14 +920,14 @@ utility syntax is a superset of the syntax specified by the
 standard.
 .Pp
 All the single character options except
-.Ic -H
-and
-.Ic -L
-as well as the
-.Ic -iname , -inum , -iregex , -print0 , -delete , -ls ,
+.Fl H
 and
-.Ic -regex
-primaries are extensions to
+.Fl L
+as well as
+.Ic -amin , -anewer , -cmin , -cnewer , -delete , -empty , -fstype ,
+.Ic -iname , -inum , -iregex , -ls , -maxdepth , -mindepth , -mmin ,
+.Ic -path , -print0 , -regex
+are extensions to
 .St -p1003.1-2001 .
 .Pp
 Historically, the
index eee5a44..8861155 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -34,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * @(#)find.c  8.5 (Berkeley) 8/5/94
- * $FreeBSD: src/usr.bin/find/find.c,v 1.17 2004/05/28 17:17:15 eik Exp $
+ * $FreeBSD: src/usr.bin/find/find.c,v 1.23 2010/12/11 08:32:16 joel Exp $
  */
 
 #include <sys/types.h>
@@ -174,7 +170,7 @@ find_execute(PLAN *plan, char *paths[])
        PLAN *p;
        int rval;
 
-       tree = fts_open(paths, ftsoptions, issort ? find_compare : NULL);
+       tree = fts_open(paths, ftsoptions, (issort ? find_compare : NULL));
        if (tree == NULL)
                err(1, "ftsopen");
 
@@ -224,10 +220,7 @@ find_execute(PLAN *plan, char *paths[])
                 */
                for (p = plan; p && (p->execute)(p, entry); p = p->next);
        }
-       /* Finish any pending -exec ... {} + functions. */
-       for (p = plan; p != NULL; p = p->next)
-               if (p->execute == f_exec && p->flags & F_EXECPLUS)
-                       (p->execute)(p, NULL);
+       finish_execplus();
        if (errno)
                err(1, "fts_read");
        return (rval);
index 5c293a1..8b5adfc 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -34,8 +30,7 @@
  * SUCH DAMAGE.
  *
  *     @(#)find.h      8.1 (Berkeley) 6/6/93
- *     $FreeBSD: src/usr.bin/find/find.h,v 1.17 2004/05/28 17:17:15 eik Exp $
- *     $DragonFly: src/usr.bin/find/find.h,v 1.4 2005/02/13 23:49:53 cpressey Exp $
+ *     $FreeBSD: src/usr.bin/find/find.h,v 1.21 2010/12/11 08:32:16 joel Exp $
  */
 
 #include <regex.h>
@@ -73,6 +68,7 @@ typedef       struct _plandata *creat_f(struct _option *, char ***);
 #define        F_IGNCASE       0x00010000      /* iname ipath iregex */
 #define        F_EXACTTIME     F_IGNCASE       /* -[acm]time units syntax */
 #define F_EXECPLUS     0x00020000      /* -exec ... {} + */
+#define F_LINK         0x00100000      /* lname or ilname */
 
 /* node definition */
 typedef struct _plandata {
@@ -104,6 +100,7 @@ typedef struct _plandata {
                        int _e_psize;           /* number of bytes of args. */
                        int _e_pbsize;          /* base num. of bytes of args */
                        int _e_psizemax;        /* max num. of bytes of args */
+                       struct _plandata *_e_next;/* next F_EXECPLUS in tree */
                } ex;
                char *_a_data[2];               /* array of char pointers */
                char *_c_data;                  /* char pointer */
@@ -134,6 +131,7 @@ typedef struct _plandata {
 #define e_psize p_un.ex._e_psize
 #define e_pbsize p_un.ex._e_pbsize
 #define e_psizemax p_un.ex._e_psizemax
+#define e_next p_un.ex._e_next
 
 typedef struct _option {
        const char *name;               /* option name */
index b08a0a5..82fb4ce 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  * SUCH DAMAGE.
  *
  * @(#)function.c  8.10 (Berkeley) 5/4/95
- * $FreeBSD: src/usr.bin/find/function.c,v 1.52 2004/07/29 03:33:55 tjr Exp $
+ * $FreeBSD: src/usr.bin/find/function.c,v 1.71 2011/06/13 05:22:07 avatar Exp $
  */
 
 #include <sys/param.h>
 #include <sys/ucred.h>
 #include <sys/stat.h>
-#include <sys/types.h>
 #include <sys/wait.h>
 #include <sys/mount.h>
-#include <sys/timeb.h>
 
 #include <dirent.h>
 #include <err.h>
@@ -69,6 +63,8 @@ static char *nextarg(OPTION *, char ***);
 
 extern char **environ;
 
+static PLAN *lastexecplus = NULL;
+
 #define        COMPARE(a, b) do {                                              \
        switch (plan->flags & F_ELG_MASK) {                             \
        case F_EQUAL:                                                   \
@@ -129,7 +125,7 @@ find_parsenum(PLAN *plan, const char *option, char *vp, char *endch)
        value = strtoq(str, &endchar, 10);
        if (value == 0 && endchar == str)
                errx(1, "%s: %s: illegal numeric value", option, vp);
-       if (endchar[0] && (endch == NULL || endchar[0] != *endch))
+       if (endchar[0] && endch == NULL)
                errx(1, "%s: %s: illegal trailing character", option, vp);
        if (endch)
                *endch = endchar[0];
@@ -362,11 +358,13 @@ f_delete(PLAN *plan __unused, FTSENT *entry)
 
        /* sanity check */
        if (isdepth == 0 ||                     /* depth off */
-           (ftsoptions & FTS_NOSTAT) ||        /* not stat()ing */
-           !(ftsoptions & FTS_PHYSICAL) ||     /* physical off */
-           (ftsoptions & FTS_LOGICAL))         /* or finally, logical on */
+           (ftsoptions & FTS_NOSTAT))          /* not stat()ing */
                errx(1, "-delete: insecure options got turned on");
 
+       if (!(ftsoptions & FTS_PHYSICAL) ||     /* physical off */
+           (ftsoptions & FTS_LOGICAL))         /* or finally, logical on */
+               errx(1, "-delete: forbidden when symlinks are followed");
+
        /* Potentially unsafe - do not accept relative paths whatsoever */
        if (strchr(entry->fts_accpath, '/') != NULL)
                errx(1, "-delete: %s: relative path potentially not safe",
@@ -376,7 +374,7 @@ f_delete(PLAN *plan __unused, FTSENT *entry)
        if ((entry->fts_statp->st_flags & (UF_APPEND|UF_IMMUTABLE)) &&
            !(entry->fts_statp->st_flags & (SF_APPEND|SF_IMMUTABLE)) &&
            geteuid() == 0)
-               chflags(entry->fts_accpath,
+               lchflags(entry->fts_accpath,
                       entry->fts_statp->st_flags &= ~(UF_APPEND|UF_IMMUTABLE));
 
        /* rmdir directories, unlink everything else */
@@ -397,8 +395,6 @@ c_delete(OPTION *option, char ***argvp __unused)
 {
 
        ftsoptions &= ~FTS_NOSTAT;      /* no optimise */
-       ftsoptions |= FTS_PHYSICAL;     /* disable -follow */
-       ftsoptions &= ~FTS_LOGICAL;     /* disable -follow */
        isoutput = 1;                   /* possible output */
        isdepth = 1;                    /* -depth implied */
 
@@ -409,7 +405,7 @@ c_delete(OPTION *option, char ***argvp __unused)
 /*
  * always_true --
  *
- *     Always true, used for -maxdepth, -mindepth, -xdev and -follow
+ *     Always true, used for -maxdepth, -mindepth, -xdev, -follow, and -true
  */
 int
 f_always_true(PLAN *plan __unused, FTSENT *entry __unused)
@@ -485,7 +481,7 @@ f_empty(PLAN *plan __unused, FTSENT *entry)
                empty = 1;
                dir = opendir(entry->fts_accpath);
                if (dir == NULL)
-                       err(1, "%s", entry->fts_accpath);
+                       return 0;
                for (dp = readdir(dir); dp; dp = readdir(dir))
                        if (dp->d_name[0] != '.' ||
                            (dp->d_name[1] != '\0' &&
@@ -648,6 +644,8 @@ c_exec(OPTION *option, char ***argvp)
                new->e_psizemax = argmax;
                new->e_pbsize = 0;
                cnt += new->e_pnummax + 1;
+               new->e_next = lastexecplus;
+               lastexecplus = new;
        }
        if ((new->e_argv = malloc(cnt * sizeof(char *))) == NULL)
                err(1, NULL);
@@ -691,6 +689,19 @@ done:      *argvp = argv + 1;
        return new;
 }
 
+/* Finish any pending -exec ... {} + functions. */
+void
+finish_execplus(void)
+{
+       PLAN *p;
+
+       p = lastexecplus;
+       while (p != NULL) {
+               (p->execute)(p, NULL);
+               p = p->e_next;
+       }
+}
+
 int
 f_flags(PLAN *plan, FTSENT *entry)
 {
@@ -761,7 +772,8 @@ f_fstype(PLAN *plan, FTSENT *entry)
        static dev_t curdev;    /* need a guaranteed illegal dev value */
        static int first = 1;
        struct statfs sb;
-       static int val_type, val_flags;
+       static int val_flags;
+       static char fstype[sizeof(sb.f_fstypename)];
        char *p, save[2] = {0,0};
 
        if ((plan->flags & F_MTMASK) == F_MTUNKNOWN)
@@ -788,10 +800,9 @@ f_fstype(PLAN *plan, FTSENT *entry)
                } else
                        p = NULL;
 
-               if (statfs(entry->fts_accpath, &sb)) {
-                       warn("%s", entry->fts_accpath);
-                       return 0;
-               }
+               if (statfs(entry->fts_accpath, &sb))
+                       err(1, "%s", entry->fts_accpath);
+
                if (p) {
                        p[0] = save[0];
                        p[1] = save[1];
@@ -804,13 +815,13 @@ f_fstype(PLAN *plan, FTSENT *entry)
                 * always copy both of them.
                 */
                val_flags = sb.f_flags;
-               val_type = sb.f_type;
+               strlcpy(fstype, sb.f_fstypename, sizeof(fstype));
        }
        switch (plan->flags & F_MTMASK) {
        case F_MTFLAG:
                return val_flags & plan->mt_data;
        case F_MTTYPE:
-               return val_type == plan->mt_data;
+               return (strncmp(fstype, plan->c_data, sizeof(fstype)) == 0);
        default:
                abort();
        }
@@ -821,22 +832,11 @@ c_fstype(OPTION *option, char ***argvp)
 {
        char *fsname;
        PLAN *new;
-       struct vfsconf vfc;
 
        fsname = nextarg(option, argvp);
        ftsoptions &= ~FTS_NOSTAT;
 
        new = palloc(option);
-
-       /*
-        * Check first for a filesystem name.
-        */
-       if (getvfsbyname(fsname, &vfc) == 0) {
-               new->flags |= F_MTTYPE;
-               new->mt_data = vfc.vfc_typenum;
-               return new;
-       }
-
        switch (*fsname) {
        case 'l':
                if (!strcmp(fsname, "local")) {
@@ -854,12 +854,8 @@ c_fstype(OPTION *option, char ***argvp)
                break;
        }
 
-       /*
-        * We need to make filesystem checks for filesystems
-        * that exists but aren't in the kernel work.
-        */
-       fprintf(stderr, "Warning: Unknown filesystem type %s\n", fsname);
-       new->flags |= F_MTUNKNOWN;
+       new->flags |= F_MTTYPE;
+       new->c_data = fsname;
        return new;
 }
 
@@ -873,7 +869,7 @@ c_fstype(OPTION *option, char ***argvp)
 int
 f_group(PLAN *plan, FTSENT *entry)
 {
-       return entry->fts_statp->st_gid == plan->g_data;
+       COMPARE(entry->fts_statp->st_gid, plan->g_data);
 }
 
 PLAN *
@@ -887,15 +883,19 @@ c_group(OPTION *option, char ***argvp)
        gname = nextarg(option, argvp);
        ftsoptions &= ~FTS_NOSTAT;
 
+       new = palloc(option);
        g = getgrnam(gname);
        if (g == NULL) {
+               char* cp = gname;
+               if (gname[0] == '-' || gname[0] == '+')
+                       gname++;
                gid = atoi(gname);
                if (gid == 0 && gname[0] != '0')
                        errx(1, "%s: %s: no such group", option->name, gname);
+               gid = find_parsenum(new, option->name, cp, NULL);
        } else
                gid = g->gr_gid;
 
-       new = palloc(option);
        new->g_data = gid;
        return new;
 }
@@ -926,6 +926,30 @@ c_inum(OPTION *option, char ***argvp)
 }
 
 /*
+ * -samefile FN
+ *
+ *     True if the file has the same inode (eg hard link) FN
+ */
+
+/* f_samefile is just f_inum */
+PLAN *
+c_samefile(OPTION *option, char ***argvp)
+{
+       char *fn;
+       PLAN *new;
+       struct stat sb;
+
+       fn = nextarg(option, argvp);
+       ftsoptions &= ~FTS_NOSTAT;
+
+       new = palloc(option);
+       if (stat(fn, &sb))
+               err(1, "%s", fn);
+       new->i_data = sb.st_ino;
+       return new;
+}
+
+/*
  * -links n functions --
  *
  *     True if the file has n links.
@@ -980,7 +1004,16 @@ c_ls(OPTION *option, char ***argvp __unused)
 int
 f_name(PLAN *plan, FTSENT *entry)
 {
-       return !fnmatch(plan->c_data, entry->fts_name,
+       char fn[PATH_MAX];
+       const char *name;
+
+       if (plan->flags & F_LINK) {
+               name = fn;
+               if (readlink(entry->fts_path, fn, sizeof(fn)) == -1)
+                       return 0;
+       } else
+               name = entry->fts_name;
+       return !fnmatch(plan->c_data, name,
            plan->flags & F_IGNCASE ? FNM_CASEFOLD : 0);
 }
 
@@ -1027,7 +1060,7 @@ c_newer(OPTION *option, char ***argvp)
        new = palloc(option);
        /* compare against what */
        if (option->flags & F_TIME2_T) {
-               new->t_data = get_date(fn_or_tspec, NULL);
+               new->t_data = get_date(fn_or_tspec);
                if (new->t_data == (time_t) -1)
                        errx(1, "Can't parse date/time: %s", fn_or_tspec);
        } else {
@@ -1268,7 +1301,7 @@ c_regex(OPTION *option, char ***argvp)
        return new;
 }
 
-/* c_simple covers c_prune, c_openparen, c_closeparen, c_not, c_or */
+/* c_simple covers c_prune, c_openparen, c_closeparen, c_not, c_or, c_true, c_false */
 
 PLAN *
 c_simple(OPTION *option, char ***argvp __unused)
@@ -1281,7 +1314,8 @@ c_simple(OPTION *option, char ***argvp __unused)
  *
  *     True if the file size in bytes, divided by an implementation defined
  *     value and rounded up to the next integer, is n.  If n is followed by
- *     a c, the size is in bytes.
+ *      one of c k M G T P, the size is in bytes, kilobytes,
+ *      megabytes, gigabytes, terabytes or petabytes respectively.
  */
 #define        FIND_SIZE       512
 static int divsize = 1;
@@ -1302,6 +1336,7 @@ c_size(OPTION *option, char ***argvp)
        char *size_str;
        PLAN *new;
        char endch;
+       off_t scale;
 
        size_str = nextarg(option, argvp);
        ftsoptions &= ~FTS_NOSTAT;
@@ -1309,8 +1344,38 @@ c_size(OPTION *option, char ***argvp)
        new = palloc(option);
        endch = 'c';
        new->o_data = find_parsenum(new, option->name, size_str, &endch);
-       if (endch == 'c')
+       if (endch != '\0') {
                divsize = 0;
+
+               switch (endch) {
+               case 'c':                       /* characters */
+                       scale = 0x1LL;
+                       break;
+               case 'k':                       /* kilobytes 1<<10 */
+                       scale = 0x400LL;
+                       break;
+               case 'M':                       /* megabytes 1<<20 */
+                       scale = 0x100000LL;
+                       break;
+               case 'G':                       /* gigabytes 1<<30 */
+                       scale = 0x40000000LL;
+                       break;
+               case 'T':                       /* terabytes 1<<40 */
+                       scale = 0x1000000000LL;
+                       break;
+               case 'P':                       /* petabytes 1<<50 */
+                       scale = 0x4000000000000LL;
+                       break;
+               default:
+                       errx(1, "%s: %s: illegal trailing character",
+                               option->name, size_str);
+                       break;
+               }
+               if (new->o_data > QUAD_MAX / scale)
+                       errx(1, "%s: %s: value too large",
+                               option->name, size_str);
+               new->o_data *= scale;
+       }
        return new;
 }
 
@@ -1384,7 +1449,7 @@ c_type(OPTION *option, char ***argvp)
 int
 f_user(PLAN *plan, FTSENT *entry)
 {
-       return entry->fts_statp->st_uid == plan->u_data;
+       COMPARE(entry->fts_statp->st_uid, plan->u_data);
 }
 
 PLAN *
@@ -1398,15 +1463,19 @@ c_user(OPTION *option, char ***argvp)
        username = nextarg(option, argvp);
        ftsoptions &= ~FTS_NOSTAT;
 
+       new = palloc(option);
        p = getpwnam(username);
        if (p == NULL) {
+               char* cp = username;
+               if( username[0] == '-' || username[0] == '+' )
+                       username++;
                uid = atoi(username);
                if (uid == 0 && username[0] != '0')
                        errx(1, "%s: %s: no such user", option->name, username);
+               uid = find_parsenum(new, option->name, cp, NULL);
        } else
                uid = p->pw_uid;
 
-       new = palloc(option);
        new->u_data = uid;
        return new;
 }
@@ -1514,3 +1583,29 @@ f_or(PLAN *plan, FTSENT *entry)
 }
 
 /* c_or == c_simple */
+
+/*
+ * -false
+ *
+ *     Always false.
+ */
+int
+f_false(PLAN *plan __unused, FTSENT *entry __unused)
+{
+       return 0;
+}
+
+/* c_false == c_simple */
+
+/*
+ * -quit
+ *
+ *     Exits the program
+ */
+int
+f_quit(PLAN *plan __unused, FTSENT *entry __unused)
+{
+       exit(0);
+}
+
+/* c_quit == c_simple */
index 307afa9..debf796 100644 (file)
@@ -12,8 +12,7 @@
 /* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
 /* SUPPRESS 288 on yyerrlab *//* Label unused */
 
-/* $FreeBSD: src/usr.bin/find/getdate.y,v 1.3 2003/06/14 13:00:21 markm Exp $ */
-/* $DragonFly: src/usr.bin/find/getdate.y,v 1.3 2005/02/13 23:49:53 cpressey Exp $ */
+/* $FreeBSD: src/usr.bin/find/getdate.y,v 1.8 2012/05/22 16:33:10 bapt Exp $ */
 
 #include <stdio.h>
 #include <ctype.h>
@@ -28,7 +27,6 @@
 #else /* defined(vms) */
 # include <sys/types.h>
 # include <sys/time.h>
-# include <sys/timeb.h>
 #endif /* !defined(vms) */
 
 #if defined (__STDC__) || defined (USG)
@@ -69,7 +67,7 @@ static int yyparse(void);
 static int yylex(void);
 static int yyerror(const char *);
 
-time_t get_date(char *, struct timeb *);
+time_t get_date(char *);
 
 #define EPOCH          1970
 #define HOUR(x)                ((time_t)(x) * 60)
@@ -849,58 +847,50 @@ difftm (struct tm *a, struct tm *b)
 }
 
 time_t
-get_date(char *p, struct timeb *now)
+get_date(char *p)
 {
-    struct tm          *tm, gmt;
-    struct timeb       ftz;
+    struct tm          *tm, *gmt_ptr, gmt;
+    int                        tzoff;
     time_t             Start;
     time_t             tod;
     time_t nowtime;
 
-    bzero(&gmt, sizeof(struct tm));
+    bzero (&gmt, sizeof(struct tm));
     yyInput = p;
-    if (now == NULL) {
-       struct tm *gmt_ptr;
 
-        now = &ftz;
-       (void)time (&nowtime);
+    (void)time (&nowtime);
 
-       gmt_ptr = gmtime (&nowtime);
-       if (gmt_ptr != NULL)
-       {
-           /* Make a copy, in case localtime modifies *tm (I think
-              that comment now applies to *gmt_ptr, but I am too
-              lazy to dig into how gmtime and locatime allocate the
-              structures they return pointers to).  */
-           gmt = *gmt_ptr;
-       }
+    gmt_ptr = gmtime (&nowtime);
+    if (gmt_ptr != NULL)
+    {
+       /* Make a copy, in case localtime modifies *tm (I think
+          that comment now applies to *gmt_ptr, but I am too
+          lazy to dig into how gmtime and locatime allocate the
+          structures they return pointers to).  */
+       gmt = *gmt_ptr;
+    }
 
-       if (! (tm = localtime (&nowtime)))
-           return -1;
+    if (! (tm = localtime (&nowtime)))
+       return -1;
 
-       if (gmt_ptr != NULL)
-           ftz.timezone = difftm (&gmt, tm) / 60;
-       else
-           /* We are on a system like VMS, where the system clock is
-              in local time and the system has no concept of timezones.
-              Hopefully we can fake this out (for the case in which the
-              user specifies no timezone) by just saying the timezone
-              is zero.  */
-           ftz.timezone = 0;
-
-       if(tm->tm_isdst)
-           ftz.timezone += 60;
-    }
+    if (gmt_ptr != NULL)
+       tzoff = difftm (&gmt, tm) / 60;
     else
-    {
-       nowtime = now->time;
-    }
+       /* We are on a system like VMS, where the system clock is
+          in local time and the system has no concept of timezones.
+          Hopefully we can fake this out (for the case in which the
+          user specifies no timezone) by just saying the timezone
+          is zero.  */
+       tzoff = 0;
+
+    if(tm->tm_isdst)
+       tzoff += 60;
 
     tm = localtime(&nowtime);
     yyYear = tm->tm_year + 1900;
     yyMonth = tm->tm_mon + 1;
     yyDay = tm->tm_mday;
-    yyTimezone = now->timezone;
+    yyTimezone = tzoff;
     yyDSTmode = DSTmaybe;
     yyHour = 0;
     yyMinutes = 0;
@@ -956,7 +946,7 @@ main(int ac, char *av[])
     (void)printf("Enter date, or blank line to exit.\n\t> ");
     (void)fflush(stdout);
     while (gets(buff) && buff[0]) {
-       d = get_date(buff, NULL);
+       d = get_date(buff);
        if (d == -1)
            (void)printf("Bad format - couldn't convert.\n");
        else
index 903e2f8..97d0cdd 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -31,8 +27,7 @@
  * SUCH DAMAGE.
  *
  * @(#)ls.c    8.1 (Berkeley) 6/6/93
- * $FreeBSD: src/usr.bin/find/ls.c,v 1.17 2004/01/20 09:27:03 des Exp $
- * $DragonFly: src/usr.bin/find/ls.c,v 1.6 2005/02/22 01:52:44 joerg Exp $
+ * $FreeBSD: src/usr.bin/find/ls.c,v 1.23 2011/09/28 18:53:36 ed Exp $
  */
 
 #include <sys/param.h>
 #include <langinfo.h>
 #include <pwd.h>
 #include <stdio.h>
-#include <stdlib.h>
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
 
 #include "find.h"
 
-#ifndef PRId64
-#define        PRId64 "lld"
-#endif
-
 /* Derived from the print routines in the ls(1) source code. */
 
 static void printlink(char *);
@@ -74,8 +64,7 @@ printlong(char *name, char *accpath, struct stat *sb)
            group_from_gid(sb->st_gid, 0));
 
        if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode))
-               printf("%3d, %3d ", major(sb->st_rdev),
-                   minor(sb->st_rdev));
+               printf("%#8jx ", (uintmax_t)sb->st_rdev);
        else
                printf("%8"PRId64" ", sb->st_size);
        printtime(sb->st_mtime);
index 9907392..bf3e891 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -35,8 +31,7 @@
  *
  * @(#) Copyright (c) 1990, 1993, 1994 The Regents of the University of California.  All rights reserved.
  * @(#)main.c  8.4 (Berkeley) 5/4/95
- * $FreeBSD: src/usr.bin/find/main.c,v 1.15 2003/06/14 13:00:21 markm Exp $
- * $DragonFly: src/usr.bin/find/main.c,v 1.6 2005/03/14 12:48:57 joerg Exp $
+ * $FreeBSD: src/usr.bin/find/main.c,v 1.23 2011/12/10 18:11:06 ed Exp $
  */
 
 #include <sys/types.h>
@@ -114,7 +109,7 @@ main(int argc, char *argv[])
                        break;
                case '?':
                default:
-                       break;
+                       usage();
                }
 
        argc -= optind;
@@ -153,7 +148,8 @@ main(int argc, char *argv[])
 static void
 usage(void)
 {
-       fprintf(stderr,
-"usage: find [-H | -L | -P] [-EXdsx] [-f file] [file ...] [expression]\n");
+       fprintf(stderr, "%s\n%s\n",
+"usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]",
+"       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]");
        exit(1);
 }
index 31d881c..05f73f1 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -33,8 +29,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.bin/find/operator.c,v 1.14 2003/06/14 13:00:21 markm Exp $
- * $DragonFly: src/usr.bin/find/operator.c,v 1.5 2005/02/13 23:49:53 cpressey Exp $
+ * $FreeBSD: src/usr.bin/find/operator.c,v 1.17 2010/12/11 08:32:16 joel Exp $
  *
  * @(#)operator.c      8.1 (Berkeley) 6/6/93
  */
index a4acef8..8f0224d 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
  * 4. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
@@ -34,8 +30,7 @@
  * SUCH DAMAGE.
  *
  * @(#)option.c        8.2 (Berkeley) 4/16/94
- * $FreeBSD: src/usr.bin/find/option.c,v 1.23 2004/07/29 03:29:44 tjr Exp $
- * $DragonFly: src/usr.bin/find/option.c,v 1.5 2005/02/13 23:49:53 cpressey Exp $
+ * $FreeBSD: src/usr.bin/find/option.c,v 1.32 2011/05/27 22:14:49 jilles Exp $
  */
 
 #include <sys/types.h>
 
 #include "find.h"
 
-int typecompare(const void *, const void *);
+static int typecompare(const void *, const void *);
 
 /* NB: the following table must be sorted lexically. */
+/* Options listed with C++ comments are in gnu find, but not our find */
 static OPTION const options[] = {
        { "!",          c_simple,       f_not,          0 },
        { "(",          c_simple,       f_openparen,    0 },
@@ -65,26 +61,38 @@ static OPTION const options[] = {
        { "-cmin",      c_Xmin,         f_Xmin,         F_TIME_C },
        { "-cnewer",    c_newer,        f_newer,        F_TIME_C },
        { "-ctime",     c_Xtime,        f_Xtime,        F_TIME_C },
+       { "-d",         c_depth,        f_depth,        0 },
+// -daystart
        { "-delete",    c_delete,       f_delete,       0 },
        { "-depth",     c_depth,        f_depth,        0 },
        { "-empty",     c_empty,        f_empty,        0 },
        { "-exec",      c_exec,         f_exec,         0 },
        { "-execdir",   c_exec,         f_exec,         F_EXECDIR },
-       { "-false",     c_simple,       f_not,          0 },
+       { "-false",     c_simple,       f_false,        0 },
        { "-flags",     c_flags,        f_flags,        0 },
+// -fls
        { "-follow",    c_follow,       f_always_true,  0 },
+// -fprint
+// -fprint0
+// -fprintf
        { "-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 },
+       { "-ilname",    c_name,         f_name,         F_LINK | F_IGNCASE },
        { "-iname",     c_name,         f_name,         F_IGNCASE },
        { "-inum",      c_inum,         f_inum,         0 },
        { "-ipath",     c_name,         f_path,         F_IGNCASE },
        { "-iregex",    c_regex,        f_regex,        F_IGNCASE },
+       { "-iwholename",c_name,         f_path,         F_IGNCASE },
        { "-links",     c_links,        f_links,        0 },
+       { "-lname",     c_name,         f_name,         F_LINK },
        { "-ls",        c_ls,           f_ls,           0 },
        { "-maxdepth",  c_mXXdepth,     f_always_true,  F_MAXDEPTH },
        { "-mindepth",  c_mXXdepth,     f_always_true,  0 },
        { "-mmin",      c_Xmin,         f_Xmin,         0 },
        { "-mnewer",    c_newer,        f_newer,        0 },
+       { "-mount",     c_xdev,         f_always_true,  0 },
        { "-mtime",     c_Xtime,        f_Xtime,        0 },
        { "-name",      c_name,         f_name,         0 },
        { "-newer",     c_newer,        f_newer,        0 },
@@ -101,6 +109,8 @@ 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 },
+       { "-noleaf",    c_simple,       f_always_true,  0 },
        { "-not",       c_simple,       f_not,          0 },
        { "-nouser",    c_nouser,       f_nouser,       0 },
        { "-o",         c_simple,       f_or,           0 },
@@ -111,12 +121,19 @@ static OPTION const options[] = {
        { "-perm",      c_perm,         f_perm,         0 },
        { "-print",     c_print,        f_print,        0 },
        { "-print0",    c_print,        f_print0,       0 },
+// -printf
        { "-prune",     c_simple,       f_prune,        0 },
+       { "-quit",      c_simple,       f_quit,         0 },
        { "-regex",     c_regex,        f_regex,        0 },
+       { "-samefile",  c_samefile,     f_inum,         0 },
        { "-size",      c_size,         f_size,         0 },
+       { "-true",      c_simple,       f_always_true,  0 },
        { "-type",      c_type,         f_type,         0 },
+       { "-uid",       c_user,         f_user,         0 },
        { "-user",      c_user,         f_user,         0 },
+       { "-wholename", c_name,         f_path,         0 },
        { "-xdev",      c_xdev,         f_always_true,  0 },
+// -xtype
 };
 
 /*
@@ -137,7 +154,7 @@ find_create(char ***argvp)
        argv = *argvp;
 
        if ((p = lookup_option(*argv)) == NULL)
-               errx(1, "%s: unknown option", *argv);
+               errx(1, "%s: unknown primary or operator", *argv);
        ++argv;
 
        new = (p->create)(p, &argv);
@@ -155,7 +172,7 @@ lookup_option(const char *name)
            sizeof(options)/sizeof(OPTION), sizeof(OPTION), typecompare));
 }
 
-int
+static int
 typecompare(const void *a, const void *b)
 {
        return (strcmp(((const OPTION *)a)->name, ((const OPTION *)b)->name));