3
0
forked from pool/findutils

Accepting request 34356 from Base:System

Copy from Base:System/findutils based on submit request 34356 from user prusnak

OBS-URL: https://build.opensuse.org/request/show/34356
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/findutils?expand=0&rev=17
This commit is contained in:
OBS User autobuild 2010-03-12 15:45:17 +00:00 committed by Git OBS Bridge
parent 07ac24ddde
commit d6d436937f
12 changed files with 1916 additions and 640 deletions

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dd1dd2ffb38b28d00ab360ada03613ef07643c1f0e207ab2a00f362b7c160e19
size 1436805

View File

@ -0,0 +1,88 @@
Index: findutils-4.4.2/find/fstype.c
===================================================================
--- findutils-4.4.2.orig/find/fstype.c
+++ findutils-4.4.2/find/fstype.c
@@ -205,7 +205,72 @@ must_read_fs_list(bool need_fs_type)
return entries;
}
+/* Return the device number from MOUNT_OPTIONS, if possible.
+ Otherwise return (dev_t) -1. Taken from 'mountlist' module
+ from gnulib. */
+static dev_t
+dev_from_mount_options (char const *mount_options)
+{
+ /* GNU/Linux allows file system implementations to define their own
+ meaning for "dev=" mount options, so don't trust the meaning
+ here. */
+# ifndef __linux__
+
+ static char const dev_pattern[] = ",dev=";
+ char const *devopt = strstr (mount_options, dev_pattern);
+
+ if (devopt)
+ {
+ char const *optval = devopt + sizeof dev_pattern - 1;
+ char *optvalend;
+ unsigned long int dev;
+ errno = 0;
+ dev = strtoul (optval, &optvalend, 16);
+ if (optval != optvalend
+ && (*optvalend == '\0' || *optvalend == ',')
+ && ! (dev == ULONG_MAX && errno == ERANGE)
+ && dev == (dev_t) dev)
+ return dev;
+ }
+
+# endif
+ (void) mount_options;
+ return -1;
+}
+
+/* Return true if the file described by STATP is on autofs file system
+ and call set_fstype_devno () if the autofs file system is matched. */
+static bool
+filesystem_check_autofs (const struct stat *statp)
+{
+ FILE *fp;
+ struct mntent *mnt;
+ struct mount_entry entry;
+ bool match = false;
+
+ /* open /proc/mounts because autofs is not listed in /etc/mtab */
+ fp = setmntent ("/proc/mounts", "r");
+ if (fp == NULL)
+ return false;
+ while ((mnt = getmntent (fp)))
+ {
+ if (0 != strcmp ("autofs", mnt->mnt_type))
+ continue;
+
+ entry.me_mountdir = mnt->mnt_dir;
+ entry.me_dev = dev_from_mount_options (mnt->mnt_opts);
+ set_fstype_devno (&entry);
+ if (entry.me_dev == statp->st_dev)
+ {
+ match = true;
+ break;
+ }
+ }
+
+ endmntent (fp);
+ return match;
+}
/* Return a newly allocated string naming the type of file system that the
file PATH, described by STATP, is on.
@@ -244,6 +309,10 @@ file_system_type_uncached (const struct
}
free_file_system_list(entries);
+ /* check for autofs */
+ if (type == NULL && filesystem_check_autofs (statp))
+ type = xstrdup ("autofs");
+
/* Don't cache unknown values. */
fstype_known = (type != NULL);

View File

