basebuilder_pel7x64builder0
6 years ago
44 changed files with 13251 additions and 0 deletions
@ -0,0 +1,18 @@ |
|||||||
|
--- coreutils-5.92/src/date.c.langinfo 2005-09-16 09:06:57.000000000 +0100 |
||||||
|
+++ coreutils-5.92/src/date.c 2005-10-24 18:09:16.000000000 +0100 |
||||||
|
@@ -451,14 +451,7 @@ |
||||||
|
format = DATE_FMT_LANGINFO (); |
||||||
|
if (! *format) |
||||||
|
{ |
||||||
|
- /* Do not wrap the following literal format string with _(...). |
||||||
|
- For example, suppose LC_ALL is unset, LC_TIME=POSIX, |
||||||
|
- and LANG="ko_KR". In that case, POSIX says that LC_TIME |
||||||
|
- determines the format and contents of date and time strings |
||||||
|
- written by date, which means "date" must generate output |
||||||
|
- using the POSIX locale; but adding _() would cause "date" |
||||||
|
- to use a Korean translation of the format. */ |
||||||
|
- format = "%a %b %e %H:%M:%S %Z %Y"; |
||||||
|
+ format = dcgettext(NULL, N_("%a %b %e %H:%M:%S %Z %Y"), LC_TIME); |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,157 @@ |
|||||||
|
diff -urNp coreutils-8.21-orig/gnulib-tests/gnulib.mk coreutils-8.21/gnulib-tests/gnulib.mk |
||||||
|
--- coreutils-8.21-orig/gnulib-tests/gnulib.mk 2013-02-07 17:58:44.000000000 +0100 |
||||||
|
+++ coreutils-8.21/gnulib-tests/gnulib.mk 2013-02-15 10:12:28.110593165 +0100 |
||||||
|
@@ -267,9 +267,9 @@ EXTRA_DIST += nap.h test-chown.h test-ch |
||||||
|
|
||||||
|
## begin gnulib module cloexec-tests |
||||||
|
|
||||||
|
-TESTS += test-cloexec |
||||||
|
-check_PROGRAMS += test-cloexec |
||||||
|
-EXTRA_DIST += test-cloexec.c macros.h |
||||||
|
+#TESTS += test-cloexec |
||||||
|
+#check_PROGRAMS += test-cloexec |
||||||
|
+#EXTRA_DIST += test-cloexec.c macros.h |
||||||
|
|
||||||
|
## end gnulib module cloexec-tests |
||||||
|
|
||||||
|
@@ -378,9 +378,9 @@ EXTRA_DIST += test-dup.c signature.h mac |
||||||
|
|
||||||
|
## begin gnulib module dup2-tests |
||||||
|
|
||||||
|
-TESTS += test-dup2 |
||||||
|
-check_PROGRAMS += test-dup2 |
||||||
|
-EXTRA_DIST += test-dup2.c signature.h macros.h |
||||||
|
+#TESTS += test-dup2 |
||||||
|
+#check_PROGRAMS += test-dup2 |
||||||
|
+#EXTRA_DIST += test-dup2.c signature.h macros.h |
||||||
|
|
||||||
|
## end gnulib module dup2-tests |
||||||
|
|
||||||
|
@@ -439,10 +439,10 @@ EXTRA_DIST += test-fadvise.c |
||||||
|
|
||||||
|
## begin gnulib module fchdir-tests |
||||||
|
|
||||||
|
-TESTS += test-fchdir |
||||||
|
-check_PROGRAMS += test-fchdir |
||||||
|
-test_fchdir_LDADD = $(LDADD) $(LIBINTL) |
||||||
|
-EXTRA_DIST += test-fchdir.c signature.h macros.h |
||||||
|
+#TESTS += test-fchdir |
||||||
|
+#check_PROGRAMS += test-fchdir |
||||||
|
+#test_fchdir_LDADD = $(LDADD) $(LIBINTL) |
||||||
|
+#EXTRA_DIST += test-fchdir.c signature.h macros.h |
||||||
|
|
||||||
|
## end gnulib module fchdir-tests |
||||||
|
|
||||||
|
@@ -874,9 +874,9 @@ EXTRA_DIST += test-getloadavg.c signatur |
||||||
|
|
||||||
|
## begin gnulib module getlogin-tests |
||||||
|
|
||||||
|
-TESTS += test-getlogin |
||||||
|
-check_PROGRAMS += test-getlogin |
||||||
|
-EXTRA_DIST += test-getlogin.c signature.h macros.h |
||||||
|
+#TESTS += test-getlogin |
||||||
|
+#check_PROGRAMS += test-getlogin |
||||||
|
+#EXTRA_DIST += test-getlogin.c signature.h macros.h |
||||||
|
|
||||||
|
## end gnulib module getlogin-tests |
||||||
|
|
||||||
|
@@ -1119,10 +1119,10 @@ EXTRA_DIST += test-link.h test-link.c si |
||||||
|
|
||||||
|
## begin gnulib module linkat-tests |
||||||
|
|
||||||
|
-TESTS += test-linkat |
||||||
|
-check_PROGRAMS += test-linkat |
||||||
|
-test_linkat_LDADD = $(LDADD) @LIBINTL@ |
||||||
|
-EXTRA_DIST += test-link.h test-linkat.c signature.h macros.h |
||||||
|
+#TESTS += test-linkat |
||||||
|
+#check_PROGRAMS += test-linkat |
||||||
|
+#test_linkat_LDADD = $(LDADD) @LIBINTL@ |
||||||
|
+#EXTRA_DIST += test-link.h test-linkat.c signature.h macros.h |
||||||
|
|
||||||
|
## end gnulib module linkat-tests |
||||||
|
|
||||||
|
@@ -1331,9 +1331,9 @@ EXTRA_DIST += test-memcoll.c macros.h |
||||||
|
|
||||||
|
## begin gnulib module memrchr-tests |
||||||
|
|
||||||
|
-TESTS += test-memrchr |
||||||
|
-check_PROGRAMS += test-memrchr |
||||||
|
-EXTRA_DIST += test-memrchr.c zerosize-ptr.h signature.h macros.h |
||||||
|
+#TESTS += test-memrchr |
||||||
|
+#check_PROGRAMS += test-memrchr |
||||||
|
+#EXTRA_DIST += test-memrchr.c zerosize-ptr.h signature.h macros.h |
||||||
|
|
||||||
|
## end gnulib module memrchr-tests |
||||||
|
|
||||||
|
@@ -1978,9 +1978,9 @@ EXTRA_DIST += test-statat.c |
||||||
|
|
||||||
|
## begin gnulib module stdalign-tests |
||||||
|
|
||||||
|
-TESTS += test-stdalign |
||||||
|
-check_PROGRAMS += test-stdalign |
||||||
|
-EXTRA_DIST += test-stdalign.c macros.h |
||||||
|
+#TESTS += test-stdalign |
||||||
|
+#check_PROGRAMS += test-stdalign |
||||||
|
+#EXTRA_DIST += test-stdalign.c macros.h |
||||||
|
|
||||||
|
## end gnulib module stdalign-tests |
||||||
|
|
||||||
|
@@ -2323,9 +2323,9 @@ EXTRA_DIST += test-uname.c signature.h m |
||||||
|
|
||||||
|
## begin gnulib module unistd-safer-tests |
||||||
|
|
||||||
|
-TESTS += test-dup-safer |
||||||
|
-check_PROGRAMS += test-dup-safer |
||||||
|
-EXTRA_DIST += test-dup-safer.c macros.h |
||||||
|
+#TESTS += test-dup-safer |
||||||
|
+#check_PROGRAMS += test-dup-safer |
||||||
|
+#EXTRA_DIST += test-dup-safer.c macros.h |
||||||
|
|
||||||
|
## end gnulib module unistd-safer-tests |
||||||
|
|
||||||
|
@@ -2438,10 +2438,10 @@ EXTRA_DIST += test-usleep.c signature.h |
||||||
|
|
||||||
|
## begin gnulib module utimens-tests |
||||||
|
|
||||||
|
-TESTS += test-utimens |
||||||
|
-check_PROGRAMS += test-utimens |
||||||
|
-test_utimens_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) $(LIB_NANOSLEEP) @LIBINTL@ |
||||||
|
-EXTRA_DIST += nap.h test-futimens.h test-lutimens.h test-utimens.h test-utimens-common.h test-utimens.c macros.h |
||||||
|
+#TESTS += test-utimens |
||||||
|
+#check_PROGRAMS += test-utimens |
||||||
|
+#test_utimens_LDADD = $(LDADD) $(LIB_CLOCK_GETTIME) $(LIB_NANOSLEEP) @LIBINTL@ |
||||||
|
+#EXTRA_DIST += nap.h test-futimens.h test-lutimens.h test-utimens.h test-utimens-common.h test-utimens.c macros.h |
||||||
|
|
||||||
|
## end gnulib module utimens-tests |
||||||
|
|
||||||
|
diff -urNp coreutils-8.21-orig/tests/local.mk coreutils-8.21/tests/local.mk |
||||||
|
--- coreutils-8.21-orig/tests/local.mk 2013-02-11 11:30:12.000000000 +0100 |
||||||
|
+++ coreutils-8.21/tests/local.mk 2013-02-15 10:10:55.890532258 +0100 |
||||||
|
@@ -131,6 +131,7 @@ all_root_tests = \ |
||||||
|
tests/rm/no-give-up.sh \ |
||||||
|
tests/rm/one-file-system.sh \ |
||||||
|
tests/rm/read-only.sh \ |
||||||
|
+ tests/tail-2/inotify-hash-abuse.sh \ |
||||||
|
tests/tail-2/append-only.sh \ |
||||||
|
tests/touch/now-owned-by-other.sh |
||||||
|
|
||||||
|
@@ -163,7 +164,6 @@ all_tests = \ |
||||||
|
tests/cp/link-heap.sh \ |
||||||
|
tests/cp/no-ctx.sh \ |
||||||
|
tests/misc/tty-eof.pl \ |
||||||
|
- tests/tail-2/inotify-hash-abuse.sh \ |
||||||
|
tests/tail-2/inotify-hash-abuse2.sh \ |
||||||
|
tests/tail-2/F-vs-missing.sh \ |
||||||
|
tests/tail-2/F-vs-rename.sh \ |
||||||
|
diff -urNp coreutils-8.21-orig/tests/touch/no-dereference.sh coreutils-8.21/tests/touch/no-dereference.sh |
||||||
|
--- coreutils-8.21-orig/tests/touch/no-dereference.sh 2013-01-31 01:46:25.000000000 +0100 |
||||||
|
+++ coreutils-8.21/tests/touch/no-dereference.sh 2013-02-15 10:10:55.889593383 +0100 |
||||||
|
@@ -42,6 +42,8 @@ test -f nowhere && fail=1 |
||||||
|
grep '^#define HAVE_UTIMENSAT 1' "$CONFIG_HEADER" > /dev/null || |
||||||
|
grep '^#define HAVE_LUTIMES 1' "$CONFIG_HEADER" > /dev/null || |
||||||
|
skip_ 'this system lacks the utimensat function' |
||||||
|
+grep '^#define HAVE_WORKINGKOJI 1' "$CONFIG_HEADER" > /dev/null || |
||||||
|
+ skip_ 'rest of the test disabled due to koji lack of utimensat function' |
||||||
|
|
||||||
|
# Changing time of dangling symlink is okay. |
||||||
|
# Skip the test if this fails, but the error text corresponds to |
@ -0,0 +1,13 @@ |
|||||||
|
diff -urNp coreutils-6.12-orig/src/md5sum.c coreutils-6.12/src/md5sum.c |
||||||
|
--- coreutils-6.12-orig/src/md5sum.c 2008-05-26 08:40:33.000000000 +0200 |
||||||
|
+++ coreutils-6.12/src/md5sum.c 2008-10-21 16:07:28.000000000 +0200 |
||||||
|
@@ -175,6 +175,9 @@ With no FILE, or when FILE is -, read st |
||||||
|
fputs (_("\ |
||||||
|
-t, --text read in text mode (default)\n\ |
||||||
|
"), stdout); |
||||||
|
+ fputs (_("\ |
||||||
|
+ Note: There is no difference between binary and text mode option on GNU system.\n\ |
||||||
|
+"), stdout); |
||||||
|
fputs (_("\ |
||||||
|
\n\ |
||||||
|
The following four options are useful only when verifying checksums:\n\ |
@ -0,0 +1,12 @@ |
|||||||
|
diff -urNp coreutils-8.13-orig/src/stty.c coreutils-8.13/src/stty.c |
||||||
|
--- coreutils-8.13-orig/src/stty.c 2011-07-28 12:38:27.000000000 +0200 |
||||||
|
+++ coreutils-8.13/src/stty.c 2011-09-09 10:18:57.526687209 +0200 |
||||||
|
@@ -1005,7 +1005,7 @@ main (int argc, char **argv) |
||||||
|
spurious difference in an uninitialized portion of the structure. */ |
||||||
|
static struct termios new_mode; |
||||||
|
|
||||||
|
- if (tcsetattr (STDIN_FILENO, TCSADRAIN, &mode)) |
||||||
|
+ if (tcsetattr (STDIN_FILENO, TCSANOW, &mode)) |
||||||
|
error (EXIT_FAILURE, errno, "%s", device_name); |
||||||
|
|
||||||
|
/* POSIX (according to Zlotnick's book) tcsetattr returns zero if |
@ -0,0 +1,49 @@ |
|||||||
|
diff -urNp coreutils-8.2-orig/src/uname.c coreutils-8.2/src/uname.c |
||||||
|
--- coreutils-8.2-orig/src/uname.c 2009-09-23 10:25:44.000000000 +0200 |
||||||
|
+++ coreutils-8.2/src/uname.c 2009-12-19 09:09:11.663607110 +0100 |
||||||
|
@@ -301,7 +301,7 @@ main (int argc, char **argv) |
||||||
|
|
||||||
|
if (toprint & PRINT_PROCESSOR) |
||||||
|
{ |
||||||
|
- char const *element = unknown; |
||||||
|
+ char *element = unknown; |
||||||
|
#if HAVE_SYSINFO && defined SI_ARCHITECTURE |
||||||
|
{ |
||||||
|
static char processor[257]; |
||||||
|
@@ -308,6 +308,12 @@ main (int argc, char **argv) |
||||||
|
if (0 <= sysinfo (SI_ARCHITECTURE, processor, sizeof processor)) |
||||||
|
element = processor; |
||||||
|
} |
||||||
|
+#else |
||||||
|
+ { |
||||||
|
+ static struct utsname u; |
||||||
|
+ uname(&u); |
||||||
|
+ element = u.machine; |
||||||
|
+ } |
||||||
|
#endif |
||||||
|
#ifdef UNAME_PROCESSOR |
||||||
|
if (element == unknown) |
||||||
|
@@ -351,7 +357,7 @@ main (int argc, char **argv) |
||||||
|
|
||||||
|
if (toprint & PRINT_HARDWARE_PLATFORM) |
||||||
|
{ |
||||||
|
- char const *element = unknown; |
||||||
|
+ char *element = unknown; |
||||||
|
#if HAVE_SYSINFO && defined SI_PLATFORM |
||||||
|
{ |
||||||
|
static char hardware_platform[257]; |
||||||
|
@@ -353,6 +359,14 @@ main (int argc, char **argv) |
||||||
|
hardware_platform, sizeof hardware_platform)) |
||||||
|
element = hardware_platform; |
||||||
|
} |
||||||
|
+#else |
||||||
|
+ { |
||||||
|
+ static struct utsname u; |
||||||
|
+ uname(&u); |
||||||
|
+ element = u.machine; |
||||||
|
+ if(strlen(element)==4 && element[0]=='i' && element[2]=='8' && element[3]=='6') |
||||||
|
+ element[1]='3'; |
||||||
|
+ } |
||||||
|
#endif |
||||||
|
#ifdef UNAME_HARDWARE_PLATFORM |
||||||
|
if (element == unknown) |
@ -0,0 +1,109 @@ |
|||||||
|
From 2b3b5bfcd5f4161d17c0bc3d43f6edcfc4a2b294 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Nicolas Looss <nicolas.iooss@m4x.org> |
||||||
|
Date: Sat, 4 Jan 2014 03:03:51 +0000 |
||||||
|
Subject: [PATCH] copy: fix a segfault in SELinux context copying code |
||||||
|
|
||||||
|
* src/selinux.c (restorecon_private): On ArchLinux the |
||||||
|
`fakeroot cp -a file1 file2` command segfaulted due |
||||||
|
to getfscreatecon() returning a NULL context. |
||||||
|
So map this to the sometimes ignored ENODATA error, |
||||||
|
rather than crashing. |
||||||
|
* tests/cp/no-ctx.sh: Add a new test case. |
||||||
|
* tests/local.mk: Reference the new test. |
||||||
|
--- |
||||||
|
src/selinux.c | 5 ++++ |
||||||
|
tests/cp/no-ctx.sh | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ |
||||||
|
tests/local.mk | 1 + |
||||||
|
3 files changed, 59 insertions(+), 0 deletions(-) |
||||||
|
create mode 100755 tests/cp/no-ctx.sh |
||||||
|
|
||||||
|
diff --git a/src/selinux.c b/src/selinux.c |
||||||
|
index cd38a81..016db16 100644 |
||||||
|
--- a/src/selinux.c |
||||||
|
+++ b/src/selinux.c |
||||||
|
@@ -192,6 +192,11 @@ restorecon_private (char const *path, bool local) |
||||||
|
{ |
||||||
|
if (getfscreatecon (&tcon) < 0) |
||||||
|
return rc; |
||||||
|
+ if (!tcon) |
||||||
|
+ { |
||||||
|
+ errno = ENODATA; |
||||||
|
+ return rc; |
||||||
|
+ } |
||||||
|
rc = lsetfilecon (path, tcon); |
||||||
|
freecon (tcon); |
||||||
|
return rc; |
||||||
|
diff --git a/tests/cp/no-ctx.sh b/tests/cp/no-ctx.sh |
||||||
|
new file mode 100755 |
||||||
|
index 0000000..59d30de |
||||||
|
--- /dev/null |
||||||
|
+++ b/tests/cp/no-ctx.sh |
||||||
|
@@ -0,0 +1,53 @@ |
||||||
|
+#!/bin/sh |
||||||
|
+# Ensure we handle file systems returning no SELinux context, |
||||||
|
+# which triggered a segmentation fault in coreutils-8.22. |
||||||
|
+# This test is skipped on systems that lack LD_PRELOAD support; that's fine. |
||||||
|
+# Similarly, on a system that lacks lgetfilecon altogether, skipping it is fine. |
||||||
|
+ |
||||||
|
+# Copyright (C) 2014 Free Software Foundation, Inc. |
||||||
|
+ |
||||||
|
+# This program is free software: you can redistribute it and/or modify |
||||||
|
+# it under the terms of the GNU General Public License as published by |
||||||
|
+# the Free Software Foundation, either version 3 of the License, or |
||||||
|
+# (at your option) any later version. |
||||||
|
+ |
||||||
|
+# This program is distributed in the hope that it will be useful, |
||||||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
+# GNU General Public License for more details. |
||||||
|
+ |
||||||
|
+# You should have received a copy of the GNU General Public License |
||||||
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
+ |
||||||
|
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src |
||||||
|
+print_ver_ cp |
||||||
|
+require_gcc_shared_ |
||||||
|
+ |
||||||
|
+# Replace each getfilecon and lgetfilecon call with a call to these stubs. |
||||||
|
+cat > k.c <<'EOF' || skip_ |
||||||
|
+#include <selinux/selinux.h> |
||||||
|
+#include <errno.h> |
||||||
|
+ |
||||||
|
+int getfilecon (const char *path, security_context_t *con) |
||||||
|
+{ errno=ENODATA; return -1; } |
||||||
|
+int lgetfilecon (const char *path, security_context_t *con) |
||||||
|
+{ errno=ENODATA; return -1; } |
||||||
|
+EOF |
||||||
|
+ |
||||||
|
+# Then compile/link it: |
||||||
|
+$CC -shared -fPIC -O2 k.c -o k.so \ |
||||||
|
+ || skip_ 'failed to build SELinux shared library' |
||||||
|
+ |
||||||
|
+touch file_src |
||||||
|
+ |
||||||
|
+# New file with SELinux context optionally included |
||||||
|
+LD_PRELOAD=./k.so cp -a file_src file_dst || fail=1 |
||||||
|
+ |
||||||
|
+# Existing file with SELinux context optionally included |
||||||
|
+LD_PRELOAD=./k.so cp -a file_src file_dst || fail=1 |
||||||
|
+ |
||||||
|
+# ENODATA should give an immediate error when required to preserve ctx |
||||||
|
+# This is debatable, and maybe we should not fail when no context available? |
||||||
|
+LD_PRELOAD=./k.so cp --preserve=context file_src file_dst && fail=1 |
||||||
|
+ |
||||||
|
+Exit $fail |
||||||
|
diff --git a/tests/local.mk b/tests/local.mk |
||||||
|
index dc7341c..9d556f6 100644 |
||||||
|
--- a/tests/local.mk |
||||||
|
+++ b/tests/local.mk |
||||||
|
@@ -161,6 +161,7 @@ all_tests = \ |
||||||
|
tests/rm/ext3-perf.sh \ |
||||||
|
tests/rm/cycle.sh \ |
||||||
|
tests/cp/link-heap.sh \ |
||||||
|
+ tests/cp/no-ctx.sh \ |
||||||
|
tests/misc/tty-eof.pl \ |
||||||
|
tests/tail-2/inotify-hash-abuse.sh \ |
||||||
|
tests/tail-2/inotify-hash-abuse2.sh \ |
||||||
|
-- |
||||||
|
1.7.7.6 |
||||||
|
|
@ -0,0 +1,279 @@ |
|||||||
|
From eea6b49210edf69682b2d0606bee17bbccb3765b Mon Sep 17 00:00:00 2001 |
||||||
|
From: Dmitry Monakhov <dmonakhov@openvz.org> |
||||||
|
Date: Fri, 30 Oct 2015 22:04:46 +0000 |
||||||
|
Subject: [PATCH] copy: fix copying of extents beyond the apparent file size |
||||||
|
|
||||||
|
fallocate can allocate extents beyond EOF via FALLOC_FL_KEEP_SIZE. |
||||||
|
Where there is a gap (hole) between the extents, and EOF is within |
||||||
|
that gap, the final hole wasn't reproduced, resulting in silent |
||||||
|
data corruption in the copied file (size too small). |
||||||
|
|
||||||
|
* src/copy.c (extent_copy): Ensure we don't process extents |
||||||
|
beyond the apparent file size, since processing and allocating |
||||||
|
those is not currently supported. |
||||||
|
* tests/cp/fiemap-extents.sh: Renamed from tests/cp/fiemap-empty.sh |
||||||
|
and re-enable parts checking the extents at and beyond EOF. |
||||||
|
* tests/local.mk: Reference the renamed test. |
||||||
|
Fixes http://bugs.gnu.org/21790 |
||||||
|
--- |
||||||
|
src/copy.c | 19 ++++++++- |
||||||
|
tests/cp/fiemap-empty.sh | 102 -------------------------------------------- |
||||||
|
tests/cp/fiemap-extents.sh | 81 +++++++++++++++++++++++++++++++++++ |
||||||
|
tests/local.mk | 2 +- |
||||||
|
5 files changed, 100 insertions(+), 104 deletions(-) |
||||||
|
delete mode 100755 tests/cp/fiemap-empty.sh |
||||||
|
create mode 100755 tests/cp/fiemap-extents.sh |
||||||
|
|
||||||
|
diff --git a/src/copy.c b/src/copy.c |
||||||
|
index dc1cd29..6771bb5 100644 |
||||||
|
--- a/src/copy.c |
||||||
|
+++ b/src/copy.c |
||||||
|
@@ -432,6 +432,20 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size, |
||||||
|
ext_len = 0; |
||||||
|
} |
||||||
|
|
||||||
|
+ /* Truncate extent to EOF. Extents starting after EOF are |
||||||
|
+ treated as zero length extents starting right after EOF. |
||||||
|
+ Generally this will trigger with an extent starting after |
||||||
|
+ src_total_size, and result in creating a hole or zeros until EOF. |
||||||
|
+ Though in a file in which extents have changed since src_total_size |
||||||
|
+ was determined, we might have an extent spanning that size, |
||||||
|
+ in which case we'll only copy data up to that size. */ |
||||||
|
+ if (src_total_size < ext_start + ext_len) |
||||||
|
+ { |
||||||
|
+ if (src_total_size < ext_start) |
||||||
|
+ ext_start = src_total_size; |
||||||
|
+ ext_len = src_total_size - ext_start; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
hole_size = ext_start - last_ext_start - last_ext_len; |
||||||
|
|
||||||
|
wrote_hole_at_eof = false; |
||||||
|
@@ -495,14 +509,17 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size, |
||||||
|
off_t n_read; |
||||||
|
empty_extent = false; |
||||||
|
last_ext_len = ext_len; |
||||||
|
+ bool read_hole; |
||||||
|
|
||||||
|
if ( ! sparse_copy (src_fd, dest_fd, buf, buf_size, |
||||||
|
sparse_mode == SPARSE_ALWAYS, |
||||||
|
src_name, dst_name, ext_len, &n_read, |
||||||
|
- &wrote_hole_at_eof)) |
||||||
|
+ &read_hole)) |
||||||
|
goto fail; |
||||||
|
|
||||||
|
dest_pos = ext_start + n_read; |
||||||
|
+ if (n_read) |
||||||
|
+ wrote_hole_at_eof = read_hole; |
||||||
|
} |
||||||
|
|
||||||
|
/* If the file ends with unwritten extents not accounted for in the |
||||||
|
deleted file mode 100755 |
||||||
|
index b3b2cd7..0000000 |
||||||
|
--- a/tests/cp/fiemap-empty.sh |
||||||
|
+++ /dev/null |
||||||
|
@@ -1,101 +0,0 @@ |
||||||
|
-#!/bin/sh |
||||||
|
-# Test cp reads unwritten extents efficiently |
||||||
|
- |
||||||
|
-# Copyright (C) 2011-2013 Free Software Foundation, Inc. |
||||||
|
- |
||||||
|
-# This program is free software: you can redistribute it and/or modify |
||||||
|
-# it under the terms of the GNU General Public License as published by |
||||||
|
-# the Free Software Foundation, either version 3 of the License, or |
||||||
|
-# (at your option) any later version. |
||||||
|
- |
||||||
|
-# This program is distributed in the hope that it will be useful, |
||||||
|
-# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
-# GNU General Public License for more details. |
||||||
|
- |
||||||
|
-# You should have received a copy of the GNU General Public License |
||||||
|
-# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
- |
||||||
|
-. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src |
||||||
|
-print_ver_ cp |
||||||
|
- |
||||||
|
-# FIXME: enable any part of this test that is still relevant, |
||||||
|
-# or, if none are relevant (now that cp does not handle unwritten |
||||||
|
-# extents), just remove the test altogether. |
||||||
|
-skip_ 'disabled for now' |
||||||
|
- |
||||||
|
-touch fiemap_chk |
||||||
|
-fiemap_capable_ fiemap_chk || |
||||||
|
- skip_ 'this file system lacks FIEMAP support' |
||||||
|
-rm fiemap_chk |
||||||
|
- |
||||||
|
-# TODO: rather than requiring $(fallocate), possible add |
||||||
|
-# this functionality to truncate --alloc |
||||||
|
-fallocate --help >/dev/null || skip_ 'The fallocate utility is required' |
||||||
|
-fallocate -l 1 -n falloc.test || |
||||||
|
- skip_ 'this file system lacks FALLOCATE support' |
||||||
|
-rm falloc.test |
||||||
|
- |
||||||
|
-# Require more space than we'll actually use, so that |
||||||
|
-# tests run in parallel do not run out of space. |
||||||
|
-# Otherwise, with inadequate space, simply running the following |
||||||
|
-# fallocate command would induce a temporary disk-full condition, |
||||||
|
-# which would cause failure of unrelated tests run in parallel. |
||||||
|
-require_file_system_bytes_free_ 800000000 |
||||||
|
- |
||||||
|
-fallocate -l 600MiB space.test || |
||||||
|
- skip_ 'this test needs at least 600MiB free space' |
||||||
|
- |
||||||
|
-# Disable this test on old BTRFS (e.g. Fedora 14) |
||||||
|
-# which reports ordinary extents for unwritten ones. |
||||||
|
-filefrag space.test || skip_ 'the 'filefrag' utility is missing' |
||||||
|
-filefrag -v space.test | grep -F 'unwritten' > /dev/null || |
||||||
|
- skip_ 'this file system does not report empty extents as "unwritten"' |
||||||
|
- |
||||||
|
-rm space.test |
||||||
|
- |
||||||
|
-# Ensure we read a large empty file quickly |
||||||
|
-fallocate -l 300MiB empty.big || framework_failure_ |
||||||
|
-timeout 3 cp --sparse=always empty.big cp.test || fail=1 |
||||||
|
-test $(stat -c %s empty.big) = $(stat -c %s cp.test) || fail=1 |
||||||
|
-rm empty.big cp.test |
||||||
|
- |
||||||
|
-# Ensure we handle extents beyond file size correctly. |
||||||
|
-# Note until we support fallocate, we will not maintain |
||||||
|
-# the file allocation. FIXME: amend this test when fallocate is supported. |
||||||
|
-fallocate -l 10MiB -n unwritten.withdata || framework_failure_ |
||||||
|
-dd count=10 if=/dev/urandom conv=notrunc iflag=fullblock of=unwritten.withdata |
||||||
|
-cp unwritten.withdata cp.test || fail=1 |
||||||
|
-test $(stat -c %s unwritten.withdata) = $(stat -c %s cp.test) || fail=1 |
||||||
|
-cmp unwritten.withdata cp.test || fail=1 |
||||||
|
-rm unwritten.withdata cp.test |
||||||
|
- |
||||||
|
-# The following to generate unaccounted extents followed by a hole, is not |
||||||
|
-# supported by ext4 at least. The ftruncate discards all extents not |
||||||
|
-# accounted for in the size. |
||||||
|
-# fallocate -l 10MiB -n unacc.withholes |
||||||
|
-# dd count=10 if=/dev/urandom conv=notrunc iflag=fullblock of=unacc.withholes |
||||||
|
-# truncate -s20M unacc.withholes |
||||||
|
- |
||||||
|
-# Ensure we handle a hole after empty extents correctly. |
||||||
|
-# Since all extents are accounted for in the size, |
||||||
|
-# we can maintain the allocation independently from |
||||||
|
-# fallocate() support. |
||||||
|
-fallocate -l 10MiB empty.withholes |
||||||
|
-truncate -s 20M empty.withholes |
||||||
|
-sectors_per_block=$(expr $(stat -c %o .) / 512) |
||||||
|
-cp empty.withholes cp.test || fail=1 |
||||||
|
-test $(stat -c %s empty.withholes) = $(stat -c %s cp.test) || fail=1 |
||||||
|
-# These are usually equal but can vary by an IO block due to alignment |
||||||
|
-alloc_diff=$(expr $(stat -c %b empty.withholes) - $(stat -c %b cp.test)) |
||||||
|
-alloc_diff=$(echo $alloc_diff | tr -d -- -) # abs() |
||||||
|
-test $alloc_diff -le $sectors_per_block || fail=1 |
||||||
|
-# Again with SPARSE_ALWAYS |
||||||
|
-cp --sparse=always empty.withholes cp.test || fail=1 |
||||||
|
-test $(stat -c %s empty.withholes) = $(stat -c %s cp.test) || fail=1 |
||||||
|
-# cp.test should take 0 space, but allowing for some systems |
||||||
|
-# that store default extended attributes in data blocks |
||||||
|
-test $(stat -c %b cp.test) -le $sectors_per_block || fail=1 |
||||||
|
-rm empty.withholes cp.test |
||||||
|
- |
||||||
|
-Exit $fail |
||||||
|
diff --git a/tests/cp/fiemap-extents.sh b/tests/cp/fiemap-extents.sh |
||||||
|
new file mode 100755 |
||||||
|
index 0000000..55ec5df |
||||||
|
--- /dev/null |
||||||
|
+++ b/tests/cp/fiemap-extents.sh |
||||||
|
@@ -0,0 +1,81 @@ |
||||||
|
+#!/bin/sh |
||||||
|
+# Test cp handles extents correctly |
||||||
|
+ |
||||||
|
+# Copyright (C) 2011-2015 Free Software Foundation, Inc. |
||||||
|
+ |
||||||
|
+# This program is free software: you can redistribute it and/or modify |
||||||
|
+# it under the terms of the GNU General Public License as published by |
||||||
|
+# the Free Software Foundation, either version 3 of the License, or |
||||||
|
+# (at your option) any later version. |
||||||
|
+ |
||||||
|
+# This program is distributed in the hope that it will be useful, |
||||||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
+# GNU General Public License for more details. |
||||||
|
+ |
||||||
|
+# You should have received a copy of the GNU General Public License |
||||||
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
+ |
||||||
|
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src |
||||||
|
+print_ver_ cp |
||||||
|
+ |
||||||
|
+require_sparse_support_ |
||||||
|
+ |
||||||
|
+touch fiemap_chk |
||||||
|
+fiemap_capable_ fiemap_chk || |
||||||
|
+ skip_ 'this file system lacks FIEMAP support' |
||||||
|
+rm fiemap_chk |
||||||
|
+ |
||||||
|
+fallocate --help >/dev/null || skip_ 'The fallocate utility is required' |
||||||
|
+touch falloc.test || framework_failure_ |
||||||
|
+fallocate -l 1 -o 0 -n falloc.test || |
||||||
|
+ skip_ 'this file system lacks FALLOCATE support' |
||||||
|
+rm falloc.test |
||||||
|
+ |
||||||
|
+# We don't currently handle unwritten extents specially |
||||||
|
+if false; then |
||||||
|
+# Require more space than we'll actually use, so that |
||||||
|
+# tests run in parallel do not run out of space. |
||||||
|
+# Otherwise, with inadequate space, simply running the following |
||||||
|
+# fallocate command would induce a temporary disk-full condition, |
||||||
|
+# which would cause failure of unrelated tests run in parallel. |
||||||
|
+require_file_system_bytes_free_ 800000000 |
||||||
|
+ |
||||||
|
+fallocate -l 600MiB space.test || |
||||||
|
+ skip_ 'this test needs at least 600MiB free space' |
||||||
|
+ |
||||||
|
+# Disable this test on old BTRFS (e.g. Fedora 14) |
||||||
|
+# which reports ordinary extents for unwritten ones. |
||||||
|
+filefrag space.test || skip_ 'the 'filefrag' utility is missing' |
||||||
|
+filefrag -v space.test | grep -F 'unwritten' > /dev/null || |
||||||
|
+ skip_ 'this file system does not report empty extents as "unwritten"' |
||||||
|
+ |
||||||
|
+rm space.test |
||||||
|
+ |
||||||
|
+# Ensure we read a large empty file quickly |
||||||
|
+fallocate -l 300MiB empty.big || framework_failure_ |
||||||
|
+timeout 3 cp --sparse=always empty.big cp.test || fail=1 |
||||||
|
+test $(stat -c %s empty.big) = $(stat -c %s cp.test) || fail=1 |
||||||
|
+rm empty.big cp.test |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+# Ensure we handle extents beyond file size correctly. |
||||||
|
+# Note until we support fallocate, we will not maintain |
||||||
|
+# the file allocation. FIXME: amend this test if fallocate is supported. |
||||||
|
+# Note currently this only uses fiemap logic when the allocation (-l) |
||||||
|
+# is smaller than the size, thus identifying the file as sparse. |
||||||
|
+# Note the '-l 1' case is an effective noop, and just checks |
||||||
|
+# a file with a trailing hole is copied correctly. |
||||||
|
+for sparse_mode in always auto never; do |
||||||
|
+ for alloc in '-l 4MiB ' '-l 1MiB -o 4MiB' '-l 1'; do |
||||||
|
+ dd count=10 if=/dev/urandom iflag=fullblock of=unwritten.withdata |
||||||
|
+ truncate -s 2MiB unwritten.withdata || framework_failure_ |
||||||
|
+ fallocate $alloc -n unwritten.withdata || framework_failure_ |
||||||
|
+ cp --sparse=$sparse_mode unwritten.withdata cp.test || fail=1 |
||||||
|
+ test $(stat -c %s unwritten.withdata) = $(stat -c %s cp.test) || fail=1 |
||||||
|
+ cmp unwritten.withdata cp.test || fail=1 |
||||||
|
+ rm unwritten.withdata cp.test |
||||||
|
+ done |
||||||
|
+done |
||||||
|
+ |
||||||
|
+Exit $fail |
||||||
|
diff --git a/tests/local.mk b/tests/local.mk |
||||||
|
index adf96f0..89fdbb0 100644 |
||||||
|
--- a/tests/local.mk |
||||||
|
+++ b/tests/local.mk |
||||||
|
@@ -446,7 +446,7 @@ all_tests = \ |
||||||
|
tests/cp/existing-perm-dir.sh \ |
||||||
|
tests/cp/existing-perm-race.sh \ |
||||||
|
tests/cp/fail-perm.sh \ |
||||||
|
- tests/cp/fiemap-empty.sh \ |
||||||
|
+ tests/cp/fiemap-extents.sh \ |
||||||
|
tests/cp/fiemap-FMR.sh \ |
||||||
|
tests/cp/fiemap-perf.sh \ |
||||||
|
tests/cp/fiemap-2.sh \ |
||||||
|
-- |
||||||
|
1.7.2.5 |
||||||
|
|
@ -0,0 +1,46 @@ |
|||||||
|
From a10acfb1d2118f9a180181d3fed5399dbbe1df3c Mon Sep 17 00:00:00 2001 |
||||||
|
From: Pádraig Brady <P@draigBrady.com> |
||||||
|
Date: Tue, 25 Feb 2014 10:58:48 +0000 |
||||||
|
Subject: parse-datetime: fix crash or infloop in TZ="" parsing |
||||||
|
|
||||||
|
This was reported in http://bugs.gnu.org/16872 |
||||||
|
from the coreutils command: date -d 'TZ="""' |
||||||
|
|
||||||
|
The infinite loop for this case was present since the |
||||||
|
initial TZ="" parsing support in commit de95bdc2 29-10-2004. |
||||||
|
This was changed to a crash or heap corruption depending |
||||||
|
on the platform with commit 2e3e4195 18-01-2010. |
||||||
|
|
||||||
|
* lib/parse-datetime.y (parse_datetime): Break out of the |
||||||
|
TZ="" parsing loop once the second significant " is found. |
||||||
|
Also skip over any subsequent whitespace to be consistent |
||||||
|
with the non TZ= case. |
||||||
|
--- |
||||||
|
diff --git a/lib/parse-datetime.y b/lib/parse-datetime.y |
||||||
|
index 6ece765..0ba0a52 100644 |
||||||
|
--- a/lib/parse-datetime.y |
||||||
|
+++ b/lib/parse-datetime.y |
||||||
|
@@ -1303,8 +1303,6 @@ parse_datetime (struct timespec *result, char const *p, |
||||||
|
char tz1buf[TZBUFSIZE]; |
||||||
|
bool large_tz = TZBUFSIZE < tzsize; |
||||||
|
bool setenv_ok; |
||||||
|
- /* Free tz0, in case this is the 2nd or subsequent time through. */ |
||||||
|
- free (tz0); |
||||||
|
tz0 = get_tz (tz0buf); |
||||||
|
z = tz1 = large_tz ? xmalloc (tzsize) : tz1buf; |
||||||
|
for (s = tzbase; *s != '"'; s++) |
||||||
|
@@ -1316,7 +1314,12 @@ parse_datetime (struct timespec *result, char const *p, |
||||||
|
if (!setenv_ok) |
||||||
|
goto fail; |
||||||
|
tz_was_altered = true; |
||||||
|
+ |
||||||
|
p = s + 1; |
||||||
|
+ while (c = *p, c_isspace (c)) |
||||||
|
+ p++; |
||||||
|
+ |
||||||
|
+ break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
-- |
||||||
|
cgit v0.9.0.2 |
@ -0,0 +1,479 @@ |
|||||||
|
From af2a4ed22594badd2719c0123441d69b17bd8328 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Federico Simoncelli <fsimonce@redhat.com> |
||||||
|
Date: Fri, 26 Sep 2014 17:12:32 +0000 |
||||||
|
Subject: [PATCH] dd: new status=progress level to print stats periodically |
||||||
|
|
||||||
|
* src/dd.c: Report the transfer progress every second when the |
||||||
|
new status=progress level is used. Adjust the handling and |
||||||
|
description of the status= option so that they're treated as |
||||||
|
mutually exclusive levels, rather than flags with implicit precedence. |
||||||
|
* doc/coreutils.texi (dd invocation): Document the new progress |
||||||
|
status level. Reference the new level in the description of SIGUSR1. |
||||||
|
* tests/dd/stats.sh: Add new test for status=progress. |
||||||
|
* tests/dd/misc.sh: Change so status=none only takes precedence |
||||||
|
if it's the last level specified. |
||||||
|
--- |
||||||
|
diff --git a/doc/coreutils.texi b/doc/coreutils.texi |
||||||
|
index 7d32af5..03bb710 100644 |
||||||
|
--- a/doc/coreutils.texi |
||||||
|
+++ b/doc/coreutils.texi |
||||||
|
@@ -8631,24 +8631,32 @@ will ensure that @samp{count=} corresponds to complete input blocks |
||||||
|
rather than the traditional POSIX specified behavior of counting |
||||||
|
input read operations. |
||||||
|
|
||||||
|
-@item status=@var{which} |
||||||
|
+@item status=@var{level} |
||||||
|
@opindex status |
||||||
|
Transfer information is normally output to stderr upon |
||||||
|
receipt of the @samp{INFO} signal or when @command{dd} exits. |
||||||
|
-Specifying @var{which} will identify which information to suppress. |
||||||
|
+Specifying @var{level} will adjust the amount of information printed, |
||||||
|
+with the last @var{level} specified taking precedence. |
||||||
|
|
||||||
|
@table @samp |
||||||
|
|
||||||
|
-@item noxfer |
||||||
|
-@opindex noxfer @r{dd status=} |
||||||
|
-Do not print the transfer rate and volume statistics |
||||||
|
-that normally make up the last status line. |
||||||
|
- |
||||||
|
@item none |
||||||
|
@opindex none @r{dd status=} |
||||||
|
Do not print any informational or warning messages to stderr. |
||||||
|
Error messages are output as normal. |
||||||
|
|
||||||
|
+@item noxfer |
||||||
|
+@opindex noxfer @r{dd status=} |
||||||
|
+Do not print the final transfer rate and volume statistics |
||||||
|
+that normally make up the last status line. |
||||||
|
+ |
||||||
|
+@item progress |
||||||
|
+@opindex progress @r{dd status=} |
||||||
|
+Print the transfer rate and volume statistics on stderr, |
||||||
|
+when processing each input block. Statistics are output |
||||||
|
+on a single line at most once every second, but updates |
||||||
|
+can be delayed when waiting on I/O. |
||||||
|
+ |
||||||
|
@end table |
||||||
|
|
||||||
|
@item conv=@var{conversion}[,@var{conversion}]@dots{} |
||||||
|
@@ -9033,6 +9041,9 @@ The above script will output in the following format |
||||||
|
5120000000 bytes (5.1 GB) copied, 18.913 seconds, 271 MB/s |
||||||
|
@end example |
||||||
|
|
||||||
|
+Note also the @samp{status=progress} option which periodically updates |
||||||
|
+the last line of the transfer statistics above. |
||||||
|
+ |
||||||
|
@vindex POSIXLY_CORRECT |
||||||
|
On systems lacking the @samp{INFO} signal @command{dd} responds to the |
||||||
|
@samp{USR1} signal instead, unless the @env{POSIXLY_CORRECT} |
||||||
|
diff --git a/src/dd.c b/src/dd.c |
||||||
|
index d22ec59..4018190 100644 |
||||||
|
--- a/src/dd.c |
||||||
|
+++ b/src/dd.c |
||||||
|
@@ -34,6 +34,7 @@ |
||||||
|
#include "long-options.h" |
||||||
|
#include "quote.h" |
||||||
|
#include "quotearg.h" |
||||||
|
+#include "verror.h" |
||||||
|
#include "xstrtol.h" |
||||||
|
#include "xtime.h" |
||||||
|
|
||||||
|
@@ -132,11 +133,13 @@ enum |
||||||
|
C_SPARSE = 0200000 |
||||||
|
}; |
||||||
|
|
||||||
|
-/* Status bit masks. */ |
||||||
|
+/* Status levels. */ |
||||||
|
enum |
||||||
|
{ |
||||||
|
- STATUS_NOXFER = 01, |
||||||
|
- STATUS_NONE = 02 |
||||||
|
+ STATUS_NONE = 1, |
||||||
|
+ STATUS_NOXFER = 2, |
||||||
|
+ STATUS_DEFAULT = 3, |
||||||
|
+ STATUS_PROGRESS = 4 |
||||||
|
}; |
||||||
|
|
||||||
|
/* The name of the input file, or NULL for the standard input. */ |
||||||
|
@@ -188,7 +191,7 @@ static int input_flags = 0; |
||||||
|
static int output_flags = 0; |
||||||
|
|
||||||
|
/* Status flags for what is printed to stderr. */ |
||||||
|
-static int status_flags = 0; |
||||||
|
+static int status_level = STATUS_DEFAULT; |
||||||
|
|
||||||
|
/* If nonzero, filter characters through the translation table. */ |
||||||
|
static bool translation_needed = false; |
||||||
|
@@ -211,6 +214,12 @@ static uintmax_t w_bytes = 0; |
||||||
|
/* Time that dd started. */ |
||||||
|
static xtime_t start_time; |
||||||
|
|
||||||
|
+/* Previous time for periodic progress. */ |
||||||
|
+static xtime_t previous_time; |
||||||
|
+ |
||||||
|
+/* Whether a '\n' is pending after writing progress. */ |
||||||
|
+static bool newline_pending; |
||||||
|
+ |
||||||
|
/* True if input is seekable. */ |
||||||
|
static bool input_seekable; |
||||||
|
|
||||||
|
@@ -373,8 +382,9 @@ static struct symbol_value const flags[] = |
||||||
|
/* Status, for status="...". */ |
||||||
|
static struct symbol_value const statuses[] = |
||||||
|
{ |
||||||
|
- {"noxfer", STATUS_NOXFER}, |
||||||
|
{"none", STATUS_NONE}, |
||||||
|
+ {"noxfer", STATUS_NOXFER}, |
||||||
|
+ {"progress", STATUS_PROGRESS}, |
||||||
|
{"", 0} |
||||||
|
}; |
||||||
|
|
||||||
|
@@ -517,6 +527,25 @@ maybe_close_stdout (void) |
||||||
|
_exit (EXIT_FAILURE); |
||||||
|
} |
||||||
|
|
||||||
|
+/* Like error() but handle any pending newline. */ |
||||||
|
+ |
||||||
|
+static void _GL_ATTRIBUTE_FORMAT ((__printf__, 3, 4)) |
||||||
|
+nl_error (int status, int errnum, const char *fmt, ...) |
||||||
|
+{ |
||||||
|
+ if (newline_pending) |
||||||
|
+ { |
||||||
|
+ fputc ('\n', stderr); |
||||||
|
+ newline_pending = false; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ va_list ap; |
||||||
|
+ va_start (ap, fmt); |
||||||
|
+ verror (status, errnum, fmt, ap); |
||||||
|
+ va_end (ap); |
||||||
|
+} |
||||||
|
+ |
||||||
|
+#define error nl_error |
||||||
|
+ |
||||||
|
void |
||||||
|
usage (int status) |
||||||
|
{ |
||||||
|
@@ -546,8 +575,10 @@ Copy a file, converting and formatting according to the operands.\n\ |
||||||
|
oflag=FLAGS write as per the comma separated symbol list\n\ |
||||||
|
seek=N skip N obs-sized blocks at start of output\n\ |
||||||
|
skip=N skip N ibs-sized blocks at start of input\n\ |
||||||
|
- status=WHICH WHICH info to suppress outputting to stderr;\n\ |
||||||
|
- 'noxfer' suppresses transfer stats, 'none' suppresses all\n\ |
||||||
|
+ status=LEVEL The LEVEL of information to print to stderr;\n\ |
||||||
|
+ 'none' suppresses everything but error messages,\n\ |
||||||
|
+ 'noxfer' suppresses the final transfer statistics,\n\ |
||||||
|
+ 'progress' shows periodic transfer statistics\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (_("\ |
||||||
|
\n\ |
||||||
|
@@ -724,8 +755,7 @@ multiple_bits_set (int i) |
||||||
|
/* Print transfer statistics. */ |
||||||
|
|
||||||
|
static void |
||||||
|
-print_stats (void) |
||||||
|
-{ |
||||||
|
+print_xfer_stats (xtime_t progress_time) { |
||||||
|
char hbuf[LONGEST_HUMAN_READABLE + 1]; |
||||||
|
int human_opts = |
||||||
|
(human_autoscale | human_round_to_nearest |
||||||
|
@@ -733,23 +763,8 @@ print_stats (void) |
||||||
|
double delta_s; |
||||||
|
char const *bytes_per_second; |
||||||
|
|
||||||
|
- if (status_flags & STATUS_NONE) |
||||||
|
- return; |
||||||
|
- |
||||||
|
- fprintf (stderr, |
||||||
|
- _("%"PRIuMAX"+%"PRIuMAX" records in\n" |
||||||
|
- "%"PRIuMAX"+%"PRIuMAX" records out\n"), |
||||||
|
- r_full, r_partial, w_full, w_partial); |
||||||
|
- |
||||||
|
- if (r_truncate != 0) |
||||||
|
- fprintf (stderr, |
||||||
|
- ngettext ("%"PRIuMAX" truncated record\n", |
||||||
|
- "%"PRIuMAX" truncated records\n", |
||||||
|
- select_plural (r_truncate)), |
||||||
|
- r_truncate); |
||||||
|
- |
||||||
|
- if (status_flags & STATUS_NOXFER) |
||||||
|
- return; |
||||||
|
+ if (progress_time) |
||||||
|
+ fputc ('\r', stderr); |
||||||
|
|
||||||
|
/* Use integer arithmetic to compute the transfer rate, |
||||||
|
since that makes it easy to use SI abbreviations. */ |
||||||
|
@@ -761,7 +776,8 @@ print_stats (void) |
||||||
|
w_bytes, |
||||||
|
human_readable (w_bytes, hbuf, human_opts, 1, 1)); |
||||||
|
|
||||||
|
- xtime_t now = gethrxtime (); |
||||||
|
+ xtime_t now = progress_time ? progress_time : gethrxtime (); |
||||||
|
+ |
||||||
|
if (start_time < now) |
||||||
|
{ |
||||||
|
double XTIME_PRECISIONe0 = XTIME_PRECISION; |
||||||
|
@@ -787,7 +803,42 @@ print_stats (void) |
||||||
|
but that was incorrect for languages like Polish. To fix this |
||||||
|
bug we now use SI symbols even though they're a bit more |
||||||
|
confusing in English. */ |
||||||
|
- fprintf (stderr, _(", %g s, %s/s\n"), delta_s, bytes_per_second); |
||||||
|
+ char const *time_fmt = _(", %g s, %s/s\n");; |
||||||
|
+ if (progress_time) |
||||||
|
+ time_fmt = _(", %.6f s, %s/s"); /* OK with '\r' as increasing width. */ |
||||||
|
+ fprintf (stderr, time_fmt, delta_s, bytes_per_second); |
||||||
|
+ |
||||||
|
+ newline_pending = !!progress_time; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static void |
||||||
|
+print_stats (void) |
||||||
|
+{ |
||||||
|
+ if (status_level == STATUS_NONE) |
||||||
|
+ return; |
||||||
|
+ |
||||||
|
+ if (newline_pending) |
||||||
|
+ { |
||||||
|
+ fputc ('\n', stderr); |
||||||
|
+ newline_pending = false; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ fprintf (stderr, |
||||||
|
+ _("%"PRIuMAX"+%"PRIuMAX" records in\n" |
||||||
|
+ "%"PRIuMAX"+%"PRIuMAX" records out\n"), |
||||||
|
+ r_full, r_partial, w_full, w_partial); |
||||||
|
+ |
||||||
|
+ if (r_truncate != 0) |
||||||
|
+ fprintf (stderr, |
||||||
|
+ ngettext ("%"PRIuMAX" truncated record\n", |
||||||
|
+ "%"PRIuMAX" truncated records\n", |
||||||
|
+ select_plural (r_truncate)), |
||||||
|
+ r_truncate); |
||||||
|
+ |
||||||
|
+ if (status_level == STATUS_NOXFER) |
||||||
|
+ return; |
||||||
|
+ |
||||||
|
+ print_xfer_stats (0); |
||||||
|
} |
||||||
|
|
||||||
|
/* An ordinary signal was received; arrange for the program to exit. */ |
||||||
|
@@ -1035,7 +1086,7 @@ iread (int fd, char *buf, size_t size) |
||||||
|
if (0 < prev_nread && prev_nread < size) |
||||||
|
{ |
||||||
|
uintmax_t prev = prev_nread; |
||||||
|
- if (!(status_flags & STATUS_NONE)) |
||||||
|
+ if (status_level != STATUS_NONE) |
||||||
|
error (0, 0, ngettext (("warning: partial read (%"PRIuMAX" byte); " |
||||||
|
"suggest iflag=fullblock"), |
||||||
|
("warning: partial read (%"PRIuMAX" bytes); " |
||||||
|
@@ -1086,7 +1137,7 @@ iwrite (int fd, char const *buf, size_t size) |
||||||
|
{ |
||||||
|
int old_flags = fcntl (STDOUT_FILENO, F_GETFL); |
||||||
|
if (fcntl (STDOUT_FILENO, F_SETFL, old_flags & ~O_DIRECT) != 0 |
||||||
|
- && !(status_flags & STATUS_NONE)) |
||||||
|
+ && status_level != STATUS_NONE) |
||||||
|
error (0, errno, _("failed to turn off O_DIRECT: %s"), |
||||||
|
quote (output_file)); |
||||||
|
|
||||||
|
@@ -1219,7 +1270,7 @@ operand_matches (char const *str, char const *pattern, char delim) |
||||||
|
|
||||||
|
static int |
||||||
|
parse_symbols (char const *str, struct symbol_value const *table, |
||||||
|
- char const *error_msgid) |
||||||
|
+ bool exclusive, char const *error_msgid) |
||||||
|
{ |
||||||
|
int value = 0; |
||||||
|
|
||||||
|
@@ -1241,7 +1292,10 @@ parse_symbols (char const *str, struct symbol_value const *table, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
- value |= entry->value; |
||||||
|
+ if (exclusive) |
||||||
|
+ value = entry->value; |
||||||
|
+ else |
||||||
|
+ value |= entry->value; |
||||||
|
if (!strcomma) |
||||||
|
break; |
||||||
|
str = strcomma + 1; |
||||||
|
@@ -1316,17 +1370,17 @@ scanargs (int argc, char *const *argv) |
||||||
|
else if (operand_is (name, "of")) |
||||||
|
output_file = val; |
||||||
|
else if (operand_is (name, "conv")) |
||||||
|
- conversions_mask |= parse_symbols (val, conversions, |
||||||
|
+ conversions_mask |= parse_symbols (val, conversions, false, |
||||||
|
N_("invalid conversion")); |
||||||
|
else if (operand_is (name, "iflag")) |
||||||
|
- input_flags |= parse_symbols (val, flags, |
||||||
|
+ input_flags |= parse_symbols (val, flags, false, |
||||||
|
N_("invalid input flag")); |
||||||
|
else if (operand_is (name, "oflag")) |
||||||
|
- output_flags |= parse_symbols (val, flags, |
||||||
|
+ output_flags |= parse_symbols (val, flags, false, |
||||||
|
N_("invalid output flag")); |
||||||
|
else if (operand_is (name, "status")) |
||||||
|
- status_flags |= parse_symbols (val, statuses, |
||||||
|
- N_("invalid status flag")); |
||||||
|
+ status_level = parse_symbols (val, statuses, true, |
||||||
|
+ N_("invalid status level")); |
||||||
|
else |
||||||
|
{ |
||||||
|
bool invalid = false; |
||||||
|
@@ -1613,7 +1667,7 @@ skip_via_lseek (char const *filename, int fdesc, off_t offset, int whence) |
||||||
|
&& ioctl (fdesc, MTIOCGET, &s2) == 0 |
||||||
|
&& MT_SAME_POSITION (s1, s2)) |
||||||
|
{ |
||||||
|
- if (!(status_flags & STATUS_NONE)) |
||||||
|
+ if (status_level != STATUS_NONE) |
||||||
|
error (0, 0, _("warning: working around lseek kernel bug for file " |
||||||
|
"(%s)\n of mt_type=0x%0lx -- " |
||||||
|
"see <sys/mtio.h> for the list of types"), |
||||||
|
@@ -1787,7 +1841,7 @@ advance_input_after_read_error (size_t nbytes) |
||||||
|
if (offset == input_offset) |
||||||
|
return true; |
||||||
|
diff = input_offset - offset; |
||||||
|
- if (! (0 <= diff && diff <= nbytes) && !(status_flags & STATUS_NONE)) |
||||||
|
+ if (! (0 <= diff && diff <= nbytes) && status_level != STATUS_NONE) |
||||||
|
error (0, 0, _("warning: invalid file offset after failed read")); |
||||||
|
if (0 <= skip_via_lseek (input_file, STDIN_FILENO, diff, SEEK_CUR)) |
||||||
|
return true; |
||||||
|
@@ -1986,7 +2040,7 @@ dd_copy (void) |
||||||
|
2. pipe has not enough data |
||||||
|
3. partial reads */ |
||||||
|
if ((us_blocks || (!input_offset_overflow && us_bytes)) |
||||||
|
- && !(status_flags & STATUS_NONE)) |
||||||
|
+ && status_level != STATUS_NONE) |
||||||
|
{ |
||||||
|
error (0, 0, |
||||||
|
_("%s: cannot skip to specified offset"), quote (input_file)); |
||||||
|
@@ -2029,6 +2083,19 @@ dd_copy (void) |
||||||
|
|
||||||
|
while (1) |
||||||
|
{ |
||||||
|
+ if (status_level == STATUS_PROGRESS) |
||||||
|
+ { |
||||||
|
+ xtime_t progress_time = gethrxtime (); |
||||||
|
+ uintmax_t delta_xtime = progress_time; |
||||||
|
+ delta_xtime -= previous_time; |
||||||
|
+ double XTIME_PRECISIONe0 = XTIME_PRECISION; |
||||||
|
+ if (delta_xtime / XTIME_PRECISIONe0 > 1) |
||||||
|
+ { |
||||||
|
+ print_xfer_stats (progress_time); |
||||||
|
+ previous_time = progress_time; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ |
||||||
|
if (r_partial + r_full >= max_records + !!max_bytes) |
||||||
|
break; |
||||||
|
|
||||||
|
@@ -2053,7 +2120,7 @@ dd_copy (void) |
||||||
|
|
||||||
|
if (nread < 0) |
||||||
|
{ |
||||||
|
- if (!(conversions_mask & C_NOERROR) || !(status_flags & STATUS_NONE)) |
||||||
|
+ if (!(conversions_mask & C_NOERROR) || status_level != STATUS_NONE) |
||||||
|
error (0, errno, _("error reading %s"), quote (input_file)); |
||||||
|
|
||||||
|
if (conversions_mask & C_NOERROR) |
||||||
|
@@ -2345,7 +2412,7 @@ main (int argc, char **argv) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
- start_time = gethrxtime (); |
||||||
|
+ start_time = previous_time = gethrxtime (); |
||||||
|
|
||||||
|
exit_status = dd_copy (); |
||||||
|
|
||||||
|
diff --git a/tests/dd/misc.sh b/tests/dd/misc.sh |
||||||
|
index f877fdd..34dfba7 100755 |
||||||
|
--- a/tests/dd/misc.sh |
||||||
|
+++ b/tests/dd/misc.sh |
||||||
|
@@ -35,9 +35,12 @@ dd status=none if=$tmp_in of=/dev/null 2> err || fail=1 |
||||||
|
test -s err && { cat err; fail=1; } |
||||||
|
dd status=none if=$tmp_in skip=2 of=/dev/null 2> err || fail=1 |
||||||
|
test -s err && { cat err; fail=1; } |
||||||
|
-# check status=none is cumulative with status=noxfer |
||||||
|
-dd status=none status=noxfer if=$tmp_in of=/dev/null 2> err || fail=1 |
||||||
|
+# check later status=none overrides earlier status=noxfer |
||||||
|
+dd status=noxfer status=none if=$tmp_in of=/dev/null 2> err || fail=1 |
||||||
|
test -s err && { cat err; fail=1; } |
||||||
|
+# check later status=noxfer overrides earlier status=none |
||||||
|
+dd status=none status=noxfer if=$tmp_in of=/dev/null 2> err || fail=1 |
||||||
|
+compare /dev/null err && fail=1 |
||||||
|
|
||||||
|
dd if=$tmp_in of=$tmp_out 2> /dev/null || fail=1 |
||||||
|
compare $tmp_in $tmp_out || fail=1 |
||||||
|
diff --git a/tests/dd/stats.sh b/tests/dd/stats.sh |
||||||
|
new file mode 100755 |
||||||
|
index 0000000..24b8c49 100755 |
||||||
|
--- /dev/null |
||||||
|
+++ b/tests/dd/stats.sh |
||||||
|
@@ -0,0 +1,65 @@ |
||||||
|
+#!/bin/sh |
||||||
|
+# Check stats output for SIG{INFO,USR1} and status=progress |
||||||
|
+ |
||||||
|
+# Copyright (C) 2014 Free Software Foundation, Inc. |
||||||
|
+ |
||||||
|
+# This program is free software: you can redistribute it and/or modify |
||||||
|
+# it under the terms of the GNU General Public License as published by |
||||||
|
+# the Free Software Foundation, either version 3 of the License, or |
||||||
|
+# (at your option) any later version. |
||||||
|
+ |
||||||
|
+# This program is distributed in the hope that it will be useful, |
||||||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
+# GNU General Public License for more details. |
||||||
|
+ |
||||||
|
+# You should have received a copy of the GNU General Public License |
||||||
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
+ |
||||||
|
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src |
||||||
|
+print_ver_ dd |
||||||
|
+ |
||||||
|
+env kill -l | grep '^INFO$' && SIGINFO='INFO' || SIGINFO='USR1' |
||||||
|
+ |
||||||
|
+# This to avoid races in the USR1 case |
||||||
|
+# as the dd process will terminate by default until |
||||||
|
+# it has its handler enabled. |
||||||
|
+trap '' $SIGINFO |
||||||
|
+ |
||||||
|
+mkfifo_or_skip_ fifo |
||||||
|
+ |
||||||
|
+for open in '' '1'; do |
||||||
|
+ # Run dd with the fullblock iflag to avoid short reads |
||||||
|
+ # which can be triggered by reception of signals |
||||||
|
+ dd iflag=fullblock if=/dev/zero of=fifo count=100 bs=5000000 2>err & pid=$! |
||||||
|
+ |
||||||
|
+ # Note if we sleep here we give dd a chance to exec and block on open. |
||||||
|
+ # Otherwise we're probably testing SIG_IGN in the forked shell or early dd. |
||||||
|
+ test "$open" && sleep .1 |
||||||
|
+ |
||||||
|
+ # dd will block on open until fifo is opened for reading. |
||||||
|
+ # Timeout in case dd goes away erroneously which we check for below. |
||||||
|
+ timeout 10 sh -c 'wc -c < fifo > nwritten' & |
||||||
|
+ |
||||||
|
+ # Send lots of signals immediately to ensure dd not killed due |
||||||
|
+ # to race setting handler, or blocking on open of fifo. |
||||||
|
+ # Many signals also check that short reads are handled. |
||||||
|
+ until ! kill -s $SIGINFO $pid 2>/dev/null; do |
||||||
|
+ sleep .01 |
||||||
|
+ done |
||||||
|
+ |
||||||
|
+ wait |
||||||
|
+ |
||||||
|
+ # Ensure all data processed and at least last status written |
||||||
|
+ grep '500000000 bytes .* copied' err || { cat err; fail=1; } |
||||||
|
+done |
||||||
|
+ |
||||||
|
+progress_output() |
||||||
|
+{ |
||||||
|
+ { sleep "$1"; echo 1; } | dd bs=1 status=progress of=/dev/null 2>err |
||||||
|
+ # Progress output should be for "byte ... copied", while final is "bytes ..." |
||||||
|
+ grep 'byte .* copied' err |
||||||
|
+} |
||||||
|
+retry_delay_ progress_output 1 4 || { cat err; fail=1; } |
||||||
|
+ |
||||||
|
+Exit $fail |
||||||
|
-- |
||||||
|
cgit v0.9.0.2 |
@ -0,0 +1,40 @@ |
|||||||
|
From ed936e1909a314febfdb9574bd10cc2d46d2b3e3 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Fri, 19 Feb 2016 10:41:49 +0100 |
||||||
|
Subject: [PATCH] mountlist: recognize autofs-mounted remote file systems, too |
||||||
|
|
||||||
|
Originally reported at: https://bugzilla.redhat.com/1309247 |
||||||
|
* lib/mountlist.c (ME_REMOTE): Return true if a file system is named |
||||||
|
"-hosts" because it is used by autofs to mount remote file systems. |
||||||
|
|
||||||
|
Upstream-commit: 781788eeb5d4d0b816698e8629300cd90a7379bd |
||||||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com> |
||||||
|
--- |
||||||
|
lib/mountlist.c | 6 ++++-- |
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/lib/mountlist.c b/lib/mountlist.c |
||||||
|
index b839cd1..17779f6 100644 |
||||||
|
--- a/lib/mountlist.c |
||||||
|
+++ b/lib/mountlist.c |
||||||
|
@@ -212,13 +212,15 @@ me_remote (char const *fs_name, char const *fs_type _GL_UNUSED) |
||||||
|
|
||||||
|
#ifndef ME_REMOTE |
||||||
|
/* A file system is "remote" if its Fs_name contains a ':' |
||||||
|
- or if (it is of type (smbfs or cifs) and its Fs_name starts with '//'). */ |
||||||
|
+ or if (it is of type (smbfs or cifs) and its Fs_name starts with '//') |
||||||
|
+ or Fs_name is equal to "-hosts" (used by autofs to mount remote fs). */ |
||||||
|
# define ME_REMOTE(Fs_name, Fs_type) \ |
||||||
|
(strchr (Fs_name, ':') != NULL \ |
||||||
|
|| ((Fs_name)[0] == '/' \ |
||||||
|
&& (Fs_name)[1] == '/' \ |
||||||
|
&& (strcmp (Fs_type, "smbfs") == 0 \ |
||||||
|
- || strcmp (Fs_type, "cifs") == 0))) |
||||||
|
+ || strcmp (Fs_type, "cifs") == 0)) \ |
||||||
|
+ || (strcmp("-hosts", Fs_name) == 0)) |
||||||
|
#endif |
||||||
|
|
||||||
|
#if MOUNTED_GETMNTINFO |
||||||
|
-- |
||||||
|
2.5.0 |
||||||
|
|
@ -0,0 +1,513 @@ |
|||||||
|
diff --git a/src/df.c b/src/df.c |
||||||
|
index e28a656..fe222d9 100644 |
||||||
|
--- a/src/df.c |
||||||
|
+++ b/src/df.c |
||||||
|
@@ -45,12 +45,12 @@ |
||||||
|
|
||||||
|
/* Filled with device numbers of examined file systems to avoid |
||||||
|
duplicities in output. */ |
||||||
|
-struct devlist |
||||||
|
+static struct devlist |
||||||
|
{ |
||||||
|
dev_t dev_num; |
||||||
|
struct mount_entry *me; |
||||||
|
struct devlist *next; |
||||||
|
-}; |
||||||
|
+} *device_list; |
||||||
|
|
||||||
|
/* If true, show even file systems with zero size or |
||||||
|
uninteresting types. */ |
||||||
|
@@ -609,13 +609,10 @@ excluded_fstype (const char *fstype) |
||||||
|
me_mountdir wins. */ |
||||||
|
|
||||||
|
static void |
||||||
|
-filter_mount_list (void) |
||||||
|
+filter_mount_list (bool devices_only) |
||||||
|
{ |
||||||
|
struct mount_entry *me; |
||||||
|
|
||||||
|
- /* Store of already-processed device numbers. */ |
||||||
|
- struct devlist *devlist_head = NULL; |
||||||
|
- |
||||||
|
/* Sort all 'wanted' entries into the list devlist_head. */ |
||||||
|
for (me = mount_list; me;) |
||||||
|
{ |
||||||
|
@@ -623,41 +620,66 @@ filter_mount_list (void) |
||||||
|
struct devlist *devlist; |
||||||
|
struct mount_entry *discard_me = NULL; |
||||||
|
|
||||||
|
- if (-1 == stat (me->me_mountdir, &buf)) |
||||||
|
+ /* Avoid stating remote file systems as that may hang. |
||||||
|
+ On Linux we probably have me_dev populated from /proc/self/mountinfo, |
||||||
|
+ however we still stat() in case another device was mounted later. */ |
||||||
|
+ if ((me->me_remote && show_local_fs) |
||||||
|
+ || -1 == stat (me->me_mountdir, &buf)) |
||||||
|
{ |
||||||
|
- /* Stat failed - add ME to be able to complain about it later. */ |
||||||
|
+ /* If remote, and showing just local, add ME for filtering later. |
||||||
|
+ If stat failed; add ME to be able to complain about it later. */ |
||||||
|
buf.st_dev = me->me_dev; |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
- /* If the device name is a real path name ... */ |
||||||
|
- if (strchr (me->me_devname, '/')) |
||||||
|
- { |
||||||
|
- /* ... try to find its device number in the devlist. */ |
||||||
|
- for (devlist = devlist_head; devlist; devlist = devlist->next) |
||||||
|
- if (devlist->dev_num == buf.st_dev) |
||||||
|
- break; |
||||||
|
+ /* If we've already seen this device... */ |
||||||
|
+ for (devlist = device_list; devlist; devlist = devlist->next) |
||||||
|
+ if (devlist->dev_num == buf.st_dev) |
||||||
|
+ break; |
||||||
|
|
||||||
|
- if (devlist) |
||||||
|
+ if (devlist) |
||||||
|
+ { |
||||||
|
+ if (! print_grand_total && me->me_remote && devlist->me->me_remote |
||||||
|
+ && ! STREQ (devlist->me->me_devname, me->me_devname)) |
||||||
|
{ |
||||||
|
+ /* Don't discard remote entries with different locations, |
||||||
|
+ as these are more likely to be explicitly mounted. |
||||||
|
+ However avoid this when producing a total to give |
||||||
|
+ a more accurate value in that case. */ |
||||||
|
+ } |
||||||
|
+ else if ((strchr (me->me_devname, '/') |
||||||
|
+ /* let "real" devices with '/' in the name win. */ |
||||||
|
+ && ! strchr (devlist->me->me_devname, '/')) |
||||||
|
+ /* let a shorter mountdir win. */ |
||||||
|
+ || (strlen (devlist->me->me_mountdir) |
||||||
|
+ > strlen (me->me_mountdir)) |
||||||
|
+ /* let an entry overmounted on a new device win... */ |
||||||
|
+ || (! STREQ (devlist->me->me_devname, me->me_devname) |
||||||
|
+ /* ... but only when matching an existing mnt point, |
||||||
|
+ to avoid problematic replacement when given |
||||||
|
+ inaccurate mount lists, seen with some chroot |
||||||
|
+ environments for example. */ |
||||||
|
+ && STREQ (me->me_mountdir, |
||||||
|
+ devlist->me->me_mountdir))) |
||||||
|
+ { |
||||||
|
+ /* Discard mount entry for existing device. */ |
||||||
|
+ discard_me = devlist->me; |
||||||
|
+ devlist->me = me; |
||||||
|
+ } |
||||||
|
+ else |
||||||
|
+ { |
||||||
|
+ /* Discard mount entry currently being processed. */ |
||||||
|
discard_me = me; |
||||||
|
- |
||||||
|
- /* Let the shorter mountdir win. */ |
||||||
|
- if (! strchr (devlist->me->me_devname, '/') |
||||||
|
- || (strlen (devlist->me->me_mountdir) |
||||||
|
- > strlen (me->me_mountdir))) |
||||||
|
- { |
||||||
|
- discard_me = devlist->me; |
||||||
|
- devlist->me = me; |
||||||
|
- } |
||||||
|
} |
||||||
|
+ |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (discard_me) |
||||||
|
{ |
||||||
|
me = me->me_next; |
||||||
|
- free_mount_entry (discard_me); |
||||||
|
+ if (! devices_only) |
||||||
|
+ free_mount_entry (discard_me); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
@@ -665,28 +687,49 @@ filter_mount_list (void) |
||||||
|
devlist = xmalloc (sizeof *devlist); |
||||||
|
devlist->me = me; |
||||||
|
devlist->dev_num = buf.st_dev; |
||||||
|
- devlist->next = devlist_head; |
||||||
|
- devlist_head = devlist; |
||||||
|
+ devlist->next = device_list; |
||||||
|
+ device_list = devlist; |
||||||
|
|
||||||
|
me = me->me_next; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/* Finally rebuild the mount_list from the devlist. */ |
||||||
|
- mount_list = NULL; |
||||||
|
- while (devlist_head) |
||||||
|
+ if (! devices_only) { |
||||||
|
+ mount_list = NULL; |
||||||
|
+ while (device_list) |
||||||
|
+ { |
||||||
|
+ /* Add the mount entry. */ |
||||||
|
+ me = device_list->me; |
||||||
|
+ me->me_next = mount_list; |
||||||
|
+ mount_list = me; |
||||||
|
+ /* Free devlist entry and advance. */ |
||||||
|
+ struct devlist *devlist = device_list->next; |
||||||
|
+ free (device_list); |
||||||
|
+ device_list = devlist; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+} |
||||||
|
+ |
||||||
|
+/* Search a mount entry list for device id DEV. |
||||||
|
+ Return the corresponding mount entry if found or NULL if not. */ |
||||||
|
+ |
||||||
|
+static struct mount_entry const * _GL_ATTRIBUTE_PURE |
||||||
|
+me_for_dev (dev_t dev) |
||||||
|
+{ |
||||||
|
+ struct devlist *dl = device_list; |
||||||
|
+ |
||||||
|
+ while (dl) |
||||||
|
{ |
||||||
|
- /* Add the mount entry. */ |
||||||
|
- me = devlist_head->me; |
||||||
|
- me->me_next = mount_list; |
||||||
|
- mount_list = me; |
||||||
|
- /* Free devlist entry and advance. */ |
||||||
|
- struct devlist *devlist = devlist_head->next; |
||||||
|
- free (devlist_head); |
||||||
|
- devlist_head = devlist; |
||||||
|
+ if (dl->dev_num == dev) |
||||||
|
+ return dl->me; |
||||||
|
+ dl = dl->next; |
||||||
|
} |
||||||
|
+ |
||||||
|
+ return NULL; |
||||||
|
} |
||||||
|
|
||||||
|
+ |
||||||
|
/* Return true if N is a known integer value. On many file systems, |
||||||
|
UINTMAX_MAX represents an unknown value; on AIX, UINTMAX_MAX - 1 |
||||||
|
represents unknown. Use a rule that works on AIX file systems, and |
||||||
|
@@ -856,6 +899,11 @@ get_dev (char const *disk, char const *mount_point, char const* file, |
||||||
|
if (!selected_fstype (fstype) || excluded_fstype (fstype)) |
||||||
|
return; |
||||||
|
|
||||||
|
+ /* Ignore relative MOUNT_POINTs, which are present for example |
||||||
|
+ in /proc/mounts on Linux with network namespaces. */ |
||||||
|
+ if (!force_fsu && mount_point && ! IS_ABSOLUTE_FILE_NAME (mount_point)) |
||||||
|
+ return; |
||||||
|
+ |
||||||
|
/* If MOUNT_POINT is NULL, then the file system is not mounted, and this |
||||||
|
program reports on the file system that the special file is on. |
||||||
|
It would be better to report on the unmounted file system, |
||||||
|
@@ -868,9 +916,43 @@ get_dev (char const *disk, char const *mount_point, char const* file, |
||||||
|
fsu = *force_fsu; |
||||||
|
else if (get_fs_usage (stat_file, disk, &fsu)) |
||||||
|
{ |
||||||
|
- error (0, errno, "%s", quote (stat_file)); |
||||||
|
- exit_status = EXIT_FAILURE; |
||||||
|
- return; |
||||||
|
+ /* If we can't access a system provided entry due |
||||||
|
+ to it not being present (now), or due to permissions, |
||||||
|
+ just output placeholder values rather than failing. */ |
||||||
|
+ if (process_all && (errno == EACCES || errno == ENOENT)) |
||||||
|
+ { |
||||||
|
+ if (! show_all_fs) |
||||||
|
+ return; |
||||||
|
+ |
||||||
|
+ fstype = "-"; |
||||||
|
+ fsu.fsu_blocksize = fsu.fsu_blocks = fsu.fsu_bfree = |
||||||
|
+ fsu.fsu_bavail = fsu.fsu_files = fsu.fsu_ffree = UINTMAX_MAX; |
||||||
|
+ } |
||||||
|
+ else |
||||||
|
+ { |
||||||
|
+ error (0, errno, "%s", quote (stat_file)); |
||||||
|
+ exit_status = EXIT_FAILURE; |
||||||
|
+ return; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ else if (process_all && show_all_fs) |
||||||
|
+ { |
||||||
|
+ /* Ensure we don't output incorrect stats for over-mounted directories. |
||||||
|
+ Discard stats when the device name doesn't match. Though don't |
||||||
|
+ discard when used and current mount entries are both remote due |
||||||
|
+ to the possibility of aliased host names or exports. */ |
||||||
|
+ struct stat sb; |
||||||
|
+ if (stat (stat_file, &sb) == 0) |
||||||
|
+ { |
||||||
|
+ struct mount_entry const * dev_me = me_for_dev (sb.st_dev); |
||||||
|
+ if (dev_me && ! STREQ (dev_me->me_devname, disk) |
||||||
|
+ && (! dev_me->me_remote || ! me_remote)) |
||||||
|
+ { |
||||||
|
+ fstype = "-"; |
||||||
|
+ fsu.fsu_blocksize = fsu.fsu_blocks = fsu.fsu_bfree = |
||||||
|
+ fsu.fsu_bavail = fsu.fsu_files = fsu.fsu_ffree = UINTMAX_MAX; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
} |
||||||
|
|
||||||
|
if (fsu.fsu_blocks == 0 && !show_all_fs && !show_listed_fs) |
||||||
|
@@ -1275,8 +1357,7 @@ get_all_entries (void) |
||||||
|
{ |
||||||
|
struct mount_entry *me; |
||||||
|
|
||||||
|
- if (!show_all_fs) |
||||||
|
- filter_mount_list (); |
||||||
|
+ filter_mount_list (show_all_fs); |
||||||
|
|
||||||
|
for (me = mount_list; me; me = me->me_next) |
||||||
|
get_dev (me->me_devname, me->me_mountdir, NULL, NULL, me->me_type, |
||||||
|
@@ -1325,7 +1406,7 @@ or all file systems by default.\n\ |
||||||
|
emit_mandatory_arg_note (); |
||||||
|
|
||||||
|
fputs (_("\ |
||||||
|
- -a, --all include dummy file systems\n\ |
||||||
|
+ -a, --all include pseudo, duplicate, inaccessible file systems\n\ |
||||||
|
-B, --block-size=SIZE scale sizes by SIZE before printing them; e.g.,\n\ |
||||||
|
'-BM' prints sizes in units of 1,048,576 bytes;\n\ |
||||||
|
see SIZE format below\n\ |
||||||
|
diff --git a/doc/coreutils.texi b/doc/coreutils.texi |
||||||
|
index 942d9a1..1df1eac 100644 |
||||||
|
--- a/doc/coreutils.texi |
||||||
|
+++ b/doc/coreutils.texi |
||||||
|
@@ -11123,11 +11123,15 @@ The program accepts the following options. Also see @ref{Common options}. |
||||||
|
@itemx --all |
||||||
|
@opindex -a |
||||||
|
@opindex --all |
||||||
|
-@cindex automounter file systems |
||||||
|
@cindex ignore file systems |
||||||
|
-Include in the listing dummy file systems, which |
||||||
|
-are omitted by default. Such file systems are typically special-purpose |
||||||
|
-pseudo-file-systems, such as automounter entries. |
||||||
|
+Include in the listing dummy, duplicate, or inaccessible file systems, which |
||||||
|
+are omitted by default. Dummy file systems are typically special purpose |
||||||
|
+pseudo file systems such as @samp{/proc}, with no associated storage. |
||||||
|
+Duplicate file systems are local or remote file systems that are mounted |
||||||
|
+at separate locations in the local file hierarchy, or bind mounted locations. |
||||||
|
+Inaccessible file systems are those which are mounted but subsequently |
||||||
|
+over-mounted by another file system at that point, or otherwise inaccessible |
||||||
|
+due to permissions of the mount point etc. |
||||||
|
|
||||||
|
@item -B @var{size} |
||||||
|
@itemx --block-size=@var{size} |
||||||
|
diff --git a/tests/df/skip-duplicates.sh b/tests/df/skip-duplicates.sh |
||||||
|
index 1e94dc0..4069604 100755 |
||||||
|
--- a/tests/df/skip-duplicates.sh |
||||||
|
+++ b/tests/df/skip-duplicates.sh |
||||||
|
@@ -2,7 +2,7 @@ |
||||||
|
# Test df's behavior when the mount list contains duplicate entries. |
||||||
|
# This test is skipped on systems that lack LD_PRELOAD support; that's fine. |
||||||
|
|
||||||
|
-# Copyright (C) 2012-2013 Free Software Foundation, Inc. |
||||||
|
+# Copyright (C) 2012-2015 Free Software Foundation, Inc. |
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
@@ -21,19 +21,73 @@ |
||||||
|
print_ver_ df |
||||||
|
require_gcc_shared_ |
||||||
|
|
||||||
|
-df || skip_ "df fails" |
||||||
|
+# We use --local here so as to not activate |
||||||
|
+# potentially very many remote mounts. |
||||||
|
+df --local || skip_ 'df fails' |
||||||
|
|
||||||
|
-# Simulate an mtab file with two entries of the same device number. |
||||||
|
-# Also add entries with unstatable mount dirs to ensure that's handled. |
||||||
|
-cat > k.c <<'EOF' || framework_failure_ |
||||||
|
+export CU_NONROOT_FS=$(df --local --output=target 2>&1 | grep /. | head -n1) |
||||||
|
+export CU_REMOTE_FS=$(df --local --output=target 2>&1 | grep /. | |
||||||
|
+ tail -n+2 | head -n1) |
||||||
|
+ |
||||||
|
+unique_entries=1 |
||||||
|
+test -z "$CU_NONROOT_FS" || unique_entries=$(expr $unique_entries + 1) |
||||||
|
+test -z "$CU_REMOTE_FS" || unique_entries=$(expr $unique_entries + 2) |
||||||
|
+ |
||||||
|
+grep '^#define HAVE_MNTENT_H 1' $CONFIG_HEADER > /dev/null \ |
||||||
|
+ || skip_ "no mntent.h available to confirm the interface" |
||||||
|
+ |
||||||
|
+grep '^#define HAVE_GETMNTENT 1' $CONFIG_HEADER > /dev/null \ |
||||||
|
+ || skip_ "getmntent is not used on this system" |
||||||
|
+ |
||||||
|
+# Simulate an mtab file to test various cases. |
||||||
|
+cat > k.c <<EOF || framework_failure_ |
||||||
|
+#define _GNU_SOURCE |
||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
+#include <errno.h> |
||||||
|
#include <mntent.h> |
||||||
|
+#include <string.h> |
||||||
|
+#include <dlfcn.h> |
||||||
|
+ |
||||||
|
+#define STREQ(a, b) (strcmp (a, b) == 0) |
||||||
|
+ |
||||||
|
+FILE* fopen(const char *path, const char *mode) |
||||||
|
+{ |
||||||
|
+ static FILE* (*fopen_func)(char const *, char const *); |
||||||
|
+ |
||||||
|
+ /* get reference to original (libc provided) fopen */ |
||||||
|
+ if (!fopen_func) |
||||||
|
+ { |
||||||
|
+ fopen_func = (FILE*(*)(char const *, char const *)) |
||||||
|
+ dlsym(RTLD_NEXT, "fopen"); |
||||||
|
+ if (!fopen_func) |
||||||
|
+ { |
||||||
|
+ fprintf (stderr, "Failed to find fopen()\n"); |
||||||
|
+ errno = ESRCH; |
||||||
|
+ return NULL; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ /* Returning ENOENT here will get read_file_system_list() |
||||||
|
+ to fall back to using getmntent() below. */ |
||||||
|
+ if (STREQ (path, "/proc/self/mountinfo")) |
||||||
|
+ { |
||||||
|
+ errno = ENOENT; |
||||||
|
+ return NULL; |
||||||
|
+ } |
||||||
|
+ else |
||||||
|
+ return fopen_func(path, mode); |
||||||
|
+} |
||||||
|
+ |
||||||
|
+#define STREQ(a, b) (strcmp (a, b) == 0) |
||||||
|
|
||||||
|
struct mntent *getmntent (FILE *fp) |
||||||
|
{ |
||||||
|
+ static char *nonroot_fs; |
||||||
|
+ static char *remote_fs; |
||||||
|
+ static int done; |
||||||
|
+ |
||||||
|
/* Prove that LD_PRELOAD works. */ |
||||||
|
- static int done = 0; |
||||||
|
if (!done) |
||||||
|
{ |
||||||
|
fclose (fopen ("x", "w")); |
||||||
|
@@ -41,50 +95,92 @@ struct mntent *getmntent (FILE *fp) |
||||||
|
} |
||||||
|
|
||||||
|
static struct mntent mntents[] = { |
||||||
|
- {.mnt_fsname="/short", .mnt_dir="/invalid/mount/dir"}, |
||||||
|
- {.mnt_fsname="fsname", .mnt_dir="/",}, |
||||||
|
- {.mnt_fsname="/fsname", .mnt_dir="/root"}, |
||||||
|
- {.mnt_fsname="/fsname", .mnt_dir="/"}, |
||||||
|
+ {.mnt_fsname="/short", .mnt_dir="/invalid/mount/dir", .mnt_opts=""}, |
||||||
|
+ {.mnt_fsname="fsname", .mnt_dir="/", .mnt_opts=""}, |
||||||
|
+ {.mnt_fsname="/fsname", .mnt_dir="/.", .mnt_opts=""}, |
||||||
|
+ {.mnt_fsname="/fsname", .mnt_dir="/", .mnt_opts=""}, |
||||||
|
+ {.mnt_fsname="virtfs", .mnt_dir="/NONROOT", .mnt_type="t1", .mnt_opts=""}, |
||||||
|
+ {.mnt_fsname="virtfs2", .mnt_dir="/NONROOT", .mnt_type="t2", .mnt_opts=""}, |
||||||
|
+ {.mnt_fsname="netns", .mnt_dir="net:[1234567]", .mnt_opts=""}, |
||||||
|
+ {.mnt_fsname="rem:ote1",.mnt_dir="/REMOTE", .mnt_opts=""}, |
||||||
|
+ {.mnt_fsname="rem:ote1",.mnt_dir="/REMOTE", .mnt_opts=""}, |
||||||
|
+ {.mnt_fsname="rem:ote2",.mnt_dir="/REMOTE", .mnt_opts=""}, |
||||||
|
}; |
||||||
|
|
||||||
|
- if (!getenv ("CU_TEST_DUPE_INVALID") && done == 1) |
||||||
|
+ if (done == 1) |
||||||
|
+ { |
||||||
|
+ nonroot_fs = getenv ("CU_NONROOT_FS"); |
||||||
|
+ if (!nonroot_fs || !*nonroot_fs) |
||||||
|
+ nonroot_fs = "/"; /* merge into / entries. */ |
||||||
|
+ |
||||||
|
+ remote_fs = getenv ("CU_REMOTE_FS"); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (done == 1 && !getenv ("CU_TEST_DUPE_INVALID")) |
||||||
|
done++; /* skip the first entry. */ |
||||||
|
|
||||||
|
- while (done++ <= 4) |
||||||
|
+ while (done++ <= 10) |
||||||
|
{ |
||||||
|
- mntents[done-2].mnt_type = "-"; |
||||||
|
+ if (!mntents[done-2].mnt_type) |
||||||
|
+ mntents[done-2].mnt_type = "-"; |
||||||
|
+ if (!mntents[done-2].mnt_opts) |
||||||
|
+ mntents[done-2].mnt_opts = "-"; |
||||||
|
+ if (STREQ (mntents[done-2].mnt_dir, "/NONROOT")) |
||||||
|
+ mntents[done-2].mnt_dir = nonroot_fs; |
||||||
|
+ if (STREQ (mntents[done-2].mnt_dir, "/REMOTE")) |
||||||
|
+ { |
||||||
|
+ if (!remote_fs || !*remote_fs) |
||||||
|
+ continue; |
||||||
|
+ else |
||||||
|
+ mntents[done-2].mnt_dir = remote_fs; |
||||||
|
+ } |
||||||
|
return &mntents[done-2]; |
||||||
|
} |
||||||
|
+ |
||||||
|
return NULL; |
||||||
|
} |
||||||
|
EOF |
||||||
|
|
||||||
|
# Then compile/link it: |
||||||
|
-gcc --std=gnu99 -shared -fPIC -ldl -O2 k.c -o k.so \ |
||||||
|
+gcc_shared_ k.c k.so \ |
||||||
|
|| framework_failure_ 'failed to build shared library' |
||||||
|
|
||||||
|
# Test if LD_PRELOAD works: |
||||||
|
-LD_PRELOAD=./k.so df |
||||||
|
+LD_PRELOAD=$LD_PRELOAD:./k.so df |
||||||
|
test -f x || skip_ "internal test failure: maybe LD_PRELOAD doesn't work?" |
||||||
|
|
||||||
|
# The fake mtab file should only contain entries |
||||||
|
# having the same device number; thus the output should |
||||||
|
-# consist of a header and one entry. |
||||||
|
-LD_PRELOAD=./k.so df >out || fail=1 |
||||||
|
-test $(wc -l <out) -eq 2 || { fail=1; cat out; } |
||||||
|
+# consist of a header and unique entries. |
||||||
|
+LD_PRELOAD=$LD_PRELOAD:./k.so df -T >out || fail=1 |
||||||
|
+test $(wc -l <out) -eq $(expr 1 + $unique_entries) || { fail=1; cat out; } |
||||||
|
|
||||||
|
-# Ensure we fail when unable to stat invalid entries |
||||||
|
-LD_PRELOAD=./k.so CU_TEST_DUPE_INVALID=1 df >out && fail=1 |
||||||
|
-test $(wc -l <out) -eq 2 || { fail=1; cat out; } |
||||||
|
+# With --total we should suppress the duplicate but separate remote file system |
||||||
|
+LD_PRELOAD=$LD_PRELOAD:./k.so df --total >out || fail=1 |
||||||
|
+test "$CU_REMOTE_FS" && elide_remote=1 || elide_remote=0 |
||||||
|
+test $(wc -l <out) -eq $(expr 2 + $unique_entries - $elide_remote) || |
||||||
|
+ { fail=1; cat out; } |
||||||
|
+ |
||||||
|
+# Ensure we don't fail when unable to stat (currently) unavailable entries |
||||||
|
+LD_PRELOAD=$LD_PRELOAD:./k.so CU_TEST_DUPE_INVALID=1 df -T >out || fail=1 |
||||||
|
+test $(wc -l <out) -eq $(expr 1 + $unique_entries) || { fail=1; cat out; } |
||||||
|
|
||||||
|
# df should also prefer "/fsname" over "fsname" |
||||||
|
-test $(grep -c '/fsname' <out) -eq 1 || { fail=1; cat out; } |
||||||
|
-# ... and "/fsname" with '/' as Mounted on over '/root' |
||||||
|
-test $(grep -c '/root' <out) -eq 0 || { fail=1; cat out; } |
||||||
|
+if test "$unique_entries" = 2; then |
||||||
|
+ test $(grep -c '/fsname' <out) -eq 1 || { fail=1; cat out; } |
||||||
|
+ # ... and "/fsname" with '/' as Mounted on over '/.' |
||||||
|
+ test $(grep -cF '/.' <out) -eq 0 || { fail=1; cat out; } |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+# df should use the last seen devname (mnt_fsname) and devtype (mnt_type) |
||||||
|
+test $(grep -c 'virtfs2.*t2' <out) -eq 1 || { fail=1; cat out; } |
||||||
|
|
||||||
|
# Ensure that filtering duplicates does not affect -a processing. |
||||||
|
-LD_PRELOAD=./k.so df -a >out || fail=1 |
||||||
|
-test $(wc -l <out) -eq 4 || { fail=1; cat out; } |
||||||
|
+LD_PRELOAD=$LD_PRELOAD:./k.so df -a >out || fail=1 |
||||||
|
+total_fs=6; test "$CU_REMOTE_FS" && total_fs=$(expr $total_fs + 3) |
||||||
|
+test $(wc -l <out) -eq $total_fs || { fail=1; cat out; } |
||||||
|
+# Ensure placeholder "-" values used for the eclipsed "virtfs" |
||||||
|
+test $(grep -c 'virtfs *-' <out) -eq 1 || { fail=1; cat out; } |
||||||
|
|
||||||
|
# Ensure that filtering duplicates does not affect |
||||||
|
# argument processing (now without the fake getmntent()). |
||||||
|
diff --git a/init.cfg b/init.cfg |
||||||
|
index 360d4da..16f9813 100644 |
||||||
|
--- a/init.cfg |
||||||
|
+++ b/init.cfg |
||||||
|
@@ -472,6 +472,18 @@ require_sparse_support_() |
||||||
|
fi |
||||||
|
} |
||||||
|
|
||||||
|
+# Compile a shared lib using the GCC options for doing so. |
||||||
|
+# Pass input and output file as parameters respectively. |
||||||
|
+# Any other optional parmeters are passed to $CC. |
||||||
|
+gcc_shared_() |
||||||
|
+{ |
||||||
|
+ local in=$1 |
||||||
|
+ local out=$2 |
||||||
|
+ shift 2 || return 1 |
||||||
|
+ |
||||||
|
+ $CC -Wall -shared --std=gnu99 -fPIC -O2 $* "$in" -o "$out" -ldl |
||||||
|
+} |
||||||
|
+ |
||||||
|
# There are a myriad of ways to build shared libs, |
||||||
|
# so we only consider running tests requiring shared libs, |
||||||
|
# on platforms that support building them as follows. |
@ -0,0 +1,117 @@ |
|||||||
|
diff -urNp coreutils-8.22-orig/src/df.c coreutils-8.22/src/df.c |
||||||
|
--- coreutils-8.22-orig/src/df.c 2015-07-03 15:51:44.293116375 +0200 |
||||||
|
+++ coreutils-8.22/src/df.c 2015-07-03 16:02:48.743390691 +0200 |
||||||
|
@@ -1057,6 +1057,33 @@ get_dev (char const *disk, char const *m |
||||||
|
free (dev_name); |
||||||
|
} |
||||||
|
|
||||||
|
+/* Scan the mount list returning the _last_ device found for MOUNT. |
||||||
|
+ NULL is returned if MOUNT not found. The result is malloced. */ |
||||||
|
+static char * |
||||||
|
+last_device_for_mount (char const* mount) |
||||||
|
+{ |
||||||
|
+ struct mount_entry const *me; |
||||||
|
+ struct mount_entry const *le = NULL; |
||||||
|
+ |
||||||
|
+ for (me = mount_list; me; me = me->me_next) |
||||||
|
+ { |
||||||
|
+ if (STREQ (me->me_mountdir, mount)) |
||||||
|
+ le = me; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (le) |
||||||
|
+ { |
||||||
|
+ char *devname = le->me_devname; |
||||||
|
+ char *canon_dev = canonicalize_file_name (devname); |
||||||
|
+ if (canon_dev && IS_ABSOLUTE_FILE_NAME (canon_dev)) |
||||||
|
+ return canon_dev; |
||||||
|
+ free (canon_dev); |
||||||
|
+ return xstrdup (le->me_devname); |
||||||
|
+ } |
||||||
|
+ else |
||||||
|
+ return NULL; |
||||||
|
+} |
||||||
|
+ |
||||||
|
/* If DISK corresponds to a mount point, show its usage |
||||||
|
and return true. Otherwise, return false. */ |
||||||
|
static bool |
||||||
|
@@ -1064,27 +1091,57 @@ get_disk (char const *disk) |
||||||
|
{ |
||||||
|
struct mount_entry const *me; |
||||||
|
struct mount_entry const *best_match = NULL; |
||||||
|
+ bool best_match_accessible = false; |
||||||
|
+ bool eclipsed_device = false; |
||||||
|
char const *file = disk; |
||||||
|
|
||||||
|
char *resolved = canonicalize_file_name (disk); |
||||||
|
- if (resolved && resolved[0] == '/') |
||||||
|
+ if (resolved && IS_ABSOLUTE_FILE_NAME (resolved)) |
||||||
|
disk = resolved; |
||||||
|
|
||||||
|
size_t best_match_len = SIZE_MAX; |
||||||
|
for (me = mount_list; me; me = me->me_next) |
||||||
|
{ |
||||||
|
- if (STREQ (disk, me->me_devname)) |
||||||
|
+ /* TODO: Should cache canon_dev in the mount_entry struct. */ |
||||||
|
+ char *devname = me->me_devname; |
||||||
|
+ char *canon_dev = canonicalize_file_name (me->me_devname); |
||||||
|
+ if (canon_dev && IS_ABSOLUTE_FILE_NAME (canon_dev)) |
||||||
|
+ devname = canon_dev; |
||||||
|
+ |
||||||
|
+ if (STREQ (disk, devname)) |
||||||
|
{ |
||||||
|
+ char *last_device = last_device_for_mount (me->me_mountdir); |
||||||
|
+ eclipsed_device = last_device && ! STREQ (last_device, devname); |
||||||
|
size_t len = strlen (me->me_mountdir); |
||||||
|
- if (len < best_match_len) |
||||||
|
+ |
||||||
|
+ if (! eclipsed_device |
||||||
|
+ && (! best_match_accessible || len < best_match_len)) |
||||||
|
{ |
||||||
|
- best_match = me; |
||||||
|
- if (len == 1) /* Traditional root. */ |
||||||
|
- break; |
||||||
|
- else |
||||||
|
- best_match_len = len; |
||||||
|
+ struct stat disk_stats; |
||||||
|
+ bool this_match_accessible = false; |
||||||
|
+ |
||||||
|
+ if (stat (me->me_mountdir, &disk_stats) == 0) |
||||||
|
+ best_match_accessible = this_match_accessible = true; |
||||||
|
+ |
||||||
|
+ if (this_match_accessible |
||||||
|
+ || (! best_match_accessible && len < best_match_len)) |
||||||
|
+ { |
||||||
|
+ best_match = me; |
||||||
|
+ if (len == 1) /* Traditional root. */ |
||||||
|
+ { |
||||||
|
+ free (last_device); |
||||||
|
+ free (canon_dev); |
||||||
|
+ break; |
||||||
|
+ } |
||||||
|
+ else |
||||||
|
+ best_match_len = len; |
||||||
|
+ } |
||||||
|
} |
||||||
|
+ |
||||||
|
+ free (last_device); |
||||||
|
} |
||||||
|
+ |
||||||
|
+ free (canon_dev); |
||||||
|
} |
||||||
|
|
||||||
|
free (resolved); |
||||||
|
@@ -1096,6 +1153,13 @@ get_disk (char const *disk) |
||||||
|
best_match->me_remote, NULL, false); |
||||||
|
return true; |
||||||
|
} |
||||||
|
+ else if (eclipsed_device) |
||||||
|
+ { |
||||||
|
+ error (0, 0, _("cannot access %s: over-mounted by another device"), |
||||||
|
+ quote (file)); |
||||||
|
+ exit_status = EXIT_FAILURE; |
||||||
|
+ return true; |
||||||
|
+ } |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
@ -0,0 +1,72 @@ |
|||||||
|
From 9c4641f42bbecf63ec0a0e05caacbccd5332b831 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Philipp Thomas <pth@suse.de> |
||||||
|
Date: Sun, 26 Mar 2017 22:34:00 -0700 |
||||||
|
Subject: [PATCH 1/2] df: avoid querying excluded file systems |
||||||
|
|
||||||
|
* src/df.c (filter_mount_list): Avoid stat() on |
||||||
|
explicitly excluded file systems, which is especially |
||||||
|
significant in cases like `-x nfs` which may hang. |
||||||
|
* NEWS: Mention the bug fix. |
||||||
|
|
||||||
|
Upstream-commit: 7c228bc55ed3fd6d56a6ad135438066de2f54a30 |
||||||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com> |
||||||
|
--- |
||||||
|
src/df.c | 4 +++- |
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/src/df.c b/src/df.c |
||||||
|
index 5b9e8fd..e0ebed7 100644 |
||||||
|
--- a/src/df.c |
||||||
|
+++ b/src/df.c |
||||||
|
@@ -632,9 +632,11 @@ filter_mount_list (bool devices_only) |
||||||
|
On Linux we probably have me_dev populated from /proc/self/mountinfo, |
||||||
|
however we still stat() in case another device was mounted later. */ |
||||||
|
if ((me->me_remote && show_local_fs) |
||||||
|
+ || (!selected_fstype (me->me_type) || excluded_fstype (me->me_type)) |
||||||
|
|| -1 == stat (me->me_mountdir, &buf)) |
||||||
|
{ |
||||||
|
- /* If remote, and showing just local, add ME for filtering later. |
||||||
|
+ /* If remote, and showing just local, or FS type is excluded, |
||||||
|
+ add ME for filtering later. |
||||||
|
If stat failed; add ME to be able to complain about it later. */ |
||||||
|
buf.st_dev = me->me_dev; |
||||||
|
} |
||||||
|
-- |
||||||
|
2.13.6 |
||||||
|
|
||||||
|
|
||||||
|
From a4a61effe74766cdf047d6af52cf63613057bd87 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Thu, 23 Nov 2017 17:30:09 +0100 |
||||||
|
Subject: [PATCH 2/2] df: limit the stat() call optimization for dummy file |
||||||
|
systems only |
||||||
|
|
||||||
|
Otherwise 'df -t rootfs' mistakenly shows a dummy file system without |
||||||
|
using the -a option, because the dummy file system is shadowed by the |
||||||
|
actual root file system entry, for which we optimize out the stat() |
||||||
|
call. |
||||||
|
|
||||||
|
The problem fixed by this patch is not observable on Fedora because |
||||||
|
/proc/self/mountinfo (which we do not use on RHEL) does not contain |
||||||
|
the rootfs mount entry. |
||||||
|
--- |
||||||
|
src/df.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/src/df.c b/src/df.c |
||||||
|
index adade6d..4c6131e 100644 |
||||||
|
--- a/src/df.c |
||||||
|
+++ b/src/df.c |
||||||
|
@@ -632,7 +632,8 @@ filter_mount_list (bool devices_only) |
||||||
|
On Linux we probably have me_dev populated from /proc/self/mountinfo, |
||||||
|
however we still stat() in case another device was mounted later. */ |
||||||
|
if ((me->me_remote && show_local_fs) |
||||||
|
- || (!selected_fstype (me->me_type) || excluded_fstype (me->me_type)) |
||||||
|
+ || (me->me_dummy && (excluded_fstype (me->me_type) |
||||||
|
+ || !selected_fstype (me->me_type))) |
||||||
|
|| -1 == stat (me->me_mountdir, &buf)) |
||||||
|
{ |
||||||
|
/* If remote, and showing just local, or FS type is excluded, |
||||||
|
-- |
||||||
|
2.13.6 |
||||||
|
|
@ -0,0 +1,157 @@ |
|||||||
|
From dc1c0523a61932fb0c26a795b7e7391eadf2171a Mon Sep 17 00:00:00 2001 |
||||||
|
From: Boris Ranto <branto@redhat.com> |
||||||
|
Date: Mon, 1 Dec 2014 09:24:14 +0100 |
||||||
|
Subject: [PATCH 1/1] du: handle sub-bind-mount cycles gracefully |
||||||
|
|
||||||
|
This patch fixes the handling of sub-bind-mount cycles which are |
||||||
|
incorrectly detected as the file system errors. If you bind mount the |
||||||
|
directory 'a' to its subdirectory 'a/b/c' and then run 'du a/b' you |
||||||
|
will get the circular dependency warning even though nothing is wrong |
||||||
|
with the file system. This happens because the first directory that is |
||||||
|
traversed twice in this case is not a bind mount but a child of bind |
||||||
|
mount. The solution is to traverse all the directories in the cycle |
||||||
|
that fts detected and check whether they are not a (bind) mount. |
||||||
|
|
||||||
|
* src/du.c (mount_point_in_fts_cycle): New function that checks whether |
||||||
|
any of the directories in the cycle that fts detected is a mount point. |
||||||
|
* src/du.c (process_file): Update the function to use the new function |
||||||
|
that looks up all the directories in the fts cycle instead of only the |
||||||
|
last one. |
||||||
|
* tests/du/bind-mount-dir-cycle-v2.sh: New test case that exhibits the |
||||||
|
described behavior. |
||||||
|
* tests/local.mk: Reference the new root test. |
||||||
|
--- |
||||||
|
src/du.c | 23 ++++++++++++++++++++- |
||||||
|
tests/du/bind-mount-dir-cycle-v2.sh | 38 +++++++++++++++++++++++++++++++++++ |
||||||
|
tests/local.mk | 1 + |
||||||
|
3 files changed, 61 insertions(+), 1 deletions(-) |
||||||
|
create mode 100755 tests/du/bind-mount-dir-cycle-v2.sh |
||||||
|
|
||||||
|
diff --git a/src/du.c b/src/du.c |
||||||
|
index ba20120..f5726c7 100644 |
||||||
|
--- a/src/du.c |
||||||
|
+++ b/src/du.c |
||||||
|
@@ -419,6 +419,27 @@ print_size (const struct duinfo *pdui, const char *string) |
||||||
|
fflush (stdout); |
||||||
|
} |
||||||
|
|
||||||
|
+/* This function checks whether any of the directories in the cycle that |
||||||
|
+ fts detected is a mount point. */ |
||||||
|
+ |
||||||
|
+static bool |
||||||
|
+mount_point_in_fts_cycle (FTSENT const *ent) |
||||||
|
+{ |
||||||
|
+ FTSENT const *cycle_ent = ent->fts_cycle; |
||||||
|
+ |
||||||
|
+ while (ent && ent != cycle_ent) |
||||||
|
+ { |
||||||
|
+ if (di_set_lookup (di_mnt, ent->fts_statp->st_dev, |
||||||
|
+ ent->fts_statp->st_ino) > 0) |
||||||
|
+ { |
||||||
|
+ return true; |
||||||
|
+ } |
||||||
|
+ ent = ent->fts_parent; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ return false; |
||||||
|
+} |
||||||
|
+ |
||||||
|
/* This function is called once for every file system object that fts |
||||||
|
encounters. fts does a depth-first traversal. This function knows |
||||||
|
that and accumulates per-directory totals based on changes in |
||||||
|
@@ -514,15 +514,11 @@ process_file (FTS *fts, FTSENT *ent) |
||||||
|
break; |
||||||
|
|
||||||
|
case FTS_DC: |
||||||
|
- if (cycle_warning_required (fts, ent)) |
||||||
|
+ /* If not following symlinks and not a (bind) mount point. */ |
||||||
|
+ if (cycle_warning_required (fts, ent) |
||||||
|
+ && ! mount_point_in_fts_cycle (ent)) |
||||||
|
{ |
||||||
|
- /* If this is a mount point, then diagnose it and avoid |
||||||
|
- the cycle. */ |
||||||
|
- if (di_set_lookup (di_mnt, sb->st_dev, sb->st_ino)) |
||||||
|
- error (0, 0, _("mount point %s already traversed"), |
||||||
|
- quote (file)); |
||||||
|
- else |
||||||
|
- emit_cycle_warning (file); |
||||||
|
+ emit_cycle_warning (file); |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
diff --git a/tests/du/bind-mount-dir-cycle-v2.sh b/tests/du/bind-mount-dir-cycle-v2.sh |
||||||
|
new file mode 100755 |
||||||
|
index 0000000..08bfae2 |
||||||
|
--- /dev/null |
||||||
|
+++ b/tests/du/bind-mount-dir-cycle-v2.sh |
||||||
|
@@ -0,0 +1,38 @@ |
||||||
|
+#!/bin/sh |
||||||
|
+# Check that du can handle sub-bind-mounts cycles as well. |
||||||
|
+ |
||||||
|
+# Copyright (C) 2014 Free Software foundation, Inc. |
||||||
|
+ |
||||||
|
+# This program is free software: you can redistribute it and/or modify |
||||||
|
+# it under the terms of the GNU General Public License as published by |
||||||
|
+# the Free Software Foundation, either version 3 of the License, or |
||||||
|
+# (at your option) any later version. |
||||||
|
+ |
||||||
|
+# This program is distributed in the hope that it will be useful, |
||||||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
+# GNU General Public License for more details. |
||||||
|
+ |
||||||
|
+# You should have received a copy of the GNU General Public License |
||||||
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
+ |
||||||
|
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src |
||||||
|
+print_ver_ du |
||||||
|
+require_root_ |
||||||
|
+ |
||||||
|
+cleanup_() { umount a/b/c; } |
||||||
|
+ |
||||||
|
+mkdir -p a/b/c || framework_failure_ |
||||||
|
+mount --bind a a/b/c \ |
||||||
|
+ || skip_ 'This test requires mount with a working --bind option.' |
||||||
|
+ |
||||||
|
+echo a/b/c > exp || framework_failure_ |
||||||
|
+echo a/b >> exp || framework_failure_ |
||||||
|
+ |
||||||
|
+du a/b > out 2> err || fail=1 |
||||||
|
+sed 's/^[0-9][0-9]* //' out > k && mv k out |
||||||
|
+ |
||||||
|
+compare /dev/null err || fail=1 |
||||||
|
+compare exp out || fail=1 |
||||||
|
+ |
||||||
|
+Exit $fail |
||||||
|
diff --git a/tests/local.mk b/tests/local.mk |
||||||
|
index 653c984..349e322 100644 |
||||||
|
--- a/tests/local.mk |
||||||
|
+++ b/tests/local.mk |
||||||
|
@@ -117,6 +117,7 @@ all_root_tests = \ |
||||||
|
tests/dd/skip-seek-past-dev.sh \ |
||||||
|
tests/df/problematic-chars.sh \ |
||||||
|
tests/du/bind-mount-dir-cycle.sh \ |
||||||
|
+ tests/du/bind-mount-dir-cycle-v2.sh \ |
||||||
|
tests/id/setgid.sh \ |
||||||
|
tests/install/install-C-root.sh \ |
||||||
|
tests/ls/capability.sh \ |
||||||
|
-- |
||||||
|
1.7.2.5 |
||||||
|
diff -urNp coreutils-8.22-orig/tests/du/bind-mount-dir-cycle.sh coreutils-8.22/tests/du/bind-mount-dir-cycle.sh |
||||||
|
--- coreutils-8.22-orig/tests/du/bind-mount-dir-cycle.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/du/bind-mount-dir-cycle.sh 2015-07-02 15:58:49.230632316 +0200 |
||||||
|
@@ -27,12 +27,11 @@ mount --bind a a/b \ |
||||||
|
|| skip_ "This test requires mount with a working --bind option." |
||||||
|
|
||||||
|
echo a > exp || framework_failure_ |
||||||
|
-echo "du: mount point 'a/b' already traversed" > exp-err || framework_failure_ |
||||||
|
|
||||||
|
-du a > out 2> err && fail=1 |
||||||
|
+du a > out 2> err || fail=1 |
||||||
|
sed 's/^[0-9][0-9]* //' out > k && mv k out |
||||||
|
|
||||||
|
-compare exp-err err || fail=1 |
||||||
|
+compare /dev/null err || fail=1 |
||||||
|
compare exp out || fail=1 |
||||||
|
|
||||||
|
Exit $fail |
@ -0,0 +1,32 @@ |
|||||||
|
diff -urNp coreutils-8.22-orig/tests/cp/cp-a-selinux.sh coreutils-8.22/tests/cp/cp-a-selinux.sh |
||||||
|
--- coreutils-8.22-orig/tests/cp/cp-a-selinux.sh 2016-06-24 11:44:21.909303666 +0200 |
||||||
|
+++ coreutils-8.22/tests/cp/cp-a-selinux.sh 2016-06-24 11:47:28.473908346 +0200 |
||||||
|
@@ -73,7 +73,8 @@ old_type_d=$(get_selinux_type c_d) |
||||||
|
# and get the adjusted type for comparison |
||||||
|
cp -a c Z1 || fail=1 |
||||||
|
cp -a c_d Z1_d || fail=1 |
||||||
|
-if restorecon Z1 Z1_d 2>/dev/null; then |
||||||
|
+if restorecon Z1 Z1_d 2>restorecon.err \ |
||||||
|
+ && compare /dev/null restorecon.err; then |
||||||
|
new_type_f=$(get_selinux_type Z1) |
||||||
|
new_type_d=$(get_selinux_type Z1_d) |
||||||
|
|
||||||
|
diff -urNp coreutils-8.22-orig/tests/local.mk coreutils-8.22/tests/local.mk |
||||||
|
--- coreutils-8.22-orig/tests/local.mk 2016-06-24 11:44:21.920303760 +0200 |
||||||
|
+++ coreutils-8.22/tests/local.mk 2016-06-24 11:49:31.388965563 +0200 |
||||||
|
@@ -117,7 +117,6 @@ all_root_tests = \ |
||||||
|
tests/df/problematic-chars.sh \ |
||||||
|
tests/du/bind-mount-dir-cycle.sh \ |
||||||
|
tests/du/bind-mount-dir-cycle-v2.sh \ |
||||||
|
- tests/id/setgid.sh \ |
||||||
|
tests/install/install-C-root.sh \ |
||||||
|
tests/ls/capability.sh \ |
||||||
|
tests/ls/nameless-uid.sh \ |
||||||
|
@@ -515,7 +514,6 @@ all_tests = \ |
||||||
|
tests/id/no-context.sh \ |
||||||
|
tests/id/context.sh \ |
||||||
|
tests/id/uid.sh \ |
||||||
|
- tests/id/setgid.sh \ |
||||||
|
tests/id/zero.sh \ |
||||||
|
tests/install/basic-1.sh \ |
||||||
|
tests/install/create-leading.sh \ |
@ -0,0 +1,39 @@ |
|||||||
|
diff -urNp coreutils-8.4-orig/src/id.c coreutils-8.4/src/id.c |
||||||
|
--- coreutils-8.4-orig/src/id.c 2014-06-26 08:47:28.435047859 +0200 |
||||||
|
+++ coreutils-8.4/src/id.c 2014-06-26 08:55:28.352788022 +0200 |
||||||
|
@@ -296,8 +296,12 @@ print_full_info (const char *username) |
||||||
|
gid_t *groups; |
||||||
|
int i; |
||||||
|
|
||||||
|
- int n_groups = xgetgroups (username, (pwd ? pwd->pw_gid : -1), |
||||||
|
- &groups); |
||||||
|
+ gid_t primary_group; |
||||||
|
+ if (username) |
||||||
|
+ primary_group = pwd ? pwd->pw_gid : -1; |
||||||
|
+ else |
||||||
|
+ primary_group = egid; |
||||||
|
+ int n_groups = xgetgroups (username, primary_group, &groups); |
||||||
|
if (n_groups < 0) |
||||||
|
{ |
||||||
|
if (username) |
||||||
|
|
||||||
|
diff -urNp coreutils-8.22-orig/tests/id/setgid.sh coreutils-8.22/tests/id/setgid.sh |
||||||
|
--- coreutils-8.22-orig/tests/id/setgid.sh 2014-06-26 08:47:28.750053213 +0200 |
||||||
|
+++ coreutils-8.22/tests/id/setgid.sh 2014-06-26 08:51:02.536624404 +0200 |
||||||
|
@@ -1,5 +1,5 @@ |
||||||
|
#!/bin/sh |
||||||
|
-# Verify that id -G prints the right group when run set-GID. |
||||||
|
+# Verify that id [-G] prints the right group when run set-GID. |
||||||
|
|
||||||
|
# Copyright (C) 2012-2013 Free Software Foundation, Inc. |
||||||
|
|
||||||
|
@@ -35,4 +35,9 @@ setuidgid -g $gp1 $NON_ROOT_USERNAME env |
||||||
|
compare exp out || fail=1 |
||||||
|
# With coreutils-8.16 and earlier, id -G would print both: $gp1 $g |
||||||
|
|
||||||
|
+# With coreutils-8.22 and earlier, id would erroneously print groups=$g |
||||||
|
+chroot --user=$NON_ROOT_USERNAME:$gp1 --groups='' / env PATH="$PATH" \ |
||||||
|
+ id > out || fail=1 |
||||||
|
+grep -F "groups=$gp1" out || fail=1 |
||||||
|
+ |
||||||
|
Exit $fail |
@ -0,0 +1,236 @@ |
|||||||
|
From e56f09afdbd4bd920e4a1f3b03e29eaccd954dac Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Tue, 6 Sep 2016 17:38:26 +0200 |
||||||
|
Subject: [PATCH] ls: allow interruption when reading slow directories |
||||||
|
|
||||||
|
Postpone installation of signal handlers until they're needed. |
||||||
|
That is right before the first escape sequence is printed. |
||||||
|
|
||||||
|
* src/ls.c (signal_setup): A new function refactored from main() |
||||||
|
to set and restore signal handlers. |
||||||
|
(main): Move signal handler setup to put_indicator() |
||||||
|
so that the default signal handling is untouched as long as possible. |
||||||
|
Adjusted condition for restoring signal handlers to reflect the change. |
||||||
|
(put_indicator): Install signal handlers if called for the very first |
||||||
|
time. It uses the same code that was in main() prior to this commit. |
||||||
|
* NEWS: Mention the improvement. |
||||||
|
|
||||||
|
See https://bugzilla.redhat.com/1365933 |
||||||
|
Fixes http://bugs.gnu.org/24232 |
||||||
|
|
||||||
|
Upstream-commit: 5445f7811ff945ea13aa2a0fd797eb4c0a0e4db0 |
||||||
|
Signed-off-by: Kamil Dudka <kdudka@redhat.com> |
||||||
|
--- |
||||||
|
src/ls.c | 161 ++++++++++++++++++++++++++++++++++++--------------------------- |
||||||
|
1 file changed, 93 insertions(+), 68 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/ls.c b/src/ls.c |
||||||
|
index a89c87a..1300938 100644 |
||||||
|
--- a/src/ls.c |
||||||
|
+++ b/src/ls.c |
||||||
|
@@ -1246,13 +1246,12 @@ process_signals (void) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
-int |
||||||
|
-main (int argc, char **argv) |
||||||
|
-{ |
||||||
|
- int i; |
||||||
|
- struct pending *thispend; |
||||||
|
- int n_files; |
||||||
|
+/* Setup signal handlers if INIT is true, |
||||||
|
+ otherwise restore to the default. */ |
||||||
|
|
||||||
|
+static void |
||||||
|
+signal_setup (bool init) |
||||||
|
+{ |
||||||
|
/* The signals that are trapped, and the number of such signals. */ |
||||||
|
static int const sig[] = |
||||||
|
{ |
||||||
|
@@ -1280,8 +1279,77 @@ main (int argc, char **argv) |
||||||
|
enum { nsigs = ARRAY_CARDINALITY (sig) }; |
||||||
|
|
||||||
|
#if ! SA_NOCLDSTOP |
||||||
|
- bool caught_sig[nsigs]; |
||||||
|
+ static bool caught_sig[nsigs]; |
||||||
|
+#endif |
||||||
|
+ |
||||||
|
+ int j; |
||||||
|
+ |
||||||
|
+ if (init) |
||||||
|
+ { |
||||||
|
+#if SA_NOCLDSTOP |
||||||
|
+ struct sigaction act; |
||||||
|
+ |
||||||
|
+ sigemptyset (&caught_signals); |
||||||
|
+ for (j = 0; j < nsigs; j++) |
||||||
|
+ { |
||||||
|
+ sigaction (sig[j], NULL, &act); |
||||||
|
+ if (act.sa_handler != SIG_IGN) |
||||||
|
+ sigaddset (&caught_signals, sig[j]); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ act.sa_mask = caught_signals; |
||||||
|
+ act.sa_flags = SA_RESTART; |
||||||
|
+ |
||||||
|
+ for (j = 0; j < nsigs; j++) |
||||||
|
+ if (sigismember (&caught_signals, sig[j])) |
||||||
|
+ { |
||||||
|
+ act.sa_handler = sig[j] == SIGTSTP ? stophandler : sighandler; |
||||||
|
+ sigaction (sig[j], &act, NULL); |
||||||
|
+ } |
||||||
|
+#else |
||||||
|
+ for (j = 0; j < nsigs; j++) |
||||||
|
+ { |
||||||
|
+ caught_sig[j] = (signal (sig[j], SIG_IGN) != SIG_IGN); |
||||||
|
+ if (caught_sig[j]) |
||||||
|
+ { |
||||||
|
+ signal (sig[j], sig[j] == SIGTSTP ? stophandler : sighandler); |
||||||
|
+ siginterrupt (sig[j], 0); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
#endif |
||||||
|
+ } |
||||||
|
+ else /* restore. */ |
||||||
|
+ { |
||||||
|
+#if SA_NOCLDSTOP |
||||||
|
+ for (j = 0; j < nsigs; j++) |
||||||
|
+ if (sigismember (&caught_signals, sig[j])) |
||||||
|
+ signal (sig[j], SIG_DFL); |
||||||
|
+#else |
||||||
|
+ for (j = 0; j < nsigs; j++) |
||||||
|
+ if (caught_sig[j]) |
||||||
|
+ signal (sig[j], SIG_DFL); |
||||||
|
+#endif |
||||||
|
+ } |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static inline void |
||||||
|
+signal_init (void) |
||||||
|
+{ |
||||||
|
+ signal_setup (true); |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static inline void |
||||||
|
+signal_restore (void) |
||||||
|
+{ |
||||||
|
+ signal_setup (false); |
||||||
|
+} |
||||||
|
+ |
||||||
|
+int |
||||||
|
+main (int argc, char **argv) |
||||||
|
+{ |
||||||
|
+ int i; |
||||||
|
+ struct pending *thispend; |
||||||
|
+ int n_files; |
||||||
|
|
||||||
|
initialize_main (&argc, &argv); |
||||||
|
set_program_name (argv[0]); |
||||||
|
@@ -1317,46 +1385,6 @@ main (int argc, char **argv) |
||||||
|
|| (is_colored (C_MISSING) && (format == long_format |
||||||
|
|| format == security_format))) |
||||||
|
check_symlink_color = true; |
||||||
|
- |
||||||
|
- /* If the standard output is a controlling terminal, watch out |
||||||
|
- for signals, so that the colors can be restored to the |
||||||
|
- default state if "ls" is suspended or interrupted. */ |
||||||
|
- |
||||||
|
- if (0 <= tcgetpgrp (STDOUT_FILENO)) |
||||||
|
- { |
||||||
|
- int j; |
||||||
|
-#if SA_NOCLDSTOP |
||||||
|
- struct sigaction act; |
||||||
|
- |
||||||
|
- sigemptyset (&caught_signals); |
||||||
|
- for (j = 0; j < nsigs; j++) |
||||||
|
- { |
||||||
|
- sigaction (sig[j], NULL, &act); |
||||||
|
- if (act.sa_handler != SIG_IGN) |
||||||
|
- sigaddset (&caught_signals, sig[j]); |
||||||
|
- } |
||||||
|
- |
||||||
|
- act.sa_mask = caught_signals; |
||||||
|
- act.sa_flags = SA_RESTART; |
||||||
|
- |
||||||
|
- for (j = 0; j < nsigs; j++) |
||||||
|
- if (sigismember (&caught_signals, sig[j])) |
||||||
|
- { |
||||||
|
- act.sa_handler = sig[j] == SIGTSTP ? stophandler : sighandler; |
||||||
|
- sigaction (sig[j], &act, NULL); |
||||||
|
- } |
||||||
|
-#else |
||||||
|
- for (j = 0; j < nsigs; j++) |
||||||
|
- { |
||||||
|
- caught_sig[j] = (signal (sig[j], SIG_IGN) != SIG_IGN); |
||||||
|
- if (caught_sig[j]) |
||||||
|
- { |
||||||
|
- signal (sig[j], sig[j] == SIGTSTP ? stophandler : sighandler); |
||||||
|
- siginterrupt (sig[j], 0); |
||||||
|
- } |
||||||
|
- } |
||||||
|
-#endif |
||||||
|
- } |
||||||
|
} |
||||||
|
|
||||||
|
if (dereference == DEREF_UNDEFINED) |
||||||
|
@@ -1467,32 +1495,21 @@ main (int argc, char **argv) |
||||||
|
print_dir_name = true; |
||||||
|
} |
||||||
|
|
||||||
|
- if (print_with_color) |
||||||
|
+ if (print_with_color && used_color) |
||||||
|
{ |
||||||
|
int j; |
||||||
|
|
||||||
|
- if (used_color) |
||||||
|
- { |
||||||
|
- /* Skip the restore when it would be a no-op, i.e., |
||||||
|
- when left is "\033[" and right is "m". */ |
||||||
|
- if (!(color_indicator[C_LEFT].len == 2 |
||||||
|
- && memcmp (color_indicator[C_LEFT].string, "\033[", 2) == 0 |
||||||
|
- && color_indicator[C_RIGHT].len == 1 |
||||||
|
- && color_indicator[C_RIGHT].string[0] == 'm')) |
||||||
|
- restore_default_color (); |
||||||
|
- } |
||||||
|
+ /* Skip the restore when it would be a no-op, i.e., |
||||||
|
+ when left is "\033[" and right is "m". */ |
||||||
|
+ if (!(color_indicator[C_LEFT].len == 2 |
||||||
|
+ && memcmp (color_indicator[C_LEFT].string, "\033[", 2) == 0 |
||||||
|
+ && color_indicator[C_RIGHT].len == 1 |
||||||
|
+ && color_indicator[C_RIGHT].string[0] == 'm')) |
||||||
|
+ restore_default_color (); |
||||||
|
+ |
||||||
|
fflush (stdout); |
||||||
|
|
||||||
|
- /* Restore the default signal handling. */ |
||||||
|
-#if SA_NOCLDSTOP |
||||||
|
- for (j = 0; j < nsigs; j++) |
||||||
|
- if (sigismember (&caught_signals, sig[j])) |
||||||
|
- signal (sig[j], SIG_DFL); |
||||||
|
-#else |
||||||
|
- for (j = 0; j < nsigs; j++) |
||||||
|
- if (caught_sig[j]) |
||||||
|
- signal (sig[j], SIG_DFL); |
||||||
|
-#endif |
||||||
|
+ signal_restore (); |
||||||
|
|
||||||
|
/* Act on any signals that arrived before the default was restored. |
||||||
|
This can process signals out of order, but there doesn't seem to |
||||||
|
@@ -4512,6 +4529,14 @@ put_indicator (const struct bin_str *ind) |
||||||
|
if (! used_color) |
||||||
|
{ |
||||||
|
used_color = true; |
||||||
|
+ |
||||||
|
+ /* If the standard output is a controlling terminal, watch out |
||||||
|
+ for signals, so that the colors can be restored to the |
||||||
|
+ default state if "ls" is suspended or interrupted. */ |
||||||
|
+ |
||||||
|
+ if (0 <= tcgetpgrp (STDOUT_FILENO)) |
||||||
|
+ signal_init (); |
||||||
|
+ |
||||||
|
prep_non_filename_text (); |
||||||
|
} |
||||||
|
|
||||||
|
-- |
||||||
|
2.13.5 |
||||||
|
|
@ -0,0 +1,365 @@ |
|||||||
|
diff -urNp coreutils-8.22-orig/src/copy.c coreutils-8.22/src/copy.c |
||||||
|
--- coreutils-8.22-orig/src/copy.c 2015-07-03 14:42:56.829772551 +0200 |
||||||
|
+++ coreutils-8.22/src/copy.c 2015-07-03 14:51:05.371383675 +0200 |
||||||
|
@@ -1292,20 +1292,12 @@ close_src_desc: |
||||||
|
copy a regular file onto a symlink that points to it. |
||||||
|
Try to minimize the cost of this function in the common case. |
||||||
|
Set *RETURN_NOW if we've determined that the caller has no more |
||||||
|
- work to do and should return successfully, right away. |
||||||
|
- |
||||||
|
- Set *UNLINK_SRC if we've determined that the caller wants to do |
||||||
|
- 'rename (a, b)' where 'a' and 'b' are distinct hard links to the same |
||||||
|
- file. In that case, the caller should try to unlink 'a' and then return |
||||||
|
- successfully. Ideally, we wouldn't have to do that, and we'd be |
||||||
|
- able to rely on rename to remove the source file. However, POSIX |
||||||
|
- mistakenly requires that such a rename call do *nothing* and return |
||||||
|
- successfully. */ |
||||||
|
+ work to do and should return successfully, right away. */ |
||||||
|
|
||||||
|
static bool |
||||||
|
same_file_ok (char const *src_name, struct stat const *src_sb, |
||||||
|
char const *dst_name, struct stat const *dst_sb, |
||||||
|
- const struct cp_options *x, bool *return_now, bool *unlink_src) |
||||||
|
+ const struct cp_options *x, bool *return_now) |
||||||
|
{ |
||||||
|
const struct stat *src_sb_link; |
||||||
|
const struct stat *dst_sb_link; |
||||||
|
@@ -1316,7 +1308,6 @@ same_file_ok (char const *src_name, stru |
||||||
|
bool same = SAME_INODE (*src_sb, *dst_sb); |
||||||
|
|
||||||
|
*return_now = false; |
||||||
|
- *unlink_src = false; |
||||||
|
|
||||||
|
/* FIXME: this should (at the very least) be moved into the following |
||||||
|
if-block. More likely, it should be removed, because it inhibits |
||||||
|
@@ -1348,14 +1339,11 @@ same_file_ok (char const *src_name, stru |
||||||
|
/* Here we have two symlinks that are hard-linked together, |
||||||
|
and we're not making backups. In this unusual case, simply |
||||||
|
returning true would lead to mv calling "rename(A,B)", |
||||||
|
- which would do nothing and return 0. I.e., A would |
||||||
|
- not be removed. Hence, the solution is to tell the |
||||||
|
- caller that all it must do is unlink A and return. */ |
||||||
|
+ which would do nothing and return 0. */ |
||||||
|
if (same_link) |
||||||
|
{ |
||||||
|
- *unlink_src = true; |
||||||
|
*return_now = true; |
||||||
|
- return true; |
||||||
|
+ return ! x->move_mode; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@@ -1443,26 +1431,22 @@ same_file_ok (char const *src_name, stru |
||||||
|
return true; |
||||||
|
#endif |
||||||
|
|
||||||
|
- /* They may refer to the same file if we're in move mode and the |
||||||
|
- target is a symlink. That is ok, since we remove any existing |
||||||
|
- destination file before opening it -- via 'rename' if they're on |
||||||
|
- the same file system, via 'unlink (DST_NAME)' otherwise. |
||||||
|
- It's also ok if they're distinct hard links to the same file. */ |
||||||
|
if (x->move_mode || x->unlink_dest_before_opening) |
||||||
|
{ |
||||||
|
+ /* They may refer to the same file if we're in move mode and the |
||||||
|
+ target is a symlink. That is ok, since we remove any existing |
||||||
|
+ destination file before opening it -- via 'rename' if they're on |
||||||
|
+ the same file system, via 'unlink (DST_NAME)' otherwise. */ |
||||||
|
if (S_ISLNK (dst_sb_link->st_mode)) |
||||||
|
return true; |
||||||
|
|
||||||
|
+ /* It's not ok if they're distinct hard links to the same file as |
||||||
|
+ this causes a race condition and we may lose data in this case. */ |
||||||
|
if (same_link |
||||||
|
&& 1 < dst_sb_link->st_nlink |
||||||
|
&& ! same_name (src_name, dst_name)) |
||||||
|
{ |
||||||
|
- if (x->move_mode) |
||||||
|
- { |
||||||
|
- *unlink_src = true; |
||||||
|
- *return_now = true; |
||||||
|
- } |
||||||
|
- return true; |
||||||
|
+ return ! x->move_mode; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@@ -1820,11 +1804,10 @@ copy_internal (char const *src_name, cha |
||||||
|
{ /* Here, we know that dst_name exists, at least to the point |
||||||
|
that it is stat'able or lstat'able. */ |
||||||
|
bool return_now; |
||||||
|
- bool unlink_src; |
||||||
|
|
||||||
|
have_dst_lstat = !use_stat; |
||||||
|
if (! same_file_ok (src_name, &src_sb, dst_name, &dst_sb, |
||||||
|
- x, &return_now, &unlink_src)) |
||||||
|
+ x, &return_now)) |
||||||
|
{ |
||||||
|
error (0, 0, _("%s and %s are the same file"), |
||||||
|
quote_n (0, src_name), quote_n (1, dst_name)); |
||||||
|
@@ -1883,22 +1866,14 @@ copy_internal (char const *src_name, cha |
||||||
|
cp and mv treat -i and -f differently. */ |
||||||
|
if (x->move_mode) |
||||||
|
{ |
||||||
|
- if (abandon_move (x, dst_name, &dst_sb) |
||||||
|
- || (unlink_src && unlink (src_name) == 0)) |
||||||
|
+ if (abandon_move (x, dst_name, &dst_sb)) |
||||||
|
{ |
||||||
|
/* Pretend the rename succeeded, so the caller (mv) |
||||||
|
doesn't end up removing the source file. */ |
||||||
|
if (rename_succeeded) |
||||||
|
*rename_succeeded = true; |
||||||
|
- if (unlink_src && x->verbose) |
||||||
|
- printf (_("removed %s\n"), quote (src_name)); |
||||||
|
return true; |
||||||
|
} |
||||||
|
- if (unlink_src) |
||||||
|
- { |
||||||
|
- error (0, errno, _("cannot remove %s"), quote (src_name)); |
||||||
|
- return false; |
||||||
|
- } |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
diff -urNp coreutils-8.22-orig/tests/cp/same-file.sh coreutils-8.22/tests/cp/same-file.sh |
||||||
|
--- coreutils-8.22-orig/tests/cp/same-file.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/cp/same-file.sh 2015-07-03 14:54:12.539772880 +0200 |
||||||
|
@@ -36,7 +36,7 @@ ln dangling-slink hard-link > /dev/null 2>&1 \ |
||||||
|
rm -f no-such dangling-slink hard-link |
||||||
|
|
||||||
|
test $hard_link_to_symlink_does_the_deref = yes \ |
||||||
|
- && remove_these_sed='/^0 -[bf]*l .*sl1 ->/d' \ |
||||||
|
+ && remove_these_sed='/^0 -[bf]*l .*sl1 ->/d; /hlsl/d' \ |
||||||
|
|| remove_these_sed='/^ELIDE NO TEST OUTPUT/d' |
||||||
|
|
||||||
|
exec 3>&1 1> actual |
||||||
|
@@ -44,7 +44,8 @@ exec 3>&1 1> actual |
||||||
|
# FIXME: This should be bigger: like more than 8k |
||||||
|
contents=XYZ |
||||||
|
|
||||||
|
-for args in 'foo symlink' 'symlink foo' 'foo foo' 'sl1 sl2' 'foo hardlink'; do |
||||||
|
+for args in 'foo symlink' 'symlink foo' 'foo foo' 'sl1 sl2' \ |
||||||
|
+ 'foo hardlink' 'hlsl sl2'; do |
||||||
|
for options in '' -d -f -df --rem -b -bd -bf -bdf \ |
||||||
|
-l -dl -fl -dfl -bl -bdl -bfl -bdfl; do |
||||||
|
case $args$options in |
||||||
|
@@ -76,6 +77,8 @@ for args in 'foo symlink' 'symlink foo' |
||||||
|
continue ;; |
||||||
|
'yes:sl1 sl2:-bfl') |
||||||
|
continue ;; |
||||||
|
+ yes:hlsl*) |
||||||
|
+ continue ;; |
||||||
|
esac |
||||||
|
|
||||||
|
rm -rf dir |
||||||
|
@@ -86,6 +87,7 @@ for args in 'foo symlink' 'symlink foo' |
||||||
|
case "$args" in *hardlink*) ln foo hardlink ;; esac |
||||||
|
case "$args" in *sl1*) ln -s foo sl1;; esac |
||||||
|
case "$args" in *sl2*) ln -s foo sl2;; esac |
||||||
|
+ case "$args" in *hlsl*) ln sl2 hlsl;;esac |
||||||
|
( |
||||||
|
( |
||||||
|
# echo 1>&2 cp $options $args |
||||||
|
@@ -211,6 +213,24 @@ cat <<\EOF | sed "$remove_these_sed" > e |
||||||
|
0 -bfl (foo hardlink) |
||||||
|
0 -bdfl (foo hardlink) |
||||||
|
|
||||||
|
+1 [cp: 'hlsl' and 'sl2' are the same file] (foo hlsl -> foo sl2 -> foo) |
||||||
|
+0 -d (foo hlsl -> foo sl2 -> foo) |
||||||
|
+1 -f [cp: 'hlsl' and 'sl2' are the same file] (foo hlsl -> foo sl2 -> foo) |
||||||
|
+0 -df (foo hlsl -> foo sl2 -> foo) |
||||||
|
+0 --rem (foo hlsl -> foo sl2) |
||||||
|
+0 -b (foo hlsl -> foo sl2 sl2.~1~ -> foo) |
||||||
|
+0 -bd (foo hlsl -> foo sl2 -> foo sl2.~1~ -> foo) |
||||||
|
+0 -bf (foo hlsl -> foo sl2 sl2.~1~ -> foo) |
||||||
|
+0 -bdf (foo hlsl -> foo sl2 -> foo sl2.~1~ -> foo) |
||||||
|
+1 -l [cp: cannot create hard link 'sl2' to 'hlsl'] (foo hlsl -> foo sl2 -> foo) |
||||||
|
+0 -dl (foo hlsl -> foo sl2 -> foo) |
||||||
|
+0 -fl (foo hlsl -> foo sl2) |
||||||
|
+0 -dfl (foo hlsl -> foo sl2 -> foo) |
||||||
|
+0 -bl (foo hlsl -> foo sl2 sl2.~1~ -> foo) |
||||||
|
+0 -bdl (foo hlsl -> foo sl2 -> foo) |
||||||
|
+0 -bfl (foo hlsl -> foo sl2 sl2.~1~ -> foo) |
||||||
|
+0 -bdfl (foo hlsl -> foo sl2 -> foo) |
||||||
|
+ |
||||||
|
EOF |
||||||
|
|
||||||
|
exec 1>&3 3>&- |
||||||
|
diff -urNp coreutils-8.22-orig/tests/local.mk coreutils-8.22/tests/local.mk |
||||||
|
--- coreutils-8.22-orig/tests/local.mk 2015-07-03 14:42:56.820772485 +0200 |
||||||
|
+++ coreutils-8.22/tests/local.mk 2015-07-03 14:55:07.060176869 +0200 |
||||||
|
@@ -591,7 +591,6 @@ all_tests = \ |
||||||
|
tests/mv/hard-3.sh \ |
||||||
|
tests/mv/hard-4.sh \ |
||||||
|
tests/mv/hard-link-1.sh \ |
||||||
|
- tests/mv/hard-verbose.sh \ |
||||||
|
tests/mv/i-1.pl \ |
||||||
|
tests/mv/i-2.sh \ |
||||||
|
tests/mv/i-3.sh \ |
||||||
|
diff -urNp coreutils-8.22-orig/tests/mv/force.sh coreutils-8.22/tests/mv/force.sh |
||||||
|
--- coreutils-8.22-orig/tests/mv/force.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/mv/force.sh 2015-07-03 14:56:42.840885931 +0200 |
||||||
|
@@ -25,18 +25,19 @@ ff2=mvforce2 |
||||||
|
echo force-contents > $ff || framework_failure_ |
||||||
|
ln $ff $ff2 || framework_failure_ |
||||||
|
|
||||||
|
-# This mv command should exit nonzero. |
||||||
|
-mv $ff $ff > out 2>&1 && fail=1 |
||||||
|
+# mv should fail for the same name, or separate hardlinks as in |
||||||
|
+# both cases rename() will do nothing and return success. |
||||||
|
+# One could unlink(src) in the hardlink case, but that would |
||||||
|
+# introduce races with overlapping mv instances removing both hardlinks. |
||||||
|
|
||||||
|
-cat > exp <<EOF |
||||||
|
-mv: '$ff' and '$ff' are the same file |
||||||
|
-EOF |
||||||
|
+for dest in $ff $ff2; do |
||||||
|
+ # This mv command should exit nonzero. |
||||||
|
+ mv $ff $dest > out 2>&1 && fail=1 |
||||||
|
|
||||||
|
-compare exp out || fail=1 |
||||||
|
-test $(cat $ff) = force-contents || fail=1 |
||||||
|
+ printf "mv: '$ff' and '$dest' are the same file\n" > exp |
||||||
|
+ compare exp out || fail=1 |
||||||
|
|
||||||
|
-# This should succeed, even though the source and destination |
||||||
|
-# device and inodes are the same. |
||||||
|
-mv $ff $ff2 || fail=1 |
||||||
|
+ test $(cat $ff) = force-contents || fail=1 |
||||||
|
+done |
||||||
|
|
||||||
|
Exit $fail |
||||||
|
diff -urNp coreutils-8.22-orig/tests/mv/hard-4.sh coreutils-8.22/tests/mv/hard-4.sh |
||||||
|
--- coreutils-8.22-orig/tests/mv/hard-4.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/mv/hard-4.sh 2015-07-03 14:58:31.179687188 +0200 |
||||||
|
@@ -1,5 +1,5 @@ |
||||||
|
#!/bin/sh |
||||||
|
-# ensure that mv removes a in this case: touch a; ln a b; mv a b |
||||||
|
+# ensure that mv maintains a in this case: touch a; ln a b; mv a b |
||||||
|
|
||||||
|
# Copyright (C) 2003-2013 Free Software Foundation, Inc. |
||||||
|
|
||||||
|
@@ -21,15 +21,19 @@ print_ver_ mv |
||||||
|
touch a || framework_failure_ |
||||||
|
ln a b || framework_failure_ |
||||||
|
|
||||||
|
+# Between coreutils-5.0 and coreutils-8.24, 'a' would be removed. |
||||||
|
+# Before coreutils-5.0.1 the issue would not have been diagnosed. |
||||||
|
+# We don't emulate the rename(a,b) with unlink(a) as that would |
||||||
|
+# introduce races with overlapping mv instances removing both links. |
||||||
|
+mv a b 2>err && fail=1 |
||||||
|
+printf "mv: 'a' and 'b' are the same file\n" > exp |
||||||
|
+compare exp err || fail=1 |
||||||
|
|
||||||
|
-mv a b || fail=1 |
||||||
|
|
||||||
|
-# In coreutils-5.0 and earlier, a would not be removed. |
||||||
|
-test -r a && fail=1 |
||||||
|
+test -r a || fail=1 |
||||||
|
test -r b || fail=1 |
||||||
|
|
||||||
|
-# Make sure it works also with --backup. |
||||||
|
-ln b a |
||||||
|
+# Make sure it works with --backup. |
||||||
|
mv --backup=simple a b || fail=1 |
||||||
|
test -r a && fail=1 |
||||||
|
test -r b || fail=1 |
||||||
|
diff -urNp coreutils-8.22-orig/tests/mv/i-4.sh coreutils-8.22/tests/mv/i-4.sh |
||||||
|
--- coreutils-8.22-orig/tests/mv/i-4.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/mv/i-4.sh 2015-07-03 15:00:39.533718254 +0200 |
||||||
|
@@ -23,6 +23,7 @@ for i in a b; do |
||||||
|
echo $i > $i || framework_failure_ |
||||||
|
done |
||||||
|
echo y > y || framework_failure_ |
||||||
|
+echo n > n || framework_failure_ |
||||||
|
|
||||||
|
mv -i a b < y >/dev/null 2>&1 || fail=1 |
||||||
|
|
||||||
|
@@ -32,18 +33,15 @@ case "$(cat b)" in |
||||||
|
*) fail=1 ;; |
||||||
|
esac |
||||||
|
|
||||||
|
-# Ensure that mv -i a b works properly with 'n' and 'y' |
||||||
|
-# responses, even when a and b are hard links to the same file. |
||||||
|
-# This 'n' test would fail (no prompt) for coreutils-5.0.1 through 5.3.0. |
||||||
|
-echo n > n |
||||||
|
+# Ensure that mv -i a b works properly with 'n' and 'y' responses, |
||||||
|
+# when a and b are hard links to the same file. |
||||||
|
rm -f a b |
||||||
|
echo a > a |
||||||
|
ln a b |
||||||
|
-mv -i a b < n >/dev/null 2>&1 || fail=1 |
||||||
|
+mv -i a b < y 2>err && fail=1 |
||||||
|
test -r a || fail=1 |
||||||
|
test -r b || fail=1 |
||||||
|
-mv -i a b < y >/dev/null 2>&1 || fail=1 |
||||||
|
-test -r a && fail=1 |
||||||
|
-test -r b || fail=1 |
||||||
|
+printf "mv: 'a' and 'b' are the same file\n" > exp |
||||||
|
+compare exp err || fail=1 |
||||||
|
|
||||||
|
Exit $fail |
||||||
|
diff -urNp coreutils-8.22-orig/tests/mv/symlink-onto-hardlink-to-self.sh coreutils-8.22/tests/mv/symlink-onto-hardlink-to-self.sh |
||||||
|
--- coreutils-8.22-orig/tests/mv/symlink-onto-hardlink-to-self.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/mv/symlink-onto-hardlink-to-self.sh 2015-07-03 15:01:39.209190741 +0200 |
||||||
|
@@ -1,10 +1,10 @@ |
||||||
|
#!/bin/sh |
||||||
|
-# Demonstrate that when moving a symlink onto a hardlink-to-that-symlink, the |
||||||
|
-# source symlink is removed. Depending on your kernel (e.g., Linux, Solaris, |
||||||
|
+# Demonstrate that when moving a symlink onto a hardlink-to-that-symlink, |
||||||
|
+# an error is presented. Depending on your kernel (e.g., Linux, Solaris, |
||||||
|
# but not NetBSD), prior to coreutils-8.16, the mv would successfully perform |
||||||
|
# a no-op. I.e., surprisingly, mv s1 s2 would succeed, yet fail to remove s1. |
||||||
|
|
||||||
|
-# Copyright (C) 2012-2013 Free Software Foundation, Inc. |
||||||
|
+# Copyright (C) 2012-2014 Free Software Foundation, Inc. |
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
@@ -26,27 +26,34 @@ print_ver_ mv |
||||||
|
touch f || framework_failure_ |
||||||
|
ln -s f s2 || framework_failure_ |
||||||
|
|
||||||
|
-for opt in '' --backup; do |
||||||
|
+# Attempt to create a hard link to that symlink. |
||||||
|
+# On some systems, it's not possible: they create a hard link to the referent. |
||||||
|
+ln s2 s1 || framework_failure_ |
||||||
|
+ |
||||||
|
+# If s1 is not a symlink, skip this test. |
||||||
|
+test -h s1 \ |
||||||
|
+ || skip_ your kernel or file system cannot create a hard link to a symlink |
||||||
|
|
||||||
|
- # Attempt to create a hard link to that symlink. |
||||||
|
- # On some systems, it's not possible: they create a hard link to the referent. |
||||||
|
- ln s2 s1 || framework_failure_ |
||||||
|
- |
||||||
|
- # If s1 is not a symlink, skip this test. |
||||||
|
- test -h s1 \ |
||||||
|
- || skip_ your kernel or file system cannot create a hard link to a symlink |
||||||
|
+for opt in '' --backup; do |
||||||
|
|
||||||
|
- mv $opt s1 s2 > out 2>&1 || fail=1 |
||||||
|
- compare /dev/null out || fail=1 |
||||||
|
+ if test "$opt" = --backup; then |
||||||
|
+ mv $opt s1 s2 > out 2>&1 || fail=1 |
||||||
|
+ compare /dev/null out || fail=1 |
||||||
|
|
||||||
|
- # Ensure that s1 is gone. |
||||||
|
- test -e s1 && fail=1 |
||||||
|
+ # Ensure that s1 is gone. |
||||||
|
+ test -e s1 && fail=1 |
||||||
|
|
||||||
|
- if test "$opt" = --backup; then |
||||||
|
# With --backup, ensure that the backup file was created. |
||||||
|
ref=$(readlink s2~) || fail=1 |
||||||
|
test "$ref" = f || fail=1 |
||||||
|
else |
||||||
|
+ echo "mv: 's1' and 's2' are the same file" > exp |
||||||
|
+ mv $opt s1 s2 2>err && fail=1 |
||||||
|
+ compare exp err || fail=1 |
||||||
|
+ |
||||||
|
+ # Ensure that s1 is still present. |
||||||
|
+ test -e s1 || fail=1 |
||||||
|
+ |
||||||
|
# Without --backup, ensure there is no backup file. |
||||||
|
test -e s2~ && fail=1 |
||||||
|
fi |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,171 @@ |
|||||||
|
diff -urNp coreutils-8.22-orig/src/fs-is-local.h coreutils-8.22/src/fs-is-local.h |
||||||
|
--- coreutils-8.22-orig/src/fs-is-local.h 2016-06-24 10:59:08.545965484 +0200 |
||||||
|
+++ coreutils-8.22/src/fs-is-local.h 2016-06-24 11:08:47.435944633 +0200 |
||||||
|
@@ -6,6 +6,7 @@ is_local_fs_type (unsigned long int magi |
||||||
|
{ |
||||||
|
switch (magic) |
||||||
|
{ |
||||||
|
+ case S_MAGIC_ACFS: return 0; |
||||||
|
case S_MAGIC_ADFS: return 1; |
||||||
|
case S_MAGIC_AFFS: return 1; |
||||||
|
case S_MAGIC_AFS: return 0; |
||||||
|
@@ -15,13 +16,16 @@ is_local_fs_type (unsigned long int magi |
||||||
|
case S_MAGIC_BEFS: return 1; |
||||||
|
case S_MAGIC_BDEVFS: return 1; |
||||||
|
case S_MAGIC_BFS: return 1; |
||||||
|
+ case S_MAGIC_BPF_FS: return 1; |
||||||
|
case S_MAGIC_BINFMTFS: return 1; |
||||||
|
case S_MAGIC_BTRFS: return 1; |
||||||
|
+ case S_MAGIC_BTRFS_TEST: return 1; |
||||||
|
case S_MAGIC_CEPH: return 0; |
||||||
|
case S_MAGIC_CGROUP: return 1; |
||||||
|
case S_MAGIC_CIFS: return 0; |
||||||
|
case S_MAGIC_CODA: return 0; |
||||||
|
case S_MAGIC_COH: return 1; |
||||||
|
+ case S_MAGIC_CONFIGFS: return 1; |
||||||
|
case S_MAGIC_CRAMFS: return 1; |
||||||
|
case S_MAGIC_CRAMFS_WEND: return 1; |
||||||
|
case S_MAGIC_DEBUGFS: return 1; |
||||||
|
@@ -43,10 +47,13 @@ is_local_fs_type (unsigned long int magi |
||||||
|
case S_MAGIC_GFS: return 0; |
||||||
|
case S_MAGIC_GPFS: return 0; |
||||||
|
case S_MAGIC_HFS: return 1; |
||||||
|
+ case S_MAGIC_HFS_PLUS: return 1; |
||||||
|
+ case S_MAGIC_HFS_X: return 1; |
||||||
|
case S_MAGIC_HOSTFS: return 1; |
||||||
|
case S_MAGIC_HPFS: return 1; |
||||||
|
case S_MAGIC_HUGETLBFS: return 1; |
||||||
|
case S_MAGIC_MTD_INODE_FS: return 1; |
||||||
|
+ case S_MAGIC_IBRIX: return 0; |
||||||
|
case S_MAGIC_INOTIFYFS: return 1; |
||||||
|
case S_MAGIC_ISOFS: return 1; |
||||||
|
case S_MAGIC_ISOFS_R_WIN: return 1; |
||||||
|
@@ -55,7 +62,9 @@ is_local_fs_type (unsigned long int magi |
||||||
|
case S_MAGIC_JFFS2: return 1; |
||||||
|
case S_MAGIC_JFS: return 1; |
||||||
|
case S_MAGIC_KAFS: return 0; |
||||||
|
+ case S_MAGIC_LOGFS: return 1; |
||||||
|
case S_MAGIC_LUSTRE: return 0; |
||||||
|
+ case S_MAGIC_M1FS: return 1; |
||||||
|
case S_MAGIC_MINIX: return 1; |
||||||
|
case S_MAGIC_MINIX_30: return 1; |
||||||
|
case S_MAGIC_MINIX_V2: return 1; |
||||||
|
@@ -67,11 +75,14 @@ is_local_fs_type (unsigned long int magi |
||||||
|
case S_MAGIC_NFS: return 0; |
||||||
|
case S_MAGIC_NFSD: return 0; |
||||||
|
case S_MAGIC_NILFS: return 1; |
||||||
|
+ case S_MAGIC_NSFS: return 1; |
||||||
|
case S_MAGIC_NTFS: return 1; |
||||||
|
case S_MAGIC_OPENPROM: return 1; |
||||||
|
case S_MAGIC_OCFS2: return 0; |
||||||
|
+ case S_MAGIC_OVERLAYFS: return 0; |
||||||
|
case S_MAGIC_PANFS: return 0; |
||||||
|
case S_MAGIC_PIPEFS: return 0; |
||||||
|
+ case S_MAGIC_PRL_FS: return 0; |
||||||
|
case S_MAGIC_PROC: return 1; |
||||||
|
case S_MAGIC_PSTOREFS: return 1; |
||||||
|
case S_MAGIC_QNX4: return 1; |
||||||
|
@@ -91,6 +101,7 @@ is_local_fs_type (unsigned long int magi |
||||||
|
case S_MAGIC_SYSV2: return 1; |
||||||
|
case S_MAGIC_SYSV4: return 1; |
||||||
|
case S_MAGIC_TMPFS: return 1; |
||||||
|
+ case S_MAGIC_TRACEFS: return 1; |
||||||
|
case S_MAGIC_UBIFS: return 1; |
||||||
|
case S_MAGIC_UDF: return 1; |
||||||
|
case S_MAGIC_UFS: return 1; |
||||||
|
diff -urNp coreutils-8.22-orig/src/stat.c coreutils-8.22/src/stat.c |
||||||
|
--- coreutils-8.22-orig/src/stat.c 2013-12-13 15:12:46.000000000 +0100 |
||||||
|
+++ coreutils-8.22/src/stat.c 2016-06-24 11:16:37.853990792 +0200 |
||||||
|
@@ -311,13 +311,13 @@ human_fstype (STRUCT_STATVFS const *stat |
||||||
|
return "fusectl"; |
||||||
|
case S_MAGIC_FUTEXFS: /* 0x0BAD1DEA local */ |
||||||
|
return "futexfs"; |
||||||
|
- case S_MAGIC_GFS: /* 0x1161970 remote */ |
||||||
|
+ case S_MAGIC_GFS: /* 0x01161970 remote */ |
||||||
|
return "gfs/gfs2"; |
||||||
|
case S_MAGIC_GPFS: /* 0x47504653 remote */ |
||||||
|
return "gpfs"; |
||||||
|
case S_MAGIC_HFS: /* 0x4244 local */ |
||||||
|
return "hfs"; |
||||||
|
- case S_MAGIC_HOSTFS: /* 0xC0FFEE local */ |
||||||
|
+ case S_MAGIC_HOSTFS: /* 0x00C0FFEE local */ |
||||||
|
return "hostfs"; |
||||||
|
case S_MAGIC_HPFS: /* 0xF995E849 local */ |
||||||
|
return "hpfs"; |
||||||
|
@@ -369,7 +369,7 @@ human_fstype (STRUCT_STATVFS const *stat |
||||||
|
return "ntfs"; |
||||||
|
case S_MAGIC_OPENPROM: /* 0x9FA1 local */ |
||||||
|
return "openprom"; |
||||||
|
- case S_MAGIC_OCFS2: /* 0x7461636f remote */ |
||||||
|
+ case S_MAGIC_OCFS2: /* 0x7461636F remote */ |
||||||
|
return "ocfs2"; |
||||||
|
case S_MAGIC_PANFS: /* 0xAAD7AAEA remote */ |
||||||
|
return "panfs"; |
||||||
|
@@ -430,7 +430,9 @@ human_fstype (STRUCT_STATVFS const *stat |
||||||
|
return "v9fs"; |
||||||
|
case S_MAGIC_VMHGFS: /* 0xBACBACBC remote */ |
||||||
|
return "vmhgfs"; |
||||||
|
- case S_MAGIC_VXFS: /* 0xA501FCF5 local */ |
||||||
|
+ case S_MAGIC_VXFS: /* 0xA501FCF5 remote */ |
||||||
|
+ /* Veritas File System can run in single instance or clustered mode, |
||||||
|
+ so mark as remote to cater for the latter case. */ |
||||||
|
return "vxfs"; |
||||||
|
case S_MAGIC_VZFS: /* 0x565A4653 local */ |
||||||
|
return "vzfs"; |
||||||
|
@@ -444,6 +446,37 @@ human_fstype (STRUCT_STATVFS const *stat |
||||||
|
return "xia"; |
||||||
|
case S_MAGIC_ZFS: /* 0x2FC12FC1 local */ |
||||||
|
return "zfs"; |
||||||
|
+/* Refresh from coreutils-8.25 bellow */ |
||||||
|
+ case S_MAGIC_ACFS: /* 0x61636673 remote */ |
||||||
|
+ return "acfs"; |
||||||
|
+ case S_MAGIC_BPF_FS: /* 0xCAFE4A11 local */ |
||||||
|
+ return "bpf_fs"; |
||||||
|
+ case S_MAGIC_BTRFS_TEST: /* 0x73727279 local */ |
||||||
|
+ return "btrfs_test"; |
||||||
|
+ case S_MAGIC_CONFIGFS: /* 0x62656570 local */ |
||||||
|
+ return "configfs"; |
||||||
|
+ case S_MAGIC_HFS_PLUS: /* 0x482B local */ |
||||||
|
+ return "hfs+"; |
||||||
|
+ case S_MAGIC_HFS_X: /* 0x4858 local */ |
||||||
|
+ return "hfsx"; |
||||||
|
+ case S_MAGIC_IBRIX: /* 0x013111A8 remote */ |
||||||
|
+ return "ibrix"; |
||||||
|
+ case S_MAGIC_LOGFS: /* 0xC97E8168 local */ |
||||||
|
+ return "logfs"; |
||||||
|
+ case S_MAGIC_M1FS: /* 0x5346314D local */ |
||||||
|
+ return "m1fs"; |
||||||
|
+ case S_MAGIC_NSFS: /* 0x6E736673 local */ |
||||||
|
+ return "nsfs"; |
||||||
|
+ case S_MAGIC_OVERLAYFS: /* 0x794C7630 remote */ |
||||||
|
+ /* This may overlay remote file systems. |
||||||
|
+ Also there have been issues reported with inotify and overlayfs, |
||||||
|
+ so mark as "remote" so that polling is used. */ |
||||||
|
+ return "overlayfs"; |
||||||
|
+ case S_MAGIC_PRL_FS: /* 0x7C7C6673 remote */ |
||||||
|
+ return "prl_fs"; |
||||||
|
+ case S_MAGIC_TRACEFS: /* 0x74726163 local */ |
||||||
|
+ return "tracefs"; |
||||||
|
+ |
||||||
|
|
||||||
|
# elif __GNU__ |
||||||
|
case FSTYPE_UFS: |
||||||
|
diff -urNp coreutils-8.22-orig/src/tail.c coreutils-8.22/src/tail.c |
||||||
|
--- coreutils-8.22-orig/src/tail.c 2013-12-09 14:40:46.000000000 +0100 |
||||||
|
+++ coreutils-8.22/src/tail.c 2016-06-24 11:03:10.268044584 +0200 |
||||||
|
@@ -898,13 +898,15 @@ fremote (int fd, const char *name) |
||||||
|
case 0: |
||||||
|
break; |
||||||
|
case -1: |
||||||
|
+#if 0 |
||||||
|
{ |
||||||
|
unsigned long int fs_type = buf.f_type; |
||||||
|
error (0, 0, _("unrecognized file system type 0x%08lx for %s. " |
||||||
|
"please report this to %s. reverting to polling"), |
||||||
|
fs_type, quote (name), PACKAGE_BUGREPORT); |
||||||
|
/* Treat as "remote", so caller polls. */ |
||||||
|
} |
||||||
|
+#endif |
||||||
|
break; |
||||||
|
case 1: |
||||||
|
remote = false; |
@ -0,0 +1,267 @@ |
|||||||
|
diff -urNp coreutils-8.22-orig/tests/cp/cp-a-selinux.sh coreutils-8.22/tests/cp/cp-a-selinux.sh |
||||||
|
--- coreutils-8.22-orig/tests/cp/cp-a-selinux.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/cp/cp-a-selinux.sh 2015-08-17 13:59:27.837012142 +0200 |
||||||
|
@@ -4,7 +4,7 @@ |
||||||
|
# Check also locally if --preserve=context, -a and --preserve=all |
||||||
|
# does work |
||||||
|
|
||||||
|
-# Copyright (C) 2007-2013 Free Software Foundation, Inc. |
||||||
|
+# Copyright (C) 2007-2015 Free Software Foundation, Inc. |
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
@@ -37,16 +37,36 @@ cp -a c d 2>err || framework_failure_ |
||||||
|
cp --preserve=context c e || framework_failure_ |
||||||
|
cp --preserve=all c f || framework_failure_ |
||||||
|
ls -Z d | grep $ctx || fail=1 |
||||||
|
-test -s err && fail=1 #there must be no stderr output for -a |
||||||
|
+# there must be no stderr output for -a |
||||||
|
+compare /dev/null err || fail=1 |
||||||
|
ls -Z e | grep $ctx || fail=1 |
||||||
|
ls -Z f | grep $ctx || fail=1 |
||||||
|
+rm -f f |
||||||
|
+ |
||||||
|
+# Check handling of existing dirs which requires specific handling |
||||||
|
+# due to recursion, and was handled incorrectly in coreutils-8.22 |
||||||
|
+# Note standard permissions are updated for existing directories |
||||||
|
+# in the destination, so SELinux contexts should be updated too. |
||||||
|
+chmod o+rw restore/existing_dir |
||||||
|
+mkdir -p backup/existing_dir/ || framework_failure_ |
||||||
|
+ls -Zd backup/existing_dir > ed_ctx || fail=1 |
||||||
|
+grep $ctx ed_ctx && framework_failure_ |
||||||
|
+touch backup/existing_dir/file || framework_failure_ |
||||||
|
+chcon $ctx backup/existing_dir/file || framework_failure_ |
||||||
|
+# Set the dir context to ensure it is reset |
||||||
|
+mkdir -p --context="$ctx" restore/existing_dir || framework_failure_ |
||||||
|
+# Copy and ensure existing directories updated |
||||||
|
+cp -a backup/. restore/ |
||||||
|
+ls -Zd restore/existing_dir > ed_ctx || fail=1 |
||||||
|
+grep $ctx ed_ctx && |
||||||
|
+ { ls -lZd restore/existing_dir; fail=1; } |
||||||
|
|
||||||
|
# Check restorecon (-Z) functionality for file and directory |
||||||
|
get_selinux_type() { ls -Zd "$1" | sed -n 's/.*:\(.*_t\):.*/\1/p'; } |
||||||
|
# Also make a dir with our known context |
||||||
|
mkdir c_d || framework_failure_ |
||||||
|
chcon $ctx c_d || framework_failure_ |
||||||
|
-# Get the type of this known context for file and dir |
||||||
|
+# Get the type of this known context for file and dir for tracing |
||||||
|
old_type_f=$(get_selinux_type c) |
||||||
|
old_type_d=$(get_selinux_type c_d) |
||||||
|
# Setup copies for manipulation with restorecon |
||||||
|
@@ -62,7 +82,7 @@ if restorecon Z1 Z1_d 2>/dev/null; then |
||||||
|
cpZ_type_f=$(get_selinux_type Z2) |
||||||
|
test "$cpZ_type_f" = "$new_type_f" || fail=1 |
||||||
|
|
||||||
|
- # Ensuze -Z overrides -a and that dirs are handled too |
||||||
|
+ # Ensure -Z overrides -a and that dirs are handled too |
||||||
|
cp -aZ c Z3 || fail=1 |
||||||
|
cp -aZ c_d Z3_d || fail=1 |
||||||
|
cpaZ_type_f=$(get_selinux_type Z3) |
||||||
|
@@ -93,27 +113,30 @@ test $skip = 1 \ |
||||||
|
|
||||||
|
cd mnt || framework_failure_ |
||||||
|
|
||||||
|
-echo > f || framework_failure_ |
||||||
|
- |
||||||
|
+# Create files with hopefully different contexts |
||||||
|
+echo > ../f || framework_failure_ |
||||||
|
echo > g || framework_failure_ |
||||||
|
+test "$(stat -c%C ../f)" = "$(stat -c%C g)" && |
||||||
|
+ skip_ "files on separate file systems have the same security context" |
||||||
|
+ |
||||||
|
# /bin/cp from coreutils-6.7-3.fc7 would fail this test by letting cp |
||||||
|
# succeed (giving no diagnostics), yet leaving the destination file empty. |
||||||
|
-cp -a f g 2>err || fail=1 |
||||||
|
+cp -a ../f g 2>err || fail=1 |
||||||
|
test -s g || fail=1 # The destination file must not be empty. |
||||||
|
-test -s err && fail=1 # There must be no stderr output. |
||||||
|
+compare /dev/null err || fail=1 |
||||||
|
|
||||||
|
# ===================================================== |
||||||
|
# Here, we expect cp to succeed and not warn with "Operation not supported" |
||||||
|
rm -f g |
||||||
|
echo > g |
||||||
|
-cp --preserve=all f g 2>err || fail=1 |
||||||
|
+cp --preserve=all ../f g 2>err || fail=1 |
||||||
|
test -s g || fail=1 |
||||||
|
grep "Operation not supported" err && fail=1 |
||||||
|
|
||||||
|
# ===================================================== |
||||||
|
# The same as above except destination does not exist |
||||||
|
rm -f g |
||||||
|
-cp --preserve=all f g 2>err || fail=1 |
||||||
|
+cp --preserve=all ../f g 2>err || fail=1 |
||||||
|
test -s g || fail=1 |
||||||
|
grep "Operation not supported" err && fail=1 |
||||||
|
|
||||||
|
@@ -133,9 +156,9 @@ echo > g |
||||||
|
# ===================================================== |
||||||
|
# Here, we expect cp to fail, because it cannot set the SELinux |
||||||
|
# security context through NFS or a mount with fixed context. |
||||||
|
-cp --preserve=context f g 2> out && fail=1 |
||||||
|
+cp --preserve=context ../f g 2> out && fail=1 |
||||||
|
# Here, we *do* expect the destination to be empty. |
||||||
|
-test -s g && fail=1 |
||||||
|
+compare /dev/null g || fail=1 |
||||||
|
sed "s/ .g'.*//" out > k |
||||||
|
mv k out |
||||||
|
compare exp out || fail=1 |
||||||
|
@@ -143,9 +166,9 @@ compare exp out || fail=1 |
||||||
|
rm -f g |
||||||
|
echo > g |
||||||
|
# Check if -a option doesn't silence --preserve=context option diagnostics |
||||||
|
-cp -a --preserve=context f g 2> out2 && fail=1 |
||||||
|
+cp -a --preserve=context ../f g 2> out2 && fail=1 |
||||||
|
# Here, we *do* expect the destination to be empty. |
||||||
|
-test -s g && fail=1 |
||||||
|
+compare /dev/null g || fail=1 |
||||||
|
sed "s/ .g'.*//" out2 > k |
||||||
|
mv k out2 |
||||||
|
compare exp out2 || fail=1 |
||||||
|
@@ -154,31 +177,33 @@ for no_g_cmd in '' 'rm -f g'; do |
||||||
|
# restorecon equivalent. Note even though the context |
||||||
|
# returned from matchpathcon() will not match $ctx |
||||||
|
# the resulting ENOTSUP warning will be suppressed. |
||||||
|
+ |
||||||
|
# With absolute path |
||||||
|
$no_g_cmd |
||||||
|
- cp -Z f $(realpath g) || fail=1 |
||||||
|
+ cp -Z ../f $(realpath g) || fail=1 |
||||||
|
# With relative path |
||||||
|
$no_g_cmd |
||||||
|
- cp -Z f g || fail=1 |
||||||
|
+ cp -Z ../f g || fail=1 |
||||||
|
# -Z overrides -a |
||||||
|
$no_g_cmd |
||||||
|
- cp -Z -a f g || fail=1 |
||||||
|
+ cp -Z -a ../f g || fail=1 |
||||||
|
# -Z doesn't take an arg |
||||||
|
$no_g_cmd |
||||||
|
- cp -Z "$ctx" f g && fail=1 |
||||||
|
+ returns_ 1 cp -Z "$ctx" ../f g || fail=1 |
||||||
|
|
||||||
|
# Explicit context |
||||||
|
$no_g_cmd |
||||||
|
# Explicitly defaulting to the global $ctx should work |
||||||
|
- cp --context="$ctx" f g || fail=1 |
||||||
|
+ cp --context="$ctx" ../f g || fail=1 |
||||||
|
# --context overrides -a |
||||||
|
$no_g_cmd |
||||||
|
- cp -a --context="$ctx" f g || fail=1 |
||||||
|
+ cp -a --context="$ctx" ../f g || fail=1 |
||||||
|
done |
||||||
|
|
||||||
|
-# Mutually exlusive options |
||||||
|
-cp -Z --preserve=context f g && fail=1 |
||||||
|
-cp --preserve=context -Z f g && fail=1 |
||||||
|
-cp --preserve=context --context="$ctx" f g && fail=1 |
||||||
|
+# Mutually exclusive options |
||||||
|
+returns_ 1 cp -Z --preserve=context ../f g || fail=1 |
||||||
|
+returns_ 1 cp --preserve=context -Z ../f g || fail=1 |
||||||
|
+returns_ 1 cp --preserve=context --context="$ctx" ../f g || fail=1 |
||||||
|
|
||||||
|
Exit $fail |
||||||
|
+ |
||||||
|
diff -urNp coreutils-8.22-orig/tests/du/2g.sh coreutils-8.22/tests/du/2g.sh |
||||||
|
--- coreutils-8.22-orig/tests/du/2g.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/du/2g.sh 2015-08-17 13:59:37.349088611 +0200 |
||||||
|
@@ -3,7 +3,7 @@ |
||||||
|
# Before coreutils-5.93, on systems with a signed, 32-bit stat.st_blocks |
||||||
|
# one of du's computations would overflow. |
||||||
|
|
||||||
|
-# Copyright (C) 2005-2013 Free Software Foundation, Inc. |
||||||
|
+# Copyright (C) 2005-2015 Free Software Foundation, Inc. |
||||||
|
|
||||||
|
# This program is free software: you can redistribute it and/or modify |
||||||
|
# it under the terms of the GNU General Public License as published by |
||||||
|
@@ -24,13 +24,9 @@ print_ver_ du |
||||||
|
# Creating a 2GB file counts as 'very expensive'. |
||||||
|
very_expensive_ |
||||||
|
|
||||||
|
- |
||||||
|
# Get number of free kilobytes on current partition, so we can |
||||||
|
# skip this test if there is insufficient free space. |
||||||
|
- |
||||||
|
-# This technique relies on the fact that the 'Available' kilobyte |
||||||
|
-# count is the number just before the one with a trailing '%'. |
||||||
|
-free_kb=$(df -kP .|tail -1|sed 's/ [0-9][0-9]*%.*//;s/ *$//;s/.* //') |
||||||
|
+free_kb=$(df -k --output=avail . | tail -n1) |
||||||
|
case "$free_kb" in |
||||||
|
[0-9]*) ;; |
||||||
|
*) skip_ "invalid size from df: $free_kb";; |
||||||
|
@@ -45,16 +41,22 @@ test $min_kb -lt $free_kb || |
||||||
|
} |
||||||
|
|
||||||
|
big=big |
||||||
|
-rm -f $big |
||||||
|
-test -t 1 || printf 'creating a 2GB file...\n' |
||||||
|
-for i in $(seq 100); do |
||||||
|
- # Note: 2147483648 == 2^31. Print floor(2^31/100) per iteration. |
||||||
|
- printf %21474836s x >> $big || fail=1 |
||||||
|
- # On the final iteration, append the remaining 48 bytes. |
||||||
|
- test $i = 100 && { printf %48s x >> $big || fail=1; } |
||||||
|
- test -t 1 && printf 'creating a 2GB file: %d%% complete\r' $i |
||||||
|
-done |
||||||
|
-echo |
||||||
|
+ |
||||||
|
+if ! fallocate -l2G $big; then |
||||||
|
+ rm -f $big |
||||||
|
+ { |
||||||
|
+ is_local_dir_ . || skip 'Not writing 2GB data to remote' |
||||||
|
+ for i in $(seq 100); do |
||||||
|
+ # Note: 2147483648 == 2^31. Print floor(2^31/100) per iteration. |
||||||
|
+ printf %21474836s x || fail=1 |
||||||
|
+ done |
||||||
|
+ # After the final iteration, append the remaining 48 bytes. |
||||||
|
+ printf %48s x || fail=1 |
||||||
|
+ } > $big || fail=1 |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+# The allocation may be done asynchronously (BTRFS for example) |
||||||
|
+sync $big || framework_failure_ |
||||||
|
|
||||||
|
du -k $big > out1 || fail=1 |
||||||
|
rm -f $big |
||||||
|
diff -urNp coreutils-8.22-orig/tests/init.sh coreutils-8.22/tests/init.sh |
||||||
|
--- coreutils-8.22-orig/tests/init.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/init.sh 2015-08-17 13:59:19.900948318 +0200 |
||||||
|
@@ -93,6 +93,27 @@ skip_ () { warn_ "$ME_: skipped test: $@ |
||||||
|
fatal_ () { warn_ "$ME_: hard error: $@"; Exit 99; } |
||||||
|
framework_failure_ () { warn_ "$ME_: set-up failure: $@"; Exit 99; } |
||||||
|
|
||||||
|
+# This is used to simplify checking of the return value |
||||||
|
+# which is useful when ensuring a command fails as desired. |
||||||
|
+# I.e., just doing `command ... &&fail=1` will not catch |
||||||
|
+# a segfault in command for example. With this helper you |
||||||
|
+# instead check an explicit exit code like |
||||||
|
+# returns_ 1 command ... || fail |
||||||
|
+returns_ () { |
||||||
|
+ # Disable tracing so it doesn't interfere with stderr of the wrapped command |
||||||
|
+ { set +x; } 2>/dev/null |
||||||
|
+ |
||||||
|
+ local exp_exit="$1" |
||||||
|
+ shift |
||||||
|
+ "$@" |
||||||
|
+ test $? -eq $exp_exit && ret_=0 || ret_=1 |
||||||
|
+ |
||||||
|
+ if test "$VERBOSE" = yes && test "$gl_set_x_corrupts_stderr_" = false; then |
||||||
|
+ set -x |
||||||
|
+ fi |
||||||
|
+ { return $ret_; } 2>/dev/null |
||||||
|
+} |
||||||
|
+ |
||||||
|
# Sanitize this shell to POSIX mode, if possible. |
||||||
|
DUALCASE=1; export DUALCASE |
||||||
|
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then |
||||||
|
diff -urNp coreutils-8.22-orig/tests/local.mk coreutils-8.22/tests/local.mk |
||||||
|
--- coreutils-8.22-orig/tests/local.mk 2015-08-17 12:44:49.343344148 +0200 |
||||||
|
+++ coreutils-8.22/tests/local.mk 2015-08-17 13:59:12.124885835 +0200 |
||||||
|
@@ -121,7 +121,6 @@ all_root_tests = \ |
||||||
|
tests/install/install-C-root.sh \ |
||||||
|
tests/ls/capability.sh \ |
||||||
|
tests/ls/nameless-uid.sh \ |
||||||
|
- tests/misc/chcon.sh \ |
||||||
|
tests/misc/chroot-credentials.sh \ |
||||||
|
tests/misc/selinux.sh \ |
||||||
|
tests/misc/truncate-owned-by-other.sh \ |
@ -0,0 +1,39 @@ |
|||||||
|
diff -up coreutils-8.22/gnulib-tests/test-isnanl.h.ppc coreutils-8.22/gnulib-tests/test-isnanl.h |
||||||
|
--- coreutils-8.22/gnulib-tests/test-isnanl.h.ppc 2014-06-23 14:01:05.925541920 +0200 |
||||||
|
+++ coreutils-8.22/gnulib-tests/test-isnanl.h 2014-06-23 14:01:39.437617584 +0200 |
||||||
|
@@ -51,6 +51,15 @@ main () |
||||||
|
/* A bit pattern that is different from a Quiet NaN. With a bit of luck, |
||||||
|
it's a Signalling NaN. */ |
||||||
|
{ |
||||||
|
+#if defined __powerpc__ && LDBL_MANT_DIG == 106 |
||||||
|
+ /* This is PowerPC "double double", a pair of two doubles. Inf and Nan are |
||||||
|
+ represented as the corresponding 64-bit IEEE values in the first double; |
||||||
|
+ the second is ignored. Manipulate only the first double. */ |
||||||
|
+ #undef NWORDS |
||||||
|
+ #define NWORDS \ |
||||||
|
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) |
||||||
|
+#endif |
||||||
|
+ |
||||||
|
memory_long_double m; |
||||||
|
m.value = NaNl (); |
||||||
|
# if LDBL_EXPBIT0_BIT > 0 |
||||||
|
diff -up coreutils-8.22/gnulib-tests/test-signbit.c.ppc coreutils-8.22/gnulib-tests/test-signbit.c |
||||||
|
--- coreutils-8.22/gnulib-tests/test-signbit.c.ppc 2013-12-04 15:53:33.000000000 +0100 |
||||||
|
+++ coreutils-8.22/gnulib-tests/test-signbit.c 2014-06-23 13:59:20.378307385 +0200 |
||||||
|
@@ -151,6 +151,16 @@ test_signbitl () |
||||||
|
#define NWORDS \ |
||||||
|
((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) |
||||||
|
typedef union { long double value; unsigned int word[NWORDS]; } memory_long_double; |
||||||
|
+ |
||||||
|
+#if defined __powerpc__ && LDBL_MANT_DIG == 106 |
||||||
|
+ /* This is PowerPC "double double", a pair of two doubles. Inf and Nan are |
||||||
|
+ represented as the corresponding 64-bit IEEE values in the first double; |
||||||
|
+ the second is ignored. Manipulate only the first double. */ |
||||||
|
+ #undef NWORDS |
||||||
|
+ #define NWORDS \ |
||||||
|
+ ((sizeof (double) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) |
||||||
|
+#endif |
||||||
|
+ |
||||||
|
memory_long_double m; |
||||||
|
m.value = zerol / zerol; |
||||||
|
# if LDBL_EXPBIT0_BIT > 0 |
@ -0,0 +1,80 @@ |
|||||||
|
diff -urNp coreutils-8.22-orig/src/cp.c coreutils-8.22/src/cp.c |
||||||
|
--- coreutils-8.22-orig/src/cp.c 2015-06-11 15:58:04.230858212 +0200 |
||||||
|
+++ coreutils-8.22/src/cp.c 2015-06-11 15:59:13.191396755 +0200 |
||||||
|
@@ -233,8 +233,10 @@ Copy SOURCE to DEST, or multiple SOURCE( |
||||||
|
-x, --one-file-system stay on this file system\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (_("\ |
||||||
|
- -Z, --context[=CTX] set SELinux security context of destination\n\ |
||||||
|
- file to default type, or to CTX if specified\n\ |
||||||
|
+ -Z set SELinux security context of destination\n\ |
||||||
|
+ file to default type\n\ |
||||||
|
+ --context[=CTX] like -Z, or if CTX is specified then set the\n\ |
||||||
|
+ SELinux or SMACK security context to CTX\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (HELP_OPTION_DESCRIPTION, stdout); |
||||||
|
fputs (VERSION_OPTION_DESCRIPTION, stdout); |
||||||
|
diff -urNp coreutils-8.22-orig/src/install.c coreutils-8.22/src/install.c |
||||||
|
--- coreutils-8.22-orig/src/install.c 2015-06-11 15:58:04.230858212 +0200 |
||||||
|
+++ coreutils-8.22/src/install.c 2015-06-11 16:00:16.754893027 +0200 |
||||||
|
@@ -647,8 +647,10 @@ In the 4th form, create all components o |
||||||
|
"), stdout); |
||||||
|
fputs (_("\ |
||||||
|
-P, --preserve-context preserve SELinux security context (-P deprecated)\n\ |
||||||
|
- -Z, --context[=CTX] set SELinux security context of destination file to\n\ |
||||||
|
- default type, or to CTX if specified\n\ |
||||||
|
+ -Z set SELinux security context of destination\n\ |
||||||
|
+ file to default type\n\ |
||||||
|
+ --context[=CTX] like -Z, or if CTX is specified then set the\n\ |
||||||
|
+ SELinux or SMACK security context to CTX\n\ |
||||||
|
"), stdout); |
||||||
|
|
||||||
|
fputs (HELP_OPTION_DESCRIPTION, stdout); |
||||||
|
diff -urNp coreutils-8.22-orig/src/mkdir.c coreutils-8.22/src/mkdir.c |
||||||
|
--- coreutils-8.22-orig/src/mkdir.c 2013-12-05 01:59:36.000000000 +0100 |
||||||
|
+++ coreutils-8.22/src/mkdir.c 2015-06-11 16:01:17.209364915 +0200 |
||||||
|
@@ -66,8 +66,12 @@ Create the DIRECTORY(ies), if they do no |
||||||
|
-m, --mode=MODE set file mode (as in chmod), not a=rwx - umask\n\ |
||||||
|
-p, --parents no error if existing, make parent directories as needed\n\ |
||||||
|
-v, --verbose print a message for each created directory\n\ |
||||||
|
- -Z, --context[=CTX] set the SELinux security context of each created\n\ |
||||||
|
- directory to default type or to CTX if specified\n\ |
||||||
|
+"), stdout); |
||||||
|
+ fputs (_("\ |
||||||
|
+ -Z set SELinux security context of each created directory\n\ |
||||||
|
+ to the default type\n\ |
||||||
|
+ --context[=CTX] like -Z, or if CTX is specified then set the SELinux\n\ |
||||||
|
+ or SMACK security context to CTX\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (HELP_OPTION_DESCRIPTION, stdout); |
||||||
|
fputs (VERSION_OPTION_DESCRIPTION, stdout); |
||||||
|
diff -urNp coreutils-8.22-orig/src/mkfifo.c coreutils-8.22/src/mkfifo.c |
||||||
|
--- coreutils-8.22-orig/src/mkfifo.c 2013-12-05 00:43:05.000000000 +0100 |
||||||
|
+++ coreutils-8.22/src/mkfifo.c 2015-06-11 16:02:03.389725315 +0200 |
||||||
|
@@ -61,8 +61,9 @@ Create named pipes (FIFOs) with the give |
||||||
|
-m, --mode=MODE set file permission bits to MODE, not a=rw - umask\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (_("\ |
||||||
|
- -Z, --context[=CTX] set the SELinux security context of each NAME to\n\ |
||||||
|
- default type, or CTX if specified\n\ |
||||||
|
+ -Z set the SELinux security context to default type\n\ |
||||||
|
+ --context[=CTX] like -Z, or if CTX is specified then set the SELinux\n\ |
||||||
|
+ or SMACK security context to CTX\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (HELP_OPTION_DESCRIPTION, stdout); |
||||||
|
fputs (VERSION_OPTION_DESCRIPTION, stdout); |
||||||
|
diff -urNp coreutils-8.22-orig/src/mknod.c coreutils-8.22/src/mknod.c |
||||||
|
--- coreutils-8.22-orig/src/mknod.c 2013-12-05 00:43:05.000000000 +0100 |
||||||
|
+++ coreutils-8.22/src/mknod.c 2015-06-11 16:02:36.300982160 +0200 |
||||||
|
@@ -63,8 +63,9 @@ Create the special file NAME of the give |
||||||
|
-m, --mode=MODE set file permission bits to MODE, not a=rw - umask\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (_("\ |
||||||
|
- -Z, --context[=CTX] set the SELinux security context of NAME to\n\ |
||||||
|
- default type, or to CTX if specified\n\ |
||||||
|
+ -Z set the SELinux security context to default type\n\ |
||||||
|
+ --context[=CTX] like -Z, or if CTX is specified then set the SELinux\n\ |
||||||
|
+ or SMACK security context to CTX\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (HELP_OPTION_DESCRIPTION, stdout); |
||||||
|
fputs (VERSION_OPTION_DESCRIPTION, stdout); |
@ -0,0 +1,35 @@ |
|||||||
|
From 3976ef5a20369d8b490907ab2cba2d617305a5e0 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Mon, 30 May 2016 16:19:20 +0200 |
||||||
|
Subject: [PATCH] sort: do not use static array 'blanks' in human_numcompare() |
||||||
|
|
||||||
|
... because the array is not initialized with MB locales. Note this is |
||||||
|
rather a conservative fix. I plan to do more cleanup of the i18n patch |
||||||
|
in Fedora to prevent mistakes like this in future updates of coreutils. |
||||||
|
--- |
||||||
|
src/sort.c | 8 +++----- |
||||||
|
1 file changed, 3 insertions(+), 5 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/sort.c b/src/sort.c |
||||||
|
index 9e07ad8..e47b039 100644 |
||||||
|
--- a/src/sort.c |
||||||
|
+++ b/src/sort.c |
||||||
|
@@ -2275,12 +2275,10 @@ find_unit_order (char const *number) |
||||||
|
<none/unknown> < K/k < M < G < T < P < E < Z < Y */ |
||||||
|
|
||||||
|
static int |
||||||
|
-human_numcompare (char const *a, char const *b) |
||||||
|
+human_numcompare (char *a, char *b) |
||||||
|
{ |
||||||
|
- while (blanks[to_uchar (*a)]) |
||||||
|
- a++; |
||||||
|
- while (blanks[to_uchar (*b)]) |
||||||
|
- b++; |
||||||
|
+ skipblanks(&a, a + strlen(a)); |
||||||
|
+ skipblanks(&b, b + strlen(b)); |
||||||
|
|
||||||
|
int diff = find_unit_order (a) - find_unit_order (b); |
||||||
|
return (diff ? diff : strnumcmp (a, b, decimal_point, thousands_sep)); |
||||||
|
-- |
||||||
|
2.5.5 |
||||||
|
|
@ -0,0 +1,13 @@ |
|||||||
|
diff -urNp coreutils-8.22-orig/tests/df/df-symlink.sh coreutils-8.22/tests/df/df-symlink.sh |
||||||
|
--- coreutils-8.22-orig/tests/df/df-symlink.sh 2013-12-04 15:48:30.000000000 +0100 |
||||||
|
+++ coreutils-8.22/tests/df/df-symlink.sh 2013-12-14 18:20:15.822594995 +0100 |
||||||
|
@@ -18,6 +18,9 @@ |
||||||
|
|
||||||
|
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src |
||||||
|
print_ver_ df |
||||||
|
+#df doesn't work correctly on symlinks when on LVM/LUKS filesystem, therefore |
||||||
|
+#marking expensive_ to disable by default |
||||||
|
+expensive_ |
||||||
|
|
||||||
|
disk=$(df --out=source '.' | tail -n1) || |
||||||
|
skip_ "cannot determine '.' file system" |
@ -0,0 +1,12 @@ |
|||||||
|
diff -urNp coreutils-8.22-orig/src/fs-is-local.h coreutils-8.22/src/fs-is-local.h |
||||||
|
--- coreutils-8.22-orig/src/fs-is-local.h 2013-12-13 15:17:10.000000000 +0100 |
||||||
|
+++ coreutils-8.22/src/fs-is-local.h 2015-06-04 11:06:34.161072669 +0200 |
||||||
|
@@ -98,7 +98,7 @@ is_local_fs_type (unsigned long int magi |
||||||
|
case S_MAGIC_USBDEVFS: return 1; |
||||||
|
case S_MAGIC_V9FS: return 1; |
||||||
|
case S_MAGIC_VMHGFS: return 0; |
||||||
|
- case S_MAGIC_VXFS: return 1; |
||||||
|
+ case S_MAGIC_VXFS: return 0; |
||||||
|
case S_MAGIC_VZFS: return 1; |
||||||
|
case S_MAGIC_XENFS: return 1; |
||||||
|
case S_MAGIC_XENIX: return 1; |
@ -0,0 +1,29 @@ |
|||||||
|
From: Pádraig Brady <pbrady@redhat.com> |
||||||
|
|
||||||
|
Avoid false failure due to speculative preallocation on XFS |
||||||
|
Avoid false failure due to delayed allocation on BTRFS |
||||||
|
|
||||||
|
diff -Naur coreutils-8.22.orig/tests/dd/sparse.sh coreutils-8.22/tests/dd/sparse.sh |
||||||
|
--- coreutils-8.22.orig/tests/dd/sparse.sh 2013-12-04 14:48:30.000000000 +0000 |
||||||
|
+++ coreutils-8.22/tests/dd/sparse.sh 2015-05-19 21:24:55.139941789 +0000 |
||||||
|
@@ -58,11 +58,18 @@ |
||||||
|
|
||||||
|
# Ensure NUL blocks smaller than the block size are not made sparse. |
||||||
|
# Here, with a 2MiB block size, dd's conv=sparse must *not* introduce a hole. |
||||||
|
- dd if=file.in of=file.out bs=2M conv=sparse |
||||||
|
+ dd if=file.in of=file.out bs=2M conv=sparse,fsync |
||||||
|
test 2500 -lt $(kb_alloc file.out) || fail=1 |
||||||
|
|
||||||
|
+ # Note we recreate a sparse file first to avoid |
||||||
|
+ # speculative preallocation seen in XFS, where a write() that |
||||||
|
+ # extends a file can preallocate some extra space that |
||||||
|
+ # a subsequent seek will not convert to a hole. |
||||||
|
+ rm -f file.out |
||||||
|
+ truncate --size=3M file.out |
||||||
|
+ |
||||||
|
# Ensure that this 1MiB string of NULs *is* converted to a hole. |
||||||
|
- dd if=file.in of=file.out bs=1M conv=sparse |
||||||
|
+ dd if=file.in of=file.out bs=1M conv=sparse,notrunc,fsync |
||||||
|
test $(kb_alloc file.out) -lt 2500 || fail=1 |
||||||
|
|
||||||
|
fi |
@ -0,0 +1,93 @@ |
|||||||
|
From eafaa2e88f7af16756142a31ab63d032b31395e3 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Pádraig Brady <P@draigBrady.com> |
||||||
|
Date: Fri, 06 Nov 2015 16:31:22 +0000 |
||||||
|
Subject: tests: fix dirent d_type support verification |
||||||
|
|
||||||
|
* tests/d_type-check: Check also the d_type of files, |
||||||
|
which excludes XFS appropriately. Specify all argument |
||||||
|
and return types to avoid truncated pointers being passed, |
||||||
|
which skipped the test due to crashes on x86_64 at least. |
||||||
|
Simplify the C library lookup by reusing the interpreter's. |
||||||
|
|
||||||
|
chroot issue reported at https://bugzilla.redhat.com/1263341 |
||||||
|
--- |
||||||
|
diff --git a/tests/d_type-check b/tests/d_type-check |
||||||
|
index ff1eb60..1a2f76f 100644 |
||||||
|
--- a/tests/d_type-check |
||||||
|
+++ b/tests/d_type-check |
||||||
|
@@ -1,13 +1,17 @@ |
||||||
|
#!/usr/bin/python |
||||||
|
-# Exit 0 if "." has useful d_type information, else 1. |
||||||
|
+# Exit 0 if "." and "./tempfile" have useful d_type information, else 1. |
||||||
|
# Intended to exit 0 only on Linux/GNU systems. |
||||||
|
+import os |
||||||
|
import sys |
||||||
|
+import tempfile |
||||||
|
|
||||||
|
fail = 1 |
||||||
|
+fname = None |
||||||
|
+ |
||||||
|
try: |
||||||
|
import ctypes |
||||||
|
|
||||||
|
- (DT_UNKNOWN, DT_DIR,) = (0, 4,) |
||||||
|
+ (DT_UNKNOWN, DT_DIR, DT_REG) = (0, 4, 8) |
||||||
|
|
||||||
|
class dirent(ctypes.Structure): |
||||||
|
_fields_ = [ |
||||||
|
@@ -17,20 +21,48 @@ try: |
||||||
|
("d_type", ctypes.c_ubyte), |
||||||
|
("d_name", ctypes.c_char*256)] |
||||||
|
|
||||||
|
+ # Pass NULL to dlopen, assuming the python |
||||||
|
+ # interpreter is linked with the C runtime |
||||||
|
+ libc = ctypes.CDLL(None) |
||||||
|
+ |
||||||
|
+ # Setup correct types for all args and returns |
||||||
|
+ # even if only passing, to avoid truncation etc. |
||||||
|
+ dirp = ctypes.c_void_p |
||||||
|
direntp = ctypes.POINTER(dirent) |
||||||
|
|
||||||
|
- # FIXME: find a way to avoid hard-coding libc's so-name. |
||||||
|
- libc = ctypes.cdll.LoadLibrary("libc.so.6") |
||||||
|
+ libc.readdir.argtypes = [dirp] |
||||||
|
libc.readdir.restype = direntp |
||||||
|
|
||||||
|
+ libc.opendir.restype = dirp |
||||||
|
+ |
||||||
|
+ # Ensure a file is present |
||||||
|
+ f, fname = tempfile.mkstemp(dir='.') |
||||||
|
+ fname = os.path.basename(fname) |
||||||
|
+ |
||||||
|
dirp = libc.opendir(".") |
||||||
|
if dirp: |
||||||
|
- ep = libc.readdir(dirp) |
||||||
|
- if ep: |
||||||
|
+ while True: |
||||||
|
+ ep = libc.readdir(dirp) |
||||||
|
+ if not ep: break |
||||||
|
+ d_type = ep.contents.d_type |
||||||
|
name = ep.contents.d_name |
||||||
|
- if (name == "." or name == "..") and ep.contents.d_type == DT_DIR: |
||||||
|
+ if name == "." or name == "..": |
||||||
|
+ if d_type != DT_DIR: break |
||||||
|
+ # Check files too since on XFS, only dirs have DT_DIR |
||||||
|
+ # while everything else has DT_UNKNOWN |
||||||
|
+ elif name == fname: |
||||||
|
+ if d_type == DT_REG: |
||||||
|
+ fail = 0 |
||||||
|
+ break |
||||||
|
+ elif d_type != DT_DIR and d_type != DT_UNKNOWN: |
||||||
|
fail = 0 |
||||||
|
+ break |
||||||
|
+except: |
||||||
|
+ pass |
||||||
|
|
||||||
|
+try: |
||||||
|
+ if fname: |
||||||
|
+ os.unlink(fname); |
||||||
|
except: |
||||||
|
pass |
||||||
|
|
||||||
|
-- |
||||||
|
cgit v0.9.0.2 |
@ -0,0 +1,12 @@ |
|||||||
|
diff -urNp coreutils-8.4-orig/doc/coreutils.texi coreutils-8.4/doc/coreutils.texi |
||||||
|
--- coreutils-8.4-orig/doc/coreutils.texi 2011-01-07 15:01:18.575654333 +0100 |
||||||
|
+++ coreutils-8.4/doc/coreutils.texi 2011-01-07 15:05:38.791655243 +0100 |
||||||
|
@@ -9058,6 +9058,8 @@ incorrect. @xref{Directory Setuid and S |
||||||
|
set-user-ID and set-group-ID bits of directories are inherited unless |
||||||
|
overridden in this way. |
||||||
|
|
||||||
|
+Note: The @option{--mode},@option{-m} option only applies to the right-most directories listed on the command line. When combined with @option{--parents}, @option{-p} option, any parent directories are created with @samp{u+wx} modified by umask. |
||||||
|
+ |
||||||
|
@item -p |
||||||
|
@itemx --parents |
||||||
|
@opindex -p |
@ -0,0 +1,263 @@ |
|||||||
|
# Configuration file for the color ls utility |
||||||
|
# Synchronized with coreutils 8.5 dircolors |
||||||
|
# This file goes in the /etc directory, and must be world readable. |
||||||
|
# You can copy this file to .dir_colors in your $HOME directory to override |
||||||
|
# the system defaults. |
||||||
|
|
||||||
|
# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not |
||||||
|
# pipes. 'all' adds color characters to all output. 'none' shuts colorization |
||||||
|
# off. |
||||||
|
COLOR tty |
||||||
|
|
||||||
|
# Extra command line options for ls go here. |
||||||
|
# Basically these ones are: |
||||||
|
# -F = show '/' for dirs, '*' for executables, etc. |
||||||
|
# -T 0 = don't trust tab spacing when formatting ls output. |
||||||
|
OPTIONS -F -T 0 |
||||||
|
|
||||||
|
# Below, there should be one TERM entry for each termtype that is colorizable |
||||||
|
TERM Eterm |
||||||
|
TERM ansi |
||||||
|
TERM color-xterm |
||||||
|
TERM con132x25 |
||||||
|
TERM con132x30 |
||||||
|
TERM con132x43 |
||||||
|
TERM con132x60 |
||||||
|
TERM con80x25 |
||||||
|
TERM con80x28 |
||||||
|
TERM con80x30 |
||||||
|
TERM con80x43 |
||||||
|
TERM con80x50 |
||||||
|
TERM con80x60 |
||||||
|
TERM cons25 |
||||||
|
TERM console |
||||||
|
TERM cygwin |
||||||
|
TERM dtterm |
||||||
|
TERM eterm-color |
||||||
|
TERM gnome |
||||||
|
TERM gnome-256color |
||||||
|
TERM jfbterm |
||||||
|
TERM konsole |
||||||
|
TERM kterm |
||||||
|
TERM linux |
||||||
|
TERM linux-c |
||||||
|
TERM mach-color |
||||||
|
TERM mlterm |
||||||
|
TERM putty |
||||||
|
TERM putty-256color |
||||||
|
TERM rxvt |
||||||
|
TERM rxvt-256color |
||||||
|
TERM rxvt-cygwin |
||||||
|
TERM rxvt-cygwin-native |
||||||
|
TERM rxvt-unicode |
||||||
|
TERM rxvt-unicode-256color |
||||||
|
TERM rxvt-unicode256 |
||||||
|
TERM screen |
||||||
|
TERM screen-256color |
||||||
|
TERM screen-256color-bce |
||||||
|
TERM screen-bce |
||||||
|
TERM screen-w |
||||||
|
TERM screen.Eterm |
||||||
|
TERM screen.rxvt |
||||||
|
TERM screen.linux |
||||||
|
TERM st |
||||||
|
TERM st-256color |
||||||
|
TERM terminator |
||||||
|
TERM vt100 |
||||||
|
TERM xterm |
||||||
|
TERM xterm-16color |
||||||
|
TERM xterm-256color |
||||||
|
TERM xterm-88color |
||||||
|
TERM xterm-color |
||||||
|
TERM xterm-debian |
||||||
|
|
||||||
|
# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output) |
||||||
|
EIGHTBIT 1 |
||||||
|
|
||||||
|
# Below are the color init strings for the basic file types. A color init |
||||||
|
# string consists of one or more of the following numeric codes: |
||||||
|
# Attribute codes: |
||||||
|
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed |
||||||
|
# Text color codes: |
||||||
|
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white |
||||||
|
# Background color codes: |
||||||
|
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white |
||||||
|
#NORMAL 00 # no color code at all |
||||||
|
#FILE 00 # normal file, use no color at all |
||||||
|
RESET 0 # reset to "normal" color |
||||||
|
DIR 01;34 # directory |
||||||
|
LINK 01;36 # symbolic link (If you set this to 'target' instead of a |
||||||
|
# numerical value, the color is as for the file pointed to.) |
||||||
|
MULTIHARDLINK 00 # regular file with more than one link |
||||||
|
FIFO 40;33 # pipe |
||||||
|
SOCK 01;35 # socket |
||||||
|
DOOR 01;35 # door |
||||||
|
BLK 40;33;01 # block device driver |
||||||
|
CHR 40;33;01 # character device driver |
||||||
|
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file |
||||||
|
MISSING 01;05;37;41 # ... and the files they point to |
||||||
|
SETUID 37;41 # file that is setuid (u+s) |
||||||
|
SETGID 30;43 # file that is setgid (g+s) |
||||||
|
CAPABILITY 30;41 # file with capability |
||||||
|
STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w) |
||||||
|
OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky |
||||||
|
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable |
||||||
|
|
||||||
|
# This is for files with execute permission: |
||||||
|
EXEC 01;32 |
||||||
|
|
||||||
|
# List any file extensions like '.gz' or '.tar' that you would like ls |
||||||
|
# to colorize below. Put the extension, a space, and the color init string. |
||||||
|
# (and any comments you want to add after a '#') |
||||||
|
# executables (bright green) |
||||||
|
#.cmd 01;32 |
||||||
|
#.exe 01;32 |
||||||
|
#.com 01;32 |
||||||
|
#.btm 01;32 |
||||||
|
#.bat 01;32 |
||||||
|
#.sh 01;32 |
||||||
|
#.csh 01;32 |
||||||
|
|
||||||
|
# archives or compressed (bright red) |
||||||
|
.tar 01;31 |
||||||
|
.tgz 01;31 |
||||||
|
.arc 01;31 |
||||||
|
.arj 01;31 |
||||||
|
.taz 01;31 |
||||||
|
.lha 01;31 |
||||||
|
.lz4 01;31 |
||||||
|
.lzh 01;31 |
||||||
|
.lzma 01;31 |
||||||
|
.tlz 01;31 |
||||||
|
.txz 01;31 |
||||||
|
.tzo 01;31 |
||||||
|
.t7z 01;31 |
||||||
|
.zip 01;31 |
||||||
|
.z 01;31 |
||||||
|
.Z 01;31 |
||||||
|
.dz 01;31 |
||||||
|
.gz 01;31 |
||||||
|
.lrz 01;31 |
||||||
|
.lz 01;31 |
||||||
|
.lzo 01;31 |
||||||
|
.xz 01;31 |
||||||
|
.bz2 01;31 |
||||||
|
.bz 01;31 |
||||||
|
.tbz 01;31 |
||||||
|
.tbz2 01;31 |
||||||
|
.tz 01;31 |
||||||
|
.deb 01;31 |
||||||
|
.rpm 01;31 |
||||||
|
.jar 01;31 |
||||||
|
.war 01;31 |
||||||
|
.ear 01;31 |
||||||
|
.sar 01;31 |
||||||
|
.rar 01;31 |
||||||
|
.alz 01;31 |
||||||
|
.ace 01;31 |
||||||
|
.zoo 01;31 |
||||||
|
.cpio 01;31 |
||||||
|
.7z 01;31 |
||||||
|
.rz 01;31 |
||||||
|
.cab 01;31 |
||||||
|
|
||||||
|
# image formats (magenta) |
||||||
|
.jpg 01;35 |
||||||
|
.jpeg 01;35 |
||||||
|
.gif 01;35 |
||||||
|
.bmp 01;35 |
||||||
|
.pbm 01;35 |
||||||
|
.pgm 01;35 |
||||||
|
.ppm 01;35 |
||||||
|
.tga 01;35 |
||||||
|
.xbm 01;35 |
||||||
|
.xpm 01;35 |
||||||
|
.tif 01;35 |
||||||
|
.tiff 01;35 |
||||||
|
.png 01;35 |
||||||
|
.svg 01;35 |
||||||
|
.svgz 01;35 |
||||||
|
.mng 01;35 |
||||||
|
.pcx 01;35 |
||||||
|
.mov 01;35 |
||||||
|
.mpg 01;35 |
||||||
|
.mpeg 01;35 |
||||||
|
.m2v 01;35 |
||||||
|
.mkv 01;35 |
||||||
|
.webm 01;35 |
||||||
|
.ogm 01;35 |
||||||
|
.mp4 01;35 |
||||||
|
.m4v 01;35 |
||||||
|
.mp4v 01;35 |
||||||
|
.vob 01;35 |
||||||
|
.qt 01;35 |
||||||
|
.nuv 01;35 |
||||||
|
.wmv 01;35 |
||||||
|
.asf 01;35 |
||||||
|
.rm 01;35 |
||||||
|
.rmvb 01;35 |
||||||
|
.flc 01;35 |
||||||
|
.avi 01;35 |
||||||
|
.fli 01;35 |
||||||
|
.flv 01;35 |
||||||
|
.gl 01;35 |
||||||
|
.dl 01;35 |
||||||
|
.xcf 01;35 |
||||||
|
.xwd 01;35 |
||||||
|
.yuv 01;35 |
||||||
|
.cgm 01;35 |
||||||
|
.emf 01;35 |
||||||
|
|
||||||
|
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions |
||||||
|
.axv 01;35 |
||||||
|
.anx 01;35 |
||||||
|
.ogv 01;35 |
||||||
|
.ogx 01;35 |
||||||
|
|
||||||
|
# audio formats (cyan) |
||||||
|
.aac 01;36 |
||||||
|
.au 01;36 |
||||||
|
.flac 01;36 |
||||||
|
.mid 01;36 |
||||||
|
.midi 01;36 |
||||||
|
.mka 01;36 |
||||||
|
.mp3 01;36 |
||||||
|
.mpc 01;36 |
||||||
|
.ogg 01;36 |
||||||
|
.ra 01;36 |
||||||
|
.wav 01;36 |
||||||
|
|
||||||
|
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions |
||||||
|
.axa 01;36 |
||||||
|
.oga 01;36 |
||||||
|
.spx 01;36 |
||||||
|
.xspf 01;36 |
||||||
|
|
||||||
|
# colorize binary documents (brown) |
||||||
|
#.pdf 00;33 |
||||||
|
#.ps 00;33 |
||||||
|
#.ps.gz 00;33 |
||||||
|
#.tex 00;33 |
||||||
|
#.xls 00;33 |
||||||
|
#.xlsx 00;33 |
||||||
|
#.ppt 00;33 |
||||||
|
#.pptx 00;33 |
||||||
|
#.rtf 00;33 |
||||||
|
#.doc 00;33 |
||||||
|
#.docx 00;33 |
||||||
|
#.odt 00;33 |
||||||
|
#.ods 00;33 |
||||||
|
#.odp 00;33 |
||||||
|
#.epub 00;33 |
||||||
|
#.abw 00;33 |
||||||
|
#.wpd 00;33 |
||||||
|
# |
||||||
|
# colorize text documents (brown) |
||||||
|
#.txt 00;33 |
||||||
|
#.patch 00;33 |
||||||
|
#.diff 00;33 |
||||||
|
#.log 00;33 |
||||||
|
#.htm 00;33 |
||||||
|
#.html 00;33 |
||||||
|
#.shtml 00;33 |
||||||
|
#.xml 00;33 |
@ -0,0 +1,233 @@ |
|||||||
|
# Configuration file for the 256color ls utility |
||||||
|
# This file goes in the /etc directory, and must be world readable. |
||||||
|
# Synchronized with coreutils 8.5 dircolors |
||||||
|
# You can copy this file to .dir_colors in your $HOME directory to override |
||||||
|
# the system defaults. |
||||||
|
# In the case that you are not satisfied with supplied colors, please |
||||||
|
# submit your color configuration or attach your file with colors readable |
||||||
|
# on ALL color background schemas (white,gray,black) to RedHat Bugzilla |
||||||
|
# ticket on https://bugzilla.redhat.com/show_bug.cgi?id=429121 . TIA. |
||||||
|
# Please just keep ls color conventions from 8 color scheme. |
||||||
|
|
||||||
|
# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not |
||||||
|
# pipes. 'all' adds color characters to all output. 'none' shuts colorization |
||||||
|
# off. |
||||||
|
COLOR tty |
||||||
|
|
||||||
|
# Extra command line options for ls go here. |
||||||
|
# Basically these ones are: |
||||||
|
# -F = show '/' for dirs, '*' for executables, etc. |
||||||
|
# -T 0 = don't trust tab spacing when formatting ls output. |
||||||
|
OPTIONS -F -T 0 |
||||||
|
|
||||||
|
# Below, there should be one TERM entry for each termtype that is colorizable |
||||||
|
TERM putty-256color |
||||||
|
TERM rxvt-256color |
||||||
|
TERM rxvt-unicode-256color |
||||||
|
TERM rxvt-unicode256 |
||||||
|
TERM screen-256color |
||||||
|
TERM xterm-256color |
||||||
|
TERM gnome-256color |
||||||
|
TERM st-256color |
||||||
|
|
||||||
|
# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output) |
||||||
|
EIGHTBIT 1 |
||||||
|
|
||||||
|
# Below are the color init strings for the basic file types. A color init |
||||||
|
# string consists of one or more of the following numeric codes: |
||||||
|
# Attribute codes: |
||||||
|
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed |
||||||
|
# Text color(8 colors mode) codes: |
||||||
|
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white |
||||||
|
# Background color(8 colors mode) codes: |
||||||
|
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white |
||||||
|
# Text color(256 colors mode) codes: |
||||||
|
# Valid syntax for text 256color is 38;5;<color number> , where color number |
||||||
|
# is number between 0 and 255. |
||||||
|
# You may find following command useful to search the best one for you: |
||||||
|
# for ((x=0; x<=255; x++));do echo -e "${x}:\033[38;5;${x}mcolor\033[000m";done |
||||||
|
# Background color(256 colors mode) codes: |
||||||
|
# Valid syntax for background 256color is 48;5;<color number> , where |
||||||
|
# color number is number between 0 and 255. |
||||||
|
# You may find following command useful to search the best one for you: |
||||||
|
# for ((x=0; x<=255; x++));do echo -e "${x}:\033[48;5;${x}mcolor\033[000m";done |
||||||
|
|
||||||
|
#NORMAL 00 # global default, no color code at all |
||||||
|
#FILE 00 # normal file, use no color at all |
||||||
|
RESET 0 # reset to "normal" color |
||||||
|
DIR 38;5;27 # directory |
||||||
|
LINK 38;5;51 # symbolic link (If you set this to 'target' instead of a |
||||||
|
# numerical value, the color is as for the file pointed to.) |
||||||
|
MULTIHARDLINK 44;38;5;15 # regular file with more than one link |
||||||
|
FIFO 40;38;5;11 # pipe |
||||||
|
SOCK 38;5;13 # socket |
||||||
|
DOOR 38;5;5 # door |
||||||
|
BLK 48;5;232;38;5;11 # block device driver |
||||||
|
CHR 48;5;232;38;5;3 # character device driver |
||||||
|
ORPHAN 48;5;232;38;5;9 # symlink to nonexistent file, or non-stat'able file |
||||||
|
MISSING 05;48;5;232;38;5;15 # ... and the files they point to |
||||||
|
SETUID 48;5;196;38;5;15 # file that is setuid (u+s) |
||||||
|
SETGID 48;5;11;38;5;16 # file that is setgid (g+s) |
||||||
|
CAPABILITY 48;5;196;38;5;226 # file with capability |
||||||
|
STICKY_OTHER_WRITABLE 48;5;10;38;5;16 # dir that is sticky and other-writable (+t,o+w) |
||||||
|
OTHER_WRITABLE 48;5;10;38;5;21 # dir that is other-writable (o+w) and not sticky |
||||||
|
STICKY 48;5;21;38;5;15 # dir with the sticky bit set (+t) and not other-writable |
||||||
|
|
||||||
|
# This is for files with execute permission: |
||||||
|
EXEC 38;5;34 |
||||||
|
|
||||||
|
# List any file extensions like '.gz' or '.tar' that you would like ls |
||||||
|
# to colorize below. Put the extension, a space, and the color init string. |
||||||
|
# (and any comments you want to add after a '#') |
||||||
|
# executables (bright green) |
||||||
|
#.cmd 38;5;34 |
||||||
|
#.exe 38;5;34 |
||||||
|
#.com 38;5;34 |
||||||
|
#.btm 38;5;34 |
||||||
|
#.bat 38;5;34 |
||||||
|
#.sh 38;5;34 |
||||||
|
#.csh 38;5;34 |
||||||
|
|
||||||
|
# archives or compressed (bright red) |
||||||
|
.tar 38;5;9 |
||||||
|
.tgz 38;5;9 |
||||||
|
.arc 38;5;9 |
||||||
|
.arj 38;5;9 |
||||||
|
.taz 38;5;9 |
||||||
|
.lha 38;5;9 |
||||||
|
.lz4 38;5;9 |
||||||
|
.lzh 38;5;9 |
||||||
|
.lzma 38;5;9 |
||||||
|
.tlz 38;5;9 |
||||||
|
.txz 38;5;9 |
||||||
|
.tzo 38;5;9 |
||||||
|
.t7z 38;5;9 |
||||||
|
.zip 38;5;9 |
||||||
|
.z 38;5;9 |
||||||
|
.Z 38;5;9 |
||||||
|
.dz 38;5;9 |
||||||
|
.gz 38;5;9 |
||||||
|
.lrz 38;5;9 |
||||||
|
.lz 38;5;9 |
||||||
|
.lzo 38;5;9 |
||||||
|
.xz 38;5;9 |
||||||
|
.bz2 38;5;9 |
||||||
|
.bz 38;5;9 |
||||||
|
.tbz 38;5;9 |
||||||
|
.tbz2 38;5;9 |
||||||
|
.tz 38;5;9 |
||||||
|
.deb 38;5;9 |
||||||
|
.rpm 38;5;9 |
||||||
|
.jar 38;5;9 |
||||||
|
.war 38;5;9 |
||||||
|
.ear 38;5;9 |
||||||
|
.sar 38;5;9 |
||||||
|
.rar 38;5;9 |
||||||
|
.alz 38;5;9 |
||||||
|
.ace 38;5;9 |
||||||
|
.zoo 38;5;9 |
||||||
|
.cpio 38;5;9 |
||||||
|
.7z 38;5;9 |
||||||
|
.rz 38;5;9 |
||||||
|
.cab 38;5;9 |
||||||
|
|
||||||
|
# image formats (magenta) |
||||||
|
.jpg 38;5;13 |
||||||
|
.jpeg 38;5;13 |
||||||
|
.gif 38;5;13 |
||||||
|
.bmp 38;5;13 |
||||||
|
.pbm 38;5;13 |
||||||
|
.pgm 38;5;13 |
||||||
|
.ppm 38;5;13 |
||||||
|
.tga 38;5;13 |
||||||
|
.xbm 38;5;13 |
||||||
|
.xpm 38;5;13 |
||||||
|
.tif 38;5;13 |
||||||
|
.tiff 38;5;13 |
||||||
|
.png 38;5;13 |
||||||
|
.svg 38;5;13 |
||||||
|
.svgz 38;5;13 |
||||||
|
.mng 38;5;13 |
||||||
|
.pcx 38;5;13 |
||||||
|
.mov 38;5;13 |
||||||
|
.mpg 38;5;13 |
||||||
|
.mpeg 38;5;13 |
||||||
|
.m2v 38;5;13 |
||||||
|
.mkv 38;5;13 |
||||||
|
.webm 38;5;13 |
||||||
|
.ogm 38;5;13 |
||||||
|
.mp4 38;5;13 |
||||||
|
.m4v 38;5;13 |
||||||
|
.mp4v 38;5;13 |
||||||
|
.vob 38;5;13 |
||||||
|
.qt 38;5;13 |
||||||
|
.nuv 38;5;13 |
||||||
|
.wmv 38;5;13 |
||||||
|
.asf 38;5;13 |
||||||
|
.rm 38;5;13 |
||||||
|
.rmvb 38;5;13 |
||||||
|
.flc 38;5;13 |
||||||
|
.avi 38;5;13 |
||||||
|
.fli 38;5;13 |
||||||
|
.flv 38;5;13 |
||||||
|
.gl 38;5;13 |
||||||
|
.dl 38;5;13 |
||||||
|
.xcf 38;5;13 |
||||||
|
.xwd 38;5;13 |
||||||
|
.yuv 38;5;13 |
||||||
|
.cgm 38;5;13 |
||||||
|
.emf 38;5;13 |
||||||
|
|
||||||
|
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions |
||||||
|
.axv 38;5;13 |
||||||
|
.anx 38;5;13 |
||||||
|
.ogv 38;5;13 |
||||||
|
.ogx 38;5;13 |
||||||
|
|
||||||
|
# audio formats (cyan) |
||||||
|
.aac 38;5;45 |
||||||
|
.au 38;5;45 |
||||||
|
.flac 38;5;45 |
||||||
|
.mid 38;5;45 |
||||||
|
.midi 38;5;45 |
||||||
|
.mka 38;5;45 |
||||||
|
.mp3 38;5;45 |
||||||
|
.mpc 38;5;45 |
||||||
|
.ogg 38;5;45 |
||||||
|
.ra 38;5;45 |
||||||
|
.wav 38;5;45 |
||||||
|
|
||||||
|
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions |
||||||
|
.axa 38;5;45 |
||||||
|
.oga 38;5;45 |
||||||
|
.spx 38;5;45 |
||||||
|
.xspf 38;5;45 |
||||||
|
|
||||||
|
# colorize binary documents (brown) |
||||||
|
#.pdf 00;33 |
||||||
|
#.ps 00;33 |
||||||
|
#.ps.gz 00;33 |
||||||
|
#.tex 00;33 |
||||||
|
#.xls 00;33 |
||||||
|
#.xlsx 00;33 |
||||||
|
#.ppt 00;33 |
||||||
|
#.pptx 00;33 |
||||||
|
#.rtf 00;33 |
||||||
|
#.doc 00;33 |
||||||
|
#.docx 00;33 |
||||||
|
#.odt 00;33 |
||||||
|
#.ods 00;33 |
||||||
|
#.odp 00;33 |
||||||
|
#.epub 00;33 |
||||||
|
#.abw 00;33 |
||||||
|
#.wpd 00;33 |
||||||
|
# |
||||||
|
# colorize text documents (brown) |
||||||
|
#.txt 00;33 |
||||||
|
#.patch 00;33 |
||||||
|
#.diff 00;33 |
||||||
|
#.log 00;33 |
||||||
|
#.htm 00;33 |
||||||
|
#.html 00;33 |
||||||
|
#.shtml 00;33 |
||||||
|
#.xml 00;33 |
@ -0,0 +1,236 @@ |
|||||||
|
# Configuration file for the color ls utility - modified for gray backgrounds |
||||||
|
# Synchronized with coreutils 8.5 dircolors |
||||||
|
# This file goes in the /etc directory, and must be world readable. |
||||||
|
# You can copy this file to .dir_colors in your $HOME directory to override |
||||||
|
# the system defaults. |
||||||
|
|
||||||
|
# COLOR needs one of these arguments: 'tty' colorizes output to ttys, but not |
||||||
|
# pipes. 'all' adds color characters to all output. 'none' shuts colorization |
||||||
|
# off. |
||||||
|
COLOR tty |
||||||
|
|
||||||
|
# Extra command line options for ls go here. |
||||||
|
# Basically these ones are: |
||||||
|
# -F = show '/' for dirs, '*' for executables, etc. |
||||||
|
# -T 0 = don't trust tab spacing when formatting ls output. |
||||||
|
OPTIONS -F -T 0 |
||||||
|
|
||||||
|
# Below, there should be one TERM entry for each termtype that is colorizable |
||||||
|
TERM linux |
||||||
|
TERM console |
||||||
|
TERM con132x25 |
||||||
|
TERM con132x30 |
||||||
|
TERM con132x43 |
||||||
|
TERM con132x60 |
||||||
|
TERM con80x25 |
||||||
|
TERM con80x28 |
||||||
|
TERM con80x30 |
||||||
|
TERM con80x43 |
||||||
|
TERM con80x50 |
||||||
|
TERM con80x60 |
||||||
|
TERM cons25 |
||||||
|
TERM xterm |
||||||
|
TERM xterm-16color |
||||||
|
TERM xterm-88color |
||||||
|
TERM xterm-256color |
||||||
|
TERM rxvt |
||||||
|
TERM rxvt-256color |
||||||
|
TERM rxvt-unicode |
||||||
|
TERM rxvt-unicode-256color |
||||||
|
TERM rxvt-unicode256 |
||||||
|
TERM xterm-color |
||||||
|
TERM color-xterm |
||||||
|
TERM vt100 |
||||||
|
TERM dtterm |
||||||
|
TERM color_xterm |
||||||
|
|
||||||
|
# EIGHTBIT, followed by '1' for on, '0' for off. (8-bit output) |
||||||
|
EIGHTBIT 1 |
||||||
|
|
||||||
|
# Below are the color init strings for the basic file types. A color init |
||||||
|
# string consists of one or more of the following numeric codes: |
||||||
|
# Attribute codes: |
||||||
|
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed |
||||||
|
# Text color codes: |
||||||
|
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white |
||||||
|
# Background color codes: |
||||||
|
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white |
||||||
|
#NORMAL 00 # no color code at all |
||||||
|
#FILE 00 # normal file, use no color at all |
||||||
|
RESET 0 |
||||||
|
DIR 00;34 # directory |
||||||
|
LINK 00;36 # symbolic link (If you set this to 'target' instead of a |
||||||
|
# numerical value, the color is as for the file pointed to.) |
||||||
|
MULTIHARDLINK 00 # regular file with more than one link |
||||||
|
FIFO 40;33 # pipe |
||||||
|
SOCK 00;35 # socket |
||||||
|
DOOR 00;35 # door |
||||||
|
BLK 40;33;01 # block device driver |
||||||
|
CHR 40;33;01 # character device driver |
||||||
|
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file |
||||||
|
MISSING 01;05;37;41 # ... and the files they point to |
||||||
|
SETUID 37;41 # file that is setuid (u+s) |
||||||
|
SETGID 30;43 # file that is setgid (g+s) |
||||||
|
CAPABILITY 30;41 # file with capability |
||||||
|
STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w) |
||||||
|
OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky |
||||||
|
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable |
||||||
|
|
||||||
|
|
||||||
|
# This is for files with execute permission: |
||||||
|
EXEC 00;32 |
||||||
|
|
||||||
|
# List any file extensions like '.gz' or '.tar' that you would like ls |
||||||
|
# to colorize below. Put the extension, a space, and the color init string. |
||||||
|
# (and any comments you want to add after a '#') |
||||||
|
#.cmd 00;32 # executables (green) |
||||||
|
#.exe 00;32 |
||||||
|
#.com 00;32 |
||||||
|
#.btm 00;32 |
||||||
|
#.bat 00;32 |
||||||
|
#.sh 00;32 |
||||||
|
#.csh 00;32 |
||||||
|
|
||||||
|
# archives or compressed (red) |
||||||
|
.tar 00;31 |
||||||
|
.tgz 00;31 |
||||||
|
.arc 00;31 |
||||||
|
.arj 00;31 |
||||||
|
.taz 00;31 |
||||||
|
.lha 00;31 |
||||||
|
.lz4 00;31 |
||||||
|
.lzh 00;31 |
||||||
|
.lzma 00;31 |
||||||
|
.tlz 00;31 |
||||||
|
.txz 00;31 |
||||||
|
.tzo 00;31 |
||||||
|
.t7z 00;31 |
||||||
|
.zip 00;31 |
||||||
|
.z 00;31 |
||||||
|
.Z 00;31 |
||||||
|
.dz 00;31 |
||||||
|
.gz 00;31 |
||||||
|
.lrz 00;31 |
||||||
|
.lz 00;31 |
||||||
|
.lzo 00;31 |
||||||
|
.xz 00;31 |
||||||
|
.bz2 00;31 |
||||||
|
.bz 00;31 |
||||||
|
.tbz 00;31 |
||||||
|
.tbz2 00;31 |
||||||
|
.tz 00;31 |
||||||
|
.deb 00;31 |
||||||
|
.rpm 00;31 |
||||||
|
.jar 00;31 |
||||||
|
.war 00;31 |
||||||
|
.ear 00;31 |
||||||
|
.sar 00;31 |
||||||
|
.rar 00;31 |
||||||
|
.alz 00;31 |
||||||
|
.ace 00;31 |
||||||
|
.zoo 00;31 |
||||||
|
.cpio 00;31 |
||||||
|
.7z 00;31 |
||||||
|
.rz 00;31 |
||||||
|
.cab 00;31 |
||||||
|
|
||||||
|
# image formats (magenta) |
||||||
|
.jpg 00;35 |
||||||
|
.jpeg 00;35 |
||||||
|
.gif 00;35 |
||||||
|
.bmp 00;35 |
||||||
|
.pbm 00;35 |
||||||
|
.pgm 00;35 |
||||||
|
.ppm 00;35 |
||||||
|
.tga 00;35 |
||||||
|
.xbm 00;35 |
||||||
|
.xpm 00;35 |
||||||
|
.tif 00;35 |
||||||
|
.tiff 00;35 |
||||||
|
.png 00;35 |
||||||
|
.svg 00;35 |
||||||
|
.svgz 00;35 |
||||||
|
.mng 00;35 |
||||||
|
.pcx 00;35 |
||||||
|
.mov 00;35 |
||||||
|
.mpg 00;35 |
||||||
|
.mpeg 00;35 |
||||||
|
.m2v 00;35 |
||||||
|
.mkv 00;35 |
||||||
|
.webm 00;35 |
||||||
|
.ogm 00;35 |
||||||
|
.mp4 00;35 |
||||||
|
.m4v 00;35 |
||||||
|
.mp4v 00;35 |
||||||
|
.vob 00;35 |
||||||
|
.qt 00;35 |
||||||
|
.nuv 00;35 |
||||||
|
.wmv 00;35 |
||||||
|
.asf 00;35 |
||||||
|
.rm 00;35 |
||||||
|
.rmvb 00;35 |
||||||
|
.flc 00;35 |
||||||
|
.avi 00;35 |
||||||
|
.fli 00;35 |
||||||
|
.flv 00;35 |
||||||
|
.gl 00;35 |
||||||
|
.dl 00;35 |
||||||
|
.xcf 00;35 |
||||||
|
.xwd 00;35 |
||||||
|
.yuv 00;35 |
||||||
|
.cgm 00;35 |
||||||
|
.emf 00;35 |
||||||
|
|
||||||
|
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions |
||||||
|
.axv 00;35 |
||||||
|
.anx 00;35 |
||||||
|
.ogv 00;35 |
||||||
|
.ogx 00;35 |
||||||
|
|
||||||
|
# audio formats (cyan) |
||||||
|
.aac 00;36 |
||||||
|
.au 00;36 |
||||||
|
.flac 00;36 |
||||||
|
.mid 00;36 |
||||||
|
.midi 00;36 |
||||||
|
.mka 00;36 |
||||||
|
.mp3 00;36 |
||||||
|
.mpc 00;36 |
||||||
|
.ogg 00;36 |
||||||
|
.ra 00;36 |
||||||
|
.wav 00;36 |
||||||
|
|
||||||
|
# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions |
||||||
|
.axa 00;36 |
||||||
|
.oga 00;36 |
||||||
|
.spx 00;36 |
||||||
|
.xspf 00;36 |
||||||
|
|
||||||
|
# colorize binary documents (brown) |
||||||
|
#.pdf 00;33 |
||||||
|
#.ps 00;33 |
||||||
|
#.ps.gz 00;33 |
||||||
|
#.tex 00;33 |
||||||
|
#.xls 00;33 |
||||||
|
#.xlsx 00;33 |
||||||
|
#.ppt 00;33 |
||||||
|
#.pptx 00;33 |
||||||
|
#.rtf 00;33 |
||||||
|
#.doc 00;33 |
||||||
|
#.docx 00;33 |
||||||
|
#.odt 00;33 |
||||||
|
#.ods 00;33 |
||||||
|
#.odp 00;33 |
||||||
|
#.epub 00;33 |
||||||
|
#.abw 00;33 |
||||||
|
#.wpd 00;33 |
||||||
|
# |
||||||
|
# colorize text documents (brown) |
||||||
|
#.txt 00;33 |
||||||
|
#.patch 00;33 |
||||||
|
#.diff 00;33 |
||||||
|
#.log 00;33 |
||||||
|
#.htm 00;33 |
||||||
|
#.html 00;33 |
||||||
|
#.shtml 00;33 |
||||||
|
#.xml 00;33 |
@ -0,0 +1,68 @@ |
|||||||
|
# skip everything for non-interactive shells |
||||||
|
if (! $?prompt) exit |
||||||
|
|
||||||
|
# color-ls initialization |
||||||
|
if ( $?USER_LS_COLORS ) then |
||||||
|
if ( "$USER_LS_COLORS" != "" ) then |
||||||
|
#when USER_LS_COLORS defined do not override user |
||||||
|
#specified LS_COLORS and use them |
||||||
|
goto finish |
||||||
|
endif |
||||||
|
endif |
||||||
|
|
||||||
|
alias ll 'ls -l' |
||||||
|
alias l. 'ls -d .*' |
||||||
|
set COLORS=/etc/DIR_COLORS |
||||||
|
|
||||||
|
if ($?TERM) then |
||||||
|
if ( -e "/etc/DIR_COLORS.256color" ) then |
||||||
|
if ( "`/usr/bin/tput colors`" == "256" ) then |
||||||
|
set COLORS=/etc/DIR_COLORS.256color |
||||||
|
endif |
||||||
|
endif |
||||||
|
if ( -e "/etc/DIR_COLORS.$TERM" ) then |
||||||
|
set COLORS="/etc/DIR_COLORS.$TERM" |
||||||
|
endif |
||||||
|
endif |
||||||
|
if ( -f ~/.dircolors ) set COLORS=~/.dircolors |
||||||
|
if ( -f ~/.dir_colors ) set COLORS=~/.dir_colors |
||||||
|
if ($?TERM) then |
||||||
|
if ( -f ~/.dircolors."$TERM" ) set COLORS=~/.dircolors."$TERM" |
||||||
|
if ( -f ~/.dir_colors."$TERM" ) set COLORS=~/.dir_colors."$TERM" |
||||||
|
endif |
||||||
|
set INCLUDE="`/usr/bin/cat "$COLORS" | /usr/bin/grep '^INCLUDE' | /usr/bin/cut -d ' ' -f2-`" |
||||||
|
|
||||||
|
if ( ! -e "$COLORS" ) exit |
||||||
|
|
||||||
|
set _tmp="`/usr/bin/mktemp .colorlsXXX -q --tmpdir=/tmp`" |
||||||
|
#if mktemp fails, exit when include was active, otherwise use $COLORS file |
||||||
|
if ( "$_tmp" == '' ) then |
||||||
|
if ( "$INCLUDE" == '' ) then |
||||||
|
eval "`/usr/bin/dircolors -c $COLORS`" |
||||||
|
endif |
||||||
|
goto cleanup |
||||||
|
endif |
||||||
|
|
||||||
|
if ( "$INCLUDE" != '' ) /usr/bin/cat "$INCLUDE" >> $_tmp |
||||||
|
/usr/bin/grep -v '^INCLUDE' "$COLORS" >> $_tmp |
||||||
|
|
||||||
|
eval "`/usr/bin/dircolors -c $_tmp`" |
||||||
|
|
||||||
|
/usr/bin/rm -f $_tmp |
||||||
|
|
||||||
|
if ( "$LS_COLORS" == '' ) exit |
||||||
|
cleanup: |
||||||
|
set color_none=`/usr/bin/sed -n '/^COLOR.*none/Ip' < $COLORS` |
||||||
|
if ( "$color_none" != '' ) then |
||||||
|
unset color_none |
||||||
|
exit |
||||||
|
endif |
||||||
|
unset color_none |
||||||
|
unset _tmp |
||||||
|
unset INCLUDE |
||||||
|
unset COLORS |
||||||
|
|
||||||
|
finish: |
||||||
|
alias ll 'ls -l --color=auto' |
||||||
|
alias l. 'ls -d .* --color=auto' |
||||||
|
alias ls 'ls --color=auto' |
@ -0,0 +1,57 @@ |
|||||||
|
# color-ls initialization |
||||||
|
|
||||||
|
# Skip all for noninteractive shells. |
||||||
|
[ ! -t 0 ] && return |
||||||
|
|
||||||
|
#when USER_LS_COLORS defined do not override user LS_COLORS, but use them. |
||||||
|
if [ -z "$USER_LS_COLORS" ]; then |
||||||
|
|
||||||
|
alias ll='ls -l' 2>/dev/null |
||||||
|
alias l.='ls -d .*' 2>/dev/null |
||||||
|
|
||||||
|
INCLUDE= |
||||||
|
COLORS= |
||||||
|
|
||||||
|
for colors in "$HOME/.dir_colors.$TERM" "$HOME/.dircolors.$TERM" \ |
||||||
|
"$HOME/.dir_colors" "$HOME/.dircolors"; do |
||||||
|
[ -e "$colors" ] && COLORS="$colors" && \ |
||||||
|
INCLUDE="`/usr/bin/cat "$COLORS" | /usr/bin/grep '^INCLUDE' | /usr/bin/cut -d ' ' -f2-`" && \ |
||||||
|
break |
||||||
|
done |
||||||
|
|
||||||
|
[ -z "$COLORS" ] && [ -e "/etc/DIR_COLORS.$TERM" ] && \ |
||||||
|
COLORS="/etc/DIR_COLORS.$TERM" |
||||||
|
|
||||||
|
[ -z "$COLORS" ] && [ -e "/etc/DIR_COLORS.256color" ] && \ |
||||||
|
[ "x`/usr/bin/tty -s && /usr/bin/tput colors 2>/dev/null`" = "x256" ] && \ |
||||||
|
COLORS="/etc/DIR_COLORS.256color" |
||||||
|
|
||||||
|
[ -z "$COLORS" ] && [ -e "/etc/DIR_COLORS" ] && \ |
||||||
|
COLORS="/etc/DIR_COLORS" |
||||||
|
|
||||||
|
# Existence of $COLORS already checked above. |
||||||
|
[ -n "$COLORS" ] || return |
||||||
|
|
||||||
|
if [ -e "$INCLUDE" ]; |
||||||
|
then |
||||||
|
TMP="`/usr/bin/mktemp .colorlsXXX -q --tmpdir=/tmp`" |
||||||
|
[ -z "$TMP" ] && return |
||||||
|
|
||||||
|
/usr/bin/cat "$INCLUDE" >> $TMP |
||||||
|
/usr/bin/grep -v '^INCLUDE' "$COLORS" >> $TMP |
||||||
|
|
||||||
|
eval "`/usr/bin/dircolors --sh $TMP 2>/dev/null`" |
||||||
|
/usr/bin/rm -f $TMP |
||||||
|
else |
||||||
|
eval "`/usr/bin/dircolors --sh $COLORS 2>/dev/null`" |
||||||
|
fi |
||||||
|
|
||||||
|
[ -z "$LS_COLORS" ] && return |
||||||
|
/usr/bin/grep -qi "^COLOR.*none" $COLORS >/dev/null 2>/dev/null && return |
||||||
|
fi |
||||||
|
|
||||||
|
unset TMP COLORS INCLUDE |
||||||
|
|
||||||
|
alias ll='ls -l --color=auto' 2>/dev/null |
||||||
|
alias l.='ls -d .* --color=auto' 2>/dev/null |
||||||
|
alias ls='ls --color=auto' 2>/dev/null |
@ -0,0 +1,170 @@ |
|||||||
|
diff -urNp coreutils-8.21-orig/doc/coreutils.texi coreutils-8.21/doc/coreutils.texi |
||||||
|
--- coreutils-8.21-orig/doc/coreutils.texi 2013-02-11 10:37:28.000000000 +0100 |
||||||
|
+++ coreutils-8.21/doc/coreutils.texi 2013-02-15 10:15:26.497593689 +0100 |
||||||
|
@@ -10961,6 +10961,13 @@ pseudo-file-systems, such as automounter |
||||||
|
Scale sizes by @var{size} before printing them (@pxref{Block size}). |
||||||
|
For example, @option{-BG} prints sizes in units of 1,073,741,824 bytes. |
||||||
|
|
||||||
|
+@item --direct |
||||||
|
+@opindex --direct |
||||||
|
+@cindex direct statfs for a file |
||||||
|
+Do not resolve mount point and show statistics directly for a file. It can be |
||||||
|
+especially useful for NFS mount points if there is a boundary between two |
||||||
|
+storage policies behind the mount point. |
||||||
|
+ |
||||||
|
@item --total |
||||||
|
@opindex --total |
||||||
|
@cindex grand total of disk size, usage and available space |
||||||
|
diff -urNp coreutils-8.21-orig/src/df.c coreutils-8.21/src/df.c |
||||||
|
--- coreutils-8.21-orig/src/df.c 2013-02-05 00:40:31.000000000 +0100 |
||||||
|
+++ coreutils-8.21/src/df.c 2013-02-15 10:26:41.158651782 +0100 |
||||||
|
@@ -116,6 +116,9 @@ static bool print_type; |
||||||
|
/* If true, print a grand total at the end. */ |
||||||
|
static bool print_grand_total; |
||||||
|
|
||||||
|
+/* If true, show statistics for a file instead of mount point. */ |
||||||
|
+static bool direct_statfs; |
||||||
|
+ |
||||||
|
/* Grand total data. */ |
||||||
|
static struct fs_usage grand_fsu; |
||||||
|
|
||||||
|
@@ -238,13 +241,15 @@ enum |
||||||
|
NO_SYNC_OPTION = CHAR_MAX + 1, |
||||||
|
SYNC_OPTION, |
||||||
|
TOTAL_OPTION, |
||||||
|
- OUTPUT_OPTION |
||||||
|
+ OUTPUT_OPTION, |
||||||
|
+ DIRECT_OPTION |
||||||
|
}; |
||||||
|
|
||||||
|
static struct option const long_options[] = |
||||||
|
{ |
||||||
|
{"all", no_argument, NULL, 'a'}, |
||||||
|
{"block-size", required_argument, NULL, 'B'}, |
||||||
|
+ {"direct", no_argument, NULL, DIRECT_OPTION}, |
||||||
|
{"inodes", no_argument, NULL, 'i'}, |
||||||
|
{"human-readable", no_argument, NULL, 'h'}, |
||||||
|
{"si", no_argument, NULL, 'H'}, |
||||||
|
@@ -500,7 +505,10 @@ get_header (void) |
||||||
|
for (col = 0; col < ncolumns; col++) |
||||||
|
{ |
||||||
|
char *cell = NULL; |
||||||
|
- char const *header = _(columns[col]->caption); |
||||||
|
+ char const *header = (columns[col]->field == TARGET_FIELD |
||||||
|
+ && direct_statfs)? |
||||||
|
+ _("File") : |
||||||
|
+ _(columns[col]->caption); |
||||||
|
|
||||||
|
if (columns[col]->field == SIZE_FIELD |
||||||
|
&& (header_mode == DEFAULT_MODE |
||||||
|
@@ -1150,6 +1158,19 @@ get_point (const char *point, const stru |
||||||
|
static void |
||||||
|
get_entry (char const *name, struct stat const *statp) |
||||||
|
{ |
||||||
|
+ if (direct_statfs) |
||||||
|
+ { |
||||||
|
+ char *resolved = canonicalize_file_name (name); |
||||||
|
+ if (resolved) |
||||||
|
+ { |
||||||
|
+ char *mp = find_mount_point (name, statp); |
||||||
|
+ get_dev (NULL, mp, resolved, NULL, NULL, false, false, NULL, false); |
||||||
|
+ free(mp); |
||||||
|
+ free (resolved); |
||||||
|
+ return; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ |
||||||
|
if ((S_ISBLK (statp->st_mode) || S_ISCHR (statp->st_mode)) |
||||||
|
&& get_disk (name)) |
||||||
|
return; |
||||||
|
@@ -1219,6 +1238,7 @@ or all file systems by default.\n\ |
||||||
|
-B, --block-size=SIZE scale sizes by SIZE before printing them; e.g.,\n\ |
||||||
|
'-BM' prints sizes in units of 1,048,576 bytes;\n\ |
||||||
|
see SIZE format below\n\ |
||||||
|
+ --direct show statistics for a file instead of mount point\n\ |
||||||
|
--total produce a grand total\n\ |
||||||
|
-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)\ |
||||||
|
\n\ |
||||||
|
@@ -1305,6 +1325,9 @@ main (int argc, char **argv) |
||||||
|
xstrtol_fatal (e, oi, c, long_options, optarg); |
||||||
|
} |
||||||
|
break; |
||||||
|
+ case DIRECT_OPTION: |
||||||
|
+ direct_statfs = true; |
||||||
|
+ break; |
||||||
|
case 'i': |
||||||
|
if (header_mode == OUTPUT_MODE) |
||||||
|
{ |
||||||
|
@@ -1408,6 +1431,13 @@ main (int argc, char **argv) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
+ if (direct_statfs && show_local_fs) |
||||||
|
+ { |
||||||
|
+ error (0, 0, _("options --direct and --local (-l) are mutually " |
||||||
|
+ "exclusive")); |
||||||
|
+ usage (EXIT_FAILURE); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
if (human_output_opts == -1) |
||||||
|
{ |
||||||
|
if (posix_format) |
||||||
|
diff -urNp coreutils-8.21-orig/tests/df/direct.sh coreutils-8.21/tests/df/direct.sh |
||||||
|
--- coreutils-8.21-orig/tests/df/direct.sh 1970-01-01 01:00:00.000000000 +0100 |
||||||
|
+++ coreutils-8.21/tests/df/direct.sh 2013-02-15 10:15:26.503644446 +0100 |
||||||
|
@@ -0,0 +1,55 @@ |
||||||
|
+#!/bin/sh |
||||||
|
+# Ensure "df --direct" works as documented |
||||||
|
+ |
||||||
|
+# Copyright (C) 2010 Free Software Foundation, Inc. |
||||||
|
+ |
||||||
|
+# This program is free software: you can redistribute it and/or modify |
||||||
|
+# it under the terms of the GNU General Public License as published by |
||||||
|
+# the Free Software Foundation, either version 3 of the License, or |
||||||
|
+# (at your option) any later version. |
||||||
|
+ |
||||||
|
+# This program is distributed in the hope that it will be useful, |
||||||
|
+# but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
+# GNU General Public License for more details. |
||||||
|
+ |
||||||
|
+# You should have received a copy of the GNU General Public License |
||||||
|
+# along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||||
|
+ |
||||||
|
+. "${srcdir=.}/init.sh"; path_prepend_ ../src |
||||||
|
+print_ver_ df |
||||||
|
+ |
||||||
|
+df || skip_ "df fails" |
||||||
|
+ |
||||||
|
+DIR=`pwd` || framework_failure |
||||||
|
+FILE="$DIR/file" |
||||||
|
+touch "$FILE" || framework_failure |
||||||
|
+echo "$FILE" > file_exp || framework_failure |
||||||
|
+echo "Mounted on" > header_mounted_exp || framework_failure |
||||||
|
+echo "File" > header_file_exp || framework_failure |
||||||
|
+ |
||||||
|
+fail=0 |
||||||
|
+ |
||||||
|
+df --portability "$FILE" > df_out || fail=1 |
||||||
|
+df --portability --direct "$FILE" > df_direct_out || fail=1 |
||||||
|
+df --portability --direct --local "$FILE" > /dev/null 2>&1 && fail=1 |
||||||
|
+ |
||||||
|
+# check df header |
||||||
|
+$AWK '{ if (NR==1) print $6 " " $7; }' df_out > header_mounted_out \ |
||||||
|
+ || framework_failure |
||||||
|
+$AWK '{ if (NR==1) print $6; }' df_direct_out > header_file_out \ |
||||||
|
+ || framework_failure |
||||||
|
+compare header_mounted_out header_mounted_exp || fail=1 |
||||||
|
+compare header_file_out header_file_exp || fail=1 |
||||||
|
+ |
||||||
|
+# check df output (without --direct) |
||||||
|
+$AWK '{ if (NR==2) print $6; }' df_out > file_out \ |
||||||
|
+ || framework_failure |
||||||
|
+compare file_out file_exp && fail=1 |
||||||
|
+ |
||||||
|
+# check df output (with --direct) |
||||||
|
+$AWK '{ if (NR==2) print $6; }' df_direct_out > file_out \ |
||||||
|
+ || framework_failure |
||||||
|
+compare file_out file_exp || fail=1 |
||||||
|
+ |
||||||
|
+Exit $fail |
@ -0,0 +1,86 @@ |
|||||||
|
diff --git a/lib/getugroups.c b/lib/getugroups.c |
||||||
|
index 299bae6..8ece29b 100644 |
||||||
|
--- a/lib/getugroups.c |
||||||
|
+++ b/lib/getugroups.c |
||||||
|
@@ -19,6 +19,9 @@ |
||||||
|
|
||||||
|
#include <config.h> |
||||||
|
|
||||||
|
+/* We do not need this code if getgrouplist(3) is available. */ |
||||||
|
+#ifndef HAVE_GETGROUPLIST |
||||||
|
+ |
||||||
|
#include "getugroups.h" |
||||||
|
|
||||||
|
#include <errno.h> |
||||||
|
@@ -123,3 +126,4 @@ getugroups (int maxcount, gid_t *grouplist, char const *username, |
||||||
|
} |
||||||
|
|
||||||
|
#endif /* HAVE_GRP_H */ |
||||||
|
+#endif /* have getgrouplist */ |
||||||
|
diff --git a/lib/mgetgroups.c b/lib/mgetgroups.c |
||||||
|
index 76474c2..0a9d221 100644 |
||||||
|
--- a/lib/mgetgroups.c |
||||||
|
+++ b/lib/mgetgroups.c |
||||||
|
@@ -115,9 +115,17 @@ mgetgroups (char const *username, gid_t gid, gid_t **groups) |
||||||
|
/* else no username, so fall through and use getgroups. */ |
||||||
|
#endif |
||||||
|
|
||||||
|
- max_n_groups = (username |
||||||
|
- ? getugroups (0, NULL, username, gid) |
||||||
|
- : getgroups (0, NULL)); |
||||||
|
+ if (!username) |
||||||
|
+ max_n_groups = getgroups(0, NULL); |
||||||
|
+ else |
||||||
|
+ { |
||||||
|
+#ifdef HAVE_GETGROUPLIST |
||||||
|
+ max_n_groups = 0; |
||||||
|
+ getgrouplist (username, gid, NULL, &max_n_groups); |
||||||
|
+#else |
||||||
|
+ max_n_groups = getugroups (0, NULL, username, gid); |
||||||
|
+#endif |
||||||
|
+ } |
||||||
|
|
||||||
|
/* If we failed to count groups because there is no supplemental |
||||||
|
group support, then return an array containing just GID. |
||||||
|
@@ -139,10 +147,25 @@ mgetgroups (char const *username, gid_t gid, gid_t **groups) |
||||||
|
if (g == NULL) |
||||||
|
return -1; |
||||||
|
|
||||||
|
- ng = (username |
||||||
|
- ? getugroups (max_n_groups, g, username, gid) |
||||||
|
- : getgroups (max_n_groups - (gid != (gid_t) -1), |
||||||
|
- g + (gid != (gid_t) -1))); |
||||||
|
+ if (!username) |
||||||
|
+ ng = getgroups (max_n_groups - (gid != (gid_t)-1), g + (gid != (gid_t)-1)); |
||||||
|
+ else |
||||||
|
+ { |
||||||
|
+#ifdef HAVE_GETGROUPLIST |
||||||
|
+ int e; |
||||||
|
+ ng = max_n_groups; |
||||||
|
+ while ((e = getgrouplist (username, gid, g, &ng)) == -1 |
||||||
|
+ && ng > max_n_groups) |
||||||
|
+ { |
||||||
|
+ max_n_groups = ng; |
||||||
|
+ g = xrealloc (g, max_n_groups * sizeof (GETGROUPS_T)); |
||||||
|
+ } |
||||||
|
+ if (e == -1) |
||||||
|
+ ng = -1; |
||||||
|
+#else |
||||||
|
+ ng = getugroups (max_n_groups, g, username, gid); |
||||||
|
+#endif |
||||||
|
+ } |
||||||
|
|
||||||
|
if (ng < 0) |
||||||
|
{ |
||||||
|
diff --git a/m4/jm-macros.m4 b/m4/jm-macros.m4 |
||||||
|
index 62777c7..5180243 100644 |
||||||
|
--- a/m4/jm-macros.m4 |
||||||
|
+++ b/m4/jm-macros.m4 |
||||||
|
@@ -78,6 +78,7 @@ |
||||||
|
fchown |
||||||
|
fchmod |
||||||
|
ftruncate |
||||||
|
+ getgrouplist |
||||||
|
iswspace |
||||||
|
mkfifo |
||||||
|
mbrlen |
@ -0,0 +1,83 @@ |
|||||||
|
From 493f1291993a352e47a79fa7471880289df2efc4 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Fri, 3 Feb 2017 12:26:53 +0100 |
||||||
|
Subject: [PATCH] fold: preserve new-lines in mutlibyte text (#1418505) |
||||||
|
|
||||||
|
--- |
||||||
|
src/fold.c | 55 +++++++++++++++++++++++++++---------------------------- |
||||||
|
1 file changed, 27 insertions(+), 28 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/fold.c b/src/fold.c |
||||||
|
index 51abea8..4106f24 100644 |
||||||
|
--- a/src/fold.c |
||||||
|
+++ b/src/fold.c |
||||||
|
@@ -342,39 +342,38 @@ fold_multibyte_text (FILE *istream, size_t width, int *saved_errno) |
||||||
|
} |
||||||
|
|
||||||
|
rescan: |
||||||
|
- if (operating_mode == byte_mode) /* byte mode */ |
||||||
|
+ if (convfail) |
||||||
|
+ increment = 1; |
||||||
|
+ else if (wc == L'\n') |
||||||
|
+ { |
||||||
|
+ /* preserve newline */ |
||||||
|
+ fwrite (line_out, sizeof(char), offset_out, stdout); |
||||||
|
+ START_NEW_LINE; |
||||||
|
+ continue; |
||||||
|
+ } |
||||||
|
+ else if (operating_mode == byte_mode) /* byte mode */ |
||||||
|
increment = mblength; |
||||||
|
else if (operating_mode == character_mode) /* character mode */ |
||||||
|
increment = 1; |
||||||
|
- else /* column mode */ |
||||||
|
+ else /* column mode */ |
||||||
|
{ |
||||||
|
- if (convfail) |
||||||
|
- increment = 1; |
||||||
|
- else |
||||||
|
+ switch (wc) |
||||||
|
{ |
||||||
|
- switch (wc) |
||||||
|
- { |
||||||
|
- case L'\n': |
||||||
|
- fwrite (line_out, sizeof(char), offset_out, stdout); |
||||||
|
- START_NEW_LINE; |
||||||
|
- continue; |
||||||
|
- |
||||||
|
- case L'\b': |
||||||
|
- increment = (column > 0) ? -1 : 0; |
||||||
|
- break; |
||||||
|
- |
||||||
|
- case L'\r': |
||||||
|
- increment = -1 * column; |
||||||
|
- break; |
||||||
|
- |
||||||
|
- case L'\t': |
||||||
|
- increment = 8 - column % 8; |
||||||
|
- break; |
||||||
|
- |
||||||
|
- default: |
||||||
|
- increment = wcwidth (wc); |
||||||
|
- increment = (increment < 0) ? 0 : increment; |
||||||
|
- } |
||||||
|
+ case L'\b': |
||||||
|
+ increment = (column > 0) ? -1 : 0; |
||||||
|
+ break; |
||||||
|
+ |
||||||
|
+ case L'\r': |
||||||
|
+ increment = -1 * column; |
||||||
|
+ break; |
||||||
|
+ |
||||||
|
+ case L'\t': |
||||||
|
+ increment = 8 - column % 8; |
||||||
|
+ break; |
||||||
|
+ |
||||||
|
+ default: |
||||||
|
+ increment = wcwidth (wc); |
||||||
|
+ increment = (increment < 0) ? 0 : increment; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
-- |
||||||
|
2.13.5 |
||||||
|
|
@ -0,0 +1,103 @@ |
|||||||
|
From e16ae8b0f8a16f05d5881ad282bd58b31645a34f Mon Sep 17 00:00:00 2001 |
||||||
|
From: Kamil Dudka <kdudka@redhat.com> |
||||||
|
Date: Fri, 15 Jun 2018 12:47:38 +0200 |
||||||
|
Subject: [PATCH] Resolves: #1259942 - fix memory leak in sort/I18N |
||||||
|
MIME-Version: 1.0 |
||||||
|
Content-Type: text/plain; charset=UTF-8 |
||||||
|
Content-Transfer-Encoding: 8bit |
||||||
|
|
||||||
|
Patches written by Pádraig. |
||||||
|
|
||||||
|
Note that the corresponding i18n/sort-month test was not included |
||||||
|
because it breaks unless sort is compiled -Dlint and we do not want |
||||||
|
to decrease performance of the resulting RPMs (and valgrind is not |
||||||
|
installed in production buildroots anyway). |
||||||
|
--- |
||||||
|
src/sort.c | 37 ++++++++++++++++++++++--------------- |
||||||
|
1 file changed, 22 insertions(+), 15 deletions(-) |
||||||
|
|
||||||
|
diff --git a/src/sort.c b/src/sort.c |
||||||
|
index e47b039..c04b513 100644 |
||||||
|
--- a/src/sort.c |
||||||
|
+++ b/src/sort.c |
||||||
|
@@ -2861,8 +2861,8 @@ getmonth_mb (const char *s, size_t len, char **ea) |
||||||
|
register int lo = 0, hi = MONTHS_PER_YEAR, result; |
||||||
|
char *tmp; |
||||||
|
size_t wclength, mblength; |
||||||
|
- const char **pp; |
||||||
|
- const wchar_t **wpp; |
||||||
|
+ const char *pp; |
||||||
|
+ const wchar_t *wpp; |
||||||
|
wchar_t *month_wcs; |
||||||
|
mbstate_t state; |
||||||
|
|
||||||
|
@@ -2875,17 +2875,19 @@ getmonth_mb (const char *s, size_t len, char **ea) |
||||||
|
if (len == 0) |
||||||
|
return 0; |
||||||
|
|
||||||
|
- month = (char *) xmalloc (len + 1); |
||||||
|
+ if (SIZE_MAX - len < 1) |
||||||
|
+ xalloc_die (); |
||||||
|
+ |
||||||
|
+ month = (char *) xnmalloc (len + 1, MB_CUR_MAX); |
||||||
|
|
||||||
|
- tmp = (char *) xmalloc (len + 1); |
||||||
|
+ pp = tmp = (char *) xnmalloc (len + 1, MB_CUR_MAX); |
||||||
|
memcpy (tmp, s, len); |
||||||
|
tmp[len] = '\0'; |
||||||
|
- pp = (const char **)&tmp; |
||||||
|
- month_wcs = (wchar_t *) xmalloc ((len + 1) * sizeof (wchar_t)); |
||||||
|
- memset (&state, '\0', sizeof(mbstate_t)); |
||||||
|
+ wpp = month_wcs = (wchar_t *) xnmalloc (len + 1, sizeof (wchar_t)); |
||||||
|
+ memset (&state, '\0', sizeof (mbstate_t)); |
||||||
|
|
||||||
|
- wclength = mbsrtowcs (month_wcs, pp, len + 1, &state); |
||||||
|
- if (wclength == (size_t)-1 || *pp != NULL) |
||||||
|
+ wclength = mbsrtowcs (month_wcs, &pp, len + 1, &state); |
||||||
|
+ if (wclength == (size_t)-1 || pp != NULL) |
||||||
|
error (SORT_FAILURE, 0, _("Invalid multibyte input %s."), quote(s)); |
||||||
|
|
||||||
|
for (i = 0; i < wclength; i++) |
||||||
|
@@ -2898,10 +2900,8 @@ getmonth_mb (const char *s, size_t len, char **ea) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
- wpp = (const wchar_t **)&month_wcs; |
||||||
|
- |
||||||
|
- mblength = wcsrtombs (month, wpp, len + 1, &state); |
||||||
|
- assert (mblength != (-1) && *wpp == NULL); |
||||||
|
+ mblength = wcsrtombs (month, &wpp, (len + 1) * MB_CUR_MAX, &state); |
||||||
|
+ assert (mblength != (-1) && wpp == NULL); |
||||||
|
|
||||||
|
do |
||||||
|
{ |
||||||
|
@@ -5363,10 +5363,10 @@ main (int argc, char **argv) |
||||||
|
|
||||||
|
if (nfiles == 0) |
||||||
|
{ |
||||||
|
- static char *minus = (char *) "-"; |
||||||
|
nfiles = 1; |
||||||
|
free (files); |
||||||
|
- files = − |
||||||
|
+ files = xmalloc (sizeof *files); |
||||||
|
+ *files = (char *) "-"; |
||||||
|
} |
||||||
|
|
||||||
|
/* Need to re-check that we meet the minimum requirement for memory |
||||||
|
@@ -5424,6 +5424,13 @@ main (int argc, char **argv) |
||||||
|
sort (files, nfiles, outfile, nthreads); |
||||||
|
} |
||||||
|
|
||||||
|
+#ifdef lint |
||||||
|
+ if (files_from) |
||||||
|
+ readtokens0_free (&tok); |
||||||
|
+ else |
||||||
|
+ free (files); |
||||||
|
+#endif |
||||||
|
+ |
||||||
|
if (have_read_stdin && fclose (stdin) == EOF) |
||||||
|
die (_("close failed"), "-"); |
||||||
|
|
||||||
|
-- |
||||||
|
2.14.4 |
||||||
|
|
@ -0,0 +1,11 @@ |
|||||||
|
--- coreutils-5.2.1/src/who.c.overflow 2005-05-25 09:59:06.000000000 +0100 |
||||||
|
+++ coreutils-5.2.1/src/who.c 2005-05-25 10:00:31.000000000 +0100 |
||||||
|
@@ -75,7 +75,7 @@ |
||||||
|
# define UT_TYPE_NEW_TIME(U) false |
||||||
|
#endif |
||||||
|
|
||||||
|
-#define IDLESTR_LEN 6 |
||||||
|
+#define IDLESTR_LEN 10 |
||||||
|
|
||||||
|
#if HAVE_STRUCT_XTMP_UT_PID |
||||||
|
# define PIDSTR_DECL_AND_INIT(Var, Utmp_ent) \ |
@ -0,0 +1,529 @@ |
|||||||
|
diff -urNp coreutils-8.21-orig/init.cfg coreutils-8.21/init.cfg |
||||||
|
--- coreutils-8.21-orig/init.cfg 2013-01-31 01:46:24.000000000 +0100 |
||||||
|
+++ coreutils-8.21/init.cfg 2013-02-15 14:31:58.957469955 +0100 |
||||||
|
@@ -308,8 +308,8 @@ require_selinux_() |
||||||
|
# Independent of whether SELinux is enabled system-wide, |
||||||
|
# the current file system may lack SELinux support. |
||||||
|
# Also the current build may have SELinux support disabled. |
||||||
|
- case $(ls -Zd .) in |
||||||
|
- '? .'|'unlabeled .') |
||||||
|
+ case $(ls -Zd . | cut -f4 -d" ") in |
||||||
|
+ '?'|'unlabeled') |
||||||
|
test -z "$CONFIG_HEADER" \ |
||||||
|
&& framework_failure_ 'CONFIG_HEADER not defined' |
||||||
|
grep '^#define HAVE_SELINUX_SELINUX_H 1' "$CONFIG_HEADER" > /dev/null \ |
||||||
|
diff -urNp coreutils-8.21-orig/man/chcon.x coreutils-8.21/man/chcon.x |
||||||
|
--- coreutils-8.21-orig/man/chcon.x 2011-08-23 15:44:01.000000000 +0200 |
||||||
|
+++ coreutils-8.21/man/chcon.x 2013-02-15 14:31:58.937482694 +0100 |
||||||
|
@@ -1,4 +1,4 @@ |
||||||
|
[NAME] |
||||||
|
-chcon \- change file security context |
||||||
|
+chcon \- change file SELinux security context |
||||||
|
[DESCRIPTION] |
||||||
|
.\" Add any additional description here |
||||||
|
diff -urNp coreutils-8.21-orig/man/runcon.x coreutils-8.21/man/runcon.x |
||||||
|
--- coreutils-8.21-orig/man/runcon.x 2011-08-23 15:44:01.000000000 +0200 |
||||||
|
+++ coreutils-8.21/man/runcon.x 2013-02-15 14:31:58.938486496 +0100 |
||||||
|
@@ -1,5 +1,5 @@ |
||||||
|
[NAME] |
||||||
|
-runcon \- run command with specified security context |
||||||
|
+runcon \- run command with specified SELinux security context |
||||||
|
[DESCRIPTION] |
||||||
|
Run COMMAND with completely-specified CONTEXT, or with current or |
||||||
|
transitioned security context modified by one or more of LEVEL, |
||||||
|
diff -urNp coreutils-8.21-orig/src/copy.c coreutils-8.21/src/copy.c |
||||||
|
--- coreutils-8.21-orig/src/copy.c 2013-02-07 10:37:05.000000000 +0100 |
||||||
|
+++ coreutils-8.21/src/copy.c 2013-02-15 14:31:58.941467872 +0100 |
||||||
|
@@ -2410,6 +2410,17 @@ copy_internal (char const *src_name, cha |
||||||
|
else |
||||||
|
{ |
||||||
|
omitted_permissions = 0; |
||||||
|
+ |
||||||
|
+ /* For directories, the process global context could be reset for |
||||||
|
+ descendents, so use it to set the context for existing dirs here. |
||||||
|
+ This will also give earlier indication of failure to set ctx. */ |
||||||
|
+ if (x->set_security_context || x->preserve_security_context) |
||||||
|
+ if (! set_file_security_ctx (dst_name, x->preserve_security_context, |
||||||
|
+ false, x)) |
||||||
|
+ { |
||||||
|
+ if (x->require_preserve_context) |
||||||
|
+ goto un_backup; |
||||||
|
+ } |
||||||
|
} |
||||||
|
|
||||||
|
/* Decide whether to copy the contents of the directory. */ |
||||||
|
@@ -2415,6 +2426,8 @@ copy_internal (char const *src_name, cha |
||||||
|
{ |
||||||
|
/* Here, we are crossing a file system boundary and cp's -x option |
||||||
|
is in effect: so don't copy the contents of this directory. */ |
||||||
|
+ if (x->preserve_security_context) |
||||||
|
+ restore_default_fscreatecon_or_die (); |
||||||
|
} |
||||||
|
else |
||||||
|
{ |
||||||
|
@@ -2602,7 +2613,7 @@ copy_internal (char const *src_name, cha |
||||||
|
|
||||||
|
/* With -Z or --preserve=context, set the context for existing files. |
||||||
|
Note this is done already for copy_reg() for reasons described therein. */ |
||||||
|
- if (!new_dst && !x->copy_as_regular |
||||||
|
+ if (!new_dst && !x->copy_as_regular && !S_ISDIR (src_mode) |
||||||
|
&& (x->set_security_context || x->preserve_security_context)) |
||||||
|
{ |
||||||
|
if (! set_file_security_ctx (dst_name, x->preserve_security_context, |
||||||
|
diff -urNp coreutils-8.21-orig/src/cp.c coreutils-8.21/src/cp.c |
||||||
|
--- coreutils-8.21-orig/src/cp.c 2013-02-07 10:37:05.000000000 +0100 |
||||||
|
+++ coreutils-8.21/src/cp.c 2013-02-15 14:31:58.945468929 +0100 |
||||||
|
@@ -201,6 +202,9 @@ Copy SOURCE to DEST, or multiple SOURCE( |
||||||
|
all\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (_("\ |
||||||
|
+ -c deprecated, same as --preserve=context\n\ |
||||||
|
+"), stdout); |
||||||
|
+ fputs (_("\ |
||||||
|
--no-preserve=ATTR_LIST don't preserve the specified attributes\n\ |
||||||
|
--parents use full source file name under DIRECTORY\n\ |
||||||
|
"), stdout); |
||||||
|
@@ -933,7 +939,7 @@ main (int argc, char **argv) |
||||||
|
we'll actually use backup_suffix_string. */ |
||||||
|
backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX"); |
||||||
|
|
||||||
|
- while ((c = getopt_long (argc, argv, "abdfHilLnprst:uvxPRS:TZ", |
||||||
|
+ while ((c = getopt_long (argc, argv, "abcdfHilLnprst:uvxPRS:TZ", |
||||||
|
long_opts, NULL)) |
||||||
|
!= -1) |
||||||
|
{ |
||||||
|
@@ -981,6 +987,17 @@ main (int argc, char **argv) |
||||||
|
copy_contents = true; |
||||||
|
break; |
||||||
|
|
||||||
|
+ case 'c': |
||||||
|
+ fprintf (stderr, "%s: warning: option '-c' is deprecated, please use '--preserve=context' instead\n", argv[0]); |
||||||
|
+ if ( x.set_security_context ) { |
||||||
|
+ (void) fprintf(stderr, "%s: cannot force target context and preserve it\n", argv[0]); |
||||||
|
+ exit( 1 ); |
||||||
|
+ } |
||||||
|
+ else if (selinux_enabled) { |
||||||
|
+ x.preserve_security_context = true; |
||||||
|
+ x.require_preserve_context = true; |
||||||
|
+ } |
||||||
|
+ break; |
||||||
|
case 'd': |
||||||
|
x.preserve_links = true; |
||||||
|
x.dereference = DEREF_NEVER; |
||||||
|
diff -urNp coreutils-8.21-orig/src/id.c coreutils-8.21/src/id.c |
||||||
|
--- coreutils-8.21-orig/src/id.c 2013-01-31 01:46:24.000000000 +0100 |
||||||
|
+++ coreutils-8.21/src/id.c 2013-02-15 14:31:58.946469154 +0100 |
||||||
|
@@ -106,7 +106,7 @@ int |
||||||
|
main (int argc, char **argv) |
||||||
|
{ |
||||||
|
int optc; |
||||||
|
- int selinux_enabled = (is_selinux_enabled () > 0); |
||||||
|
+ bool selinux_enabled = (is_selinux_enabled () > 0); |
||||||
|
bool smack_enabled = is_smack_enabled (); |
||||||
|
bool opt_zero = false; |
||||||
|
char *pw_name = NULL; |
||||||
|
diff -urNp coreutils-8.21-orig/src/install.c coreutils-8.21/src/install.c |
||||||
|
--- coreutils-8.21-orig/src/install.c 2013-02-07 10:37:05.000000000 +0100 |
||||||
|
+++ coreutils-8.21/src/install.c 2013-02-15 14:31:58.948469440 +0100 |
||||||
|
@@ -639,7 +640,7 @@ In the 4th form, create all components o |
||||||
|
-v, --verbose print the name of each directory as it is created\n\ |
||||||
|
"), stdout); |
||||||
|
fputs (_("\ |
||||||
|
- --preserve-context preserve SELinux security context\n\ |
||||||
|
+ -P, --preserve-context preserve SELinux security context (-P deprecated)\n\ |
||||||
|
-Z, --context[=CTX] set SELinux security context of destination file to\n\ |
||||||
|
default type, or to CTX if specified\n\ |
||||||
|
"), stdout); |
||||||
|
@@ -782,7 +783,7 @@ main (int argc, char **argv) |
||||||
|
we'll actually use backup_suffix_string. */ |
||||||
|
backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX"); |
||||||
|
|
||||||
|
- while ((optc = getopt_long (argc, argv, "bcCsDdg:m:o:pt:TvS:Z", long_options, |
||||||
|
+ while ((optc = getopt_long (argc, argv, "bcCsDdg:m:o:pPt:TvS:Z", long_options, |
||||||
|
NULL)) != -1) |
||||||
|
{ |
||||||
|
switch (optc) |
||||||
|
@@ -853,6 +854,8 @@ main (int argc, char **argv) |
||||||
|
no_target_directory = true; |
||||||
|
break; |
||||||
|
|
||||||
|
+ case 'P': |
||||||
|
+ fprintf (stderr, "%s: warning: option '-P' is deprecated, please use '--preserve-context' instead\n", argv[0]); |
||||||
|
case PRESERVE_CONTEXT_OPTION: |
||||||
|
if (! selinux_enabled) |
||||||
|
{ |
||||||
|
@@ -860,6 +862,10 @@ main (int argc, char **argv) |
||||||
|
"this kernel is not SELinux-enabled")); |
||||||
|
break; |
||||||
|
} |
||||||
|
+ if ( x.set_security_context ) { |
||||||
|
+ (void) fprintf(stderr, "%s: cannot force target context and preserve it\n", argv[0]); |
||||||
|
+ exit( 1 ); |
||||||
|
+ } |
||||||
|
x.preserve_security_context = true; |
||||||
|
use_default_selinux_context = false; |
||||||
|
break; |
||||||
|
diff -urNp coreutils-8.21-orig/src/ls.c coreutils-8.21/src/ls.c |
||||||
|
--- coreutils-8.21-orig/src/ls.c 2013-02-03 04:24:02.000000000 +0100 |
||||||
|
+++ coreutils-8.21/src/ls.c 2013-02-15 14:31:58.953469008 +0100 |
||||||
|
@@ -165,7 +165,8 @@ enum filetype |
||||||
|
symbolic_link, |
||||||
|
sock, |
||||||
|
whiteout, |
||||||
|
- arg_directory |
||||||
|
+ arg_directory, |
||||||
|
+ command_line |
||||||
|
}; |
||||||
|
|
||||||
|
/* Display letters and indicators for each filetype. |
||||||
|
@@ -281,6 +282,7 @@ static void queue_directory (char const |
||||||
|
bool command_line_arg); |
||||||
|
static void sort_files (void); |
||||||
|
static void parse_ls_color (void); |
||||||
|
+static void print_scontext_format (const struct fileinfo *f); |
||||||
|
|
||||||
|
/* Initial size of hash table. |
||||||
|
Most hierarchies are likely to be shallower than this. */ |
||||||
|
@@ -350,7 +352,7 @@ static struct pending *pending_dirs; |
||||||
|
|
||||||
|
static struct timespec current_time; |
||||||
|
|
||||||
|
-static bool print_scontext; |
||||||
|
+static int print_scontext = 0; |
||||||
|
static char UNKNOWN_SECURITY_CONTEXT[] = "?"; |
||||||
|
|
||||||
|
/* Whether any of the files has an ACL. This affects the width of the |
||||||
|
@@ -390,7 +392,9 @@ enum format |
||||||
|
one_per_line, /* -1 */ |
||||||
|
many_per_line, /* -C */ |
||||||
|
horizontal, /* -x */ |
||||||
|
- with_commas /* -m */ |
||||||
|
+ with_commas, /* -m */ |
||||||
|
+ security_format, /* -Z */ |
||||||
|
+ invalid_format |
||||||
|
}; |
||||||
|
|
||||||
|
static enum format format; |
||||||
|
@@ -793,6 +797,9 @@ enum |
||||||
|
SHOW_CONTROL_CHARS_OPTION, |
||||||
|
SI_OPTION, |
||||||
|
SORT_OPTION, |
||||||
|
+ CONTEXT_OPTION, |
||||||
|
+ LCONTEXT_OPTION, |
||||||
|
+ SCONTEXT_OPTION, |
||||||
|
TIME_OPTION, |
||||||
|
TIME_STYLE_OPTION |
||||||
|
}; |
||||||
|
@@ -839,7 +846,9 @@ static struct option const long_options[ |
||||||
|
{"time-style", required_argument, NULL, TIME_STYLE_OPTION}, |
||||||
|
{"color", optional_argument, NULL, COLOR_OPTION}, |
||||||
|
{"block-size", required_argument, NULL, BLOCK_SIZE_OPTION}, |
||||||
|
- {"context", no_argument, 0, 'Z'}, |
||||||
|
+ {"context", no_argument, 0, CONTEXT_OPTION}, |
||||||
|
+ {"lcontext", no_argument, 0, LCONTEXT_OPTION}, |
||||||
|
+ {"scontext", no_argument, 0, SCONTEXT_OPTION}, |
||||||
|
{"author", no_argument, NULL, AUTHOR_OPTION}, |
||||||
|
{GETOPT_HELP_OPTION_DECL}, |
||||||
|
{GETOPT_VERSION_OPTION_DECL}, |
||||||
|
@@ -849,12 +858,12 @@ static struct option const long_options[ |
||||||
|
static char const *const format_args[] = |
||||||
|
{ |
||||||
|
"verbose", "long", "commas", "horizontal", "across", |
||||||
|
- "vertical", "single-column", NULL |
||||||
|
+ "vertical", "single-column", "context", NULL |
||||||
|
}; |
||||||
|
static enum format const format_types[] = |
||||||
|
{ |
||||||
|
long_format, long_format, with_commas, horizontal, horizontal, |
||||||
|
- many_per_line, one_per_line |
||||||
|
+ many_per_line, one_per_line, security_format |
||||||
|
}; |
||||||
|
ARGMATCH_VERIFY (format_args, format_types); |
||||||
|
|
||||||
|
@@ -1296,7 +1305,8 @@ main (int argc, char **argv) |
||||||
|
/* Avoid following symbolic links when possible. */ |
||||||
|
if (is_colored (C_ORPHAN) |
||||||
|
|| (is_colored (C_EXEC) && color_symlink_as_referent) |
||||||
|
- || (is_colored (C_MISSING) && format == long_format)) |
||||||
|
+ || (is_colored (C_MISSING) && (format == long_format |
||||||
|
+ || format == security_format))) |
||||||
|
check_symlink_color = true; |
||||||
|
|
||||||
|
/* If the standard output is a controlling terminal, watch out |
||||||
|
@@ -1343,7 +1353,7 @@ main (int argc, char **argv) |
||||||
|
if (dereference == DEREF_UNDEFINED) |
||||||
|
dereference = ((immediate_dirs |
||||||
|
|| indicator_style == classify |
||||||
|
- || format == long_format) |
||||||
|
+ || format == long_format || format == security_format) |
||||||
|
? DEREF_NEVER |
||||||
|
: DEREF_COMMAND_LINE_SYMLINK_TO_DIR); |
||||||
|
|
||||||
|
@@ -1363,7 +1373,7 @@ main (int argc, char **argv) |
||||||
|
|
||||||
|
format_needs_stat = sort_type == sort_time || sort_type == sort_size |
||||||
|
|| format == long_format |
||||||
|
- || print_scontext |
||||||
|
+ || format == security_format || print_scontext |
||||||
|
|| print_block_size; |
||||||
|
format_needs_type = (! format_needs_stat |
||||||
|
&& (recursive |
||||||
|
@@ -1394,7 +1404,7 @@ main (int argc, char **argv) |
||||||
|
} |
||||||
|
else |
||||||
|
do |
||||||
|
- gobble_file (argv[i++], unknown, NOT_AN_INODE_NUMBER, true, ""); |
||||||
|
+ gobble_file (argv[i++], command_line, NOT_AN_INODE_NUMBER, true, ""); |
||||||
|
while (i < argc); |
||||||
|
|
||||||
|
if (cwd_n_used) |
||||||
|
@@ -1565,7 +1575,7 @@ decode_switches (int argc, char **argv) |
||||||
|
ignore_mode = IGNORE_DEFAULT; |
||||||
|
ignore_patterns = NULL; |
||||||
|
hide_patterns = NULL; |
||||||
|
- print_scontext = false; |
||||||
|
+ print_scontext = 0; |
||||||
|
|
||||||
|
/* FIXME: put this in a function. */ |
||||||
|
{ |
||||||
|
@@ -1941,13 +1951,27 @@ decode_switches (int argc, char **argv) |
||||||
|
break; |
||||||
|
|
||||||
|
case 'Z': |
||||||
|
- print_scontext = true; |
||||||
|
+ print_scontext = 1; |
||||||
|
+ format = security_format; |
||||||
|
break; |
||||||
|
|
||||||
|
case_GETOPT_HELP_CHAR; |
||||||
|
|
||||||
|
case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS); |
||||||
|
|
||||||
|
+ case CONTEXT_OPTION: /* default security context format */ |
||||||
|
+ print_scontext = 1; |
||||||
|
+ format = security_format; |
||||||
|
+ break; |
||||||
|
+ case LCONTEXT_OPTION: /* long format plus security context */ |
||||||
|
+ print_scontext = 1; |
||||||
|
+ format = long_format; |
||||||
|
+ break; |
||||||
|
+ case SCONTEXT_OPTION: /* short form of new security format */ |
||||||
|
+ print_scontext = 0; |
||||||
|
+ format = security_format; |
||||||
|
+ break; |
||||||
|
+ |
||||||
|
default: |
||||||
|
usage (LS_FAILURE); |
||||||
|
} |
||||||
|
@@ -2883,6 +2907,7 @@ gobble_file (char const *name, enum file |
||||||
|
memset (f, '\0', sizeof *f); |
||||||
|
f->stat.st_ino = inode; |
||||||
|
f->filetype = type; |
||||||
|
+ f->scontext = NULL; |
||||||
|
|
||||||
|
if (command_line_arg |
||||||
|
|| format_needs_stat |
||||||
|
@@ -2995,7 +3020,7 @@ gobble_file (char const *name, enum file |
||||||
|
&& print_with_color && is_colored (C_CAP)) |
||||||
|
f->has_capability = has_capability_cache (absolute_name, f); |
||||||
|
|
||||||
|
- if (format == long_format || print_scontext) |
||||||
|
+ if (format == long_format || format == security_format || print_scontext) |
||||||
|
{ |
||||||
|
bool have_scontext = false; |
||||||
|
bool have_acl = false; |
||||||
|
@@ -3016,7 +3041,7 @@ gobble_file (char const *name, enum file |
||||||
|
err = 0; |
||||||
|
} |
||||||
|
|
||||||
|
- if (err == 0 && format == long_format) |
||||||
|
+ if (err == 0 && (format == long_format || format == security_format)) |
||||||
|
{ |
||||||
|
int n = file_has_acl_cache (absolute_name, f); |
||||||
|
err = (n < 0); |
||||||
|
@@ -3035,7 +3060,8 @@ gobble_file (char const *name, enum file |
||||||
|
} |
||||||
|
|
||||||
|
if (S_ISLNK (f->stat.st_mode) |
||||||
|
- && (format == long_format || check_symlink_color)) |
||||||
|
+ && (format == long_format || format == security_format |
||||||
|
+ || check_symlink_color)) |
||||||
|
{ |
||||||
|
struct stat linkstats; |
||||||
|
|
||||||
|
@@ -3054,6 +3080,7 @@ gobble_file (char const *name, enum file |
||||||
|
command line are automatically traced if not being |
||||||
|
listed as files. */ |
||||||
|
if (!command_line_arg || format == long_format |
||||||
|
+ || format == security_format |
||||||
|
|| !S_ISDIR (linkstats.st_mode)) |
||||||
|
{ |
||||||
|
/* Get the linked-to file's mode for the filetype indicator |
||||||
|
@@ -3087,7 +3114,7 @@ gobble_file (char const *name, enum file |
||||||
|
block_size_width = len; |
||||||
|
} |
||||||
|
|
||||||
|
- if (format == long_format) |
||||||
|
+ if (format == long_format || format == security_format) |
||||||
|
{ |
||||||
|
if (print_owner) |
||||||
|
{ |
||||||
|
@@ -3591,6 +3618,13 @@ print_current_files (void) |
||||||
|
print_long_format (sorted_file[i]); |
||||||
|
DIRED_PUTCHAR ('\n'); |
||||||
|
} |
||||||
|
+ break; |
||||||
|
+ case security_format: |
||||||
|
+ for (i = 0; i < cwd_n_used; i++) |
||||||
|
+ { |
||||||
|
+ print_scontext_format (sorted_file[i]); |
||||||
|
+ DIRED_PUTCHAR ('\n'); |
||||||
|
+ } |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
@@ -3753,6 +3787,67 @@ format_inode (char *buf, size_t buflen, |
||||||
|
: (char *) "?"); |
||||||
|
} |
||||||
|
|
||||||
|
+/* Print info about f in scontext format */ |
||||||
|
+static void |
||||||
|
+print_scontext_format (const struct fileinfo *f) |
||||||
|
+{ |
||||||
|
+ char modebuf[12]; |
||||||
|
+ |
||||||
|
+ /* 7 fields that may require LONGEST_HUMAN_READABLE bytes, |
||||||
|
+ 1 10-byte mode string, |
||||||
|
+ 9 spaces, one following each of these fields, and |
||||||
|
+ 1 trailing NUL byte. */ |
||||||
|
+ |
||||||
|
+ char init_bigbuf[7 * LONGEST_HUMAN_READABLE + 10 + 9 + 1]; |
||||||
|
+ char *buf = init_bigbuf; |
||||||
|
+ char *p; |
||||||
|
+ |
||||||
|
+ p = buf; |
||||||
|
+ |
||||||
|
+ if ( print_scontext ) { /* zero means terse listing */ |
||||||
|
+ filemodestring (&f->stat, modebuf); |
||||||
|
+ if (! any_has_acl) |
||||||
|
+ modebuf[10] = '\0'; |
||||||
|
+ else if (f->acl_type == ACL_T_SELINUX_ONLY) |
||||||
|
+ modebuf[10] = '.'; |
||||||
|
+ else if (f->acl_type == ACL_T_YES) |
||||||
|
+ modebuf[10] = '+'; |
||||||
|
+ modebuf[11] = '\0'; |
||||||
|
+ |
||||||
|
+ /* print mode */ |
||||||
|
+ |
||||||
|
+ (void) sprintf (p, "%s ", modebuf); |
||||||
|
+ p += strlen (p); |
||||||
|
+ |
||||||
|
+ /* print standard user and group */ |
||||||
|
+ |
||||||
|
+ DIRED_FPUTS (buf, stdout, p - buf); |
||||||
|
+ format_user (f->stat.st_uid, owner_width, f->stat_ok); |
||||||
|
+ format_group (f->stat.st_gid, group_width, f->stat_ok); |
||||||
|
+ p = buf; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ (void) sprintf (p, "%-32s ", f->scontext ?: ""); |
||||||
|
+ p += strlen (p); |
||||||
|
+ |
||||||
|
+ DIRED_INDENT (); |
||||||
|
+ DIRED_FPUTS (buf, stdout, p - buf); |
||||||
|
+ size_t w = print_name_with_quoting (f, false, &dired_obstack, p - buf); |
||||||
|
+ |
||||||
|
+ if (f->filetype == symbolic_link) { |
||||||
|
+ if (f->linkname) { |
||||||
|
+ DIRED_FPUTS_LITERAL (" -> ", stdout); |
||||||
|
+ print_name_with_quoting (f, true, NULL, (p - buf) + w + 4); |
||||||
|
+ if (indicator_style != none) |
||||||
|
+ print_type_indicator (f->stat_ok, f->linkmode, f->filetype); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ else { |
||||||
|
+ if (indicator_style != none) |
||||||
|
+ print_type_indicator (f->stat_ok, f->stat.st_mode, f->filetype); |
||||||
|
+ } |
||||||
|
+} |
||||||
|
+ |
||||||
|
/* Print information about F in long format. */ |
||||||
|
static void |
||||||
|
print_long_format (const struct fileinfo *f) |
||||||
|
@@ -3844,9 +3939,15 @@ print_long_format (const struct fileinfo |
||||||
|
The latter is wrong when nlink_width is zero. */ |
||||||
|
p += strlen (p); |
||||||
|
|
||||||
|
+ if (print_scontext) |
||||||
|
+ { |
||||||
|
+ sprintf (p, "%-32s ", f->scontext ? f->scontext : ""); |
||||||
|
+ p += strlen (p); |
||||||
|
+ } |
||||||
|
+ |
||||||
|
DIRED_INDENT (); |
||||||
|
|
||||||
|
- if (print_owner || print_group || print_author || print_scontext) |
||||||
|
+ if (print_owner || print_group || print_author) |
||||||
|
{ |
||||||
|
DIRED_FPUTS (buf, stdout, p - buf); |
||||||
|
|
||||||
|
@@ -3859,9 +3960,6 @@ print_long_format (const struct fileinfo |
||||||
|
if (print_author) |
||||||
|
format_user (f->stat.st_author, author_width, f->stat_ok); |
||||||
|
|
||||||
|
- if (print_scontext) |
||||||
|
- format_user_or_group (f->scontext, 0, scontext_width); |
||||||
|
- |
||||||
|
p = buf; |
||||||
|
} |
||||||
|
|
||||||
|
@@ -4207,9 +4305,6 @@ print_file_name_and_frills (const struct |
||||||
|
: human_readable (ST_NBLOCKS (f->stat), buf, human_output_opts, |
||||||
|
ST_NBLOCKSIZE, output_block_size)); |
||||||
|
|
||||||
|
- if (print_scontext) |
||||||
|
- printf ("%*s ", format == with_commas ? 0 : scontext_width, f->scontext); |
||||||
|
- |
||||||
|
size_t width = print_name_with_quoting (f, false, NULL, start_col); |
||||||
|
|
||||||
|
if (indicator_style != none) |
||||||
|
@@ -4417,9 +4512,6 @@ length_of_file_name_and_frills (const st |
||||||
|
output_block_size)) |
||||||
|
: block_size_width); |
||||||
|
|
||||||
|
- if (print_scontext) |
||||||
|
- len += 1 + (format == with_commas ? strlen (f->scontext) : scontext_width); |
||||||
|
- |
||||||
|
quote_name (NULL, f->name, filename_quoting_options, &name_width); |
||||||
|
len += name_width; |
||||||
|
|
||||||
|
@@ -4856,9 +4948,16 @@ Sort entries alphabetically if none of - |
||||||
|
-w, --width=COLS assume screen width instead of current value\n\ |
||||||
|
-x list entries by lines instead of by columns\n\ |
||||||
|
-X sort alphabetically by entry extension\n\ |
||||||
|
- -Z, --context print any SELinux security context of each file\n\ |
||||||
|
-1 list one file per line\n\ |
||||||
|
"), stdout); |
||||||
|
+ fputs(_("\nSELinux options:\n\n\ |
||||||
|
+ --lcontext Display security context. Enable -l. Lines\n\ |
||||||
|
+ will probably be too wide for most displays.\n\ |
||||||
|
+ -Z, --context Display security context so it fits on most\n\ |
||||||
|
+ displays. Displays only mode, user, group,\n\ |
||||||
|
+ security context and file name.\n\ |
||||||
|
+ --scontext Display only security context and file name.\n\ |
||||||
|
+"), stdout); |
||||||
|
fputs (HELP_OPTION_DESCRIPTION, stdout); |
||||||
|
fputs (VERSION_OPTION_DESCRIPTION, stdout); |
||||||
|
emit_size_note (); |
||||||
|
diff -urNp coreutils-8.21-orig/tests/misc/selinux.sh coreutils-8.21/tests/misc/selinux.sh |
||||||
|
--- coreutils-8.21-orig/tests/misc/selinux.sh 2013-01-31 01:46:24.000000000 +0100 |
||||||
|
+++ coreutils-8.21/tests/misc/selinux.sh 2013-02-15 14:31:58.957469955 +0100 |
||||||
|
@@ -37,7 +37,7 @@ chcon $ctx f d p || |
||||||
|
|
||||||
|
# inspect that context with both ls -Z and stat. |
||||||
|
for i in d f p; do |
||||||
|
- c=$(ls -dogZ $i|cut -d' ' -f3); test x$c = x$ctx || fail=1 |
||||||
|
+ c=$(ls -dogZ $i|cut -d' ' -f4); test x$c = x$ctx || fail=1 |
||||||
|
c=$(stat --printf %C $i); test x$c = x$ctx || fail=1 |
||||||
|
done |
||||||
|
|
@ -0,0 +1,53 @@ |
|||||||
|
diff -urNp coreutils-6.10-orig/doc/coreutils.texi coreutils-6.10/doc/coreutils.texi |
||||||
|
--- coreutils-6.10-orig/doc/coreutils.texi 2008-04-07 17:52:11.000000000 +0200 |
||||||
|
+++ coreutils-6.10/doc/coreutils.texi 2008-04-07 18:01:43.000000000 +0200 |
||||||
|
@@ -6981,6 +6981,11 @@ for i; do |
||||||
|
exit $fail |
||||||
|
@end example |
||||||
|
|
||||||
|
+@item -c |
||||||
|
+@cindex SELinux security context information, preserving |
||||||
|
+Preserve SELinux security context of the original files if possible. |
||||||
|
+Some file systems don't support storing of SELinux security context. |
||||||
|
+ |
||||||
|
@item --copy-contents |
||||||
|
@cindex directories, copying recursively |
||||||
|
@cindex copying directories recursively |
||||||
|
diff -urNp coreutils-8.22-orig/doc/coreutils.texi coreutils-8.22/doc/coreutils.texi |
||||||
|
--- coreutils-8.22-orig/doc/coreutils.texi 2015-06-12 14:16:22.672832509 +0200 |
||||||
|
+++ coreutils-8.22/doc/coreutils.texi 2015-06-12 14:43:02.646303224 +0200 |
||||||
|
@@ -7311,13 +7311,32 @@ it also affects the HP-UX @command{ls} p |
||||||
|
|
||||||
|
@item -Z |
||||||
|
@itemx --context |
||||||
|
+@itemx --scontext |
||||||
|
+@itemx --lcontext |
||||||
|
+@itemx --format=context |
||||||
|
@opindex -Z |
||||||
|
@opindex --context |
||||||
|
+@opindex --format=security |
||||||
|
+@opindex --scontext |
||||||
|
+@opindex --lcontext |
||||||
|
@cindex SELinux |
||||||
|
@cindex security context |
||||||
|
Display the SELinux security context or @samp{?} if none is found. |
||||||
|
-When used with the @option{-l} option, print the security context |
||||||
|
-to the left of the size column. |
||||||
|
+@option{-Z} counts as format option and enables displaying of SELinux |
||||||
|
+context. |
||||||
|
+@option{--scontext} prints SELinux context left to the file name. |
||||||
|
+@option{--lcontext} prints long format with SELinux context in the middle. |
||||||
|
+@option{--context} prints permissions, user/group, context and file name (in comparison to @option{--lcontext}, omits size, modification time and number of hardlinks). |
||||||
|
+ |
||||||
|
+Note: When multiple format options are used in @command{ls}, |
||||||
|
+the last one is used. Therefore @samp{ls -lZ} (security format |
||||||
|
+is last - same as @samp{ls --context}) differs from @samp{ls -Zl} |
||||||
|
+(long format with selinux context is shown, same as @samp{ls --lcontext}) |
||||||
|
+ |
||||||
|
+Do not rely on @option{--scontext} and @option{--lcontext} |
||||||
|
+options in your scripts. They will be removed in next major |
||||||
|
+version of Red Hat Enterprise Linux. @option{--context} behaviour |
||||||
|
+will change (just enabling displaying SELinux context). |
||||||
|
|
||||||
|
@end table |
||||||
|
|
@ -0,0 +1,12 @@ |
|||||||
|
diff -urNp coreutils-5.97-orig/man/date.x coreutils-5.97/man/date.x |
||||||
|
--- coreutils-5.97-orig/man/date.x 1999-11-02 15:07:36.000000000 +0100 |
||||||
|
+++ coreutils-5.97/man/date.x 2008-10-15 10:13:31.000000000 +0200 |
||||||
|
@@ -11,3 +11,8 @@ |
||||||
|
relative date, and numbers. An empty string indicates the beginning |
||||||
|
of the day. The date string format is more complex than is easily |
||||||
|
documented here but is fully described in the info documentation. |
||||||
|
+[ENVIRONMENT] |
||||||
|
+.TP |
||||||
|
+TZ |
||||||
|
+Specifies the timezone, unless overridden by command line parameters. |
||||||
|
+If neither is specified, the setting from /etc/localtime is used. |
Loading…
Reference in new issue