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
This commit is contained in:
Alex Richardson 2018-02-06 15:41:26 +00:00
parent e911aac76a
commit c3a6ea5ba6
6 changed files with 62 additions and 1 deletions

View File

@ -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=

View File

@ -36,6 +36,31 @@
*/
#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;
@ -70,8 +95,10 @@ 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 ... {} + */
#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 */

View File

@ -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;

View File

@ -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);

View File

@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <err.h>
#include <fts.h>
#include <stdio.h>
#include <time.h>
#include "find.h"

View File

@ -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 },