@ -0,0 +1,27 @@
This patch is already applied on gnulib upstream git.
Index: findutils-4.4.2/gnulib/lib/fts.c
===================================================================
--- findutils-4.4.2.orig/gnulib/lib/fts.c
+++ findutils-4.4.2/gnulib/lib/fts.c
@@ -974,6 +974,20 @@ fts_build (register FTS *sp, int type)
opening it. */
if (cur->fts_info == FTS_NSOK)
cur->fts_info = fts_stat(sp, cur, false);
+ else if (sp->fts_options & FTS_TIGHT_CYCLE_CHECK) {
+ /* Now read the stat info again after opening a directory to
+ * reveal eventual changes caused by a submount triggered by
+ * the traverse. But do it only for utilities which use
+ * FTS_TIGHT_CYCLE_CHECK. Therefore only find and du can
+ * benefit from this feature for now.
+ */
+ LEAVE_DIR (sp, cur, "4");
+ fts_stat (sp, cur, false);
+ if (! enter_dir (sp, cur)) {
+ __set_errno (ENOMEM);
+ return NULL;
+ }
+ }
/*
* Nlinks is the number of possible entries of type directory in the

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,445 @@
Index: findutils-4.4.2/NEWS
===================================================================
--- findutils-4.4.2.orig/NEWS
+++ findutils-4.4.2/NEWS
@@ -1,5 +1,11 @@
GNU findutils NEWS - User visible changes. -*- outline -*- (allout)
+* Major changes in release 4.4.2, 2009-11-26
+
+** Functional Enhancements to find
+
+patch #4848: Patch - Support for SELinux
+
* Major changes in release 4.4.2, 2009-05-16
** Bug Fixes
Index: findutils-4.4.2/doc/find.texi
===================================================================
--- findutils-4.4.2.orig/doc/find.texi
+++ findutils-4.4.2/doc/find.texi
@@ -1242,6 +1242,14 @@ situation.
@end deffn
+@deffn Test -context pattern
+True if file's SELinux context matches the pattern @var{pattern}.
+The pattern uses shell glob matching.
+
+This predicate is supported only on @code{find} versions compiled with
+SELinux support and only when SELinux is enabled.
+@end deffn
+
@node Contents
@section Contents
@@ -1737,6 +1745,7 @@ from the novel you are reading.
* Size Directives::
* Location Directives::
* Time Directives::
+* Other Directives::
* Formatting Flags::
@end menu
@@ -1894,6 +1903,14 @@ File's last modification time in the for
(@pxref{Time Formats}).
@end table
+@node Other Directives
+@subsubsection Other Directives
+
+@table @code
+@item %Z
+File's SELinux context, or empty string if the file has no SELinux context.
+@end table
+
@node Time Formats
@subsection Time Formats
Index: findutils-4.4.2/find/Makefile.am
===================================================================
--- findutils-4.4.2.orig/find/Makefile.am
+++ findutils-4.4.2/find/Makefile.am
@@ -26,7 +26,7 @@ endif
EXTRA_DIST = defs.h $(man_MANS)
INCLUDES = -I../gnulib/lib -I$(top_srcdir)/lib -I$(top_srcdir)/gnulib/lib -I../intl -DLOCALEDIR=\"$(localedir)\"
-LDADD = ./libfindtools.a ../lib/libfind.a ../gnulib/lib/libgnulib.a @INTLLIBS@ @LIB_CLOCK_GETTIME@ @FINDLIBS@
+LDADD = ./libfindtools.a ../lib/libfind.a ../gnulib/lib/libgnulib.a @INTLLIBS@ @LIB_CLOCK_GETTIME@ @FINDLIBS@ @LIB_SELINUX@
man_MANS = find.1
SUBDIRS = . testsuite
Index: findutils-4.4.2/find/defs.h
===================================================================
--- findutils-4.4.2.orig/find/defs.h
+++ findutils-4.4.2/find/defs.h
@@ -48,6 +48,7 @@ Please stop compiling the program now
#include <stdbool.h> /* for bool/boolean */
#include <stdint.h> /* for uintmax_t */
#include <sys/stat.h> /* S_ISUID etc. */
+#include <selinux/selinux.h>
@@ -315,6 +316,7 @@ struct predicate
struct samefile_file_id samefileid; /* samefile */
mode_t type; /* type */
struct format_val printf_vec; /* printf fprintf fprint ls fls print0 fprint0 print */
+ security_context_t scontext; /* security context */
} args;
/* The next predicate in the user input sequence,
@@ -459,6 +461,7 @@ PREDICATEFUNCTION pred_used;
PREDICATEFUNCTION pred_user;
PREDICATEFUNCTION pred_writable;
PREDICATEFUNCTION pred_xtype;
+PREDICATEFUNCTION pred_context;
@@ -604,6 +607,9 @@ struct options
*/
int regex_options;
+ /* function used to get file context */
+ int (*x_getfilecon) (int, const char *, security_context_t *);
+
/* Optimisation level. One is the default.
*/
unsigned short optimisation_level;
Index: findutils-4.4.2/find/find.1
===================================================================
--- findutils-4.4.2.orig/find/find.1
+++ findutils-4.4.2/find/find.1
@@ -936,6 +936,8 @@ if \fIc\fR is `l'. In other words, for
checks the type of the file that
.B \-type
does not check.
+.IP "\-context \fIpattern\fR"
+(SELinux only) Security context of the file matches glob \fIpattern\fR.
.SS ACTIONS
.IP "\-delete\fR"
@@ -1357,6 +1359,8 @@ File's type (like in
U=unknown type (shouldn't happen)
.IP %Y
File's type (like %y), plus follow symlinks: L=loop, N=nonexistent
+.IP %Z
+(SELinux only) file's security context.
.PP
A `%' character followed by any other character is discarded, but the
other character is printed (don't rely on this, as further format
Index: findutils-4.4.2/find/parser.c
===================================================================
--- findutils-4.4.2.orig/find/parser.c
+++ findutils-4.4.2/find/parser.c
@@ -53,6 +53,8 @@
#include <unistd.h>
#include <sys/stat.h>
+#include "selinux-at.h"
+
#if ENABLE_NLS
# include <libintl.h>
# define _(Text) gettext (Text)
@@ -156,6 +158,7 @@ static boolean parse_noignore_race PARAM
static boolean parse_warn PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_xtype PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_quit PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
+static boolean parse_context PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
boolean parse_print PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
@@ -252,6 +255,7 @@ static struct parser_table const parse_t
PARSE_TEST ("cmin", cmin), /* GNU */
PARSE_TEST ("cnewer", cnewer), /* GNU */
{ARG_TEST, "ctime", parse_time, pred_ctime}, /* POSIX */
+ PARSE_TEST ("context", context), /* GNU */
PARSE_POSOPT ("daystart", daystart), /* GNU */
PARSE_ACTION ("delete", delete), /* GNU, Mac OS, FreeBSD */
PARSE_OPTION ("d", d), /* Mac OS X, FreeBSD, NetBSD, OpenBSD, but deprecated in favour of -depth */
@@ -349,6 +353,86 @@ static struct parser_table const parse_t
static const char *first_nonoption_arg = NULL;
static const struct parser_table *noop = NULL;
+static int
+fallback_getfilecon (int fd, const char *name, security_context_t *p,
+ int prev_rv)
+{
+ /* Our original getfilecon () call failed. Perhaps we can't follow a
+ * symbolic link. If that might be the problem, lgetfilecon () the link.
+ * Otherwise, admit defeat. */
+ switch (errno)
+ {
+ case ENOENT:
+ case ENOTDIR:
+#ifdef DEBUG_STAT
+ fprintf (stderr, "fallback_getfilecon(): getfilecon(%s) failed; falling "
+ "back on lgetfilecon()\n", name);
+#endif
+ return lgetfileconat (fd, name, p);
+
+ case EACCES:
+ case EIO:
+ case ELOOP:
+ case ENAMETOOLONG:
+#ifdef EOVERFLOW
+ case EOVERFLOW: /* EOVERFLOW is not #defined on UNICOS. */
+#endif
+ default:
+ return prev_rv;
+ }
+}
+
+/* optionh_getfilecon () implements the getfilecon operation when the
+ * -H option is in effect.
+ *
+ * If the item to be examined is a command-line argument, we follow
+ * symbolic links. If the getfilecon () call fails on the command-line
+ * item, we fall back on the properties of the symbolic link.
+ *
+ * If the item to be examined is not a command-line argument, we
+ * examine the link itself. */
+int
+optionh_getfilecon (int fd, const char *name, security_context_t *p)
+{
+ int rv;
+ if (0 == state.curdepth)
+ {
+ /* This file is from the command line; dereference the link (if it is
+ a link). */
+ rv = getfileconat (fd, name, p);
+ if (0 == rv)
+ return 0; /* success */
+ else
+ return fallback_getfilecon (fd, name, p, rv);
+ }
+ else
+ {
+ /* Not a file on the command line; do not dereference the link. */
+ return lgetfileconat (fd, name, p);
+ }
+}
+
+/* optionl_getfilecon () implements the getfilecon operation when the
+ * -L option is in effect. That option makes us examine the thing the
+ * symbolic link points to, not the symbolic link itself. */
+int
+optionl_getfilecon (int fd, const char *name, security_context_t *p)
+{
+ int rv = getfileconat (fd, name, p);
+ if (0 == rv)
+ return 0; /* normal case. */
+ else
+ return fallback_getfilecon (fd, name, p, rv);
+}
+
+/* optionp_getfilecon () implements the stat operation when the -P
+ * option is in effect (this is also the default). That option makes
+ * us examine the symbolic link itself, not the thing it points to. */
+int
+optionp_getfilecon (int fd, const char *name, security_context_t *p)
+{
+ return lgetfileconat (fd, name, p);
+}
void
check_option_combinations(const struct predicate *p)
@@ -452,11 +536,13 @@ set_follow_state(enum SymlinkOption opt)
{
case SYMLINK_ALWAYS_DEREF: /* -L */
options.xstat = optionl_stat;
+ options.x_getfilecon = optionl_getfilecon;
options.no_leaf_check = true;
break;
case SYMLINK_NEVER_DEREF: /* -P (default) */
options.xstat = optionp_stat;
+ options.x_getfilecon = optionp_getfilecon;
/* Can't turn no_leaf_check off because the user might have specified
* -noleaf anyway
*/
@@ -464,6 +550,7 @@ set_follow_state(enum SymlinkOption opt)
case SYMLINK_DEREF_ARGSONLY: /* -H */
options.xstat = optionh_stat;
+ options.x_getfilecon = optionh_getfilecon;
options.no_leaf_check = true;
}
}
@@ -1129,8 +1216,10 @@ tests (N can be +N or -N or N): -amin N
-nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN\n\
-readable -writable -executable\n\
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N\n\
- -used N -user NAME -xtype [bcdpfls]\n"));
+ -used N -user NAME -xtype [bcdpfls]"));
puts (_("\
+ -context CONTEXT\n"));
+ puts (_("\n\
actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print \n\
-fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit\n\
-exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;\n\
@@ -2520,6 +2609,11 @@ parse_version (const struct parser_table
printf("LEAF_OPTIMISATION ");
++features;
#endif
+ if (0 < is_selinux_enabled ())
+ {
+ printf ("SELINUX ");
+ ++features;
+ }
flags = 0;
if (is_fts_enabled(&flags))
@@ -2555,6 +2649,31 @@ parse_version (const struct parser_table
}
static boolean
+parse_context (const struct parser_table* entry, char **argv, int *arg_ptr)
+{
+ struct predicate *our_pred;
+
+ if ((argv == NULL) || (argv[*arg_ptr] == NULL))
+ return false;
+
+ if (is_selinux_enabled () <= 0)
+ {
+ error (1, 0, _("invalid predicate -context: SELinux is not enabled."));
+ return false;
+ }
+ our_pred = insert_primary (entry);
+ our_pred->est_success_rate = 0.01f;
+ our_pred->need_stat = false;
+#ifdef DEBUG
+ our_pred->p_name = find_pred_name (pred_context);
+#endif /*DEBUG*/
+ our_pred->args.scontext = argv[*arg_ptr];
+
+ (*arg_ptr)++;
+ return true;
+}
+
+static boolean
parse_xdev (const struct parser_table* entry, char **argv, int *arg_ptr)
{
options.stay_on_filesystem = true;
@@ -2815,7 +2934,7 @@ insert_fprintf (struct format_val *vec,
if (*scan2 == '.')
for (scan2++; ISDIGIT (*scan2); scan2++)
/* Do nothing. */ ;
- if (strchr ("abcdDfFgGhHiklmMnpPsStuUyY", *scan2))
+ if (strchr ("abcdDfFgGhHiklmMnpPsStuUyYZ", *scan2))
{
segmentp = make_segment (segmentp, format, scan2 - format,
KIND_FORMAT, *scan2, 0,
@@ -2945,6 +3064,11 @@ make_segment (struct segment **segment,
*fmt++ = 's';
break;
+ case 'Z': /* SELinux security context */
+ mycost = NeedsAccessInfo;
+ *fmt++ = 's';
+ break;
+
case 'H': /* ARGV element file was found under */
*fmt++ = 's';
break;
Index: findutils-4.4.2/find/pred.c
===================================================================
--- findutils-4.4.2.orig/find/pred.c
+++ findutils-4.4.2/find/pred.c
@@ -48,6 +48,8 @@
#include "error.h"
#include "verify.h"
+#include <selinux/selinux.h>
+
#if ENABLE_NLS
# include <libintl.h>
# define _(Text) gettext (Text)
@@ -230,6 +232,7 @@ struct pred_assoc pred_table[] =
{pred_user, "user "},
{pred_writable, "writable "},
{pred_xtype, "xtype "},
+ {pred_context, "context"},
{0, "none "}
};
#endif
@@ -1054,6 +1057,30 @@ do_fprintf(struct format_val *dest,
mode_to_filetype(stat_buf->st_mode & S_IFMT));
}
break;
+
+ case 'Z': /* SELinux security context */
+ {
+ security_context_t scontext;
+ int rv = (*options.x_getfilecon) (state.cwd_dir_fd, state.rel_pathname,
+ &scontext);
+ if (rv < 0)
+ {
+ /* If getfilecon fails, there will in the general case
+ still be some text to print. We just make %Z expand
+ to an empty string. */
+ checked_fprintf (dest, segment->text, "");
+
+ error (0, errno, "getfilecon: %s",
+ safely_quote_err_filename (0, pathname));
+ state.exit_status = 1;
+ }
+ else
+ {
+ checked_fprintf (dest, segment->text, scontext);
+ freecon (scontext);
+ }
+ }
+ break;
}
/* end of KIND_FORMAT case */
break;
@@ -1844,6 +1871,26 @@ pred_xtype (const char *pathname, struct
*/
return (pred_type (pathname, &sbuf, pred_ptr));
}
+
+
+boolean
+pred_context (const char *pathname, struct stat *stat_buf,
+ struct predicate *pred_ptr)
+{
+ security_context_t scontext;
+ int rv = (*options.x_getfilecon) (state.cwd_dir_fd, state.rel_pathname,
+ &scontext);
+ if (rv < 0)
+ {
+ error (0, errno, "getfilecon: %s", safely_quote_err_filename (0, pathname));
+ return false;
+ }
+
+ rv = (fnmatch (pred_ptr->args.scontext, scontext, 0) == 0);
+ freecon (scontext);
+ return rv;
+}
+
/* 1) fork to get a child; parent remembers the child pid
2) child execs the command requested
Index: findutils-4.4.2/find/tree.c
===================================================================
--- findutils-4.4.2.orig/find/tree.c
+++ findutils-4.4.2/find/tree.c
@@ -904,6 +904,7 @@ static struct pred_cost_lookup costlooku
{ pred_cmin , NeedsStatInfo, },
{ pred_cnewer , NeedsStatInfo, },
{ pred_comma , NeedsNothing, },
+ { pred_context , NeedsAccessInfo },
{ pred_ctime , NeedsStatInfo, },
{ pred_delete , NeedsSyncDiskHit },
{ pred_empty , NeedsStatInfo },
@@ -1434,6 +1435,7 @@ get_new_pred (const struct parser_table
last_pred->need_stat = true;
last_pred->need_type = true;
last_pred->args.str = NULL;
+ last_pred->args.scontext = NULL;
last_pred->pred_next = NULL;
last_pred->pred_left = NULL;
last_pred->pred_right = NULL;

View File

@ -1,6 +1,8 @@
--- doc/find.texi
Index: doc/find.texi
===================================================================
--- doc/find.texi.orig
+++ doc/find.texi
@@ -3329,7 +3329,7 @@ Default is none.
@@ -3364,7 +3364,7 @@ Default is none.
@item --prunepaths='@var{path}@dots{}'
Directories to omit from the database, which would otherwise be
included. The environment variable @code{PRUNEPATHS} also sets this
@ -9,61 +11,9 @@
used as regular expressions (with @code{find ... -regex}, so you need
to specify these paths in the same way that @code{find} will encounter
them. This means for example that the paths must not include trailing
--- find/ftsfind.c
+++ find/ftsfind.c
@@ -388,7 +388,7 @@ consider_visiting(FTS *p, FTSENT *ent)
{
struct stat statbuf;
mode_t mode;
- int ignore, isdir;
+ int ignore;
if (options.debug_options & DebugSearch)
fprintf(stderr,
@@ -498,22 +498,6 @@ consider_visiting(FTS *p, FTSENT *ent)
/* examine this item. */
ignore = 0;
- isdir = S_ISDIR(statbuf.st_mode)
- || (FTS_D == ent->fts_info)
- || (FTS_DP == ent->fts_info)
- || (FTS_DC == ent->fts_info);
-
- if (isdir && (ent->fts_info == FTS_NSOK))
- {
- /* This is a directory, but fts did not stat it, so
- * presumably would not be planning to search its
- * children. Force a stat of the file so that the
- * children can be checked.
- */
- fts_set(p, ent, FTS_AGAIN);
- return;
- }
-
if (options.maxdepth >= 0)
{
if (ent->fts_level >= options.maxdepth)
--- find/parser.c
+++ find/parser.c
@@ -3234,7 +3234,7 @@ get_relative_timestamp (const char *str,
double sec_per_unit,
const char *overflowmessage)
{
- uintmax_t checkval;
+ double checkval;
double offset, seconds, nanosec;
if (get_comp_type(&str, &result->kind))
@@ -3259,7 +3259,7 @@ get_relative_timestamp (const char *str,
result->ts.tv_sec = origin.tv_sec - seconds;
result->ts.tv_nsec = origin.tv_nsec - nanosec;
- checkval = (uintmax_t)origin.tv_sec - seconds;
+ checkval = origin.tv_sec - seconds;
if (origin.tv_nsec < nanosec)
{
--- locate/updatedb.1
Index: locate/updatedb.1
===================================================================
--- locate/updatedb.1.orig
+++ locate/updatedb.1
@@ -75,8 +75,7 @@ Default is \fInfs NFS proc\fP.
.TP
@ -84,7 +34,9 @@
You can also use the environment variable \fBNETUSER\fP to set this user.
.TP
.B \-\-old\-format
--- locate/updatedb.sh
Index: locate/updatedb.sh
===================================================================
--- locate/updatedb.sh.orig
+++ locate/updatedb.sh
@@ -158,7 +158,7 @@ select_shell() {
: ${NETPATHS=}
@ -108,13 +60,13 @@
PATH=/bin:/usr/bin:${BINDIR}; export PATH
-: ${PRUNEFS="nfs NFS proc afs proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs sysfs shfs"}
+: ${PRUNEFS="nfs NFS nfs4 afs proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs sysfs shfs cifs 9P"}
-: ${PRUNEFS="nfs NFS proc afs smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs sysfs shfs"}
+: ${PRUNEFS="nfs NFS proc afs smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs sysfs shfs cifs 9P"}
if test -n "$PRUNEFS"; then
-prunefs_exp=`echo $PRUNEFS |sed -e 's/\([^ ][^ ]*\)/-o -fstype \1/g' \
- -e 's/-o //' -e 's/$/ -o/'`
+ prunefs_exp=`echo $PRUNEFS |sed -e 's/\([^ ][^ ]*\)/-fstype \1 -o/g'`
+prunefs_exp=`echo $PRUNEFS |sed -e 's/\([^ ][^ ]*\)/-fstype \1 -o/g'`
else
prunefs_exp=''
fi

View File

@ -0,0 +1,109 @@
Index: findutils-4.4.2/doc/find.texi
===================================================================
--- findutils-4.4.2.orig/doc/find.texi
+++ findutils-4.4.2/doc/find.texi
@@ -1413,6 +1413,10 @@ them.
There are two ways to avoid searching certain filesystems. One way is
to tell @code{find} to only search one filesystem:
+@deffn Option -xautofs
+Don't descend directories on autofs filesystems.
+@end deffn
+
@deffn Option -xdev
@deffnx Option -mount
Don't descend directories on other filesystems. These options are
Index: findutils-4.4.2/find/defs.h
===================================================================
--- findutils-4.4.2.orig/find/defs.h
+++ findutils-4.4.2/find/defs.h
@@ -550,6 +550,9 @@ struct options
/* If true, don't cross filesystem boundaries. */
boolean stay_on_filesystem;
+ /* If true, don't descend directories on autofs filesystems. */
+ boolean bypass_autofs;
+
/* If true, we ignore the problem where we find that a directory entry
* no longer exists by the time we get around to processing it.
*/
Index: findutils-4.4.2/find/find.1
===================================================================
--- findutils-4.4.2.orig/find/find.1
+++ findutils-4.4.2/find/find.1
@@ -451,6 +451,9 @@ if standard input is a tty, and to
.B \-nowarn
otherwise.
+.IP \-xautofs
+Don't descend directories on autofs filesystems.
+
.IP \-xdev
Don't descend directories on other filesystems.
Index: findutils-4.4.2/find/ftsfind.c
===================================================================
--- findutils-4.4.2.orig/find/ftsfind.c
+++ findutils-4.4.2/find/ftsfind.c
@@ -525,6 +525,12 @@ consider_visiting(FTS *p, FTSENT *ent)
}
}
+ if (options.bypass_autofs &&
+ 0 == strcmp ("autofs", filesystem_type (&statbuf, ent->fts_name)))
+ {
+ fts_set(p, ent, FTS_SKIP); /* descend no further */
+ }
+
if ( (ent->fts_info == FTS_D) && !options.do_dir_first )
{
/* this is the preorder visit, but user said -depth */
Index: findutils-4.4.2/find/parser.c
===================================================================
--- findutils-4.4.2.orig/find/parser.c
+++ findutils-4.4.2/find/parser.c
@@ -150,6 +150,7 @@ static boolean parse_user PARAM
static boolean parse_version PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_wholename PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_xdev PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
+static boolean parse_xautofs PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_ignore_race PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_noignore_race PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_warn PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
@@ -320,6 +321,7 @@ static struct parser_table const parse_t
PARSE_TEST_NP ("wholename", wholename), /* GNU, replaced -path, but anyway -path will soon be in POSIX */
{ARG_TEST, "writable", parse_accesscheck, pred_writable}, /* GNU, 4.3.0+ */
PARSE_OPTION ("xdev", xdev), /* POSIX */
+ PARSE_OPTION ("xautofs", xautofs),
PARSE_TEST ("xtype", xtype), /* GNU */
#ifdef UNIMPLEMENTED_UNIX
/* It's pretty ugly for find to know about archive formats.
@@ -2560,6 +2562,16 @@ parse_xdev (const struct parser_table* e
}
static boolean
+parse_xautofs (const struct parser_table* entry, char **argv, int *arg_ptr)
+{
+ (void) argv;
+ (void) arg_ptr;
+ (void) entry;
+ options.bypass_autofs = true;
+ return true;
+}
+
+static boolean
parse_ignore_race (const struct parser_table* entry, char **argv, int *arg_ptr)
{
options.ignore_readdir_race = true;
Index: findutils-4.4.2/find/util.c
===================================================================
--- findutils-4.4.2.orig/find/util.c
+++ findutils-4.4.2/find/util.c
@@ -933,6 +933,7 @@ set_option_defaults(struct options *p)
p->full_days = false;
p->stay_on_filesystem = false;
+ p->bypass_autofs = false;
p->ignore_readdir_race = false;
if (p->posixly_correct)

3
findutils-4.4.2.tar.bz2 Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:62ff724e2de32788fa527df69c631ad34c6dfbbd5430b6b6dc410662a6d206d6
size 1506634

View File

@ -1,11 +0,0 @@
--- find/find.1
+++ find/find.1 2009-03-10 16:13:42.792001067 +0100
@@ -1166,7 +1166,7 @@ Carriage return.
Horizontal tab.
.IP \ev
Vertical tab.
-.IP \e\0
+.IP \e0
ASCII NUL.
.IP \e\e
A literal backslash (`\e').

View File

@ -1,486 +0,0 @@
--- findutils-4.4.0/configure.ac
+++ findutils-4.4.0/configure.ac
@@ -114,6 +114,16 @@ AC_CHECK_LIB([m],[fabs],[FINDLIBS="-lm $
AC_DEFINE_UNQUOTED(HAVE_FABS_IN_LIBM,1,[fabs is defined in -lm]))
AC_SUBST([FINDLIBS])
+AC_ARG_WITH([selinux],
+ AS_HELP_STRING([--without-selinux], [disable SELinux support]),
+ [:],
+[AC_CHECK_LIB([selinux], [is_selinux_enabled],
+ [with_selinux=yes], [with_selinux=no])])
+if test x$with_selinux != xno; then
+ AC_DEFINE([WITH_SELINUX], [1], [Define to support SELinux])
+ AC_SUBST([LIBSELINUX], [-lselinux])
+fi
+
dnl Checks for header files.
AC_HEADER_STDC
dnl Assume unistd.h is present - coreutils does too.
--- findutils-4.4.0/doc/find.texi
+++ findutils-4.4.0/doc/find.texi
@@ -1242,6 +1242,14 @@ situation.
@end deffn
+@deffn Test -context pattern
+True if file's SELinux context matches the pattern @var{pattern}.
+The pattern uses shell glob matching.
+
+This predicate is supported only on @code{find} versions compiled with
+SELinux support and only when SELinux is enabled.
+@end deffn
+
@node Contents
@section Contents
@@ -1826,6 +1834,9 @@ value used for BLOCKSIZE is system-depen
bytes. If the file size is zero, the value printed is undefined. On
systems which lack support for st_blocks, a file's sparseness is
assumed to be 1.0.
+@item %Z
+File's SELinux context, or empty string if the file has no SELinux context
+or this version of find does not support SELinux.
@end table
@node Location Directives
--- findutils-4.4.0/find/Makefile.am
+++ findutils-4.4.0/find/Makefile.am
@@ -26,7 +26,7 @@ endif
EXTRA_DIST = defs.h $(man_MANS)
INCLUDES = -I../gnulib/lib -I$(top_srcdir)/lib -I$(top_srcdir)/gnulib/lib -I../intl -DLOCALEDIR=\"$(localedir)\"
-LDADD = ./libfindtools.a ../lib/libfind.a ../gnulib/lib/libgnulib.a @INTLLIBS@ @LIB_CLOCK_GETTIME@ @FINDLIBS@
+LDADD = ./libfindtools.a ../lib/libfind.a ../gnulib/lib/libgnulib.a @INTLLIBS@ @LIB_CLOCK_GETTIME@ @FINDLIBS@ @LIBSELINUX@
man_MANS = find.1
SUBDIRS = . testsuite
--- findutils-4.4.0/find/defs.h
+++ findutils-4.4.0/find/defs.h
@@ -91,6 +91,9 @@ int get_statinfo PARAMS((const char *pat
#define MODE_RWX (S_IXUSR | S_IXGRP | S_IXOTH | MODE_RW)
#define MODE_ALL (S_ISUID | S_ISGID | S_ISVTX | MODE_RWX)
+#ifdef WITH_SELINUX
+#include <selinux/selinux.h>
+#endif
struct predicate;
struct options;
@@ -315,6 +318,9 @@ struct predicate
struct samefile_file_id samefileid; /* samefile */
mode_t type; /* type */
struct format_val printf_vec; /* printf fprintf fprint ls fls print0 fprint0 print */
+#ifdef WITH_SELINUX
+ security_context_t scontext; /* scontext */
+#endif
} args;
/* The next predicate in the user input sequence,
@@ -459,6 +465,9 @@ PREDICATEFUNCTION pred_used;
PREDICATEFUNCTION pred_user;
PREDICATEFUNCTION pred_writable;
PREDICATEFUNCTION pred_xtype;
+#ifdef WITH_SELINUX
+PREDICATEFUNCTION pred_context;
+#endif
@@ -601,6 +610,10 @@ struct options
*/
int regex_options;
+#ifdef WITH_SELINUX
+ int (*x_getfilecon) (const char *name, security_context_t *context);
+#endif
+
/* Optimisation level. One is the default.
*/
unsigned short optimisation_level;
--- findutils-4.4.0/find/find.1
+++ findutils-4.4.0/find/find.1
@@ -934,6 +934,8 @@ if \fIc\fR is `l'. In other words, for
checks the type of the file that
.B \-type
does not check.
+.IP "\-context \fIpattern\fR"
+(SELinux only) Security context of the file matches glob \fIpattern\fR.
.SS ACTIONS
.IP "\-delete\fR"
@@ -1340,6 +1342,8 @@ File's type (like in
U=unknown type (shouldn't happen)
.IP %Y
File's type (like %y), plus follow symlinks: L=loop, N=nonexistent
+.IP %Z
+(SELinux only) file's security context.
.PP
A `%' character followed by any other character is discarded, but the
other character is printed (don't rely on this, as further format
--- findutils-4.4.0/find/find.c
+++ findutils-4.4.0/find/find.c
@@ -120,6 +120,35 @@ int get_current_dirfd(void)
return AT_FDCWD;
}
+#ifdef WITH_SELINUX
+static int
+fallback_getfilecon (const char *name, security_context_t *p, int prev_rv)
+{
+ /* Our original getfilecon call failed. Perhaps we can't follow a
+ symbolic link. If that might be the problem, lgetfilecon the link.
+ Otherwise, admit defeat. */
+ switch (errno)
+ {
+ case ENOENT:
+ case ENOTDIR:
+#ifdef DEBUG_STAT
+ fprintf(stderr, "fallback_getfilecon(): getfilecon(%s) failed; falling back on lgetfilecon()\n", name);
+#endif
+ return lgetfilecon (name, p);
+
+ case EACCES:
+ case EIO:
+ case ELOOP:
+ case ENAMETOOLONG:
+#ifdef EOVERFLOW
+ case EOVERFLOW: /* EOVERFLOW is not #defined on UNICOS. */
+#endif
+ default:
+ return prev_rv;
+ }
+}
+#endif /* WITH_SELINUX */
+
int
main (int argc, char **argv)
--- findutils-4.4.0/find/parser.c
+++ findutils-4.4.0/find/parser.c
@@ -53,6 +53,10 @@
#include <unistd.h>
#include <sys/stat.h>
+#ifdef WITH_SELINUX
+#include <selinux/selinux.h>
+#endif
+
#if ENABLE_NLS
# include <libintl.h>
# define _(Text) gettext (Text)
@@ -156,6 +160,9 @@ static boolean parse_noignore_race PARAM
static boolean parse_warn PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_xtype PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
static boolean parse_quit PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
+#ifdef WITH_SELINUX
+static boolean parse_context PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
+#endif
boolean parse_print PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
@@ -252,6 +259,9 @@ static struct parser_table const parse_t
PARSE_TEST ("cmin", cmin), /* GNU */
PARSE_TEST ("cnewer", cnewer), /* GNU */
{ARG_TEST, "ctime", parse_time, pred_ctime}, /* POSIX */
+#ifdef WITH_SELINUX
+ PARSE_TEST ("context", context), /* GNU */
+#endif
PARSE_POSOPT ("daystart", daystart), /* GNU */
PARSE_ACTION ("delete", delete), /* GNU, Mac OS, FreeBSD */
PARSE_OPTION ("d", d), /* Mac OS X, FreeBSD, NetBSD, OpenBSD, but deprecated in favour of -depth */
@@ -348,6 +358,85 @@ static struct parser_table const parse_t
static const char *first_nonoption_arg = NULL;
static const struct parser_table *noop = NULL;
+#ifdef WITH_SELINUX
+static int
+fallback_getfilecon (const char *name, security_context_t *p, int prev_rv)
+{
+ /* Our original getfilecon call failed. Perhaps we can't follow a
+ symbolic link. If that might be the problem, lgetfilecon the link.
+ Otherwise, admit defeat. */
+ switch (errno)
+ {
+ case ENOENT:
+ case ENOTDIR:
+#ifdef DEBUG_STAT
+ fprintf(stderr, "fallback_getfilecon(): getfilecon(%s) failed; falling back on lgetfilecon()\n", name);
+#endif
+ return lgetfilecon (name, p);
+
+ case EACCES:
+ case EIO:
+ case ELOOP:
+ case ENAMETOOLONG:
+#ifdef EOVERFLOW
+ case EOVERFLOW: /* EOVERFLOW is not #defined on UNICOS. */
+#endif
+ default:
+ return prev_rv;
+ }
+}
+
+/* optionh_getfilecon implements the getfilecon operation when the
+ -H option is in effect.
+
+ If the item to be examined is a command-line argument, we follow
+ symbolic links. If the getfilecon call fails on the command-line
+ item, we fall back on the properties of the symbolic link.
+
+ If the item to be examined is not a command-line argument, we
+ examine the link itself. */
+int
+optionh_getfilecon (const char *name, security_context_t *p)
+{
+ if (state.curdepth == 0)
+ {
+ /* This file is from the command line; deference the link (if it
+ is a link). */
+ int rv = getfilecon (name, p);
+ if (0 == rv)
+ return 0; /* success */
+ else
+ return fallback_getfilecon (name, p, rv);
+ }
+ else
+ {
+ /* Not a file on the command line; do not derefernce the link. */
+ return lgetfilecon (name, p);
+ }
+}
+
+/* optionl_getfilecon implements the getfilecon operation when the
+ -L option is in effect. That option makes us examine the thing the
+ symbolic link points to, not the symbolic link itself. */
+int
+optionl_getfilecon (const char *name, security_context_t *p)
+{
+ int rv = getfilecon (name, p);
+ if (rv == 0)
+ return 0; /* normal case. */
+ else
+ return fallback_getfilecon (name, p, rv);
+}
+
+/* optionp_getfilecon implements the stat operation when the -P
+ option is in effect (this is also the default). That option makes
+ us examine the symbolic link itself, not the thing it points to. */
+int
+optionp_getfilecon (const char *name, security_context_t *p)
+{
+ return lgetfilecon (name, p);
+}
+#endif /* WITH_SELINUX */
void
check_option_combinations(const struct predicate *p)
@@ -451,11 +540,17 @@ set_follow_state(enum SymlinkOption opt)
{
case SYMLINK_ALWAYS_DEREF: /* -L */
options.xstat = optionl_stat;
+#ifdef WITH_SELINUX
+ options.x_getfilecon = optionl_getfilecon;
+#endif
options.no_leaf_check = true;
break;
case SYMLINK_NEVER_DEREF: /* -P (default) */
options.xstat = optionp_stat;
+#ifdef WITH_SELINUX
+ options.x_getfilecon = optionp_getfilecon;
+#endif
/* Can't turn no_leaf_check off because the user might have specified
* -noleaf anyway
*/
@@ -463,6 +558,9 @@ set_follow_state(enum SymlinkOption opt)
case SYMLINK_DEREF_ARGSONLY: /* -H */
options.xstat = optionh_stat;
+#ifdef WITH_SELINUX
+ options.x_getfilecon = optionh_getfilecon;
+#endif
options.no_leaf_check = true;
}
}
@@ -1124,6 +1222,10 @@ tests (N can be +N or -N or N): -amin N
-cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME\n\
-ilname PATTERN -iname PATTERN -inum N -iwholename PATTERN -iregex PATTERN\n\
-links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE"));
+#ifdef WITH_SELINUX
+ puts (_("\
+ -context CONTEXT"));
+#endif
puts (_("\
-nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN\n\
-readable -writable -executable\n\
@@ -2492,6 +2594,10 @@ parse_version (const struct parser_table
printf("LEAF_OPTIMISATION ");
++features;
#endif
+#if defined (WITH_SELINUX)
+ printf ("SELINUX ");
+ ++features;
+#endif
flags = 0;
if (is_fts_enabled(&flags))
@@ -2526,6 +2632,32 @@ parse_version (const struct parser_table
exit (0);
}
+#ifdef WITH_SELINUX
+static boolean
+parse_context (const struct parser_table* entry, char **argv, int *arg_ptr)
+{
+ struct predicate *our_pred;
+
+ if (argv == NULL || argv[*arg_ptr] == NULL)
+ return false;
+
+ if (is_selinux_enabled () <= 0)
+ {
+ error (1, 0, _("invalid predicate -context: SELinux is not enabled."));
+ return false;
+ }
+ our_pred = insert_primary (entry);
+ our_pred->need_stat = false;
+#ifdef DEBUG
+ our_pred->p_name = find_pred_name (pred_context);
+#endif /*DEBUG*/
+ our_pred->args.scontext = argv[*arg_ptr];
+
+ (*arg_ptr)++;
+ return true;
+}
+#endif /* WITH_SELINUX */
+
static boolean
parse_xdev (const struct parser_table* entry, char **argv, int *arg_ptr)
{
@@ -2777,7 +2909,7 @@ insert_fprintf (struct format_val *vec,
if (*scan2 == '.')
for (scan2++; ISDIGIT (*scan2); scan2++)
/* Do nothing. */ ;
- if (strchr ("abcdDfFgGhHiklmMnpPsStuUyY", *scan2))
+ if (strchr ("abcdDfFgGhHiklmMnpPsStuUyYZ", *scan2))
{
segmentp = make_segment (segmentp, format, scan2 - format,
KIND_FORMAT, *scan2, 0,
@@ -2904,6 +3036,7 @@ make_segment (struct segment **segment,
case 'h': /* leading directories part of path */
case 'p': /* pathname */
case 'P': /* pathname with ARGV element stripped */
+ case 'Z': /* SELinux security context */
*fmt++ = 's';
break;
--- findutils-4.4.0/find/pred.c
+++ findutils-4.4.0/find/pred.c
@@ -47,6 +47,10 @@
#include "error.h"
#include "verify.h"
+#ifdef WITH_SELINUX
+#include <selinux/selinux.h>
+#endif /*WITH_SELINUX*/
+
#if ENABLE_NLS
# include <libintl.h>
# define _(Text) gettext (Text)
@@ -229,6 +233,9 @@ struct pred_assoc pred_table[] =
{pred_user, "user "},
{pred_writable, "writable "},
{pred_xtype, "xtype "},
+#ifdef WITH_SELINUX
+ {pred_context, "context"},
+#endif /*WITH_SELINUX*/
{0, "none "}
};
#endif
@@ -1053,6 +1060,27 @@ do_fprintf(struct format_val *dest,
mode_to_filetype(stat_buf->st_mode & S_IFMT));
}
break;
+ case 'Z': /* SELinux security context */
+#ifdef WITH_SELINUX
+ {
+ security_context_t scontext;
+ int rv;
+ rv = options.x_getfilecon (state.rel_pathname, &scontext);
+
+ if (rv < 0)
+ {
+ fprintf (stderr, "getfilecon(%s): %s", pathname,
+ strerror (errno));
+ fflush (stderr);
+ }
+ else
+ {
+ checked_fprintf (dest, segment->text, scontext);
+ freecon (scontext);
+ }
+ }
+#endif /* WITH_SELINUX */
+ break;
}
/* end of KIND_FORMAT case */
break;
@@ -1841,6 +1869,33 @@ pred_xtype (const char *pathname, struct
*/
return (pred_type (pathname, &sbuf, pred_ptr));
}
+
+
+#ifdef WITH_SELINUX
+
+boolean
+pred_context (const char *pathname, struct stat *stat_buf,
+ struct predicate *pred_ptr)
+{
+ int rv;
+ security_context_t scontext;
+
+ rv = options.x_getfilecon (state.rel_pathname, &scontext);
+
+ if (rv < 0)
+ {
+ fprintf (stderr, "getfilecon(%s): %s\n", pathname, strerror (errno));
+ fflush (stderr);
+ return false;
+ }
+
+ rv = fnmatch (pred_ptr->args.scontext, scontext, 0) == 0;
+ freecon (scontext);
+ return rv;
+}
+
+#endif /*WITH_SELINUX*/
+
/* 1) fork to get a child; parent remembers the child pid
2) child execs the command requested
--- findutils-4.4.0/find/tree.c
+++ findutils-4.4.0/find/tree.c
@@ -953,7 +953,10 @@ static struct pred_cost_lookup costlooku
{ pred_used , NeedsStatInfo },
{ pred_user , NeedsStatInfo },
{ pred_writable , NeedsAccessInfo },
- { pred_xtype , NeedsType } /* roughly correct unless most files are symlinks */
+ { pred_xtype , NeedsType }, /* roughly correct unless most files are symlinks */
+#ifdef WITH_SELINUX
+ { pred_context , NeedsNothing } /* remove warning only:) */
+#endif
};
static int pred_table_sorted = 0;
@@ -1434,6 +1437,9 @@ get_new_pred (const struct parser_table
last_pred->need_stat = true;
last_pred->need_type = true;
last_pred->args.str = NULL;
+#ifdef WITH_SELINUX
+ last_pred->args.scontext = NULL;
+#endif
last_pred->pred_next = NULL;
last_pred->pred_left = NULL;
last_pred->pred_right = NULL;

View File

@ -1,3 +1,13 @@
-------------------------------------------------------------------
Mon Mar 8 18:53:10 CET 2010 - prusnak@suse.cz
- updated to 4.4.2
* see NEWS for more info
- updated SElinux patches (selinux.patch, selinux-gnulib.patch)
- added more patches from Fedora (autofs.patch, ftsremount.patch, xautofs.patch)
- findutils.patch renamed to updatedb.patch
- split-off lang package
-------------------------------------------------------------------
Fri Jul 10 19:26:16 UTC 2009 - jansimon.moeller@opensuse.org
@ -568,11 +578,7 @@ Mon Nov 10 11:04:28 MET 1997 - bs@suse.de
----------------------------------------------------------------------------
Sun Apr 13 23:04:29 MEST 1997 - florian@suse.de
- add bug-fixes from debian and gnu.utils.bugs
- updatedb now supports "--prunefs"
- "mv /usr/libexec/* /usr/lib/find/"

View File

@ -1,7 +1,7 @@
#
# spec file for package findutils (Version 4.4.0)
# spec file for package findutils (Version 4.4.2)
#
# Copyright (c) 2009 SUSE LINUX Products GmbH, Nuernberg, Germany.
# Copyright (c) 2010 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@ -18,51 +18,58 @@
Name: findutils
%if %suse_version > 1100
BuildRequires: libselinux-devel
%endif
Url: http://www.gnu.org/software/findutils/
License: GFDL v1.2 ; GPL v3 or later
License: GPLv3+
Group: Productivity/File utilities
Provides: find
Obsoletes: find
AutoReqProv: on
PreReq: %{install_info_prereq}
Version: 4.4.0
Release: 45
Summary: GNU find--Finding Files
Version: 4.4.2
Release: 1
Summary: The GNU versions of find utilities (find and xargs)
# retreived from http://ftp.gnu.org/pub/gnu/findutils/findutils-4.4.2.tar.gz
Source: findutils-%{version}.tar.bz2
Source1: sysconfig.locate
Source2: cron.daily.updatedb
Patch: findutils-%{version}.diff
Patch1: findutils-selinux.diff
Patch2: findutils-null.diff
# learn find to recognize autofs file system by reading /proc/mounts
# as autofs mount points are not listed in /etc/mtab
Patch0: findutils-4.4.2-autofs.patch
# adds a new option -xautofs to find to not descend into directories on autofs file systems
Patch1: findutils-4.4.2-xautofs.patch
# patch accepted by gnulib upstream - rhbz#538536
Patch2: findutils-4.4.2-fts-remount.patch
# gnulib based SELinux patch adding a new search predicate -context and
# a new -printf conversion %Z
Patch3: findutils-4.4.2-selinux.patch
# once the selinux-at module appears on the list within import-gnulib.config
# the following patch will be no longer needed
Patch4: findutils-4.4.2-selinux-gnulib.patch
Patch5: findutils-4.4.2-updatedb.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%if 0%{?suse_version} > 1100
BuildRequires: libselinux-devel
%endif
Provides: find = %{version}
Obsoletes: find < %{version}
Requires(post): %{install_info_prereq}
Requires(preun): %{install_info_prereq}
%description
This package contains GNU find and xargs. The programs comply with
POSIX 1003.2. They also support additional options, some borrowed from
Unix and some unique to GNU.
The findutils package contains programs which will help you locate
files on your system. The find utility searches through a hierarchy
of directories looking for files which match a certain set of criteria
(such as a file name pattern). The xargs utility builds and executes
command lines from standard input arguments (usually lists of file
names generated by the find command).
You should install findutils because it includes tools that are very
useful for finding things on your system.
Authors:
--------
David J. MacKenzie <djm@gnu.org>
Jan Brittenson <bson@gnu.org>
Brian L. Matthews <blm@6sceng.UUCP>
Mike Rendell <michael@cs.mun.ca>
James A. Woods <jwoods@adobe.com>
Jay Plett <jay@silence.princeton.nj.us>
Tim Wood <tim@toad.com>
%lang_package
%package locate
License: GPL v3 or later
Summary: Tool for Locating Files (GNU Findutils Subpackage)
License: GPLv3+
Summary: Tool for Locating Files (findutils subpackage)
Group: Productivity/File utilities
Provides: findutils:/usr/bin/locate
AutoReqProv: on
PreReq: %fillup_prereq
PreReq: %{fillup_prereq}
Requires: cron
%description locate
@ -74,48 +81,45 @@ an additional daily cron job will be added to the cron system. This
job will update the files database every night or shortly after
switching on the computer.
Authors:
--------
David J. MacKenzie <djm@gnu.org>
Jan Brittenson <bson@gnu.org>
Brian L. Matthews <blm@6sceng.UUCP>
Mike Rendell <michael@cs.mun.ca>
James A. Woods <jwoods@adobe.com>
Jay Plett <jay@silence.princeton.nj.us>
Tim Wood <tim@toad.com>
%prep
%setup -q
%patch
%patch0 -p1
%patch1 -p1
%patch2 -p0
%patch2 -p1
%patch3 -p1
%patch4 -p1
%patch5
%build
autoreconf
%ifarch %arm armv5tel armv7l armv7el armv5el
# this is a workaround for a qemu-user bug, we hit. A qemu patch is being discussed, but for now ...
DEFAULT_ARG_SIZE="(31u * 1024u)" \
export DEFAULT_ARG_SIZE="(31u * 1024u)"
%endif
./configure CFLAGS="$RPM_OPT_FLAGS" \
--prefix=%{_prefix} --libexecdir=%{_libdir}/find \
%configure \
--libexecdir=%{_libdir}/find \
--localstatedir=/var/lib \
--infodir=%{_infodir} --mandir=%{_mandir} \
--without-included-regex \
--without-fts \
--enable-d_type-optimisation
make
make %{?_smp_mflags}
%check
make check
%install
make install DESTDIR=$RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/var/adm/fillup-templates
mkdir -p $RPM_BUILD_ROOT/etc/cron.daily
install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/var/adm/fillup-templates
install -m 755 %{SOURCE2} $RPM_BUILD_ROOT/etc/cron.daily/suse.de-updatedb
%find_lang %name
install -D -m 644 %{SOURCE1} $RPM_BUILD_ROOT/var/adm/fillup-templates/sysconfig.locate
install -D -m 755 %{SOURCE2} $RPM_BUILD_ROOT/etc/cron.daily/suse-updatedb
rm -f $RPM_BUILD_ROOT%{_bindir}/oldfind
rm -f $RPM_BUILD_ROOT%{_bindir}/ftsfind
rm -f $RPM_BUILD_ROOT%{_infodir}/find-maint*
%find_lang %{name}
# move find to /bin/find
mkdir -p $RPM_BUILD_ROOT/bin
mv $RPM_BUILD_ROOT{%{_bindir},/bin}/find
# create /usr/bin/find -> /bin/find symlink
ln -sf ../../bin/find $RPM_BUILD_ROOT%{_bindir}
%clean
rm -rf $RPM_BUILD_ROOT
@ -126,20 +130,24 @@ rm -rf $RPM_BUILD_ROOT
%post
%install_info --info-dir=%{_infodir} %{_infodir}/find.info.gz
%postun
%preun
%install_info_delete --info-dir=%{_infodir} %{_infodir}/find.info.gz
%files -f %name.lang
%defattr(-,root,root,755)
%doc README NEWS AUTHORS TODO
%files
%defattr(-,root,root,-)
%doc AUTHORS COPYING NEWS README THANKS TODO
/bin/find
%{_bindir}/find
%{_bindir}/xargs
%doc %{_infodir}/find.info*.gz
%doc %{_mandir}/man1/find.1.gz
%doc %{_mandir}/man1/xargs.1.gz
%files lang -f %{name}.lang
%defattr(-,root,root,-)
%files locate
%defattr(-,root,root,755)
%defattr(-,root,root,-)
/etc/cron.daily/*
%{_bindir}/locate
%{_bindir}/updatedb