basebuilder_pel7x64builder0
6 years ago
44 changed files with 13251 additions and 0 deletions
@ -0,0 +1,18 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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