svn commit: r328933 - head/usr.bin/find

Alex Richardson arichardson at FreeBSD.org
Tue Feb 6 15:41:27 UTC 2018


Author: arichardson
Date: Tue Feb  6 15:41:26 2018
New Revision: 328933
URL: https://svnweb.freebsd.org/changeset/base/328933

Log:
  Allow compiling usr.bin/find on Linux and Mac
  
  When building FreeBSD the makefiles invoke find with various flags such as
  `-s` that aren't supported in the native /usr/bin/find. To fix this I
  build the FreeBSD version of find and use that when crossbuilding.
  
  Inserting lots if #ifdefs in the code is rather ugly but I don't see a
  better solution.
  
  Reviewed By:	brooks (mentor)
  Approved By:	jhb (mentor)
  Differential Revision: https://reviews.freebsd.org/D13306

Modified:
  head/usr.bin/find/Makefile
  head/usr.bin/find/find.h
  head/usr.bin/find/function.c
  head/usr.bin/find/ls.c
  head/usr.bin/find/operator.c
  head/usr.bin/find/option.c

Modified: head/usr.bin/find/Makefile
==============================================================================
--- head/usr.bin/find/Makefile	Tue Feb  6 15:41:15 2018	(r328932)
+++ head/usr.bin/find/Makefile	Tue Feb  6 15:41:26 2018	(r328933)
@@ -7,6 +7,7 @@ PROG=	find
 SRCS=	find.c function.c ls.c main.c misc.c operator.c option.c \
 	getdate.y
 YFLAGS=
+CFLAGS.clang+=	-Werror=undef
 
 NO_WMISSING_VARIABLE_DECLARATIONS=
 

Modified: head/usr.bin/find/find.h
==============================================================================
--- head/usr.bin/find/find.h	Tue Feb  6 15:41:15 2018	(r328932)
+++ head/usr.bin/find/find.h	Tue Feb  6 15:41:26 2018	(r328933)
@@ -36,7 +36,32 @@
  */
 
 #include <regex.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
 
+/*
+ * We need to build find during the bootstrap stage when building on a
+ * non-FreeBSD system. Linux does not have the st_flags and st_birthtime
+ * members in struct stat so we need to omit support for tests that depend
+ * on these members. This works fine since none of these flags are used
+ * during the build of world and kernel.
+ */
+#ifdef UF_SETTABLE
+#define HAVE_STRUCT_STAT_ST_FLAGS 1
+#else
+#define HAVE_STRUCT_STAT_ST_FLAGS 0
+#endif
+#if defined(st_birthtime) || defined(st_birthtimespec)
+#define HAVE_STRUCT_STAT_ST_BIRTHTIME 1
+#else
+#define HAVE_STRUCT_STAT_ST_BIRTHTIME 0
+#endif
+#if defined(MFSNAMELEN) || defined(MFSTYPENAMELEN)
+#define HAVE_STRUCT_STATFS_F_FSTYPENAME 1
+#else
+#define HAVE_STRUCT_STATFS_F_FSTYPENAME 0
+#endif
+
 /* forward declarations */
 struct _plandata;
 struct _option;
@@ -70,8 +95,10 @@ typedef	struct _plandata *creat_f(struct _option *, ch
 #define	F_IGNCASE	0x00010000	/* iname ipath iregex */
 #define	F_EXACTTIME	F_IGNCASE	/* -[acm]time units syntax */
 #define F_EXECPLUS	0x00020000	/* -exec ... {} + */
+#if HAVE_STRUCT_STAT_ST_BIRTHTIME
 #define	F_TIME_B	0x00040000	/* one of -Btime, -Bnewer, -newerB* */
 #define	F_TIME2_B	0x00080000	/* one of -newer?B */
+#endif
 #define F_LINK		0x00100000	/* lname or ilname */
 
 /* node definition */

Modified: head/usr.bin/find/function.c
==============================================================================
--- head/usr.bin/find/function.c	Tue Feb  6 15:41:15 2018	(r328932)
+++ head/usr.bin/find/function.c	Tue Feb  6 15:41:26 2018	(r328933)
@@ -261,9 +261,11 @@ f_Xmin(PLAN *plan, FTSENT *entry)
 	} else if (plan->flags & F_TIME_A) {
 		COMPARE((now - entry->fts_statp->st_atime +
 		    60 - 1) / 60, plan->t_data.tv_sec);
+#if HAVE_STRUCT_STAT_ST_BIRTHTIME
 	} else if (plan->flags & F_TIME_B) {
 		COMPARE((now - entry->fts_statp->st_birthtime +
 		    60 - 1) / 60, plan->t_data.tv_sec);
+#endif
 	} else {
 		COMPARE((now - entry->fts_statp->st_mtime +
 		    60 - 1) / 60, plan->t_data.tv_sec);
@@ -304,8 +306,10 @@ f_Xtime(PLAN *plan, FTSENT *entry)
 
 	if (plan->flags & F_TIME_A)
 		xtime = entry->fts_statp->st_atime;
+#if HAVE_STRUCT_STAT_ST_BIRTHTIME
 	else if (plan->flags & F_TIME_B)
 		xtime = entry->fts_statp->st_birthtime;
+#endif
 	else if (plan->flags & F_TIME_C)
 		xtime = entry->fts_statp->st_ctime;
 	else
@@ -362,6 +366,7 @@ c_mXXdepth(OPTION *option, char ***argvp)
 	return new;
 }
 
