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:
parent
07ac24ddde
commit
d6d436937f
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:dd1dd2ffb38b28d00ab360ada03613ef07643c1f0e207ab2a00f362b7c160e19
|
||||
size 1436805
|
88
findutils-4.4.2-autofs.patch
Normal file
88
findutils-4.4.2-autofs.patch
Normal 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);
|
||||
|
27
findutils-4.4.2-fts-remount.patch
Normal file
27
findutils-4.4.2-fts-remount.patch
Normal 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
|
1138
findutils-4.4.2-selinux-gnulib.patch
Normal file
1138
findutils-4.4.2-selinux-gnulib.patch
Normal file
File diff suppressed because it is too large
Load Diff
445
findutils-4.4.2-selinux.patch
Normal file
445
findutils-4.4.2-selinux.patch
Normal 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;
|
@ -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
|
109
findutils-4.4.2-xautofs.patch
Normal file
109
findutils-4.4.2-xautofs.patch
Normal 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
3
findutils-4.4.2.tar.bz2
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:62ff724e2de32788fa527df69c631ad34c6dfbbd5430b6b6dc410662a6d206d6
|
||||
size 1506634
|
@ -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').
|
@ -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;
|
@ -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/"
|
||||
|
||||
|
||||
|
134
findutils.spec
134
findutils.spec
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user