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:
parent
e911aac76a
commit
c3a6ea5ba6
@ -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=
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <err.h>
|
||||
#include <fts.h>
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "find.h"
|
||||
|
||||
|
@ -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 },
|
||||
|
Loading…
Reference in New Issue
Block a user