+#ifdef ACL_TYPE_NFS4
 /*
  * -acl function --
  *
@@ -412,6 +417,7 @@ f_acl(PLAN *plan __unused, FTSENT *entry)
 		return (0);
 	return (1);
 }
+#endif
 
 PLAN *
 c_acl(OPTION *option, char ***argvp __unused)
@@ -448,12 +454,14 @@ f_delete(PLAN *plan __unused, FTSENT *entry)
 		errx(1, "-delete: %s: relative path potentially not safe",
 			entry->fts_accpath);
 
+#if HAVE_STRUCT_STAT_ST_FLAGS
 	/* Turn off user immutable bits if running as root */
 	if ((entry->fts_statp->st_flags & (UF_APPEND|UF_IMMUTABLE)) &&
 	    !(entry->fts_statp->st_flags & (SF_APPEND|SF_IMMUTABLE)) &&
 	    geteuid() == 0)
 		lchflags(entry->fts_accpath,
 		       entry->fts_statp->st_flags &= ~(UF_APPEND|UF_IMMUTABLE));
+#endif
 
 	/* rmdir directories, unlink everything else */
 	if (S_ISDIR(entry->fts_statp->st_mode)) {
@@ -806,6 +814,7 @@ finish_execplus(void)
 	}
 }
 
+#if HAVE_STRUCT_STAT_ST_FLAGS
 int
 f_flags(PLAN *plan, FTSENT *entry)
 {
@@ -849,6 +858,7 @@ c_flags(OPTION *option, char ***argvp)
 	new->fl_notflags = notflags;
 	return new;
 }
