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