src/usr.bin/find

Alexander 'alxl' Lobachov alxl at alxl.info
Sun Jan 16 13:39:35 PST 2005


Two src/usr.bin/find patches.

-- 
Alexander 'alxl' Lobachov	mailto:alxl at xxxxxxxxx

Sync to FreeBSD with minor edits, like acl remove.
Major differences:
- Give find(1) the option -acl to locate files with extended
  ACLs. (NOT INCLUDED)
- Use a larger field for the size in blocks; the current width (4 digits)
  is only good for 5 MB.
- Updated manual page
- Introduce a new primary `-depth n', which tests whether
  the depth of the current file relative to the starting
  point of the traversal is n. The usual +/- modifiers
  to the argument apply.
- Remove partial support for building this on NetBSD.

diff -Nru dfly/src/usr.bin/find/Makefile fbsd/src/usr.bin/find/Makefile
--- dfly/src/usr.bin/find/Makefile	2003-06-17 07:29:26.000000000 +0300
+++ fbsd/src/usr.bin/find/Makefile	2005-01-16 22:15:07.000000000 +0200
@@ -1,10 +1,12 @@
 #	@(#)Makefile	8.1 (Berkeley) 6/6/93
-# $FreeBSD: src/usr.bin/find/Makefile,v 1.8.2.5 2003/01/22 03:26:34 peter Exp $
+# $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.2 2003/06/17 04:29:26 dillon Exp $
 
-CFLAGS+=-Wall
 PROG=	find
-SRCS=	find.c function.c ls.c main.c misc.c operator.c option.c getdate.y
+SRCS=	find.c function.c ls.c main.c misc.c operator.c option.c \
+	getdate.y
+WARNS?=2
+CFLAGS+= -DHAVE_SYS_TIMEB_H -I${.CURDIR}
 YFLAGS=
 
 .include <bsd.prog.mk>
diff -Nru dfly/src/usr.bin/find/extern.h fbsd/src/usr.bin/find/extern.h
--- dfly/src/usr.bin/find/extern.h	2003-11-03 21:31:29.000000000 +0200
+++ fbsd/src/usr.bin/find/extern.h	2005-01-16 22:26:50.000000000 +0200
@@ -31,24 +31,25 @@
  * SUCH DAMAGE.
  *
  *	@(#)extern.h	8.3 (Berkeley) 4/16/94
- *	$FreeBSD: src/usr.bin/find/extern.h,v 1.9.2.4 2001/05/06 09:53:22 phk Exp $
+ *	$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.3 2003/11/03 19:31:29 eirikn Exp $
  */
 
 #include <sys/cdefs.h>
 
 void	 brace_subst(char *, char **, char *, int);
-void	*emalloc(unsigned int);
 PLAN	*find_create(char ***);
 int	 find_execute(PLAN *, char **);
 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 *);
 struct stat;
 void	 printlong(char *, char *, struct stat *);
 int	 queryuser(char **);
-OPTION	*option(char *);
+OPTION	*lookup_option(const char *);
 
 creat_f	c_Xmin;
 creat_f	c_Xtime;
@@ -59,9 +60,7 @@
 creat_f	c_exec;
 creat_f	c_flags;
 creat_f	c_follow;
-#if !defined(__NetBSD__)
 creat_f	c_fstype;
-#endif
 creat_f	c_group;
 creat_f	c_inum;
 creat_f	c_links;
@@ -85,6 +84,7 @@
 exec_f	f_always_true;
 exec_f	f_closeparen;
 exec_f	f_delete;
+exec_f	f_depth;
 exec_f	f_empty;
 exec_f	f_exec;
 exec_f	f_expr;
@@ -114,3 +114,6 @@
 extern int ftsoptions, isdeprecated, isdepth, isoutput, issort, isxargs;
 extern int mindepth, maxdepth;
 extern int regexp_flags;
+extern time_t now;
+extern int dotfd;
+extern FTS *tree;
diff -Nru dfly/src/usr.bin/find/find.1 fbsd/src/usr.bin/find/find.1
--- dfly/src/usr.bin/find/find.1	2003-06-17 07:29:26.000000000 +0300
+++ fbsd/src/usr.bin/find/find.1	2005-01-16 22:50:43.000000000 +0200
@@ -1,3 +1,4 @@
+.\" Copyright (c) 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
 .\"
 .\" This code is derived from software contributed to Berkeley by
@@ -32,7 +33,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\"	@(#)find.1	8.7 (Berkeley) 5/9/95
-.\" $FreeBSD: src/usr.bin/find/find.1,v 1.23.2.20 2003/02/25 20:31:18 trhodes Exp $
+.\" $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.2 2003/06/17 04:29:26 dillon Exp $
 .\"
 .Dd May 3, 2001
@@ -90,6 +91,10 @@
 link, not the link itself.
 If the referenced file does not exist, the file information and type will
 be for the link itself.
+.Pp
+This option is equivalent to the deprecated
+.Ic -follow
+primary.
 .It Fl P
 Cause the file information and file type (see
 .Xr stat 2 )
@@ -120,15 +125,28 @@
 .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
+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.
+visits directories in pre-order, i.e., before their contents.
 Note, the default is
 .Em not
-a breadth\-first traversal.
+a breadth-first traversal.
+.Pp
+This option is equivalent to the
+.Ic -depth
+primary of
+.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
@@ -150,6 +168,10 @@
 .Nm
 from descending into directories that have a device number different
 than that of the file from which the descent began.
+.Pp
+This option is equivalent to the deprecated
+.Ic -xdev
+primary.
 .El
 .Sh PRIMARIES
 .Bl -tag -width indent
@@ -166,9 +188,9 @@
 If no units are specified, this primary evaluates to
 true if the difference between the file last access time and the time
 .Nm
-was started, rounded up to the next full 24\-hour period, is
+was started, rounded up to the next full 24-hour period, is
 .Ar n
-24\-hour periods.
+24-hour periods.
 .Pp
 If units are specified, this primary evaluates to
 true if the difference between the file last access time and the time
@@ -215,9 +237,9 @@
 true if the difference between the time of last change of file status
 information and the time
 .Nm
-was started, rounded up to the next full 24\-hour period, is
+was started, rounded up to the next full 24-hour period, is
 .Ar n
-24\-hour periods.
+24-hour periods.
 .Pp
 If units are specified, this primary evaluates to
 true if the difference between the time of last change of file status
@@ -241,23 +263,19 @@
 character in its pathname relative to
 .Dq Pa \&.
 for security reasons.
-Depth\-first traversal processing is implied by this option.
+Depth-first traversal processing is implied by this option.
 .It Ic -depth
 Always true;
 same as the
 .Fl d
 option.
-.Ic -depth
-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
+.Ar n .
 .It Ic -empty
 True if the current file or directory is empty.
-.It Ic -exec Ar utility Op Ar argument ... ;
+.It Ic -exec Ar utility Oo Ar argument ... Oc Li \&;
 True if the program named
 .Ar utility
 returns a zero value as its exit status.
@@ -266,6 +284,10 @@
 may be passed to the utility.
 The expression must be terminated by a semicolon
 .Pq Dq Li \&; .
+If you invoke
+.Nm
+from a shell you may need to quote the semicolon if the shell would
+otherwise treat it as a control operator.
 If the string
 .Dq Li {}
 appears anywhere in the utility name or the
@@ -279,7 +301,16 @@
 .Ar arguments
 are not subject to the further expansion of shell patterns
 and constructs.
-.It Ic -execdir Ar utility Op Ar argument ... ;
+.It Ic -exec Ar utility Oo Ar argument ... Oc Li {} +
+Same as
+.Ic -exec ,
+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 -execdir Ar utility Oo Ar argument ... Oc Li \&;
 The
 .Ic -execdir
 primary is identical to the
@@ -385,11 +416,11 @@
 .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
+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
 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
+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
@@ -397,11 +428,24 @@
 .Nm ls Fl dgils .
 .Ek
 .It Ic -maxdepth Ar n
-True if the depth of the current file into the tree is less than or equal to
-.Ar n .
+Always true; descend at most
+.Ar n
+directory levels below the command line arguments.
+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
+limits the whole search to the command line arguments.
 .It Ic -mindepth Ar n
-True if the depth of the current file into the tree is greater than or equal to
+Always true; do not apply any tests or actions at levels less than
 .Ar n .
+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
+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
 .Nm
@@ -415,9 +459,9 @@
 If no units are specified, this primary evaluates to
 true if the difference between the file last modification time and the time
 .Nm
-was started, rounded up to the next full 24\-hour period, is
+was started, rounded up to the next full 24-hour period, is
 .Ar n
-24\-hour periods.
+24-hour periods.
 .Pp
 If units are specified, this primary evaluates to
 true if the difference between the file last modification time and the time
@@ -492,7 +536,7 @@
 value of the
 .Ic -ok
 expression is false.
-.It Ic -okdir Ar utility Op Ar argument ... ;
+.It Ic -okdir Ar utility Oo Ar argument ... Oc Li \&;
 The
 .Ic -okdir
 primary is identical to the
@@ -597,7 +641,7 @@
 or
 .Dq Li /foo/ .
 .It Ic -size Ar n Ns Op Cm c
-True if the file's size, rounded up, in 512\-byte blocks is
+True if the file's size, rounded up, in 512-byte blocks is
 .Ar n .
 If
 .Ar n
@@ -715,10 +759,34 @@
 .Dq wnj
 or that are newer than
 .Pa ttt .
-.It Li "find . -newerct '1 minute ago' -print"
+.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 -L /usr/ports/packages -type l -delete"
+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 -print"
+Is not equivalent to the previous example, since
+.Ic -prune
+is not evaluated below level seven.
 .El
+.Sh COMPATIBILITY
+The
+.Ic -follow
+primary is deprecated; the
+.Fl L
+option should be used instead.
+See the
+.Sx STANDARDS
+section below for details.
 .Sh SEE ALSO
 .Xr chflags 1 ,
 .Xr chmod 1 ,
@@ -738,18 +806,22 @@
 The
 .Nm
 utility syntax is a superset of the syntax specified by the
-.St -p1003.2
+.St -p1003.1-2001
 standard.
 .Pp
-All the single character options as well as the
+All the single character options except
+.Ic -H
+and
+.Ic -L
+as well as the
 .Ic -iname , -inum , -iregex , -print0 , -delete , -ls ,
 and
 .Ic -regex
 primaries are extensions to
-.St -p1003.2 .
+.St -p1003.1-2001 .
 .Pp
 Historically, the
-.Fl d , h
+.Fl d , L
 and
 .Fl x
 options were implemented using the primaries
@@ -791,10 +863,16 @@
 .Pp
 The
 .Fl E
-option was implemented on the analogy of
+option was inspired by the equivalent
 .Xr grep 1
 and
-.Xr sed 1 .
+.Xr sed 1
+options.
+.Sh HISTORY
+A
+.Nm
+command appeared in
+.At v1 .
 .Sh BUGS
 The special characters used by
 .Nm
@@ -830,8 +908,11 @@
 .Ic -delete
 primary does not interact well with other options that cause the file system
 tree traversal options to be changed.
-.Sh HISTORY
-A
-.Nm
-command appeared in
-.At v1 .
+.Pp
+The
+.Ic -mindepth
+and
+.Ic -maxdepth
+primaries are actually global options (as documented above).
+They should
+probably be replaced by options which look like options.
diff -Nru dfly/src/usr.bin/find/find.c fbsd/src/usr.bin/find/find.c
--- dfly/src/usr.bin/find/find.c	2003-10-04 23:36:44.000000000 +0300
+++ fbsd/src/usr.bin/find/find.c	2005-01-16 22:16:28.000000000 +0200
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)find.c	8.5 (Berkeley) 8/5/94
- * $FreeBSD: src/usr.bin/find/find.c,v 1.7.6.3 2001/05/06 09:53:22 phk Exp $
+ * $FreeBSD: src/usr.bin/find/find.c,v 1.17 2004/05/28 17:17:15 eik Exp $
  * $DragonFly: src/usr.bin/find/find.c,v 1.3 2003/10/04 20:36:44 hmp Exp $
  */
 
@@ -46,12 +46,12 @@
 #include <fts.h>
 #include <regex.h>
 #include <stdio.h>
-#include <string.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "find.h"
 
-static int	find_compare(const FTSENT **s1, const FTSENT **s2);
+static int find_compare(const FTSENT * const *s1, const FTSENT * const *s2);
 
 /*
  * find_compare --
@@ -60,7 +60,7 @@
  *	order within each directory.
  */
 static int
-find_compare(const FTSENT **s1, const FTSENT **s2)
+find_compare(const FTSENT * const *s1, const FTSENT * const *s2)
 {
 
 	return (strcoll((*s1)->fts_name, (*s2)->fts_name));
@@ -72,7 +72,7 @@
  *	command arguments.
  */
 PLAN *
-find_formplan(char **argv)
+find_formplan(char *argv[])
 {
 	PLAN *plan, *tail, *new;
 
@@ -110,23 +110,23 @@
 	 */
 	if (!isoutput) {
 		OPTION *p;
-		char **argv = 0;
+		char **argv1 = 0;
 
 		if (plan == NULL) {
-			p = option("-print");
-			new = (p->create)(p, &argv);
+			p = lookup_option("-print");
+			new = (p->create)(p, &argv1);
 			tail = plan = new;
 		} else {
-			p = option("(");
-			new = (p->create)(p, &argv);
+			p = lookup_option("(");
+			new = (p->create)(p, &argv1);
 			new->next = plan;
 			plan = new;
-			p = option(")");
-			new = (p->create)(p, &argv);
+			p = lookup_option(")");
+			new = (p->create)(p, &argv1);
 			tail->next = new;
 			tail = new;
-			p = option("-print");
-			new = (p->create)(p, &argv);
+			p = lookup_option("-print");
+			new = (p->create)(p, &argv1);
 			tail->next = new;
 			tail = new;
 		}
@@ -167,14 +167,11 @@
  * find_execute --
  *	take a search plan and an array of search paths and executes the plan
  *	over all FTSENT's returned for the given search paths.
- *
- * plan: search plan
- * paths: array of pathnames to traverse
  */
 int
-find_execute(PLAN *plan, char **paths)
+find_execute(PLAN *plan, char *paths[])
 {
-	register FTSENT *entry;
+	FTSENT *entry;
 	PLAN *p;
 	int rval;
 
@@ -183,6 +180,11 @@
 		err(1, "ftsopen");
 
 	for (rval = 0; (entry = fts_read(tree)) != NULL;) {
+		if (maxdepth != -1 && entry->fts_level >= maxdepth) {
+			if (fts_set(tree, entry, FTS_SKIP))
+				err(1, "%s", entry->fts_path);
+		}
+
 		switch (entry->fts_info) {
 		case FTS_D:
 			if (isdepth)
@@ -222,13 +224,11 @@
 		 * the work specified by the user on the command line.
 		 */
 		for (p = plan; p && (p->execute)(p, entry); p = p->next);
-
-		if (maxdepth != -1 && entry->fts_level >= maxdepth) {
-			if (fts_set(tree, entry, FTS_SKIP))
-			err(1, "%s", entry->fts_path);
-			continue;
-		}
 	}
+	/* 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);
 	if (errno)
 		err(1, "fts_read");
 	return (rval);
diff -Nru dfly/src/usr.bin/find/find.h fbsd/src/usr.bin/find/find.h
--- dfly/src/usr.bin/find/find.h	2003-11-03 21:31:29.000000000 +0200
+++ fbsd/src/usr.bin/find/find.h	2005-01-16 22:17:11.000000000 +0200
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)find.h	8.1 (Berkeley) 6/6/93
- *	$FreeBSD: src/usr.bin/find/find.h,v 1.6.2.7 2002/11/15 11:38:15 sheldonh Exp $
+ *	$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.3 2003/11/03 19:31:29 eirikn Exp $
  */
 
@@ -58,6 +58,7 @@
 #define	F_TIME2_C	0x00000020	/* one of -newer?c */
 #define	F_TIME2_T	0x00000040	/* one of -newer?t */
 #define F_MAXDEPTH	F_TIME_A	/* maxdepth vs. mindepth */
+#define F_DEPTH		F_TIME_A	/* -depth n vs. -d */
 /* command line function modifiers */
 #define	F_EQUAL		0x00000000	/* [acm]min [acm]time inum links size */
 #define	F_LESSTHAN	0x00000100
@@ -68,8 +69,10 @@
 #define	F_MTMASK	0x00003000
 #define	F_MTFLAG	0x00000000	/* fstype */
 #define	F_MTTYPE	0x00001000
+#define	F_MTUNKNOWN	0x00002000
 #define	F_IGNCASE	0x00010000	/* iname ipath iregex */
 #define	F_EXACTTIME	F_IGNCASE	/* -[acm]time units syntax */
+#define F_EXECPLUS	0x00020000	/* -exec ... {} + */
 
 /* node definition */
 typedef struct _plandata {
@@ -85,6 +88,7 @@
 			u_long _f_notflags;
 		} fl;
 		nlink_t _l_data;		/* link count */
+		short _d_data;			/* level depth (-1 to N) */
 		off_t _o_data;			/* file size */
 		time_t _t_data;			/* time value */
 		uid_t _u_data;			/* uid */
@@ -94,6 +98,12 @@
 			char **_e_argv;		/* argv array */
 			char **_e_orig;		/* original strings */
 			int *_e_len;		/* allocated length */
+			int _e_pbnum;		/* base num. of args. used */
+			int _e_ppos;		/* number of arguments used */
+			int _e_pnummax;		/* max. number of arguments */
+			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 */
 		} ex;
 		char *_a_data[2];		/* array of char pointers */
 		char *_c_data;			/* char pointer */
@@ -102,6 +112,7 @@
 } PLAN;
 #define	a_data	p_un._a_data
 #define	c_data	p_un._c_data
+#define	d_data	p_un._d_data
 #define fl_flags	p_un.fl._f_flags
 #define fl_notflags	p_un.fl._f_notflags
 #define	g_data	p_un._g_data
@@ -117,9 +128,15 @@
 #define	e_argv	p_un.ex._e_argv
 #define	e_orig	p_un.ex._e_orig
 #define	e_len	p_un.ex._e_len
+#define e_pbnum	p_un.ex._e_pbnum
+#define e_ppos	p_un.ex._e_ppos
+#define e_pnummax p_un.ex._e_pnummax
+#define e_psize p_un.ex._e_psize
+#define e_pbsize p_un.ex._e_pbsize
+#define e_psizemax p_un.ex._e_psizemax
 
 typedef struct _option {
-	char *name;			/* option name */
+	const char *name;		/* option name */
 	creat_f *create;		/* create function */
 	exec_f *execute;		/* execute function */
 	int flags;
diff -Nru dfly/src/usr.bin/find/function.c fbsd/src/usr.bin/find/function.c
--- dfly/src/usr.bin/find/function.c	2004-11-28 23:17:07.000000000 +0200
+++ fbsd/src/usr.bin/find/function.c	2005-01-16 22:25:51.000000000 +0200
@@ -34,13 +34,14 @@
  * SUCH DAMAGE.
  *
  * @(#)function.c  8.10 (Berkeley) 5/4/95
- * $FreeBSD: src/usr.bin/find/function.c,v 1.22.2.11 2002/11/15 11:38:15 sheldonh Exp $
+ * $FreeBSD: src/usr.bin/find/function.c,v 1.52 2004/07/29 03:33:55 tjr Exp $
  * $DragonFly: src/usr.bin/find/function.c,v 1.4 2004/11/28 21:17:07 liamfoy 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>
@@ -51,16 +52,23 @@
 #include <fnmatch.h>
 #include <fts.h>
 #include <grp.h>
+#include <limits.h>
 #include <pwd.h>
 #include <regex.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <ctype.h>
 
 #include "find.h"
 
-time_t get_date (char *date, struct timeb *now);
+static PLAN *palloc(OPTION *);
+static long long find_parsenum(PLAN *, const char *, char *, char *);
+static long long find_parsetime(PLAN *, const char *, char *);
+static char *nextarg(OPTION *, char ***);
+
+extern char **environ;
 
 #define	COMPARE(a, b) do {						\
 	switch (plan->flags & F_ELG_MASK) {				\
@@ -93,7 +101,7 @@
  *	Parse a string of the form [+-]# and return the value.
  */
 static long long
-find_parsenum(PLAN *plan, char *option, char *vp, char *endch)
+find_parsenum(PLAN *plan, const char *option, char *vp, char *endch)
 {
 	long long value;
 	char *endchar, *str;	/* Pointer to character ending conversion. */
@@ -134,7 +142,7 @@
  *	Parse a string of the form [+-]([0-9]+[smhdw]?)+ and return the value.
  */
 static long long
-find_parsetime(PLAN *plan, char *option, char *vp)
+find_parsetime(PLAN *plan, const char *option, char *vp)
 {
 	long long secs, value;
 	char *str, *unit;	/* Pointer to character ending conversion. */
@@ -241,8 +249,6 @@
 int
 f_Xmin(PLAN *plan, FTSENT *entry)
 {
-	extern time_t now;
-
 	if (plan->flags & F_TIME_C) {
 		COMPARE((now - entry->fts_statp->st_ctime +
 		    60 - 1) / 60, plan->t_data);
@@ -283,33 +289,19 @@
 int
 f_Xtime(PLAN *plan, FTSENT *entry)
 {
-	extern time_t now;
-	int exact_time;
+	time_t xtime;
 
-	exact_time = plan->flags & F_EXACTTIME;
+	if (plan->flags & F_TIME_A)
+		xtime = entry->fts_statp->st_atime;
+	else if (plan->flags & F_TIME_C)
+		xtime = entry->fts_statp->st_ctime;
+	else
+		xtime = entry->fts_statp->st_mtime;
 
-	if (plan->flags & F_TIME_C) {
-		if (exact_time)
-			COMPARE(now - entry->fts_statp->st_ctime,
-			    plan->t_data);
-		else
-			COMPARE((now - entry->fts_statp->st_ctime +
-			    86400 - 1) / 86400, plan->t_data);
-	} else if (plan->flags & F_TIME_A) {
-		if (exact_time)
-			COMPARE(now - entry->fts_statp->st_atime,
-			    plan->t_data);
-		else
-			COMPARE((now - entry->fts_statp->st_atime +
-			    86400 - 1) / 86400, plan->t_data);
-	} else {
-		if (exact_time)
-			COMPARE(now - entry->fts_statp->st_mtime,
-			    plan->t_data);
-		else
-			COMPARE((now - entry->fts_statp->st_mtime +
-			    86400 - 1) / 86400, plan->t_data);
-	}
+	if (plan->flags & F_EXACTTIME)
+		COMPARE(now - xtime, plan->t_data);
+	else
+		COMPARE((now - xtime + 86400 - 1) / 86400, plan->t_data);
 }
 
 PLAN *
@@ -362,7 +354,7 @@
  *	True always.  Makes its best shot and continues on regardless.
  */
 int
-f_delete(PLAN *plan, FTSENT *entry)
+f_delete(PLAN *plan __unused, FTSENT *entry)
 {
 	/* ignore these from fts */
 	if (strcmp(entry->fts_accpath, ".") == 0 ||
@@ -402,7 +394,7 @@
 }
 
 PLAN *
-c_delete(OPTION *option, char ***argvp)
+c_delete(OPTION *option, char ***argvp __unused)
 {
 
 	ftsoptions &= ~FTS_NOSTAT;	/* no optimise */
@@ -416,33 +408,72 @@
 
 
 /*
- * -depth functions --
+ * always_true --
  *
- *	Always true, causes descent of the directory hierarchy to be done
- *	so that all entries in a directory are acted on before the directory
- *	itself.
+ *	Always true, used for -maxdepth, -mindepth, -xdev and -follow
  */
 int
-f_always_true(PLAN *plan, FTSENT *entry)
+f_always_true(PLAN *plan __unused, FTSENT *entry __unused)
 {
 	return 1;
 }
 
+/*
+ * -depth functions --
+ *
+ *	With argument: True if the file is at level n.
+ *	Without argument: Always true, causes descent of the directory hierarchy
+ *	to be done so that all entries in a directory are acted on before the
+ *	directory itself.
+ */
+int
+f_depth(PLAN *plan, FTSENT *entry)
+{
+	if (plan->flags & F_DEPTH)
+		COMPARE(entry->fts_level, plan->d_data);
+	else
+		return 1;
+}
+
 PLAN *
 c_depth(OPTION *option, char ***argvp)
 {
-	isdepth = 1;
+	PLAN *new;
+	char *str;
 
-	return palloc(option);
-}
+	new = palloc(option);
+
+	str = **argvp;
+	if (str && !(new->flags & F_DEPTH)) {
+		/* skip leading + or - */
+		if (*str == '+' || *str == '-')
+			str++;
+		/* skip sign */
+		if (*str == '+' || *str == '-')
+			str++;
+		if (isdigit(*str))
+			new->flags |= F_DEPTH;
+	}
+
+	if (new->flags & F_DEPTH) {	/* -depth n */
+		char *ndepth;
+
+		ndepth = nextarg(option, argvp);
+		new->d_data = find_parsenum(new, option->name, ndepth, NULL);
+	} else {			/* -d */
+		isdepth = 1;
+	}
 
+	return new;
+}
+ 
 /*
  * -empty functions --
  *
  *	True if the file or directory is empty
  */
 int
-f_empty(PLAN *plan, FTSENT *entry)
+f_empty(PLAN *plan __unused, FTSENT *entry)
 {
 	if (S_ISREG(entry->fts_statp->st_mode) &&
 	    entry->fts_statp->st_size == 0)
@@ -470,7 +501,7 @@
 }
 
 PLAN *
-c_empty(OPTION *option, char ***argvp)
+c_empty(OPTION *option, char ***argvp __unused)
 {
 	ftsoptions &= ~FTS_NOSTAT;
 
@@ -493,14 +524,20 @@
  *	of the user before executing the utility.
  */
 int
-f_exec(register PLAN *plan, FTSENT *entry)
+f_exec(PLAN *plan, FTSENT *entry)
 {
-	extern int dotfd;
-	register int cnt;
+	int cnt;
 	pid_t pid;
 	int status;
 	char *file;
 
+	if (entry == NULL && plan->flags & F_EXECPLUS) {
+		if (plan->e_ppos == plan->e_pbnum)
+			return (1);
+		plan->e_argv[plan->e_ppos] = NULL;
+		goto doexec;
+	}
+
 	/* XXX - if file/dir ends in '/' this will not work -- can it? */
 	if ((plan->flags & F_EXECDIR) && \
 	    (file = strrchr(entry->fts_path, '/')))
@@ -508,12 +545,24 @@
 	else
 		file = entry->fts_path;
 
-	for (cnt = 0; plan->e_argv[cnt]; ++cnt)
-		if (plan->e_len[cnt])
-			brace_subst(plan->e_orig[cnt], &plan->e_argv[cnt],
-			    file, plan->e_len[cnt]);
+	if (plan->flags & F_EXECPLUS) {
+		if ((plan->e_argv[plan->e_ppos] = strdup(file)) == NULL)
+			err(1, NULL);
+		plan->e_len[plan->e_ppos] = strlen(file);
+		plan->e_psize += plan->e_len[plan->e_ppos];
+		if (++plan->e_ppos < plan->e_pnummax &&
+		    plan->e_psize < plan->e_psizemax)
+			return (1);
+		plan->e_argv[plan->e_ppos] = NULL;
+	} else {
+		for (cnt = 0; plan->e_argv[cnt]; ++cnt)
+			if (plan->e_len[cnt])
+				brace_subst(plan->e_orig[cnt],
+				    &plan->e_argv[cnt], file,
+				    plan->e_len[cnt]);
+	}
 
-	if ((plan->flags & F_NEEDOK) && !queryuser(plan->e_argv))
+doexec:	if ((plan->flags & F_NEEDOK) && !queryuser(plan->e_argv))
 		return 0;
 
 	/* make sure find output is interspersed correctly with subprocesses */
@@ -534,6 +583,12 @@
 		warn("%s", plan->e_argv[0]);
 		_exit(1);
 	}
+	if (plan->flags & F_EXECPLUS) {
+		while (--plan->e_ppos >= plan->e_pbnum)
+			free(plan->e_argv[plan->e_ppos]);
+		plan->e_ppos = plan->e_pbnum;
+		plan->e_psize = plan->e_pbsize;
+	}
 	pid = waitpid(pid, &status, 0);
 	return (pid != -1 && WIFEXITED(status) && !WEXITSTATUS(status));
 }
@@ -549,8 +604,9 @@
 c_exec(OPTION *option, char ***argvp)
 {
 	PLAN *new;			/* node returned */
-	register int cnt;
-	register char **argv, **ap, *p;
+	long argmax;
+	int cnt, i;
+	char **argv, **ap, **ep, *p;
 
 	/* XXX - was in c_execdir, but seems unnecessary!?
 	ftsoptions &= ~FTS_NOSTAT;
@@ -563,24 +619,54 @@
 	for (ap = argv = *argvp;; ++ap) {
 		if (!*ap)
 			errx(1,
-			    "%s: no terminating \";\"", option->name);
+			    "%s: no terminating \";\" or \"+\"", option->name);
 		if (**ap == ';')
 			break;
+		if (**ap == '+' && ap != argv && strcmp(*(ap - 1), "{}") == 0) {
+			new->flags |= F_EXECPLUS;
+			break;
+		}
 	}
 
 		errx(1, "%s: no command specified", option->name);
 
 	cnt = ap - *argvp + 1;
-	new->e_argv = (char **)emalloc((u_int)cnt * sizeof(char *));
-	new->e_orig = (char **)emalloc((u_int)cnt * sizeof(char *));
-	new->e_len = (int *)emalloc((u_int)cnt * sizeof(int));
+	if (new->flags & F_EXECPLUS) {
+		new->e_ppos = new->e_pbnum = cnt - 2;
+		if ((argmax = sysconf(_SC_ARG_MAX)) == -1) {
+			warn("sysconf(_SC_ARG_MAX)");
+			argmax = _POSIX_ARG_MAX;
+		}
+		argmax -= 1024;
+		for (ep = environ; *ep != NULL; ep++)
+			argmax -= strlen(*ep) + 1 + sizeof(*ep);
+		argmax -= 1 + sizeof(*ep);
+		new->e_pnummax = argmax / 16;
+		argmax -= sizeof(char *) * new->e_pnummax;
+		if (argmax <= 0)
+			errx(1, "no space for arguments");
+		new->e_psizemax = argmax;
+		new->e_pbsize = 0;
+		cnt += new->e_pnummax + 1;
+	}
+	if ((new->e_argv = malloc(cnt * sizeof(char *))) == NULL)
+		err(1, NULL);
+	if ((new->e_orig = malloc(cnt * sizeof(char *))) == NULL)
+		err(1, NULL);
+	if ((new->e_len = malloc(cnt * sizeof(int))) == NULL)
+		err(1, NULL);
 
 	for (argv = *argvp, cnt = 0; argv < ap; ++argv, ++cnt) {
 		new->e_orig[cnt] = *argv;
+		if (new->flags & F_EXECPLUS)
+			new->e_pbsize += strlen(*argv) + 1;
 		for (p = *argv; *p; ++p)
-			if (p[0] == '{' && p[1] == '}') {
-				new->e_argv[cnt] = emalloc((u_int)MAXPATHLEN);
+			if (!(new->flags & F_EXECPLUS) && p[0] == '{' &&
+			    p[1] == '}') {
+				if ((new->e_argv[cnt] =
+				    malloc(MAXPATHLEN)) == NULL)
+					err(1, NULL);
 				new->e_len[cnt] = MAXPATHLEN;
 				break;
 			}
@@ -589,9 +675,20 @@
 			new->e_len[cnt] = 0;
 		}
 	}
+	if (new->flags & F_EXECPLUS) {
+		new->e_psize = new->e_pbsize;
+		cnt--;
+		for (i = 0; i < new->e_pnummax; i++) {
+			new->e_argv[cnt] = NULL;
+			new->e_len[cnt] = 0;
+			cnt++;
+		}
+		argv = ap;
+		goto done;
+	}
 	new->e_argv[cnt] = new->e_orig[cnt] = NULL;
 
-	*argvp = argv + 1;
+done:	*argvp = argv + 1;
 	return new;
 }
 
@@ -646,7 +743,7 @@
  *	basis.
  */
 PLAN *
-c_follow(OPTION *option, char ***argvp)
+c_follow(OPTION *option, char ***argvp __unused)
 {
 	ftsoptions &= ~FTS_PHYSICAL;
 	ftsoptions |= FTS_LOGICAL;
@@ -668,12 +765,15 @@
 	static int val_type, val_flags;
 	char *p, save[2];
 
+	if ((plan->flags & F_MTMASK) == F_MTUNKNOWN)
+		return 0;
+
 	/* Only check when we cross mount point. */
 	if (first || curdev != entry->fts_statp->st_dev) {
 		curdev = entry->fts_statp->st_dev;
 
 		/*
-		 * Statfs follows symlinks; find wants the link's file system,
+		 * Statfs follows symlinks; find wants the link's filesystem,
 		 * not where it points.
 		 */
 		if (entry->fts_info == FTS_SL ||
@@ -708,20 +808,19 @@
 	}
 	switch (plan->flags & F_MTMASK) {
 	case F_MTFLAG:
-		return (val_flags & plan->mt_data) != 0;
+		return val_flags & plan->mt_data;
 	case F_MTTYPE:
-		return (val_type == plan->mt_data);
+		return val_type == plan->mt_data;
 	default:
 		abort();
 	}
 }
 
-#if !defined(__NetBSD__)
 PLAN *
 c_fstype(OPTION *option, char ***argvp)
 {
 	char *fsname;
-	register PLAN *new;
+	PLAN *new;
 	struct vfsconf vfc;
 
 	fsname = nextarg(option, argvp);
@@ -755,10 +854,14 @@
 		break;
 	}
 
-	errx(1, "%s: unknown file type", fsname);
-	/* NOTREACHED */
+	/*
+	 * 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;
+	return new;
 }
-#endif /* __NetBSD__ */
 
 /*
  * -group gname functions --
@@ -853,14 +956,14 @@
  *	Always true - prints the current entry to stdout in "ls" format.
  */
 int
-f_ls(PLAN *plan, FTSENT *entry)
+f_ls(PLAN *plan __unused, FTSENT *entry)
 {
 	printlong(entry->fts_path, entry->fts_accpath, entry->fts_statp);
 	return 1;
 }
 
 PLAN *
-c_ls(OPTION *option, char ***argvp)
+c_ls(OPTION *option, char ***argvp __unused)
 {
 	ftsoptions &= ~FTS_NOSTAT;
 	isoutput = 1;
@@ -947,13 +1050,13 @@
  *	of the getgrnam() 9.2.1 [POSIX.1] function returns NULL.
  */
 int
-f_nogroup(PLAN *plan, FTSENT *entry)
+f_nogroup(PLAN *plan __unused, FTSENT *entry)
 {
 	return group_from_gid(entry->fts_statp->st_gid, 1) == NULL;
 }
 
 PLAN *
-c_nogroup(OPTION *option, char ***argvp)
+c_nogroup(OPTION *option, char ***argvp __unused)
 {
 	ftsoptions &= ~FTS_NOSTAT;
 
@@ -967,13 +1070,13 @@
  *	of the getpwuid() 9.2.2 [POSIX.1] function returns NULL.
  */
 int
-f_nouser(PLAN *plan, FTSENT *entry)
+f_nouser(PLAN *plan __unused, FTSENT *entry)
 {
 	return user_from_uid(entry->fts_statp->st_uid, 1) == NULL;
 }
 
 PLAN *
-c_nouser(OPTION *option, char ***argvp)
+c_nouser(OPTION *option, char ***argvp __unused)
 {
 	ftsoptions &= ~FTS_NOSTAT;
 
@@ -1038,13 +1141,8 @@
 		++perm;
 	}
 
-	errno = 0;
-	if ((set = setmode(perm)) == NULL) {
-		if (!errno) 
-			errx(1, "%s: %s: illegal mode string", option->name, perm);
-		else
-			err(1, "malloc failed");
-	}
+	if ((set = setmode(perm)) == NULL)
+		errx(1, "%s: %s: illegal mode string", option->name, perm);
 
 	new->m_data = getmode(set, 0);
 	free(set);
@@ -1054,18 +1152,18 @@
 /*
  * -print functions --
  *
- *	Always true, causes the current pathame to be written to
+ *	Always true, causes the current pathname to be written to
  *	standard output.
  */
 int
-f_print(PLAN *plan, FTSENT *entry)
+f_print(PLAN *plan __unused, FTSENT *entry)
 {
 	(void)puts(entry->fts_path);
 	return 1;
 }
 
 PLAN *
-c_print(OPTION *option, char ***argvp)
+c_print(OPTION *option, char ***argvp __unused)
 {
 	isoutput = 1;
 
@@ -1075,11 +1173,11 @@
 /*
  * -print0 functions --
  *
- *	Always true, causes the current pathame to be written to
+ *	Always true, causes the current pathname to be written to
  *	standard output followed by a NUL character
  */
 int
-f_print0(PLAN *plan, FTSENT *entry)
+f_print0(PLAN *plan __unused, FTSENT *entry)
 {
 	fputs(entry->fts_path, stdout);
 	fputc('\0', stdout);
@@ -1094,10 +1192,8 @@
  *	Prune a portion of the hierarchy.
  */
 int
-f_prune(PLAN *plan, FTSENT *entry)
+f_prune(PLAN *plan __unused, FTSENT *entry)
 {
-	extern FTS *tree;
-
 	if (fts_set(tree, entry, FTS_SKIP))
 		err(1, "%s", entry->fts_path);
 	return 1;
@@ -1115,7 +1211,7 @@
 f_regex(PLAN *plan, FTSENT *entry)
 {
 	char *str;
-	size_t len;
+	int len;
 	regex_t *pre;
 	regmatch_t pmatch;
 	int errcode;
@@ -1175,7 +1271,7 @@
 /* c_simple covers c_prune, c_openparen, c_closeparen, c_not, c_or */
 
 PLAN *
-c_simple(OPTION *option, char ***argvp)
+c_simple(OPTION *option, char ***argvp __unused)
 {
 	return palloc(option);
 }
@@ -1318,11 +1414,11 @@
 /*
  * -xdev functions --
  *
- *	Always true, causes find not to decend past directories that have a
+ *	Always true, causes find not to descend past directories that have a
  *	different device ID (st_dev, see stat() S5.6.2 [POSIX.1])
  */
 PLAN *
-c_xdev(OPTION *option, char ***argvp)
+c_xdev(OPTION *option, char ***argvp __unused)
 {
 	ftsoptions |= FTS_XDEV;
 
@@ -1337,8 +1433,8 @@
 int
 f_expr(PLAN *plan, FTSENT *entry)
 {
-	register PLAN *p;
-	register int state = 0;
+	PLAN *p;
+	int state = 0;
 
 	for (p = plan->p_data[0];
 	    p && (state = (p->execute)(p, entry)); p = p->next);
@@ -1353,13 +1449,13 @@
  */
 
 int
-f_openparen(PLAN *plan, FTSENT *entry)
+f_openparen(PLAN *plan __unused, FTSENT *entry __unused)
 {
 	abort();
 }
 
 int
-f_closeparen(PLAN *plan, FTSENT *entry)
+f_closeparen(PLAN *plan __unused, FTSENT *entry __unused)
 {
 	abort();
 }
@@ -1371,7 +1467,7 @@
  * AND operator. Since AND is implicit, no node is allocated.
  */
 PLAN *
-c_and(OPTION *option, char ***argvp)
+c_and(OPTION *option __unused, char ***argvp __unused)
 {
 	return NULL;
 }
@@ -1384,8 +1480,8 @@
 int
 f_not(PLAN *plan, FTSENT *entry)
 {
-	register PLAN *p;
-	register int state = 0;
+	PLAN *p;
+	int state = 0;
 
 	for (p = plan->p_data[0];
 	    p && (state = (p->execute)(p, entry)); p = p->next);
@@ -1403,8 +1499,8 @@
 int
 f_or(PLAN *plan, FTSENT *entry)
 {
-	register PLAN *p;
-	register int state = 0;
+	PLAN *p;
+	int state = 0;
 
 	for (p = plan->p_data[0];
 	    p && (state = (p->execute)(p, entry)); p = p->next);
diff -Nru dfly/src/usr.bin/find/getdate.y fbsd/src/usr.bin/find/getdate.y
--- dfly/src/usr.bin/find/getdate.y	2003-06-17 07:29:26.000000000 +0300
+++ fbsd/src/usr.bin/find/getdate.y	2005-01-16 22:18:26.000000000 +0200
@@ -12,7 +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.2.4.1 2003/01/22 03:26:34 peter Exp $ */
+/* $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.2 2003/06/17 04:29:26 dillon Exp $ */
 
 #include <stdio.h>
@@ -59,16 +59,17 @@
    unportable getdate.c's), but that seems to cause as many problems
    as it solves.  */
 
-extern struct tm	*gmtime();
-extern struct tm	*localtime();
+#include <time.h>
 
 #define yyparse getdate_yyparse
 #define yylex getdate_yylex
 #define yyerror getdate_yyerror
 
-static int yyparse ();
-static int yylex ();
-static int yyerror ();
+static int yyparse(void);
+static int yylex(void);
+static int yyerror(const char *);
+
+time_t get_date(char *, struct timeb *);
 
 #define EPOCH		1970
 #define HOUR(x)		((time_t)(x) * 60)
@@ -79,7 +80,7 @@
 **  An entry in the lexical lookup table.
 */
 typedef struct _TABLE {
-    char	*name;
+    const char	*name;
     int		type;
     time_t	value;
 } TABLE;
@@ -374,7 +375,7 @@
     { "thurs",		tDAY, 4 },
     { "friday",		tDAY, 5 },
     { "saturday",	tDAY, 6 },
-    { NULL }
+    { NULL,		0, 0 }
 };
 
 /* Time units table. */
@@ -389,7 +390,7 @@
     { "min",		tMINUTE_UNIT,	1 },
     { "second",		tSEC_UNIT,	1 },
     { "sec",		tSEC_UNIT,	1 },
-    { NULL }
+    { NULL,		0,		0 }
 };
 
 /* Assorted relative-time words. */
@@ -413,8 +414,8 @@
     { "tenth",		tUNUMBER,	10 },
     { "eleventh",	tUNUMBER,	11 },
     { "twelfth",	tUNUMBER,	12 },
-    { "ago",		tAGO,	1 },
-    { NULL }
+    { "ago",		tAGO,		1 },
+    { NULL,		0,		0 }
 };
 
 /* The timezone table. */
@@ -499,7 +500,7 @@
     { "nzst",	tZONE,     -HOUR(12) },	/* New Zealand Standard */
     { "nzdt",	tDAYZONE,  -HOUR(12) },	/* New Zealand Daylight */
     { "idle",	tZONE,     -HOUR(12) },	/* International Date Line East */
-    {  NULL  }
+    {  NULL,	0,	   0 }
 };
 
 /* Military timezone table. */
@@ -529,7 +530,7 @@
     { "x",	tZONE,	HOUR(-11) },
     { "y",	tZONE,	HOUR(-12) },
     { "z",	tZONE,	HOUR(  0) },
-    { NULL }
+    { NULL,	0,	0 }
 };
 
 
@@ -537,19 +538,14 @@
 
 /* ARGSUSED */
 static int
-yyerror(s)
-    char	*s __unused;
+yyerror(const char *s __unused)
 {
   return 0;
 }
 
 
 static time_t
-ToSeconds(Hours, Minutes, Seconds, Meridian)
-    time_t	Hours;
-    time_t	Minutes;
-    time_t	Seconds;
-    MERIDIAN	Meridian;
+ToSeconds(time_t Hours, time_t Minutes, time_t Seconds, MERIDIAN Meridian)
 {
     if (Minutes < 0 || Minutes > 59 || Seconds < 0 || Seconds > 59)
 	return -1;
@@ -582,15 +578,9 @@
    * A number from 0 to 99, which means a year from 1900 to 1999, or
    * The actual year (>=100).  */
 static time_t
-Convert(Month, Day, Year, Hours, Minutes, Seconds, Meridian, DSTmode)
-    time_t	Month;
-    time_t	Day;
-    time_t	Year;
-    time_t	Hours;
-    time_t	Minutes;
-    time_t	Seconds;
-    MERIDIAN	Meridian;
-    DSTMODE	DSTmode;
+Convert(time_t Month, time_t Day, time_t Year,
+	time_t Hours, time_t Minutes, time_t Seconds,
+	MERIDIAN Meridian, DSTMODE DSTmode)
 {
     static int DaysInMonth[12] = {
 	31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
@@ -632,9 +622,7 @@
 
 
 static time_t
-DSTcorrect(Start, Future)
-    time_t	Start;
-    time_t	Future;
+DSTcorrect(time_t Start, time_t Future)
 {
     time_t	StartDay;
     time_t	FutureDay;
@@ -646,10 +634,7 @@
 
 
 static time_t
-RelativeDate(Start, DayOrdinal, DayNumber)
-    time_t	Start;
-    time_t	DayOrdinal;
-    time_t	DayNumber;
+RelativeDate(time_t Start, time_t DayOrdinal, time_t DayNumber)
 {
     struct tm	*tm;
     time_t	now;
@@ -663,9 +648,7 @@
 
 
 static time_t
-RelativeMonth(Start, RelMonth)
-    time_t	Start;
-    time_t	RelMonth;
+RelativeMonth(time_t Start, time_t RelMonth)
 {
     struct tm	*tm;
     time_t	Month;
@@ -685,14 +668,13 @@
 
 
 static int
-LookupWord(buff)
-    char		*buff;
+LookupWord(char *buff)
 {
-    register char	*p;
-    register char	*q;
-    register const TABLE	*tp;
-    int			i;
-    int			abbrev;
+    char	*p;
+    char	*q;
+    const TABLE	*tp;
+    int		i;
+    int		abbrev;
 
     /* Make it lowercase. */
     for (p = buff; *p; p++)
@@ -792,13 +774,13 @@
 
 
 static int
-yylex()
+yylex(void)
 {
-    register char	c;
-    register char	*p;
-    char		buff[20];
-    int			Count;
-    int			sign;
+    char	c;
+    char	*p;
+    char	buff[20];
+    int		Count;
+    int		sign;
 
     for ( ; ; ) {
 	while (isspace(*yyInput))
@@ -847,8 +829,7 @@
 
 /* Yield A - B, measured in seconds.  */
 static long
-difftm (a, b)
-     struct tm *a, *b;
+difftm (struct tm *a, struct tm *b)
 {
   int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
   int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
@@ -868,9 +849,7 @@
 }
 
 time_t
-get_date(p, now)
-    char		*p;
-    struct timeb	*now;
+get_date(char *p, struct timeb *now)
 {
     struct tm		*tm, gmt;
     struct timeb	ftz;
@@ -968,9 +947,7 @@
 
 /* ARGSUSED */
 int
-main(ac, av)
-    int		ac;
-    char	*av[];
+main(int ac, char *av[])
 {
     char	buff[128];
     time_t	d;
diff -Nru dfly/src/usr.bin/find/ls.c fbsd/src/usr.bin/find/ls.c
--- dfly/src/usr.bin/find/ls.c	2003-10-04 23:36:44.000000000 +0300
+++ fbsd/src/usr.bin/find/ls.c	2005-01-16 22:18:50.000000000 +0200
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  * @(#)ls.c	8.1 (Berkeley) 6/6/93
- * $FreeBSD: src/usr.bin/find/ls.c,v 1.5.6.3 2002/03/12 19:34:50 phantom Exp $
+ * $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.3 2003/10/04 20:36:44 hmp Exp $
  */
 
@@ -40,39 +40,39 @@
 
 #include <err.h>
 #include <errno.h>
+#include <fts.h>
+#include <grp.h>
+#include <inttypes.h>
 #include <langinfo.h>
+#include <pwd.h>
 #include <stdio.h>
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
-#include <utmp.h>
+
+#include "find.h"
 
 /* Derived from the print routines in the ls(1) source code. */
 
-static void printlink (char *);
-static void printtime (time_t);
+static void printlink(char *);
+static void printtime(time_t);
 
-/*
-name: filename to print
-accpath: current valid path to filename
-sb: stat buffer
-*/
 void
 printlong(char *name, char *accpath, struct stat *sb)
 {
-	char modep[15], *user_from_uid(), *group_from_gid();
+	char modep[15];
 
-	(void)printf("%6lu %4qd ", (u_long) sb->st_ino, sb->st_blocks);
+	(void)printf("%6lu %8"PRId64" ", (u_long) sb->st_ino, sb->st_blocks);
 	(void)strmode(sb->st_mode, modep);
-	(void)printf("%s %3u %-*s %-*s ", modep, sb->st_nlink, UT_NAMESIZE,
-	    user_from_uid(sb->st_uid, 0), UT_NAMESIZE,
+	(void)printf("%s %3u %-*s %-*s ", modep, sb->st_nlink, MAXLOGNAME - 1,
+	    user_from_uid(sb->st_uid, 0), MAXLOGNAME - 1,
 	    group_from_gid(sb->st_gid, 0));
 
 	if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode))
 		(void)printf("%3d, %3d ", major(sb->st_rdev),
 		    minor(sb->st_rdev));
 	else
-		(void)printf("%8qd ", sb->st_size);
+		(void)printf("%8"PRId64" ", sb->st_size);
 	printtime(sb->st_mtime);
 	(void)printf("%s", name);
 	if (S_ISLNK(sb->st_mode))
@@ -84,17 +84,17 @@
 printtime(time_t ftime)
 {
 	char longstring[80];
-	static time_t now;
+	static time_t lnow;
 	const char *format;
 	static int d_first = -1;
 
 	if (d_first < 0)
 		d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
-	if (now == 0)
-		now = time(NULL);
+	if (lnow == 0)
+		lnow = time(NULL);
 
 #define	SIXMONTHS	((365 / 2) * 86400)
-	if (ftime + SIXMONTHS > now && ftime < now + SIXMONTHS)
+	if (ftime + SIXMONTHS > lnow && ftime < lnow + SIXMONTHS)
 		/* mmm dd hh:mm || dd mmm hh:mm */
 		format = d_first ? "%e %b %R " : "%b %e %R ";
 	else
@@ -108,7 +108,7 @@
 printlink(char *name)
 {
 	int lnklen;
-	char path[MAXPATHLEN + 1];
+	char path[MAXPATHLEN];
 
 	if ((lnklen = readlink(name, path, MAXPATHLEN - 1)) == -1) {
 		warn("%s", name);
diff -Nru dfly/src/usr.bin/find/main.c fbsd/src/usr.bin/find/main.c
--- dfly/src/usr.bin/find/main.c	2003-10-04 23:36:44.000000000 +0300
+++ fbsd/src/usr.bin/find/main.c	2005-01-16 22:19:11.000000000 +0200
@@ -35,7 +35,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.9.6.2 2001/02/25 21:56:59 knu Exp $
+ * $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.3 2003/10/04 20:36:44 hmp Exp $
  */
 
@@ -66,12 +66,12 @@
 int mindepth = -1, maxdepth = -1; /* minimum and maximum depth */
 int regexp_flags = REG_BASIC;	/* use the "basic" regexp by default*/
 
-static void usage (void);
+static void usage(void);
 
 int
-main(int argc, char **argv)
+main(int argc, char *argv[])
 {
-	register char **p, **start;
+	char **p, **start;
 	int Hflag, Lflag, ch;
 
 	(void)setlocale(LC_ALL, "");
diff -Nru dfly/src/usr.bin/find/misc.c fbsd/src/usr.bin/find/misc.c
--- dfly/src/usr.bin/find/misc.c	2003-10-04 23:36:44.000000000 +0300
+++ fbsd/src/usr.bin/find/misc.c	2005-01-16 22:11:37.000000000 +0200
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)misc.c	8.2 (Berkeley) 4/1/94
- * $FreeBSD: src/usr.bin/find/misc.c,v 1.2.12.1 2000/06/23 18:38:46 roberto Exp $
+ * $FreeBSD: src/usr.bin/find/misc.c,v 1.7 2003/06/14 13:00:21 markm Exp $
  * $DragonFly: src/usr.bin/find/misc.c,v 1.3 2003/10/04 20:36:44 hmp Exp $
  */
 
@@ -57,8 +57,8 @@
 void
 brace_subst(char *orig, char **store, char *path, int len)
 {
-	register int plen;
-	register char ch, *p;
+	int plen;
+	char ch, *p;
 
 	plen = strlen(path);
 	for (p = *store; (ch = *orig) != '\0'; ++orig)
@@ -80,7 +80,7 @@
  *	input. If the input is 'y' then 1 is returned.
  */
 int
-queryuser(register char **argv)
+queryuser(char *argv[])
 {
 	int ch, first, nl;
 
@@ -107,17 +107,3 @@
 	}
         return (first == 'y');
 }
-
-/*
- * emalloc --
- *	malloc with error checking.
- */
-void *
-emalloc(u_int len)
-{
-	void *p;
-
-	if ((p = malloc(len)) == NULL)
-		err(1, NULL);
-	return (p);
-}
diff -Nru dfly/src/usr.bin/find/operator.c fbsd/src/usr.bin/find/operator.c
--- dfly/src/usr.bin/find/operator.c	2004-07-09 22:11:20.000000000 +0300
+++ fbsd/src/usr.bin/find/operator.c	2005-01-16 22:20:02.000000000 +0200
@@ -33,7 +33,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.5.6.1 2001/05/06 09:53:22 phk Exp $
+ * $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.4 2004/07/09 19:11:20 drhodus Exp $
  *
  * @(#)operator.c	8.1 (Berkeley) 6/6/93
@@ -47,11 +47,13 @@
 
 #include "find.h"
 
+static PLAN *yanknode(PLAN **);
+static PLAN *yankexpr(PLAN **);
+
 /*
  * yanknode --
  *	destructively removes the top from the plan
  */
-/* planp: pointer to top of plan (modified) */
 static PLAN *
 yanknode(PLAN **planp)
 {
@@ -70,11 +72,10 @@
  *	paren_squish.  In comments below, an expression is either a
  *	simple node or a f_expr node containing a list of simple nodes.
  */
-/* planp: pointer to top of plan (modified) */
 static PLAN *
 yankexpr(PLAN **planp)
 {
-	register PLAN *next;	/* temp node holding subexpression results */
+	PLAN *next;		/* temp node holding subexpression results */
 	PLAN *node;		/* pointer to returned node or expression */
 	PLAN *tail;		/* pointer to tail of subplan */
 	PLAN *subplan;		/* pointer to head of ( ) expression */
@@ -92,7 +93,7 @@
 	if (node->execute == f_openparen)
 		for (tail = subplan = NULL;;) {
 			if ((next = yankexpr(planp)) == NULL)
-				err(1, "(: missing closing ')'");
+				errx(1, "(: missing closing ')'");
 			/*
 			 * If we find a closing ')' we store the collected
 			 * subplan in our '(' node and convert the node to
@@ -121,14 +122,13 @@
 
 /*
  * paren_squish --
- *	replaces "parentheisized" plans in our search plan with "expr" nodes.
+ *	replaces "parenthesized" plans in our search plan with "expr" nodes.
  */
-/* plan: plan with ( ) nodes */
 PLAN *
 paren_squish(PLAN *plan)
 {
-	register PLAN *expr;	/* pointer to next expression */
-	register PLAN *tail;	/* pointer to tail of result plan */
+	PLAN *expr;		/* pointer to next expression */
+	PLAN *tail;		/* pointer to tail of result plan */
 	PLAN *result;		/* pointer to head of result plan */
 
 	result = tail = NULL;
@@ -161,13 +161,12 @@
  * not_squish --
  *	compresses "!" expressions in our search plan.
  */
-/* plan: plan to process */
 PLAN *
 not_squish(PLAN *plan)
 {
-	register PLAN *next;	/* next node being processed */
-	register PLAN *node;	/* temporary node used in f_not processing */
-	register PLAN *tail;	/* pointer to tail of result plan */
+	PLAN *next;		/* next node being processed */
+	PLAN *node;		/* temporary node used in f_not processing */
+	PLAN *tail;		/* pointer to tail of result plan */
 	PLAN *result;		/* pointer to head of result plan */
 
 	tail = result = NULL;
@@ -225,12 +224,11 @@
  * or_squish --
  *	compresses -o expressions in our search plan.
  */
-/* plan: plan with ors to be squished */
 PLAN *
 or_squish(PLAN *plan)
 {
-	register PLAN *next;	/* next node being processed */
-	register PLAN *tail;	/* pointer to tail of result plan */
+	PLAN *next;		/* next node being processed */
+	PLAN *tail;		/* pointer to tail of result plan */
 	PLAN *result;		/* pointer to head of result plan */
 
 	tail = result = next = NULL;
diff -Nru dfly/src/usr.bin/find/option.c fbsd/src/usr.bin/find/option.c
--- dfly/src/usr.bin/find/option.c	2003-11-03 21:31:29.000000000 +0200
+++ fbsd/src/usr.bin/find/option.c	2005-01-16 22:30:29.000000000 +0200
@@ -34,7 +34,7 @@
  * SUCH DAMAGE.
  *
  * @(#)option.c	8.2 (Berkeley) 4/16/94
- * $FreeBSD: src/usr.bin/find/option.c,v 1.9.2.6 2003/02/22 16:33:24 des Exp $
+ * $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.4 2003/11/03 19:31:29 eirikn Exp $
  */
 
@@ -50,6 +50,8 @@
 
 #include "find.h"
 
+int typecompare(const void *, const void *);
+
 /* NB: the following table must be sorted lexically. */
 static OPTION const options[] = {
 	{ "!",		c_simple,	f_not,		0 },
@@ -64,20 +66,14 @@
 	{ "-cnewer",	c_newer,	f_newer,	F_TIME_C },
 	{ "-ctime",	c_Xtime,	f_Xtime,	F_TIME_C },
 	{ "-delete",	c_delete,	f_delete,	0 },
-	{ "-depth",	c_depth,	f_always_true,	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 },
 	{ "-flags",	c_flags,	f_flags,	0 },
 	{ "-follow",	c_follow,	f_always_true,	0 },
-/*
- * NetBSD doesn't provide a getvfsbyname(), so this option
- * is not available if using a NetBSD kernel.
- */
-#if !defined(__NetBSD__)
 	{ "-fstype",	c_fstype,	f_fstype,	0 },
-#endif
 	{ "-group",	c_group,	f_group,	0 },
 	{ "-iname",	c_name,		f_name,		F_IGNCASE },
 	{ "-inum",	c_inum,		f_inum,		0 },
@@ -134,13 +130,13 @@
 PLAN *
 find_create(char ***argvp)
 {
-	register OPTION *p;
+	OPTION *p;
 	PLAN *new;
 	char **argv;
 
 	argv = *argvp;
 
-	if ((p = option(*argv)) == NULL)
+	if ((p = lookup_option(*argv)) == NULL)
 		errx(1, "%s: unknown option", *argv);
 	++argv;
 
@@ -150,10 +146,9 @@
 }
 
 OPTION *
-option(char *name)
+lookup_option(const char *name)
 {
 	OPTION tmp;
-	int typecompare(const void *, const void *);
 
 	tmp.name = name;
 	return ((OPTION *)bsearch(&tmp, options,
@@ -163,5 +158,5 @@
 int
 typecompare(const void *a, const void *b)
 {
-	return (strcmp(((OPTION *)a)->name, ((OPTION *)b)->name));
+	return (strcmp(((const OPTION *)a)->name, ((const OPTION *)b)->name));
 }
Minor cleanups after sync
* Remove (void) casts
* Make explicit cast for 3rd fts_open argument
* Bump WARNS to 6

diff -Nru fbsd/src/usr.bin/find/Makefile new/src/usr.bin/find/Makefile
--- fbsd/src/usr.bin/find/Makefile	2005-01-16 22:15:07.000000000 +0200
+++ new/src/usr.bin/find/Makefile	2005-01-16 23:10:45.000000000 +0200
@@ -5,8 +5,8 @@
 PROG=	find
 SRCS=	find.c function.c ls.c main.c misc.c operator.c option.c \
 	getdate.y
-WARNS?=2
-CFLAGS+= -DHAVE_SYS_TIMEB_H -I${.CURDIR}
+WARNS?=	6
+CFLAGS+=-DHAVE_SYS_TIMEB_H -I${.CURDIR}
 YFLAGS=
 
 .include <bsd.prog.mk>
diff -Nru fbsd/src/usr.bin/find/find.c new/src/usr.bin/find/find.c
--- fbsd/src/usr.bin/find/find.c	2005-01-16 22:16:28.000000000 +0200
+++ new/src/usr.bin/find/find.c	2005-01-16 22:48:59.000000000 +0200
@@ -175,7 +175,7 @@
 	PLAN *p;
 	int rval;
 
-	tree = fts_open(paths, ftsoptions, (issort ? find_compare : NULL));
+	tree = fts_open(paths, ftsoptions, (int (*)(const FTSENT **, const FTSENT **))(issort ? find_compare : NULL));
 	if (tree == NULL)
 		err(1, "ftsopen");
 
@@ -197,7 +197,7 @@
 		case FTS_DNR:
 		case FTS_ERR:
 		case FTS_NS:
-			(void)fflush(stdout);
+			fflush(stdout);
 			warnx("%s: %s",
 			    entry->fts_path, strerror(entry->fts_errno));
 			rval = 1;
@@ -209,7 +209,7 @@
 		}
 #define	BADCH	" \t\n\\'\""
 		if (isxargs && strpbrk(entry->fts_path, BADCH)) {
-			(void)fflush(stdout);
+			fflush(stdout);
 			warnx("%s: illegal path", entry->fts_path);
 			rval = 1;
 			continue;
diff -Nru fbsd/src/usr.bin/find/function.c new/src/usr.bin/find/function.c
--- fbsd/src/usr.bin/find/function.c	2005-01-16 22:25:51.000000000 +0200
+++ new/src/usr.bin/find/function.c	2005-01-16 23:05:34.000000000 +0200
@@ -1158,7 +1158,7 @@
 int
 f_print(PLAN *plan __unused, FTSENT *entry)
 {
-	(void)puts(entry->fts_path);
+	puts(entry->fts_path);
 	return 1;
 }
 
diff -Nru fbsd/src/usr.bin/find/ls.c new/src/usr.bin/find/ls.c
--- fbsd/src/usr.bin/find/ls.c	2005-01-16 22:18:50.000000000 +0200
+++ new/src/usr.bin/find/ls.c	2005-01-16 22:48:59.000000000 +0200
@@ -46,6 +46,7 @@
 #include <langinfo.h>
 #include <pwd.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <time.h>
 #include <unistd.h>
@@ -62,22 +63,22 @@
 {
 	char modep[15];
 
-	(void)printf("%6lu %8"PRId64" ", (u_long) sb->st_ino, sb->st_blocks);
-	(void)strmode(sb->st_mode, modep);
-	(void)printf("%s %3u %-*s %-*s ", modep, sb->st_nlink, MAXLOGNAME - 1,
+	printf("%6lu %8"PRId64" ", (u_long) sb->st_ino, sb->st_blocks);
+	strmode(sb->st_mode, modep);
+	printf("%s %3u %-*s %-*s ", modep, sb->st_nlink, MAXLOGNAME - 1,
 	    user_from_uid(sb->st_uid, 0), MAXLOGNAME - 1,
 	    group_from_gid(sb->st_gid, 0));
 
 	if (S_ISCHR(sb->st_mode) || S_ISBLK(sb->st_mode))
-		(void)printf("%3d, %3d ", major(sb->st_rdev),
+		printf("%3d, %3d ", major(sb->st_rdev),
 		    minor(sb->st_rdev));
 	else
-		(void)printf("%8"PRId64" ", sb->st_size);
+		printf("%8"PRId64" ", sb->st_size);
 	printtime(sb->st_mtime);
-	(void)printf("%s", name);
+	printf("%s", name);
 	if (S_ISLNK(sb->st_mode))
 		printlink(accpath);
-	(void)putchar('\n');
+	putchar('\n');
 }
 
 static void
@@ -115,5 +116,5 @@
 		return;
 	}
 	path[lnklen] = '\0';
-	(void)printf(" -> %s", path);
+	printf(" -> %s", path);
 }
diff -Nru fbsd/src/usr.bin/find/main.c new/src/usr.bin/find/main.c
--- fbsd/src/usr.bin/find/main.c	2005-01-16 22:19:11.000000000 +0200
+++ new/src/usr.bin/find/main.c	2005-01-16 22:48:59.000000000 +0200
@@ -74,9 +74,9 @@
 	char **p, **start;
 	int Hflag, Lflag, ch;
 
-	(void)setlocale(LC_ALL, "");
+	setlocale(LC_ALL, "");
 
-	(void)time(&now);	/* initialize the time-of-day */
+	time(&now);	/* initialize the time-of-day */
 
 	p = start = argv;
 	Hflag = Lflag = 0;
@@ -153,7 +153,7 @@
 static void
 usage(void)
 {
-	(void)fprintf(stderr,
+	fprintf(stderr,
 "usage: find [-H | -L | -P] [-EXdsx] [-f file] [file ...] [expression]\n");
 	exit(1);
 }
diff -Nru fbsd/src/usr.bin/find/misc.c new/src/usr.bin/find/misc.c
--- fbsd/src/usr.bin/find/misc.c	2005-01-16 22:11:37.000000000 +0200
+++ new/src/usr.bin/find/misc.c	2005-01-16 22:48:59.000000000 +0200
@@ -84,11 +84,11 @@
 {
 	int ch, first, nl;
 
-	(void)fprintf(stderr, "\"%s", *argv);
+	fprintf(stderr, "\"%s", *argv);
 	while (*++argv)
-		(void)fprintf(stderr, " %s", *argv);
-	(void)fprintf(stderr, "\"? ");
-	(void)fflush(stderr);
+		fprintf(stderr, " %s", *argv);
+	fprintf(stderr, "\"? ");
+	fflush(stderr);
 
 	first = ch = getchar();
 	for (nl = 0;;) {
@@ -102,8 +102,8 @@
 	}
 
-		(void)fprintf(stderr, "\n");
-		(void)fflush(stderr);
+		fprintf(stderr, "\n");
+		fflush(stderr);
 	}
         return (first == 'y');
 }




More information about the Submit mailing list