+#endif
 
 /*
  * -follow functions --
@@ -865,6 +875,7 @@ c_follow(OPTION *option, char ***argvp __unused)
 	return palloc(option);
 }
 
+#if HAVE_STRUCT_STATFS_F_FSTYPENAME
 /*
  * -fstype functions --
  *
@@ -967,6 +978,7 @@ c_fstype(OPTION *option, char ***argvp)
 	new->c_data = fsname;
 	return new;
 }
+#endif
 
 /*
  * -group gname functions --
@@ -1189,10 +1201,12 @@ f_newer(PLAN *plan, FTSENT *entry)
 
 	if (plan->flags & F_TIME_C)
 		ft = entry->fts_statp->st_ctim;
+#if HAVE_STRUCT_STAT_ST_BIRTHTIME
 	else if (plan->flags & F_TIME_A)
 		ft = entry->fts_statp->st_atim;
 	else if (plan->flags & F_TIME_B)
 		ft = entry->fts_statp->st_birthtim;
+#endif
 	else
 		ft = entry->fts_statp->st_mtim;
 	return (ft.tv_sec > plan->t_data.tv_sec ||
@@ -1230,8 +1244,10 @@ c_newer(OPTION *option, char ***argvp)
 			new->t_data = sb.st_ctim;
 		else if (option->flags & F_TIME2_A)
 			new->t_data = sb.st_atim;
+#if HAVE_STRUCT_STAT_ST_BIRTHTIME
 		else if (option->flags & F_TIME2_B)
 			new->t_data = sb.st_birthtim;
+#endif
 		else
 			new->t_data = sb.st_mtim;
 	}
@@ -1615,7 +1631,7 @@ c_type(OPTION *option, char ***argvp)
 	case 's':
 		mask = S_IFSOCK;
 		break;
-#ifdef FTS_WHITEOUT
+#if defined(FTS_WHITEOUT) && defined(S_IFWHT)
 	case 'w':
 		mask = S_IFWHT;
 		ftsoptions |= FTS_WHITEOUT;

Modified: head/usr.bin/find/ls.c
==============================================================================
--- head/usr.bin/find/ls.c	Tue Feb  6 15:41:15 2018	(r328932)
+++ head/usr.bin/find/ls.c	Tue Feb  6 15:41:26 2018	(r328933)
@@ -91,8 +91,10 @@ printtime(time_t ftime)
 	const char *format;
 	static int d_first = -1;
 
+#ifdef D_MD_ORDER
 	if (d_first < 0)
 		d_first = (*nl_langinfo(D_MD_ORDER) == 'd');
+#endif
 	if (lnow == 0)
 		lnow = time(NULL);
 

Modified: head/usr.bin/find/operator.c
==============================================================================
--- head/usr.bin/find/operator.c	Tue Feb  6 15:41:15 2018	(r328932)
+++ head/usr.bin/find/operator.c	Tue Feb  6 15:41:26 2018	(r328933)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
 #include <err.h>
 #include <fts.h>
 #include <stdio.h>
+#include <time.h>
 
 #include "find.h"
 

Modified: head/usr.bin/find/option.c
==============================================================================
--- head/usr.bin/find/option.c	Tue Feb  6 15:41:15 2018	(r328932)
+++ head/usr.bin/find/option.c	Tue Feb  6 15:41:26 2018	(r328933)
@@ -61,11 +61,15 @@ static OPTION const options[] = {
 	{ "!",		c_simple,	f_not,		0 },
 	{ "(",		c_simple,	f_openparen,	0 },
 	{ ")",		c_simple,	f_closeparen,	0 },
+#if HAVE_STRUCT_STAT_ST_BIRTHTIME
 	{ "-Bmin",	c_Xmin,		f_Xmin,		F_TIME_B },
 	{ "-Bnewer",	c_newer,	f_newer,	F_TIME_B },
 	{ "-Btime",	c_Xtime,	f_Xtime,	F_TIME_B },
+#endif
 	{ "-a",		c_and,		NULL,		0 },
+#ifdef ACL_TYPE_NFS4
 	{ "-acl",	c_acl,		f_acl,		0 },
+#endif
 	{ "-amin",	c_Xmin,		f_Xmin,		F_TIME_A },
 	{ "-and",	c_and,		NULL,		0 },
 	{ "-anewer",	c_newer,	f_newer,	F_TIME_A },
@@ -81,13 +85,17 @@ static OPTION const options[] = {
 	{ "-exec",	c_exec,		f_exec,		0 },
 	{ "-execdir",	c_exec,		f_exec,		F_EXECDIR },
 	{ "-false",	c_simple,	f_false,	0 },
+#if HAVE_STRUCT_STAT_ST_FLAGS
 	{ "-flags",	c_flags,	f_flags,	0 },
+#endif
 // -fls
 	{ "-follow",	c_follow,	f_always_true,	0 },
 // -fprint
 // -fprint0
 // -fprintf
+#if HAVE_STRUCT_STATFS_F_FSTYPENAME
 	{ "-fstype",	c_fstype,	f_fstype,	0 },
+#endif
 	{ "-gid",	c_group,	f_group,	0 },
 	{ "-group",	c_group,	f_group,	0 },
 	{ "-ignore_readdir_race",c_ignore_readdir_race, f_always_true,0 },
@@ -108,22 +116,28 @@ static OPTION const options[] = {
 	{ "-mtime",	c_Xtime,	f_Xtime,	0 },
 	{ "-name",	c_name,		f_name,		0 },
 	{ "-newer",	c_newer,	f_newer,	0 },
+#if HAVE_STRUCT_STAT_ST_BIRTHTIME
 	{ "-newerBB",	c_newer,	f_newer,	F_TIME_B | F_TIME2_B },
 	{ "-newerBa",	c_newer,	f_newer,	F_TIME_B | F_TIME2_A },
 	{ "-newerBc",	c_newer,	f_newer,	F_TIME_B | F_TIME2_C },
 	{ "-newerBm",	c_newer,	f_newer,	F_TIME_B },
 	{ "-newerBt",	c_newer,	f_newer,	F_TIME_B | F_TIME2_T },
 	{ "-neweraB",	c_newer,	f_newer,	F_TIME_A | F_TIME2_B },
+#endif
 	{ "-neweraa",	c_newer,	f_newer,	F_TIME_A | F_TIME2_A },
 	{ "-newerac",	c_newer,	f_newer,	F_TIME_A | F_TIME2_C },
 	{ "-neweram",	c_newer,	f_newer,	F_TIME_A },
 	{ "-newerat",	c_newer,	f_newer,	F_TIME_A | F_TIME2_T },
+#if HAVE_STRUCT_STAT_ST_BIRTHTIME
 	{ "-newercB",	c_newer,	f_newer,	F_TIME_C | F_TIME2_B },
+#endif
 	{ "-newerca",	c_newer,	f_newer,	F_TIME_C | F_TIME2_A },
 	{ "-newercc",	c_newer,	f_newer,	F_TIME_C | F_TIME2_C },
 	{ "-newercm",	c_newer,	f_newer,	F_TIME_C },
 	{ "-newerct",	c_newer,	f_newer,	F_TIME_C | F_TIME2_T },
+#if HAVE_STRUCT_STAT_ST_BIRTHTIME
 	{ "-newermB",	c_newer,	f_newer,	F_TIME2_B },
+#endif
 	{ "-newerma",	c_newer,	f_newer,	F_TIME2_A },
 	{ "-newermc",	c_newer,	f_newer,	F_TIME2_C },
 	{ "-newermm",	c_newer,	f_newer,	0 },


More information about the svn-src-head mailing list