Compare commits
84 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f674e5fc9c |
||
|
|
eb04a0fe33 |
||
|
|
0615d97b81 |
||
|
|
0095d94d91 |
||
|
|
20976b8be8 |
||
|
|
c493f607ab | ||
|
|
c3c18147bd |
||
|
|
e454479c5c |
||
|
|
a0b27bcd5f |
||
|
|
386bf34c2e |
||
|
|
fdfe50c891 |
||
|
|
f0604fd61a |
||
|
|
ec87f84093 |
||
|
|
c71c8701f4 | ||
|
|
e847b805f8 | ||
|
|
ddff633d0f | ||
|
|
a6d9263e25 | ||
|
|
8080f5a15a |
||
|
|
968cac099d |
||
|
|
e3b928358b |
||
|
|
d3137f0cd0 |
||
|
|
a09814d13c | ||
|
|
6cd5ce1d7e |
||
|
|
e02261a471 |
||
|
|
7c8ffed470 | ||
|
|
ba7b19b5bf | ||
|
|
1421739c0c |
||
|
|
56dd448b26 |
||
|
|
a91df5db11 |
||
|
|
245be9f408 |
||
|
|
f6a44b3f1f | ||
|
|
fd8859df68 | ||
|
|
bf7dfdb2ce |
||
|
|
b851cbdafc |
||
|
|
bf0817f5a5 |
||
|
|
21acecbf27 | ||
|
|
6e05a62913 | ||
|
|
3040113a7a | ||
|
|
1c60283cdf | ||
|
|
f33a14f44f | ||
|
|
6bd7dce39d |
||
|
|
cce55f8f56 | ||
|
|
24c306d28d | ||
|
|
2c4d4b8151 | ||
|
|
43d181cda7 | ||
|
|
f8035e385d | ||
|
|
ea41467a56 | ||
|
|
9d850274b1 | ||
|
|
ad57d2b8e8 | ||
|
|
31230267ea | ||
|
|
cd953e11dd | ||
|
|
23b297bf58 | ||
|
|
f3c6ff7e2c | ||
|
|
4dcaf08c8b | ||
|
|
26b2c3ae54 | ||
|
|
e0f6afe5e6 | ||
|
|
2158b83433 | ||
|
|
f672fec436 | ||
|
|
cc30dec8eb | ||
|
|
9325dbbef7 | ||
|
|
1f19874524 | ||
|
|
c25beef1ca | ||
|
|
d00a2dffe1 | ||
|
|
dddf06a3e5 | ||
|
|
a39a95cf1a | ||
|
|
97967f71c8 | ||
|
|
59649f0733 | ||
|
|
4a2b84513e | ||
|
|
baf6440388 | ||
|
|
67dacdf0ad | ||
|
|
b55ae3bd16 | ||
|
|
37018cae6e | ||
|
|
9482c160b7 | ||
|
|
1250da8dfb | ||
|
|
c05b5f83e5 | ||
|
|
a0cb772e6f | ||
|
|
d21fd8df0d | ||
|
|
9666248b72 | ||
|
|
18d8c0abc1 | ||
|
|
ce3b866d19 | ||
|
|
3a336cf37e | ||
|
|
56555a47f2 | ||
|
|
e4decc2688 | ||
|
|
e680748e28 |
48 changed files with 3073 additions and 6605 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1 +1,2 @@
|
||||||
/coreutils-[0-9.]*.tar.xz
|
/coreutils-[0-9.]*.tar.xz
|
||||||
|
/coreutils-[0-9.]*.tar.xz.sig
|
||||||
|
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
diff --git a/src/date.c b/src/date.c
|
|
||||||
index ddb011e..619a72b 100644
|
|
||||||
--- a/src/date.c
|
|
||||||
+++ b/src/date.c
|
|
||||||
@@ -490,14 +490,7 @@ main (int argc, char **argv)
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,49 +0,0 @@
|
||||||
diff --git a/src/uname.c b/src/uname.c
|
|
||||||
index 6371ca2..1ad8fd7 100644
|
|
||||||
--- a/src/uname.c
|
|
||||||
+++ b/src/uname.c
|
|
||||||
@@ -300,13 +300,19 @@ 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];
|
|
||||||
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)
|
|
||||||
@@ -344,7 +350,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];
|
|
||||||
@@ -352,6 +358,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)
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
From 81e25c8521937ecf7f444bab11fddaaf81cc3efd Mon Sep 17 00:00:00 2001
|
From bca11e30e8a6281a8cbddc9fb196dd86ab09c955 Mon Sep 17 00:00:00 2001
|
||||||
From: Kamil Dudka <kdudka@redhat.com>
|
From: Kamil Dudka <kdudka@redhat.com>
|
||||||
Date: Fri, 17 Jun 2016 16:58:18 +0200
|
Date: Fri, 17 Jun 2016 16:58:18 +0200
|
||||||
Subject: [PATCH] downstream changes to default DIR_COLORS
|
Subject: [PATCH] downstream changes to default DIR_COLORS
|
||||||
|
|
@ -9,61 +9,61 @@ Subject: [PATCH] downstream changes to default DIR_COLORS
|
||||||
2 files changed, 23 insertions(+), 7 deletions(-)
|
2 files changed, 23 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
diff --git a/DIR_COLORS b/DIR_COLORS
|
diff --git a/DIR_COLORS b/DIR_COLORS
|
||||||
index bd5df23..84f2417 100644
|
index 540f6cd..b4785b6 100644
|
||||||
--- a/DIR_COLORS
|
--- a/DIR_COLORS
|
||||||
+++ b/DIR_COLORS
|
+++ b/DIR_COLORS
|
||||||
@@ -1,3 +1,7 @@
|
@@ -1,3 +1,7 @@
|
||||||
+# This file goes in the /etc directory, and must be world readable.
|
+# 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
|
+# You can override the system defaults by making a copy of this file
|
||||||
+# the system defaults.
|
+# as ~/.dir_colors
|
||||||
+
|
+
|
||||||
# Configuration file for dircolors, a utility to help you set the
|
# Configuration file for dircolors, a utility to help you set the
|
||||||
# LS_COLORS environment variable used by GNU ls with the --color option.
|
# LS_COLORS environment variable used by GNU ls with the --color option.
|
||||||
|
|
||||||
@@ -8,6 +12,9 @@
|
@@ -11,6 +15,9 @@
|
||||||
# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
|
|
||||||
# slackware version of dircolors) are recognized but ignored.
|
# Global config options can be specified before TERM or COLORTERM entries
|
||||||
|
|
||||||
+# For compatibility, the pattern "^COLOR.*none" is recognized as a way to
|
+# For compatibility, the pattern "^COLOR.*none" is recognized as a way to
|
||||||
+# disable colorization. See https://bugzilla.redhat.com/1349579 for details.
|
+# disable colorization. See https://bugzilla.redhat.com/1349579 for details.
|
||||||
+
|
+
|
||||||
# Below are TERM entries, which can be a glob patterns, to match
|
# ===================================================================
|
||||||
# against the TERM environment variable to determine if it is colorizable.
|
# Terminal filters
|
||||||
TERM Eterm
|
# ===================================================================
|
||||||
@@ -58,7 +65,7 @@ DOOR 01;35 # door
|
@@ -70,7 +77,7 @@ DOOR 01;35 # door
|
||||||
BLK 40;33;01 # block device driver
|
BLK 40;33;01 # block device driver
|
||||||
CHR 40;33;01 # character device driver
|
CHR 40;33;01 # character device driver
|
||||||
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ...
|
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ...
|
||||||
-MISSING 00 # ... and the files they point to
|
-MISSING 00 # ... and the files they point to
|
||||||
+MISSING 01;37;41 # ... and the files they point to
|
+MISSING 01;37;41 # ... and the files they point to
|
||||||
SETUID 37;41 # file that is setuid (u+s)
|
SETUID 37;41 # regular file that is setuid (u+s)
|
||||||
SETGID 30;43 # file that is setgid (g+s)
|
SETGID 30;43 # regular file that is setgid (g+s)
|
||||||
CAPABILITY 30;41 # file with capability
|
CAPABILITY 00 # regular file with capability (very expensive to lookup)
|
||||||
diff --git a/DIR_COLORS.lightbgcolor b/DIR_COLORS.lightbgcolor
|
diff --git a/DIR_COLORS.lightbgcolor b/DIR_COLORS.lightbgcolor
|
||||||
index 4316832..6402854 100644
|
index e3b0ec3..39a0a4c 100644
|
||||||
--- a/DIR_COLORS.lightbgcolor
|
--- a/DIR_COLORS.lightbgcolor
|
||||||
+++ b/DIR_COLORS.lightbgcolor
|
+++ b/DIR_COLORS.lightbgcolor
|
||||||
@@ -1,3 +1,9 @@
|
@@ -1,3 +1,9 @@
|
||||||
+# Configuration file for the color ls utility - modified for lighter backgrounds
|
+# Configuration file for the color ls utility - modified for lighter backgrounds
|
||||||
+
|
+
|
||||||
+# This file goes in the /etc directory, and must be world readable.
|
+# 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
|
+# You can override the system defaults by making a copy of this file
|
||||||
+# the system defaults.
|
+# as ~/.dir_colors
|
||||||
+
|
+
|
||||||
# Configuration file for dircolors, a utility to help you set the
|
# Configuration file for dircolors, a utility to help you set the
|
||||||
# LS_COLORS environment variable used by GNU ls with the --color option.
|
# LS_COLORS environment variable used by GNU ls with the --color option.
|
||||||
|
|
||||||
@@ -8,6 +14,9 @@
|
@@ -11,6 +17,9 @@
|
||||||
# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the
|
|
||||||
# slackware version of dircolors) are recognized but ignored.
|
# Global config options can be specified before TERM or COLORTERM entries
|
||||||
|
|
||||||
+# For compatibility, the pattern "^COLOR.*none" is recognized as a way to
|
+# For compatibility, the pattern "^COLOR.*none" is recognized as a way to
|
||||||
+# disable colorization. See https://bugzilla.redhat.com/1349579 for details.
|
+# disable colorization. See https://bugzilla.redhat.com/1349579 for details.
|
||||||
+
|
+
|
||||||
# Below are TERM entries, which can be a glob patterns, to match
|
# ===================================================================
|
||||||
# against the TERM environment variable to determine if it is colorizable.
|
# Terminal filters
|
||||||
TERM Eterm
|
# ===================================================================
|
||||||
@@ -48,17 +57,17 @@ TERM xterm*
|
@@ -60,17 +69,17 @@ TERM xterm*
|
||||||
#NORMAL 00 # no color code at all
|
#NORMAL 00 # no color code at all
|
||||||
#FILE 00 # regular file: use no color at all
|
#FILE 00 # regular file: use no color at all
|
||||||
RESET 0 # reset to "normal" color
|
RESET 0 # reset to "normal" color
|
||||||
|
|
@ -83,18 +83,18 @@ index 4316832..6402854 100644
|
||||||
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ...
|
ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file ...
|
||||||
-MISSING 00 # ... and the files they point to
|
-MISSING 00 # ... and the files they point to
|
||||||
+MISSING 01;37;41 # ... and the files they point to
|
+MISSING 01;37;41 # ... and the files they point to
|
||||||
SETUID 37;41 # file that is setuid (u+s)
|
SETUID 37;41 # regular file that is setuid (u+s)
|
||||||
SETGID 30;43 # file that is setgid (g+s)
|
SETGID 30;43 # regular file that is setgid (g+s)
|
||||||
CAPABILITY 30;41 # file with capability
|
CAPABILITY 00 # regular file with capability (very expensive to lookup)
|
||||||
@@ -67,7 +76,7 @@ OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
|
@@ -79,7 +88,7 @@ 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
|
STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable
|
||||||
|
|
||||||
# This is for files with execute permission:
|
# This is for regular files with execute permission:
|
||||||
-EXEC 01;32
|
-EXEC 01;32
|
||||||
+EXEC 00;32
|
+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.
|
# File extension attributes
|
||||||
--
|
--
|
||||||
2.21.1
|
2.49.0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
||||||
From 51b9a8ba0974d262e0b0f81a2078b3c7907b25ed Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Wed, 7 Apr 2021 17:29:59 -0700
|
|
||||||
Subject: [PATCH] utimens: fix confusing arg type in internal func
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Although the old code was technically correct, this was accidental
|
|
||||||
and it understandably confused Coverity. Reported by Ondrej Dubaj in:
|
|
||||||
https://lists.gnu.org/r/bug-tar/2021-04/msg00000.html
|
|
||||||
* lib/utimens.c (update_timespec): Change arg type from ‘struct
|
|
||||||
timespec *[2]’ (pointer to array of 2 pointers to timespecs) to
|
|
||||||
‘struct timespec **’ (pointer to pointer to the first timespec in
|
|
||||||
an array of 2 timespecs). Although the old code happened to be
|
|
||||||
technically correct, it was misleading and confused Coverity.
|
|
||||||
And though the type ‘struct timespec (**)[2]’ (pointer to pointer
|
|
||||||
to array of 2 timespecs) would perhaps be more technically
|
|
||||||
correct, it would be almost as confusing and would require changes
|
|
||||||
elsewhere in this file; let’s quit while we’re ahead.
|
|
||||||
|
|
||||||
Upstream-commit: a3a946f670718d0dee5a7425ad5ac0a29fb46ea1
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
lib/utimens.c | 6 +++---
|
|
||||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/utimens.c b/lib/utimens.c
|
|
||||||
index 3f53942..ea8c672 100644
|
|
||||||
--- a/lib/utimens.c
|
|
||||||
+++ b/lib/utimens.c
|
|
||||||
@@ -123,14 +123,14 @@ validate_timespec (struct timespec timespec[2])
|
|
||||||
return result + (utime_omit_count == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
-/* Normalize any UTIME_NOW or UTIME_OMIT values in *TS, using stat
|
|
||||||
- buffer STATBUF to obtain the current timestamps of the file. If
|
|
||||||
+/* Normalize any UTIME_NOW or UTIME_OMIT values in (*TS)[0] and (*TS)[1],
|
|
||||||
+ using STATBUF to obtain the current timestamps of the file. If
|
|
||||||
both times are UTIME_NOW, set *TS to NULL (as this can avoid some
|
|
||||||
permissions issues). If both times are UTIME_OMIT, return true
|
|
||||||
(nothing further beyond the prior collection of STATBUF is
|
|
||||||
necessary); otherwise return false. */
|
|
||||||
static bool
|
|
||||||
-update_timespec (struct stat const *statbuf, struct timespec *ts[2])
|
|
||||||
+update_timespec (struct stat const *statbuf, struct timespec **ts)
|
|
||||||
{
|
|
||||||
struct timespec *timespec = *ts;
|
|
||||||
if (timespec[0].tv_nsec == UTIME_OMIT
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
@ -1,978 +0,0 @@
|
||||||
From 5f2dac18054d9d9b3d84e7fba8c2a6e750d2c245 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
|
||||||
Date: Wed, 1 Apr 2020 12:51:34 +0100
|
|
||||||
Subject: [PATCH 1/6] cp: ensure --attributes-only doesn't remove files
|
|
||||||
|
|
||||||
* src/copy.c (copy_internal): Ensure we don't unlink the destination
|
|
||||||
unless explicitly requested.
|
|
||||||
* tests/cp/attr-existing.sh: Add test cases.
|
|
||||||
* NEWS: Mention the bug fix.
|
|
||||||
Fixes https://bugs.gnu.org/40352
|
|
||||||
|
|
||||||
Upstream-commit: 7b5f0fa47cd04c84975250d5b5da7c98e097e99f
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/copy.c | 9 +++++----
|
|
||||||
tests/cp/attr-existing.sh | 21 ++++++++++++++++++---
|
|
||||||
2 files changed, 23 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/copy.c b/src/copy.c
|
|
||||||
index 6e5efc7..54601ce 100644
|
|
||||||
--- a/src/copy.c
|
|
||||||
+++ b/src/copy.c
|
|
||||||
@@ -2211,10 +2211,11 @@ copy_internal (char const *src_name, char const *dst_name,
|
|
||||||
/* Never unlink dst_name when in move mode. */
|
|
||||||
&& ! x->move_mode
|
|
||||||
&& (x->unlink_dest_before_opening
|
|
||||||
- || (x->preserve_links && 1 < dst_sb.st_nlink)
|
|
||||||
- || (x->dereference == DEREF_NEVER
|
|
||||||
- && ! S_ISREG (src_sb.st_mode))
|
|
||||||
- ))
|
|
||||||
+ || (x->data_copy_required
|
|
||||||
+ && ((x->preserve_links && 1 < dst_sb.st_nlink)
|
|
||||||
+ || (x->dereference == DEREF_NEVER
|
|
||||||
+ && ! S_ISREG (src_sb.st_mode))))
|
|
||||||
+ ))
|
|
||||||
{
|
|
||||||
if (unlink (dst_name) != 0 && errno != ENOENT)
|
|
||||||
{
|
|
||||||
diff --git a/tests/cp/attr-existing.sh b/tests/cp/attr-existing.sh
|
|
||||||
index 59ce641..14fc844 100755
|
|
||||||
--- a/tests/cp/attr-existing.sh
|
|
||||||
+++ b/tests/cp/attr-existing.sh
|
|
||||||
@@ -19,11 +19,26 @@
|
|
||||||
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
||||||
print_ver_ cp
|
|
||||||
|
|
||||||
-printf '1' > file1
|
|
||||||
-printf '2' > file2
|
|
||||||
-printf '2' > file2.exp
|
|
||||||
+printf '1' > file1 || framework_failure_
|
|
||||||
+printf '2' > file2 || framework_failure_
|
|
||||||
+printf '2' > file2.exp || framework_failure_
|
|
||||||
|
|
||||||
cp --attributes-only file1 file2 || fail=1
|
|
||||||
cmp file2 file2.exp || fail=1
|
|
||||||
|
|
||||||
+# coreutils v8.32 and before would remove destination files
|
|
||||||
+# if hardlinked or the source was not a regular file.
|
|
||||||
+ln file2 link2 || framework_failure_
|
|
||||||
+cp -a --attributes-only file1 file2 || fail=1
|
|
||||||
+cmp file2 file2.exp || fail=1
|
|
||||||
+
|
|
||||||
+ln -s file1 sym1 || framework_failure_
|
|
||||||
+returns_ 1 cp -a --attributes-only sym1 file2 || fail=1
|
|
||||||
+cmp file2 file2.exp || fail=1
|
|
||||||
+
|
|
||||||
+# One can still force removal though
|
|
||||||
+cp -a --remove-destination --attributes-only sym1 file2 || fail=1
|
|
||||||
+test -L file2 || fail=1
|
|
||||||
+cmp file1 file2 || fail=1
|
|
||||||
+
|
|
||||||
Exit $fail
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
||||||
From c728747b06e71894c96d1f27434f2484af992c75 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Tue, 23 Jun 2020 19:18:04 -0700
|
|
||||||
Subject: [PATCH 2/6] cp: refactor extent_copy
|
|
||||||
|
|
||||||
* src/copy.c (extent_copy): New arg SCAN, replacing
|
|
||||||
REQUIRE_NORMAL_COPY. All callers changed.
|
|
||||||
(enum scantype): New type.
|
|
||||||
(infer_scantype): Rename from is_probably_sparse and return
|
|
||||||
the new type. Add args FD and SCAN. All callers changed.
|
|
||||||
|
|
||||||
Upstream-commit: 761ba28400a04ee24eefe9cd4973ec8850cd7a52
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/copy.c | 119 +++++++++++++++++++++++++----------------------------
|
|
||||||
1 file changed, 55 insertions(+), 64 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/copy.c b/src/copy.c
|
|
||||||
index 54601ce..f694f91 100644
|
|
||||||
--- a/src/copy.c
|
|
||||||
+++ b/src/copy.c
|
|
||||||
@@ -422,9 +422,8 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
|
|
||||||
size_t hole_size, off_t src_total_size,
|
|
||||||
enum Sparse_type sparse_mode,
|
|
||||||
char const *src_name, char const *dst_name,
|
|
||||||
- bool *require_normal_copy)
|
|
||||||
+ struct extent_scan *scan)
|
|
||||||
{
|
|
||||||
- struct extent_scan scan;
|
|
||||||
off_t last_ext_start = 0;
|
|
||||||
off_t last_ext_len = 0;
|
|
||||||
|
|
||||||
@@ -432,45 +431,25 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
|
|
||||||
We may need this at the end, for a final ftruncate. */
|
|
||||||
off_t dest_pos = 0;
|
|
||||||
|
|
||||||
- extent_scan_init (src_fd, &scan);
|
|
||||||
-
|
|
||||||
- *require_normal_copy = false;
|
|
||||||
bool wrote_hole_at_eof = true;
|
|
||||||
- do
|
|
||||||
+ while (true)
|
|
||||||
{
|
|
||||||
- bool ok = extent_scan_read (&scan);
|
|
||||||
- if (! ok)
|
|
||||||
- {
|
|
||||||
- if (scan.hit_final_extent)
|
|
||||||
- break;
|
|
||||||
-
|
|
||||||
- if (scan.initial_scan_failed)
|
|
||||||
- {
|
|
||||||
- *require_normal_copy = true;
|
|
||||||
- return false;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- error (0, errno, _("%s: failed to get extents info"),
|
|
||||||
- quotef (src_name));
|
|
||||||
- return false;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
bool empty_extent = false;
|
|
||||||
- for (unsigned int i = 0; i < scan.ei_count || empty_extent; i++)
|
|
||||||
+ for (unsigned int i = 0; i < scan->ei_count || empty_extent; i++)
|
|
||||||
{
|
|
||||||
off_t ext_start;
|
|
||||||
off_t ext_len;
|
|
||||||
off_t ext_hole_size;
|
|
||||||
|
|
||||||
- if (i < scan.ei_count)
|
|
||||||
+ if (i < scan->ei_count)
|
|
||||||
{
|
|
||||||
- ext_start = scan.ext_info[i].ext_logical;
|
|
||||||
- ext_len = scan.ext_info[i].ext_length;
|
|
||||||
+ ext_start = scan->ext_info[i].ext_logical;
|
|
||||||
+ ext_len = scan->ext_info[i].ext_length;
|
|
||||||
}
|
|
||||||
else /* empty extent at EOF. */
|
|
||||||
{
|
|
||||||
i--;
|
|
||||||
- ext_start = last_ext_start + scan.ext_info[i].ext_length;
|
|
||||||
+ ext_start = last_ext_start + scan->ext_info[i].ext_length;
|
|
||||||
ext_len = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -498,7 +477,7 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
|
|
||||||
{
|
|
||||||
error (0, errno, _("cannot lseek %s"), quoteaf (src_name));
|
|
||||||
fail:
|
|
||||||
- extent_scan_free (&scan);
|
|
||||||
+ extent_scan_free (scan);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -539,7 +518,7 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
|
|
||||||
/* For now, do not treat FIEMAP_EXTENT_UNWRITTEN specially,
|
|
||||||
because that (in combination with no sync) would lead to data
|
|
||||||
loss at least on XFS and ext4 when using 2.6.39-rc3 kernels. */
|
|
||||||
- if (0 && (scan.ext_info[i].ext_flags & FIEMAP_EXTENT_UNWRITTEN))
|
|
||||||
+ if (0 && (scan->ext_info[i].ext_flags & FIEMAP_EXTENT_UNWRITTEN))
|
|
||||||
{
|
|
||||||
empty_extent = true;
|
|
||||||
last_ext_len = 0;
|
|
||||||
@@ -571,16 +550,23 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
|
|
||||||
extents beyond the apparent size. */
|
|
||||||
if (dest_pos == src_total_size)
|
|
||||||
{
|
|
||||||
- scan.hit_final_extent = true;
|
|
||||||
+ scan->hit_final_extent = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release the space allocated to scan->ext_info. */
|
|
||||||
- extent_scan_free (&scan);
|
|
||||||
+ extent_scan_free (scan);
|
|
||||||
|
|
||||||
+ if (scan->hit_final_extent)
|
|
||||||
+ break;
|
|
||||||
+ if (! extent_scan_read (scan) && ! scan->hit_final_extent)
|
|
||||||
+ {
|
|
||||||
+ error (0, errno, _("%s: failed to get extents info"),
|
|
||||||
+ quotef (src_name));
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
- while (! scan.hit_final_extent);
|
|
||||||
|
|
||||||
/* When the source file ends with a hole, we have to do a little more work,
|
|
||||||
since the above copied only up to and including the final extent.
|
|
||||||
@@ -1021,16 +1007,35 @@ fchmod_or_lchmod (int desc, char const *name, mode_t mode)
|
|
||||||
# define HAVE_STRUCT_STAT_ST_BLOCKS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
+/* Type of scan being done on the input when looking for sparseness. */
|
|
||||||
+enum scantype
|
|
||||||
+ {
|
|
||||||
+ /* No fancy scanning; just read and write. */
|
|
||||||
+ PLAIN_SCANTYPE,
|
|
||||||
+
|
|
||||||
+ /* Read and examine data looking for zero blocks; useful when
|
|
||||||
+ attempting to create sparse output. */
|
|
||||||
+ ZERO_SCANTYPE,
|
|
||||||
+
|
|
||||||
+ /* Extent information is available. */
|
|
||||||
+ EXTENT_SCANTYPE
|
|
||||||
+ };
|
|
||||||
+
|
|
||||||
/* Use a heuristic to determine whether stat buffer SB comes from a file
|
|
||||||
with sparse blocks. If the file has fewer blocks than would normally
|
|
||||||
be needed for a file of its size, then at least one of the blocks in
|
|
||||||
the file is a hole. In that case, return true. */
|
|
||||||
-static bool
|
|
||||||
-is_probably_sparse (struct stat const *sb)
|
|
||||||
+static enum scantype
|
|
||||||
+infer_scantype (int fd, struct stat const *sb, struct extent_scan *scan)
|
|
||||||
{
|
|
||||||
- return (HAVE_STRUCT_STAT_ST_BLOCKS
|
|
||||||
- && S_ISREG (sb->st_mode)
|
|
||||||
- && ST_NBLOCKS (*sb) < sb->st_size / ST_NBLOCKSIZE);
|
|
||||||
+ if (! (HAVE_STRUCT_STAT_ST_BLOCKS
|
|
||||||
+ && S_ISREG (sb->st_mode)
|
|
||||||
+ && ST_NBLOCKS (*sb) < sb->st_size / ST_NBLOCKSIZE))
|
|
||||||
+ return PLAIN_SCANTYPE;
|
|
||||||
+
|
|
||||||
+ extent_scan_init (fd, scan);
|
|
||||||
+ extent_scan_read (scan);
|
|
||||||
+ return scan->initial_scan_failed ? ZERO_SCANTYPE : EXTENT_SCANTYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1061,6 +1066,7 @@ copy_reg (char const *src_name, char const *dst_name,
|
|
||||||
mode_t src_mode = src_sb->st_mode;
|
|
||||||
struct stat sb;
|
|
||||||
struct stat src_open_sb;
|
|
||||||
+ struct extent_scan scan;
|
|
||||||
bool return_val = true;
|
|
||||||
bool data_copy_required = x->data_copy_required;
|
|
||||||
|
|
||||||
@@ -1260,23 +1266,13 @@ copy_reg (char const *src_name, char const *dst_name,
|
|
||||||
fdadvise (source_desc, 0, 0, FADVISE_SEQUENTIAL);
|
|
||||||
|
|
||||||
/* Deal with sparse files. */
|
|
||||||
- bool make_holes = false;
|
|
||||||
- bool sparse_src = is_probably_sparse (&src_open_sb);
|
|
||||||
-
|
|
||||||
- if (S_ISREG (sb.st_mode))
|
|
||||||
- {
|
|
||||||
- /* Even with --sparse=always, try to create holes only
|
|
||||||
- if the destination is a regular file. */
|
|
||||||
- if (x->sparse_mode == SPARSE_ALWAYS)
|
|
||||||
- make_holes = true;
|
|
||||||
-
|
|
||||||
- /* Use a heuristic to determine whether SRC_NAME contains any sparse
|
|
||||||
- blocks. If the file has fewer blocks than would normally be
|
|
||||||
- needed for a file of its size, then at least one of the blocks in
|
|
||||||
- the file is a hole. */
|
|
||||||
- if (x->sparse_mode == SPARSE_AUTO && sparse_src)
|
|
||||||
- make_holes = true;
|
|
||||||
- }
|
|
||||||
+ enum scantype scantype = infer_scantype (source_desc, &src_open_sb,
|
|
||||||
+ &scan);
|
|
||||||
+ bool make_holes
|
|
||||||
+ = (S_ISREG (sb.st_mode)
|
|
||||||
+ && (x->sparse_mode == SPARSE_ALWAYS
|
|
||||||
+ || (x->sparse_mode == SPARSE_AUTO
|
|
||||||
+ && scantype != PLAIN_SCANTYPE)));
|
|
||||||
|
|
||||||
/* If not making a sparse file, try to use a more-efficient
|
|
||||||
buffer size. */
|
|
||||||
@@ -1305,10 +1301,8 @@ copy_reg (char const *src_name, char const *dst_name,
|
|
||||||
buf_alloc = xmalloc (buf_size + buf_alignment);
|
|
||||||
buf = ptr_align (buf_alloc, buf_alignment);
|
|
||||||
|
|
||||||
- if (sparse_src)
|
|
||||||
+ if (scantype == EXTENT_SCANTYPE)
|
|
||||||
{
|
|
||||||
- bool normal_copy_required;
|
|
||||||
-
|
|
||||||
/* Perform an efficient extent-based copy, falling back to the
|
|
||||||
standard copy only if the initial extent scan fails. If the
|
|
||||||
'--sparse=never' option is specified, write all data but use
|
|
||||||
@@ -1316,14 +1310,11 @@ copy_reg (char const *src_name, char const *dst_name,
|
|
||||||
if (extent_copy (source_desc, dest_desc, buf, buf_size, hole_size,
|
|
||||||
src_open_sb.st_size,
|
|
||||||
make_holes ? x->sparse_mode : SPARSE_NEVER,
|
|
||||||
- src_name, dst_name, &normal_copy_required))
|
|
||||||
+ src_name, dst_name, &scan))
|
|
||||||
goto preserve_metadata;
|
|
||||||
|
|
||||||
- if (! normal_copy_required)
|
|
||||||
- {
|
|
||||||
- return_val = false;
|
|
||||||
- goto close_src_and_dst_desc;
|
|
||||||
- }
|
|
||||||
+ return_val = false;
|
|
||||||
+ goto close_src_and_dst_desc;
|
|
||||||
}
|
|
||||||
|
|
||||||
off_t n_read;
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
||||||
From ed7ff81de507bef46991f4caac550f41ab65e3ed Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Wed, 24 Jun 2020 17:05:20 -0700
|
|
||||||
Subject: [PATCH 3/6] cp: avoid copy_reg goto
|
|
||||||
|
|
||||||
* src/copy.c (copy_reg): Redo to avoid label and goto.
|
|
||||||
|
|
||||||
Upstream-commit: 2fcd0f3328f5181a2986905fa5469a0152c67279
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/copy.c | 34 +++++++++++-----------------------
|
|
||||||
1 file changed, 11 insertions(+), 23 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/copy.c b/src/copy.c
|
|
||||||
index f694f91..b382cfa 100644
|
|
||||||
--- a/src/copy.c
|
|
||||||
+++ b/src/copy.c
|
|
||||||
@@ -1301,29 +1301,18 @@ copy_reg (char const *src_name, char const *dst_name,
|
|
||||||
buf_alloc = xmalloc (buf_size + buf_alignment);
|
|
||||||
buf = ptr_align (buf_alloc, buf_alignment);
|
|
||||||
|
|
||||||
- if (scantype == EXTENT_SCANTYPE)
|
|
||||||
- {
|
|
||||||
- /* Perform an efficient extent-based copy, falling back to the
|
|
||||||
- standard copy only if the initial extent scan fails. If the
|
|
||||||
- '--sparse=never' option is specified, write all data but use
|
|
||||||
- any extents to read more efficiently. */
|
|
||||||
- if (extent_copy (source_desc, dest_desc, buf, buf_size, hole_size,
|
|
||||||
- src_open_sb.st_size,
|
|
||||||
- make_holes ? x->sparse_mode : SPARSE_NEVER,
|
|
||||||
- src_name, dst_name, &scan))
|
|
||||||
- goto preserve_metadata;
|
|
||||||
-
|
|
||||||
- return_val = false;
|
|
||||||
- goto close_src_and_dst_desc;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
off_t n_read;
|
|
||||||
- bool wrote_hole_at_eof;
|
|
||||||
- if (! sparse_copy (source_desc, dest_desc, buf, buf_size,
|
|
||||||
- make_holes ? hole_size : 0,
|
|
||||||
- x->sparse_mode == SPARSE_ALWAYS, src_name, dst_name,
|
|
||||||
- UINTMAX_MAX, &n_read,
|
|
||||||
- &wrote_hole_at_eof))
|
|
||||||
+ bool wrote_hole_at_eof = false;
|
|
||||||
+ if (! (scantype == EXTENT_SCANTYPE
|
|
||||||
+ ? extent_copy (source_desc, dest_desc, buf, buf_size, hole_size,
|
|
||||||
+ src_open_sb.st_size,
|
|
||||||
+ make_holes ? x->sparse_mode : SPARSE_NEVER,
|
|
||||||
+ src_name, dst_name, &scan)
|
|
||||||
+ : sparse_copy (source_desc, dest_desc, buf, buf_size,
|
|
||||||
+ make_holes ? hole_size : 0,
|
|
||||||
+ x->sparse_mode == SPARSE_ALWAYS,
|
|
||||||
+ src_name, dst_name, UINTMAX_MAX, &n_read,
|
|
||||||
+ &wrote_hole_at_eof)))
|
|
||||||
{
|
|
||||||
return_val = false;
|
|
||||||
goto close_src_and_dst_desc;
|
|
||||||
@@ -1336,7 +1325,6 @@ copy_reg (char const *src_name, char const *dst_name,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
-preserve_metadata:
|
|
||||||
if (x->preserve_timestamps)
|
|
||||||
{
|
|
||||||
struct timespec timespec[2];
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
||||||
From 5631bded3a385ca0bbd77456b50767fe5580240c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Thu, 25 Jun 2020 16:31:44 -0700
|
|
||||||
Subject: [PATCH 4/6] cp: use SEEK_DATA/SEEK_HOLE if available
|
|
||||||
|
|
||||||
If it works, prefer lseek with SEEK_DATA and SEEK_HOLE to FIEMAP,
|
|
||||||
as lseek is simpler and more portable (will be in next POSIX).
|
|
||||||
Problem reported in 2011 by Jeff Liu (Bug#8061).
|
|
||||||
* NEWS: Mention this.
|
|
||||||
* src/copy.c (lseek_copy) [SEEK_HOLE]: New function.
|
|
||||||
(enum scantype): New constants ERROR_SCANTYPE, LSEEK_SCANTYPE.
|
|
||||||
(union scan_inference): New type.
|
|
||||||
(infer_scantype): Last arg is now union scan_inference *,
|
|
||||||
not struct extent_scan *. All callers changed.
|
|
||||||
Prefer SEEK_HOLE to FIEMAP if both work, since
|
|
||||||
SEEK_HOLE is simpler and more portable.
|
|
||||||
(copy_reg): Do the fdadvise after initial scan, in case the scan
|
|
||||||
fails. Report an error if the initial scan fails.
|
|
||||||
(copy_reg) [SEEK_HOLE]: Use lseek_copy if scantype says so.
|
|
||||||
|
|
||||||
Upstream-commit: a6eaee501f6ec0c152abe88640203a64c390993e
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/copy.c | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++---
|
|
||||||
1 file changed, 198 insertions(+), 11 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/copy.c b/src/copy.c
|
|
||||||
index b382cfa..d88f8cf 100644
|
|
||||||
--- a/src/copy.c
|
|
||||||
+++ b/src/copy.c
|
|
||||||
@@ -416,7 +416,12 @@ write_zeros (int fd, off_t n_bytes)
|
|
||||||
Upon a successful copy, return true. If the initial extent scan
|
|
||||||
fails, set *NORMAL_COPY_REQUIRED to true and return false.
|
|
||||||
Upon any other failure, set *NORMAL_COPY_REQUIRED to false and
|
|
||||||
- return false. */
|
|
||||||
+ return false.
|
|
||||||
+
|
|
||||||
+ FIXME: Once we no longer need to support Linux kernel versions
|
|
||||||
+ before 3.1 (2011), this function can be retired as it is superseded
|
|
||||||
+ by lseek_copy. That is, we no longer need extent-scan.h and can
|
|
||||||
+ remove any of the code that uses it. */
|
|
||||||
static bool
|
|
||||||
extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
|
|
||||||
size_t hole_size, off_t src_total_size,
|
|
||||||
@@ -595,6 +600,150 @@ extent_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
+#ifdef SEEK_HOLE
|
|
||||||
+/* Perform an efficient extent copy, if possible. This avoids
|
|
||||||
+ the overhead of detecting holes in hole-introducing/preserving
|
|
||||||
+ copy, and thus makes copying sparse files much more efficient.
|
|
||||||
+ Copy from SRC_FD to DEST_FD, using BUF (of size BUF_SIZE) for a buffer.
|
|
||||||
+ Look for holes of size HOLE_SIZE in the input.
|
|
||||||
+ The input file is of size SRC_TOTAL_SIZE.
|
|
||||||
+ Use SPARSE_MODE to determine whether to create holes in the output.
|
|
||||||
+ SRC_NAME and DST_NAME are the input and output file names.
|
|
||||||
+ Return true if successful, false (with a diagnostic) otherwise. */
|
|
||||||
+
|
|
||||||
+static bool
|
|
||||||
+lseek_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
|
|
||||||
+ size_t hole_size, off_t ext_start, off_t src_total_size,
|
|
||||||
+ enum Sparse_type sparse_mode,
|
|
||||||
+ char const *src_name, char const *dst_name)
|
|
||||||
+{
|
|
||||||
+ off_t last_ext_start = 0;
|
|
||||||
+ off_t last_ext_len = 0;
|
|
||||||
+ off_t dest_pos = 0;
|
|
||||||
+ bool wrote_hole_at_eof = true;
|
|
||||||
+
|
|
||||||
+ while (0 <= ext_start)
|
|
||||||
+ {
|
|
||||||
+ off_t ext_end = lseek (src_fd, ext_start, SEEK_HOLE);
|
|
||||||
+ if (ext_end < 0)
|
|
||||||
+ {
|
|
||||||
+ if (errno != ENXIO)
|
|
||||||
+ goto cannot_lseek;
|
|
||||||
+ ext_end = src_total_size;
|
|
||||||
+ if (ext_end <= ext_start)
|
|
||||||
+ {
|
|
||||||
+ /* The input file grew; get its current size. */
|
|
||||||
+ src_total_size = lseek (src_fd, 0, SEEK_END);
|
|
||||||
+ if (src_total_size < 0)
|
|
||||||
+ goto cannot_lseek;
|
|
||||||
+
|
|
||||||
+ /* If the input file shrank after growing, stop copying. */
|
|
||||||
+ if (src_total_size <= ext_start)
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ ext_end = src_total_size;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ /* If the input file must have grown, increase its measured size. */
|
|
||||||
+ if (src_total_size < ext_end)
|
|
||||||
+ src_total_size = ext_end;
|
|
||||||
+
|
|
||||||
+ if (lseek (src_fd, ext_start, SEEK_SET) < 0)
|
|
||||||
+ goto cannot_lseek;
|
|
||||||
+
|
|
||||||
+ wrote_hole_at_eof = false;
|
|
||||||
+ off_t ext_hole_size = ext_start - last_ext_start - last_ext_len;
|
|
||||||
+
|
|
||||||
+ if (ext_hole_size)
|
|
||||||
+ {
|
|
||||||
+ if (sparse_mode != SPARSE_NEVER)
|
|
||||||
+ {
|
|
||||||
+ if (! create_hole (dest_fd, dst_name,
|
|
||||||
+ sparse_mode == SPARSE_ALWAYS,
|
|
||||||
+ ext_hole_size))
|
|
||||||
+ return false;
|
|
||||||
+ wrote_hole_at_eof = true;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ /* When not inducing holes and when there is a hole between
|
|
||||||
+ the end of the previous extent and the beginning of the
|
|
||||||
+ current one, write zeros to the destination file. */
|
|
||||||
+ if (! write_zeros (dest_fd, ext_hole_size))
|
|
||||||
+ {
|
|
||||||
+ error (0, errno, _("%s: write failed"),
|
|
||||||
+ quotef (dst_name));
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ off_t ext_len = ext_end - ext_start;
|
|
||||||
+ last_ext_start = ext_start;
|
|
||||||
+ last_ext_len = ext_len;
|
|
||||||
+
|
|
||||||
+ /* Copy this extent, looking for further opportunities to not
|
|
||||||
+ bother to write zeros unless --sparse=never, since SEEK_HOLE
|
|
||||||
+ is conservative and may miss some holes. */
|
|
||||||
+ off_t n_read;
|
|
||||||
+ bool read_hole;
|
|
||||||
+ if ( ! sparse_copy (src_fd, dest_fd, buf, buf_size,
|
|
||||||
+ sparse_mode == SPARSE_NEVER ? 0 : hole_size,
|
|
||||||
+ true, src_name, dst_name, ext_len, &n_read,
|
|
||||||
+ &read_hole))
|
|
||||||
+ return false;
|
|
||||||
+
|
|
||||||
+ dest_pos = ext_start + n_read;
|
|
||||||
+ if (n_read)
|
|
||||||
+ wrote_hole_at_eof = read_hole;
|
|
||||||
+ if (n_read < ext_len)
|
|
||||||
+ {
|
|
||||||
+ /* The input file shrank. */
|
|
||||||
+ src_total_size = dest_pos;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ext_start = lseek (src_fd, dest_pos, SEEK_DATA);
|
|
||||||
+ if (ext_start < 0)
|
|
||||||
+ {
|
|
||||||
+ if (errno != ENXIO)
|
|
||||||
+ goto cannot_lseek;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* When the source file ends with a hole, we have to do a little more work,
|
|
||||||
+ since the above copied only up to and including the final extent.
|
|
||||||
+ In order to complete the copy, we may have to insert a hole or write
|
|
||||||
+ zeros in the destination corresponding to the source file's hole-at-EOF.
|
|
||||||
+
|
|
||||||
+ In addition, if the final extent was a block of zeros at EOF and we've
|
|
||||||
+ just converted them to a hole in the destination, we must call ftruncate
|
|
||||||
+ here in order to record the proper length in the destination. */
|
|
||||||
+ if ((dest_pos < src_total_size || wrote_hole_at_eof)
|
|
||||||
+ && ! (sparse_mode == SPARSE_NEVER
|
|
||||||
+ ? write_zeros (dest_fd, src_total_size - dest_pos)
|
|
||||||
+ : ftruncate (dest_fd, src_total_size) == 0))
|
|
||||||
+ {
|
|
||||||
+ error (0, errno, _("failed to extend %s"), quoteaf (dst_name));
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (sparse_mode == SPARSE_ALWAYS && dest_pos < src_total_size
|
|
||||||
+ && punch_hole (dest_fd, dest_pos, src_total_size - dest_pos) < 0)
|
|
||||||
+ {
|
|
||||||
+ error (0, errno, _("error deallocating %s"), quoteaf (dst_name));
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return true;
|
|
||||||
+
|
|
||||||
+ cannot_lseek:
|
|
||||||
+ error (0, errno, _("cannot lseek %s"), quoteaf (src_name));
|
|
||||||
+ return false;
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
/* FIXME: describe */
|
|
||||||
/* FIXME: rewrite this to use a hash table so we avoid the quadratic
|
|
||||||
performance hit that's probably noticeable only on trees deeper
|
|
||||||
@@ -1010,6 +1159,9 @@ fchmod_or_lchmod (int desc, char const *name, mode_t mode)
|
|
||||||
/* Type of scan being done on the input when looking for sparseness. */
|
|
||||||
enum scantype
|
|
||||||
{
|
|
||||||
+ /* An error was found when determining scantype. */
|
|
||||||
+ ERROR_SCANTYPE,
|
|
||||||
+
|
|
||||||
/* No fancy scanning; just read and write. */
|
|
||||||
PLAIN_SCANTYPE,
|
|
||||||
|
|
||||||
@@ -1017,22 +1169,44 @@ enum scantype
|
|
||||||
attempting to create sparse output. */
|
|
||||||
ZERO_SCANTYPE,
|
|
||||||
|
|
||||||
+ /* lseek information is available. */
|
|
||||||
+ LSEEK_SCANTYPE,
|
|
||||||
+
|
|
||||||
/* Extent information is available. */
|
|
||||||
EXTENT_SCANTYPE
|
|
||||||
};
|
|
||||||
|
|
||||||
-/* Use a heuristic to determine whether stat buffer SB comes from a file
|
|
||||||
- with sparse blocks. If the file has fewer blocks than would normally
|
|
||||||
- be needed for a file of its size, then at least one of the blocks in
|
|
||||||
- the file is a hole. In that case, return true. */
|
|
||||||
+/* Result of infer_scantype. */
|
|
||||||
+union scan_inference
|
|
||||||
+{
|
|
||||||
+ /* Used if infer_scantype returns LSEEK_SCANTYPE. This is the
|
|
||||||
+ offset of the first data block, or -1 if the file has no data. */
|
|
||||||
+ off_t ext_start;
|
|
||||||
+
|
|
||||||
+ /* Used if infer_scantype returns EXTENT_SCANTYPE. */
|
|
||||||
+ struct extent_scan extent_scan;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/* Return how to scan a file with descriptor FD and stat buffer SB.
|
|
||||||
+ Store any information gathered into *SCAN. */
|
|
||||||
static enum scantype
|
|
||||||
-infer_scantype (int fd, struct stat const *sb, struct extent_scan *scan)
|
|
||||||
+infer_scantype (int fd, struct stat const *sb,
|
|
||||||
+ union scan_inference *scan_inference)
|
|
||||||
{
|
|
||||||
if (! (HAVE_STRUCT_STAT_ST_BLOCKS
|
|
||||||
&& S_ISREG (sb->st_mode)
|
|
||||||
&& ST_NBLOCKS (*sb) < sb->st_size / ST_NBLOCKSIZE))
|
|
||||||
return PLAIN_SCANTYPE;
|
|
||||||
|
|
||||||
+#ifdef SEEK_HOLE
|
|
||||||
+ scan_inference->ext_start = lseek (fd, 0, SEEK_DATA);
|
|
||||||
+ if (0 <= scan_inference->ext_start)
|
|
||||||
+ return LSEEK_SCANTYPE;
|
|
||||||
+ else if (errno != EINVAL && errno != ENOTSUP)
|
|
||||||
+ return errno == ENXIO ? LSEEK_SCANTYPE : ERROR_SCANTYPE;
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+ struct extent_scan *scan = &scan_inference->extent_scan;
|
|
||||||
extent_scan_init (fd, scan);
|
|
||||||
extent_scan_read (scan);
|
|
||||||
return scan->initial_scan_failed ? ZERO_SCANTYPE : EXTENT_SCANTYPE;
|
|
||||||
@@ -1066,7 +1240,7 @@ copy_reg (char const *src_name, char const *dst_name,
|
|
||||||
mode_t src_mode = src_sb->st_mode;
|
|
||||||
struct stat sb;
|
|
||||||
struct stat src_open_sb;
|
|
||||||
- struct extent_scan scan;
|
|
||||||
+ union scan_inference scan_inference;
|
|
||||||
bool return_val = true;
|
|
||||||
bool data_copy_required = x->data_copy_required;
|
|
||||||
|
|
||||||
@@ -1263,17 +1437,23 @@ copy_reg (char const *src_name, char const *dst_name,
|
|
||||||
size_t buf_size = io_blksize (sb);
|
|
||||||
size_t hole_size = ST_BLKSIZE (sb);
|
|
||||||
|
|
||||||
- fdadvise (source_desc, 0, 0, FADVISE_SEQUENTIAL);
|
|
||||||
-
|
|
||||||
/* Deal with sparse files. */
|
|
||||||
enum scantype scantype = infer_scantype (source_desc, &src_open_sb,
|
|
||||||
- &scan);
|
|
||||||
+ &scan_inference);
|
|
||||||
+ if (scantype == ERROR_SCANTYPE)
|
|
||||||
+ {
|
|
||||||
+ error (0, errno, _("cannot lseek %s"), quoteaf (src_name));
|
|
||||||
+ return_val = false;
|
|
||||||
+ goto close_src_and_dst_desc;
|
|
||||||
+ }
|
|
||||||
bool make_holes
|
|
||||||
= (S_ISREG (sb.st_mode)
|
|
||||||
&& (x->sparse_mode == SPARSE_ALWAYS
|
|
||||||
|| (x->sparse_mode == SPARSE_AUTO
|
|
||||||
&& scantype != PLAIN_SCANTYPE)));
|
|
||||||
|
|
||||||
+ fdadvise (source_desc, 0, 0, FADVISE_SEQUENTIAL);
|
|
||||||
+
|
|
||||||
/* If not making a sparse file, try to use a more-efficient
|
|
||||||
buffer size. */
|
|
||||||
if (! make_holes)
|
|
||||||
@@ -1307,7 +1487,14 @@ copy_reg (char const *src_name, char const *dst_name,
|
|
||||||
? extent_copy (source_desc, dest_desc, buf, buf_size, hole_size,
|
|
||||||
src_open_sb.st_size,
|
|
||||||
make_holes ? x->sparse_mode : SPARSE_NEVER,
|
|
||||||
- src_name, dst_name, &scan)
|
|
||||||
+ src_name, dst_name, &scan_inference.extent_scan)
|
|
||||||
+#ifdef SEEK_HOLE
|
|
||||||
+ : scantype == LSEEK_SCANTYPE
|
|
||||||
+ ? lseek_copy (source_desc, dest_desc, buf, buf_size, hole_size,
|
|
||||||
+ scan_inference.ext_start, src_open_sb.st_size,
|
|
||||||
+ make_holes ? x->sparse_mode : SPARSE_NEVER,
|
|
||||||
+ src_name, dst_name)
|
|
||||||
+#endif
|
|
||||||
: sparse_copy (source_desc, dest_desc, buf, buf_size,
|
|
||||||
make_holes ? hole_size : 0,
|
|
||||||
x->sparse_mode == SPARSE_ALWAYS,
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
||||||
From be7466be92d779cfbece418d4de33191ae52ab4a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
Date: Wed, 24 Mar 2021 16:06:53 +0100
|
|
||||||
Subject: [PATCH 5/6] import the copy-file-range module from gnulib
|
|
||||||
|
|
||||||
---
|
|
||||||
aclocal.m4 | 1 +
|
|
||||||
lib/config.hin | 3 +++
|
|
||||||
lib/copy-file-range.c | 33 +++++++++++++++++++++++++++++++++
|
|
||||||
lib/gnulib.mk | 10 ++++++++++
|
|
||||||
m4/copy-file-range.m4 | 36 ++++++++++++++++++++++++++++++++++++
|
|
||||||
m4/gnulib-comp.m4 | 8 ++++++++
|
|
||||||
6 files changed, 91 insertions(+)
|
|
||||||
create mode 100644 lib/copy-file-range.c
|
|
||||||
create mode 100644 m4/copy-file-range.m4
|
|
||||||
|
|
||||||
diff --git a/aclocal.m4 b/aclocal.m4
|
|
||||||
index 713f7c5..09a7ea8 100644
|
|
||||||
--- a/aclocal.m4
|
|
||||||
+++ b/aclocal.m4
|
|
||||||
@@ -1163,6 +1163,7 @@ m4_include([m4/closedir.m4])
|
|
||||||
m4_include([m4/codeset.m4])
|
|
||||||
m4_include([m4/config-h.m4])
|
|
||||||
m4_include([m4/configmake.m4])
|
|
||||||
+m4_include([m4/copy-file-range.m4])
|
|
||||||
m4_include([m4/ctype.m4])
|
|
||||||
m4_include([m4/cycle-check.m4])
|
|
||||||
m4_include([m4/d-ino.m4])
|
|
||||||
diff --git a/lib/config.hin b/lib/config.hin
|
|
||||||
index 9769c39..bf9f9f8 100644
|
|
||||||
--- a/lib/config.hin
|
|
||||||
+++ b/lib/config.hin
|
|
||||||
@@ -370,6 +370,9 @@
|
|
||||||
/* Define to 1 when the gnulib module connect should be tested. */
|
|
||||||
#undef GNULIB_TEST_CONNECT
|
|
||||||
|
|
||||||
+/* Define to 1 when the gnulib module copy-file-range should be tested. */
|
|
||||||
+#undef GNULIB_TEST_COPY_FILE_RANGE
|
|
||||||
+
|
|
||||||
/* Define to 1 when the gnulib module dirfd should be tested. */
|
|
||||||
#undef GNULIB_TEST_DIRFD
|
|
||||||
|
|
||||||
diff --git a/lib/copy-file-range.c b/lib/copy-file-range.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..069f144
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/lib/copy-file-range.c
|
|
||||||
@@ -0,0 +1,33 @@
|
|
||||||
+/* Stub for copy_file_range
|
|
||||||
+ Copyright 2019-2020 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 <https://www.gnu.org/licenses/>. */
|
|
||||||
+
|
|
||||||
+#include <config.h>
|
|
||||||
+
|
|
||||||
+#include <unistd.h>
|
|
||||||
+
|
|
||||||
+#include <errno.h>
|
|
||||||
+
|
|
||||||
+ssize_t
|
|
||||||
+copy_file_range (int infd, off_t *pinoff,
|
|
||||||
+ int outfd, off_t *poutoff,
|
|
||||||
+ size_t length, unsigned int flags)
|
|
||||||
+{
|
|
||||||
+ /* There is little need to emulate copy_file_range with read+write,
|
|
||||||
+ since programs that use copy_file_range must fall back on
|
|
||||||
+ read+write anyway. */
|
|
||||||
+ errno = ENOSYS;
|
|
||||||
+ return -1;
|
|
||||||
+}
|
|
||||||
diff --git a/lib/gnulib.mk b/lib/gnulib.mk
|
|
||||||
index b3633b8..86829f3 100644
|
|
||||||
--- a/lib/gnulib.mk
|
|
||||||
+++ b/lib/gnulib.mk
|
|
||||||
@@ -65,6 +65,7 @@
|
|
||||||
# closeout \
|
|
||||||
# config-h \
|
|
||||||
# configmake \
|
|
||||||
+# copy-file-range \
|
|
||||||
# crypto/md5 \
|
|
||||||
# crypto/sha1 \
|
|
||||||
# crypto/sha256 \
|
|
||||||
@@ -800,6 +801,15 @@ CLEANFILES += lib/configmake.h lib/configmake.h-t
|
|
||||||
|
|
||||||
## end gnulib module configmake
|
|
||||||
|
|
||||||
+## begin gnulib module copy-file-range
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+EXTRA_DIST += lib/copy-file-range.c
|
|
||||||
+
|
|
||||||
+EXTRA_lib_libcoreutils_a_SOURCES += lib/copy-file-range.c
|
|
||||||
+
|
|
||||||
+## end gnulib module copy-file-range
|
|
||||||
+
|
|
||||||
## begin gnulib module count-leading-zeros
|
|
||||||
|
|
||||||
lib_libcoreutils_a_SOURCES += lib/count-leading-zeros.c
|
|
||||||
diff --git a/m4/copy-file-range.m4 b/m4/copy-file-range.m4
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..5c5a274
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/m4/copy-file-range.m4
|
|
||||||
@@ -0,0 +1,36 @@
|
|
||||||
+# copy-file-range.m4
|
|
||||||
+dnl Copyright 2019-2020 Free Software Foundation, Inc.
|
|
||||||
+dnl This file is free software; the Free Software Foundation
|
|
||||||
+dnl gives unlimited permission to copy and/or distribute it,
|
|
||||||
+dnl with or without modifications, as long as this notice is preserved.
|
|
||||||
+
|
|
||||||
+AC_DEFUN([gl_FUNC_COPY_FILE_RANGE],
|
|
||||||
+[
|
|
||||||
+ AC_REQUIRE([gl_UNISTD_H_DEFAULTS])
|
|
||||||
+
|
|
||||||
+ dnl Persuade glibc <unistd.h> to declare copy_file_range.
|
|
||||||
+ AC_REQUIRE([AC_USE_SYSTEM_EXTENSIONS])
|
|
||||||
+
|
|
||||||
+ dnl Use AC_LINK_IFELSE, rather than AC_CHECK_FUNCS or a variant,
|
|
||||||
+ dnl since we don't want AC_CHECK_FUNCS's checks for glibc stubs.
|
|
||||||
+ dnl Programs that use copy_file_range must fall back on read+write
|
|
||||||
+ dnl anyway, and there's little point to substituting the Gnulib stub
|
|
||||||
+ dnl for a glibc stub.
|
|
||||||
+ AC_CACHE_CHECK([for copy_file_range], [gl_cv_func_copy_file_range],
|
|
||||||
+ [AC_LINK_IFELSE(
|
|
||||||
+ [AC_LANG_PROGRAM(
|
|
||||||
+ [[#include <unistd.h>
|
|
||||||
+ ]],
|
|
||||||
+ [[ssize_t (*func) (int, off_t *, int, off_t, size_t, unsigned)
|
|
||||||
+ = copy_file_range;
|
|
||||||
+ return func (0, 0, 0, 0, 0, 0) & 127;
|
|
||||||
+ ]])
|
|
||||||
+ ],
|
|
||||||
+ [gl_cv_func_copy_file_range=yes],
|
|
||||||
+ [gl_cv_func_copy_file_range=no])
|
|
||||||
+ ])
|
|
||||||
+
|
|
||||||
+ if test "$gl_cv_func_copy_file_range" != yes; then
|
|
||||||
+ HAVE_COPY_FILE_RANGE=0
|
|
||||||
+ fi
|
|
||||||
+])
|
|
||||||
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
|
|
||||||
index dead90e..953e7f0 100644
|
|
||||||
--- a/m4/gnulib-comp.m4
|
|
||||||
+++ b/m4/gnulib-comp.m4
|
|
||||||
@@ -129,6 +129,7 @@ AC_DEFUN([gl_EARLY],
|
|
||||||
# Code from module configmake:
|
|
||||||
# Code from module connect:
|
|
||||||
# Code from module connect-tests:
|
|
||||||
+ # Code from module copy-file-range:
|
|
||||||
# Code from module count-leading-zeros:
|
|
||||||
# Code from module count-leading-zeros-tests:
|
|
||||||
# Code from module crypto/af_alg:
|
|
||||||
@@ -977,6 +978,11 @@ AC_DEFUN([gl_INIT],
|
|
||||||
gl_DIRENT_MODULE_INDICATOR([closedir])
|
|
||||||
gl_CONFIG_H
|
|
||||||
gl_CONFIGMAKE_PREP
|
|
||||||
+ gl_FUNC_COPY_FILE_RANGE
|
|
||||||
+ if test $HAVE_COPY_FILE_RANGE = 0; then
|
|
||||||
+ AC_LIBOBJ([copy-file-range])
|
|
||||||
+ fi
|
|
||||||
+ gl_UNISTD_MODULE_INDICATOR([copy-file-range])
|
|
||||||
gl_AF_ALG
|
|
||||||
AC_DEFINE([GL_COMPILE_CRYPTO_STREAM], 1, [Compile Gnulib crypto stream ops.])
|
|
||||||
AC_REQUIRE([AC_C_RESTRICT])
|
|
||||||
@@ -2746,6 +2752,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|
||||||
lib/closeout.c
|
|
||||||
lib/closeout.h
|
|
||||||
lib/copy-acl.c
|
|
||||||
+ lib/copy-file-range.c
|
|
||||||
lib/count-leading-zeros.c
|
|
||||||
lib/count-leading-zeros.h
|
|
||||||
lib/creat-safer.c
|
|
||||||
@@ -3438,6 +3445,7 @@ AC_DEFUN([gl_FILE_LIST], [
|
|
||||||
m4/codeset.m4
|
|
||||||
m4/config-h.m4
|
|
||||||
m4/configmake.m4
|
|
||||||
+ m4/copy-file-range.m4
|
|
||||||
m4/ctype.m4
|
|
||||||
m4/cycle-check.m4
|
|
||||||
m4/d-ino.m4
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
||||||
From 48370c95bcf7c25ce021fbd2145062d3d29ae6d5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Thu, 25 Jun 2020 17:34:23 -0700
|
|
||||||
Subject: [PATCH 6/6] cp: use copy_file_range if available
|
|
||||||
|
|
||||||
* NEWS: Mention this.
|
|
||||||
* bootstrap.conf (gnulib_modules): Add copy-file-range.
|
|
||||||
* src/copy.c (sparse_copy): Try copy_file_range if not
|
|
||||||
looking for holes.
|
|
||||||
|
|
||||||
Upstream-commit: 4b04a0c3b792d27909670a81d21f2a3b3e0ea563
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
bootstrap.conf | 1 +
|
|
||||||
src/copy.c | 40 ++++++++++++++++++++++++++++++++++++++++
|
|
||||||
2 files changed, 41 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/bootstrap.conf b/bootstrap.conf
|
|
||||||
index 2a342c1..7d53e28 100644
|
|
||||||
--- a/bootstrap.conf
|
|
||||||
+++ b/bootstrap.conf
|
|
||||||
@@ -54,6 +54,7 @@ gnulib_modules="
|
|
||||||
closeout
|
|
||||||
config-h
|
|
||||||
configmake
|
|
||||||
+ copy-file-range
|
|
||||||
crypto/md5
|
|
||||||
crypto/sha1
|
|
||||||
crypto/sha256
|
|
||||||
diff --git a/src/copy.c b/src/copy.c
|
|
||||||
index d88f8cf..4050f69 100644
|
|
||||||
--- a/src/copy.c
|
|
||||||
+++ b/src/copy.c
|
|
||||||
@@ -265,6 +265,46 @@ sparse_copy (int src_fd, int dest_fd, char *buf, size_t buf_size,
|
|
||||||
{
|
|
||||||
*last_write_made_hole = false;
|
|
||||||
*total_n_read = 0;
|
|
||||||
+
|
|
||||||
+ /* If not looking for holes, use copy_file_range if available. */
|
|
||||||
+ if (!hole_size)
|
|
||||||
+ while (max_n_read)
|
|
||||||
+ {
|
|
||||||
+ /* Copy at most COPY_MAX bytes at a time; this is min
|
|
||||||
+ (PTRDIFF_MAX, SIZE_MAX) truncated to a value that is
|
|
||||||
+ surely aligned well. */
|
|
||||||
+ ssize_t ssize_max = TYPE_MAXIMUM (ssize_t);
|
|
||||||
+ ptrdiff_t copy_max = MIN (ssize_max, SIZE_MAX) >> 30 << 30;
|
|
||||||
+ ssize_t n_copied = copy_file_range (src_fd, NULL, dest_fd, NULL,
|
|
||||||
+ MIN (max_n_read, copy_max), 0);
|
|
||||||
+ if (n_copied == 0)
|
|
||||||
+ {
|
|
||||||
+ /* copy_file_range incorrectly returns 0 when reading from
|
|
||||||
+ the proc file system on the Linux kernel through at
|
|
||||||
+ least 5.6.19 (2020), so fall back on 'read' if the
|
|
||||||
+ input file seems empty. */
|
|
||||||
+ if (*total_n_read == 0)
|
|
||||||
+ break;
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+ if (n_copied < 0)
|
|
||||||
+ {
|
|
||||||
+ if (errno == ENOSYS || errno == EINVAL
|
|
||||||
+ || errno == EBADF || errno == EXDEV)
|
|
||||||
+ break;
|
|
||||||
+ if (errno == EINTR)
|
|
||||||
+ n_copied = 0;
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ error (0, errno, _("error copying %s to %s"),
|
|
||||||
+ quoteaf_n (0, src_name), quoteaf_n (1, dst_name));
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ max_n_read -= n_copied;
|
|
||||||
+ *total_n_read += n_copied;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
bool make_hole = false;
|
|
||||||
off_t psize = 0;
|
|
||||||
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
@ -1,119 +0,0 @@
|
||||||
From 76126e2831580d0df20530f4d6f72189bd4f0b9a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Thu, 18 Jun 2020 22:16:24 -0700
|
|
||||||
Subject: [PATCH] cp: default to COW
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Likewise for ‘install’. Proposed in Bug#24400, and long past due.
|
|
||||||
* NEWS:
|
|
||||||
* doc/coreutils.texi (cp invocation):
|
|
||||||
* src/copy.h (enum Reflink_type): Document this.
|
|
||||||
* src/cp.c (cp_option_init):
|
|
||||||
* src/install.c (cp_option_init): Implement this.
|
|
||||||
|
|
||||||
Upstream-commit: 25725f9d41735d176d73a757430739fb71c7d043
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
doc/coreutils.texi | 19 ++++++++++++-------
|
|
||||||
src/copy.h | 4 ++--
|
|
||||||
src/cp.c | 2 +-
|
|
||||||
src/install.c | 2 +-
|
|
||||||
4 files changed, 16 insertions(+), 11 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
|
|
||||||
index 02e0c1c..2382a16 100644
|
|
||||||
--- a/doc/coreutils.texi
|
|
||||||
+++ b/doc/coreutils.texi
|
|
||||||
@@ -8854,12 +8854,14 @@ The @var{when} value can be one of the following:
|
|
||||||
|
|
||||||
@table @samp
|
|
||||||
@item always
|
|
||||||
-The default behavior: if the copy-on-write operation is not supported
|
|
||||||
+If the copy-on-write operation is not supported
|
|
||||||
then report the failure for each file and exit with a failure status.
|
|
||||||
+Plain @option{--reflink} is equivalent to @option{--reflink=when}.
|
|
||||||
|
|
||||||
@item auto
|
|
||||||
If the copy-on-write operation is not supported then fall back
|
|
||||||
to the standard copy behavior.
|
|
||||||
+This is the default if no @option{--reflink} option is given.
|
|
||||||
|
|
||||||
@item never
|
|
||||||
Disable copy-on-write operation and use the standard copy behavior.
|
|
||||||
@@ -8868,12 +8870,6 @@ Disable copy-on-write operation and use the standard copy behavior.
|
|
||||||
This option is overridden by the @option{--link}, @option{--symbolic-link}
|
|
||||||
and @option{--attributes-only} options, thus allowing it to be used
|
|
||||||
to configure the default data copying behavior for @command{cp}.
|
|
||||||
-For example, with the following alias, @command{cp} will use the
|
|
||||||
-minimum amount of space supported by the file system.
|
|
||||||
-
|
|
||||||
-@example
|
|
||||||
-alias cp='cp --reflink=auto --sparse=always'
|
|
||||||
-@end example
|
|
||||||
|
|
||||||
@item --remove-destination
|
|
||||||
@opindex --remove-destination
|
|
||||||
@@ -8918,6 +8914,15 @@ This is useful in creating a file for use with the @command{mkswap} command,
|
|
||||||
since such a file must not have any holes.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
+For example, with the following alias, @command{cp} will use the
|
|
||||||
+minimum amount of space supported by the file system.
|
|
||||||
+(Older versions of @command{cp} can also benefit from
|
|
||||||
+@option{--reflink=auto} here.)
|
|
||||||
+
|
|
||||||
+@example
|
|
||||||
+alias cp='cp --sparse=always'
|
|
||||||
+@end example
|
|
||||||
+
|
|
||||||
@optStripTrailingSlashes
|
|
||||||
|
|
||||||
@item -s
|
|
||||||
diff --git a/src/copy.h b/src/copy.h
|
|
||||||
index 874d6f7..a0ad494 100644
|
|
||||||
--- a/src/copy.h
|
|
||||||
+++ b/src/copy.h
|
|
||||||
@@ -46,10 +46,10 @@ enum Sparse_type
|
|
||||||
/* Control creation of COW files. */
|
|
||||||
enum Reflink_type
|
|
||||||
{
|
|
||||||
- /* Default to a standard copy. */
|
|
||||||
+ /* Do a standard copy. */
|
|
||||||
REFLINK_NEVER,
|
|
||||||
|
|
||||||
- /* Try a COW copy and fall back to a standard copy. */
|
|
||||||
+ /* Try a COW copy and fall back to a standard copy; this is the default. */
|
|
||||||
REFLINK_AUTO,
|
|
||||||
|
|
||||||
/* Require a COW copy and fail if not available. */
|
|
||||||
diff --git a/src/cp.c b/src/cp.c
|
|
||||||
index 0193df8..9e7ad14 100644
|
|
||||||
--- a/src/cp.c
|
|
||||||
+++ b/src/cp.c
|
|
||||||
@@ -796,7 +796,7 @@ cp_option_init (struct cp_options *x)
|
|
||||||
x->move_mode = false;
|
|
||||||
x->install_mode = false;
|
|
||||||
x->one_file_system = false;
|
|
||||||
- x->reflink_mode = REFLINK_NEVER;
|
|
||||||
+ x->reflink_mode = REFLINK_AUTO;
|
|
||||||
|
|
||||||
x->preserve_ownership = false;
|
|
||||||
x->preserve_links = false;
|
|
||||||
diff --git a/src/install.c b/src/install.c
|
|
||||||
index 4ab44a6..aef16ca 100644
|
|
||||||
--- a/src/install.c
|
|
||||||
+++ b/src/install.c
|
|
||||||
@@ -264,7 +264,7 @@ cp_option_init (struct cp_options *x)
|
|
||||||
{
|
|
||||||
cp_options_default (x);
|
|
||||||
x->copy_as_regular = true;
|
|
||||||
- x->reflink_mode = REFLINK_NEVER;
|
|
||||||
+ x->reflink_mode = REFLINK_AUTO;
|
|
||||||
x->dereference = DEREF_ALWAYS;
|
|
||||||
x->unlink_dest_before_opening = true;
|
|
||||||
x->unlink_dest_after_failed_open = false;
|
|
||||||
--
|
|
||||||
2.25.4
|
|
||||||
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
From 9618fb718b75920f37e5be2049ad1d0bb5c4a28c Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Tue, 26 Jan 2021 09:23:54 -0800
|
|
||||||
Subject: [PATCH] expr: fix bug with unmatched \(...\)
|
|
||||||
|
|
||||||
Problem reported by Qiuhao Li.
|
|
||||||
* doc/coreutils.texi (String expressions):
|
|
||||||
Document the correct behavior, which POSIX requires.
|
|
||||||
* src/expr.c (docolon): Treat unmatched \(...\) as empty.
|
|
||||||
* tests/misc/expr.pl: New test.
|
|
||||||
|
|
||||||
Upstream-commit: 735083ba24878075235007b4417982ad5700436d
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
doc/coreutils.texi | 14 ++++++++------
|
|
||||||
src/expr.c | 9 +++++++--
|
|
||||||
tests/misc/expr.pl | 3 +++
|
|
||||||
3 files changed, 18 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
|
|
||||||
index 2382a16..5b2bb2c 100644
|
|
||||||
--- a/doc/coreutils.texi
|
|
||||||
+++ b/doc/coreutils.texi
|
|
||||||
@@ -13529,12 +13529,14 @@ second is considered to be a (basic, a la GNU @code{grep}) regular
|
|
||||||
expression, with a @code{^} implicitly prepended. The first argument is
|
|
||||||
then matched against this regular expression.
|
|
||||||
|
|
||||||
-If the match succeeds and @var{regex} uses @samp{\(} and @samp{\)}, the
|
|
||||||
-@code{:} expression returns the part of @var{string} that matched the
|
|
||||||
-subexpression; otherwise, it returns the number of characters matched.
|
|
||||||
-
|
|
||||||
-If the match fails, the @code{:} operator returns the null string if
|
|
||||||
-@samp{\(} and @samp{\)} are used in @var{regex}, otherwise 0.
|
|
||||||
+If @var{regex} does not use @samp{\(} and @samp{\)}, the @code{:}
|
|
||||||
+expression returns the number of characters matched, or 0 if the match
|
|
||||||
+fails.
|
|
||||||
+
|
|
||||||
+If @var{regex} uses @samp{\(} and @samp{\)}, the @code{:} expression
|
|
||||||
+returns the part of @var{string} that matched the subexpression, or
|
|
||||||
+the null string if the match failed or the subexpression did not
|
|
||||||
+contribute to the match.
|
|
||||||
|
|
||||||
@kindex \( @r{regexp operator}
|
|
||||||
Only the first @samp{\( @dots{} \)} pair is relevant to the return
|
|
||||||
diff --git a/src/expr.c b/src/expr.c
|
|
||||||
index e134872..0616a42 100644
|
|
||||||
--- a/src/expr.c
|
|
||||||
+++ b/src/expr.c
|
|
||||||
@@ -721,8 +721,13 @@ docolon (VALUE *sv, VALUE *pv)
|
|
||||||
/* Were \(...\) used? */
|
|
||||||
if (re_buffer.re_nsub > 0)
|
|
||||||
{
|
|
||||||
- sv->u.s[re_regs.end[1]] = '\0';
|
|
||||||
- v = str_value (sv->u.s + re_regs.start[1]);
|
|
||||||
+ if (re_regs.end[1] < 0)
|
|
||||||
+ v = str_value ("");
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ sv->u.s[re_regs.end[1]] = '\0';
|
|
||||||
+ v = str_value (sv->u.s + re_regs.start[1]);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
diff --git a/tests/misc/expr.pl b/tests/misc/expr.pl
|
|
||||||
index e45f8e7..e57f79d 100755
|
|
||||||
--- a/tests/misc/expr.pl
|
|
||||||
+++ b/tests/misc/expr.pl
|
|
||||||
@@ -84,6 +84,9 @@ my @Tests =
|
|
||||||
# In 5.94 and earlier, anchors incorrectly matched newlines.
|
|
||||||
['anchor', "'a\nb' : 'a\$'", {OUT => '0'}, {EXIT => 1}],
|
|
||||||
|
|
||||||
+ # In 8.32, \( ... \) that did not match caused memory errors.
|
|
||||||
+ ['emptysub', '"a" : "\\(b\\)*"', {OUT => ''}, {EXIT => 1}],
|
|
||||||
+
|
|
||||||
# These tests are taken from grep/tests/bre.tests.
|
|
||||||
['bre1', '"abc" : "a\\(b\\)c"', {OUT => 'b'}],
|
|
||||||
['bre2', '"a(" : "a("', {OUT => '2'}],
|
|
||||||
--
|
|
||||||
2.26.2
|
|
||||||
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
From f61085aaa37f169365c56e44f5129d0491913b6a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Thu, 27 Aug 2020 17:52:58 -0700
|
|
||||||
Subject: [PATCH] perror, strerror_r: remove unportable tests
|
|
||||||
|
|
||||||
Problem reported by Florian Weimer in:
|
|
||||||
https://lists.gnu.org/r/bug-gnulib/2020-08/msg00220.html
|
|
||||||
* tests/test-perror2.c (main):
|
|
||||||
* tests/test-strerror_r.c (main): Omit unportable tests.
|
|
||||||
|
|
||||||
Upstream-commit: 175e0bc72808d564074c4adcc72aeadb74adfcc6
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
gnulib-tests/test-perror2.c | 3 ---
|
|
||||||
gnulib-tests/test-strerror_r.c | 3 ---
|
|
||||||
2 files changed, 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gnulib-tests/test-perror2.c b/gnulib-tests/test-perror2.c
|
|
||||||
index 1d14eda..c6214dd 100644
|
|
||||||
--- a/gnulib-tests/test-perror2.c
|
|
||||||
+++ b/gnulib-tests/test-perror2.c
|
|
||||||
@@ -79,9 +79,6 @@ main (void)
|
|
||||||
errno = -5;
|
|
||||||
perror ("");
|
|
||||||
ASSERT (!ferror (stderr));
|
|
||||||
- ASSERT (msg1 == msg2 || msg1 == msg4 || STREQ (msg1, str1));
|
|
||||||
- ASSERT (msg2 == msg4 || STREQ (msg2, str2));
|
|
||||||
- ASSERT (msg3 == msg4 || STREQ (msg3, str3));
|
|
||||||
ASSERT (STREQ (msg4, str4));
|
|
||||||
|
|
||||||
free (str1);
|
|
||||||
diff --git a/gnulib-tests/test-strerror_r.c b/gnulib-tests/test-strerror_r.c
|
|
||||||
index b11d6fd..c1dbcf8 100644
|
|
||||||
--- a/gnulib-tests/test-strerror_r.c
|
|
||||||
+++ b/gnulib-tests/test-strerror_r.c
|
|
||||||
@@ -165,9 +165,6 @@ main (void)
|
|
||||||
|
|
||||||
strerror_r (EACCES, buf, sizeof buf);
|
|
||||||
strerror_r (-5, buf, sizeof buf);
|
|
||||||
- ASSERT (msg1 == msg2 || msg1 == msg4 || STREQ (msg1, str1));
|
|
||||||
- ASSERT (msg2 == msg4 || STREQ (msg2, str2));
|
|
||||||
- ASSERT (msg3 == msg4 || STREQ (msg3, str3));
|
|
||||||
ASSERT (STREQ (msg4, str4));
|
|
||||||
|
|
||||||
free (str1);
|
|
||||||
--
|
|
||||||
2.25.4
|
|
||||||
|
|
||||||
|
|
@ -1,164 +0,0 @@
|
||||||
From b9f9ed14bda93ecb407129b69e6476813c250046 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Wed, 15 Apr 2020 20:50:32 -0700
|
|
||||||
Subject: [PATCH] fts: remove NOSTAT_LEAF_OPTIMIZATION
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
It caused ‘find’ and ‘du’ to dump core, and it was useful
|
|
||||||
only for obsolescent Linux filesystems anyway. Problem reported in:
|
|
||||||
https://lists.gnu.org/r/bug-gnulib/2020-04/msg00068.html
|
|
||||||
Quite possibly there is still a serious underlying fts bug with
|
|
||||||
tight-loop-check and mutating file systems, but if so this patch
|
|
||||||
should cause the bug to be triggered less often.
|
|
||||||
* lib/fts.c (enum leaf_optimization): Remove
|
|
||||||
NOSTAT_LEAF_OPTIMIZATION, as it’s problematic.
|
|
||||||
(S_MAGIC_REISERFS, S_MAGIC_XFS): Remove; no longer needed.
|
|
||||||
(leaf_optimization): Remove special cases for ReiserFS and XFS.
|
|
||||||
(fts_read): Remove NOSTAT_LEAF_OPTIMIZATION code.
|
|
||||||
* lib/fts_.h (struct _ftsent.fts_n_dirs_remaining):
|
|
||||||
Remove. All uses removed.
|
|
||||||
|
|
||||||
Upstream-commit: 47bf2cf3184027c1eb9c1dfeea5c5b8b2d69710d
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
lib/fts.c | 56 ++++++++-------------------------------------------
|
|
||||||
lib/fts_.h | 5 -----
|
|
||||||
2 files changed, 8 insertions(+), 53 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/fts.c b/lib/fts.c
|
|
||||||
index 1093ce5..dfe3fef 100644
|
|
||||||
--- a/lib/fts.c
|
|
||||||
+++ b/lib/fts.c
|
|
||||||
@@ -445,7 +445,6 @@ fts_open (char * const *argv,
|
|
||||||
if ((parent = fts_alloc(sp, "", 0)) == NULL)
|
|
||||||
goto mem2;
|
|
||||||
parent->fts_level = FTS_ROOTPARENTLEVEL;
|
|
||||||
- parent->fts_n_dirs_remaining = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The classic fts implementation would call fts_stat with
|
|
||||||
@@ -634,9 +633,8 @@ fts_close (FTS *sp)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Minimum link count of a traditional Unix directory. When leaf
|
|
||||||
- optimization is OK and MIN_DIR_NLINK <= st_nlink, then st_nlink is
|
|
||||||
- an upper bound on the number of subdirectories (counting "." and
|
|
||||||
- ".."). */
|
|
||||||
+ optimization is OK and a directory's st_nlink == MIN_DIR_NLINK,
|
|
||||||
+ then the directory has no subdirectories. */
|
|
||||||
enum { MIN_DIR_NLINK = 2 };
|
|
||||||
|
|
||||||
/* Whether leaf optimization is OK for a directory. */
|
|
||||||
@@ -645,12 +643,8 @@ enum leaf_optimization
|
|
||||||
/* st_nlink is not reliable for this directory's subdirectories. */
|
|
||||||
NO_LEAF_OPTIMIZATION,
|
|
||||||
|
|
||||||
- /* Leaf optimization is OK, but is not useful for avoiding stat calls. */
|
|
||||||
- OK_LEAF_OPTIMIZATION,
|
|
||||||
-
|
|
||||||
- /* Leaf optimization is not only OK: it is useful for avoiding
|
|
||||||
- stat calls, because dirent.d_type does not work. */
|
|
||||||
- NOSTAT_LEAF_OPTIMIZATION
|
|
||||||
+ /* st_nlink == 2 means the directory lacks subdirectories. */
|
|
||||||
+ OK_LEAF_OPTIMIZATION
|
|
||||||
};
|
|
||||||
|
|
||||||
#if (defined __linux__ || defined __ANDROID__) \
|
|
||||||
@@ -663,9 +657,7 @@ enum leaf_optimization
|
|
||||||
# define S_MAGIC_CIFS 0xFF534D42
|
|
||||||
# define S_MAGIC_NFS 0x6969
|
|
||||||
# define S_MAGIC_PROC 0x9FA0
|
|
||||||
-# define S_MAGIC_REISERFS 0x52654973
|
|
||||||
# define S_MAGIC_TMPFS 0x1021994
|
|
||||||
-# define S_MAGIC_XFS 0x58465342
|
|
||||||
|
|
||||||
# ifdef HAVE___FSWORD_T
|
|
||||||
typedef __fsword_t fsword;
|
|
||||||
@@ -786,23 +778,15 @@ dirent_inode_sort_may_be_useful (FTSENT const *p, int dir_fd)
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Given an FTS entry P for a directory with descriptor DIR_FD,
|
|
||||||
- return true if it is both useful and valid to apply leaf optimization.
|
|
||||||
- The optimization is useful only for file systems that lack usable
|
|
||||||
- dirent.d_type info. The optimization is valid if an st_nlink value
|
|
||||||
- of at least MIN_DIR_NLINK is an upper bound on the number of
|
|
||||||
- subdirectories of D, counting "." and ".." as subdirectories.
|
|
||||||
+ return whether it is valid to apply leaf optimization.
|
|
||||||
+ The optimization is valid if a directory's st_nlink value equal
|
|
||||||
+ to MIN_DIR_NLINK means the directory has no subdirectories.
|
|
||||||
DIR_FD is negative if unavailable. */
|
|
||||||
static enum leaf_optimization
|
|
||||||
leaf_optimization (FTSENT const *p, int dir_fd)
|
|
||||||
{
|
|
||||||
switch (filesystem_type (p, dir_fd))
|
|
||||||
{
|
|
||||||
- /* List here the file system types that may lack usable dirent.d_type
|
|
||||||
- info, yet for which the optimization does apply. */
|
|
||||||
- case S_MAGIC_REISERFS:
|
|
||||||
- case S_MAGIC_XFS: /* XFS lacked it until 2013-08-22 commit. */
|
|
||||||
- return NOSTAT_LEAF_OPTIMIZATION;
|
|
||||||
-
|
|
||||||
case 0:
|
|
||||||
/* Leaf optimization is unsafe if the file system type is unknown. */
|
|
||||||
FALLTHROUGH;
|
|
||||||
@@ -1027,26 +1011,7 @@ check_for_dir:
|
|
||||||
if (p->fts_info == FTS_NSOK)
|
|
||||||
{
|
|
||||||
if (p->fts_statp->st_size == FTS_STAT_REQUIRED)
|
|
||||||
- {
|
|
||||||
- FTSENT *parent = p->fts_parent;
|
|
||||||
- if (parent->fts_n_dirs_remaining == 0
|
|
||||||
- && ISSET(FTS_NOSTAT)
|
|
||||||
- && ISSET(FTS_PHYSICAL)
|
|
||||||
- && (leaf_optimization (parent, sp->fts_cwd_fd)
|
|
||||||
- == NOSTAT_LEAF_OPTIMIZATION))
|
|
||||||
- {
|
|
||||||
- /* nothing more needed */
|
|
||||||
- }
|
|
||||||
- else
|
|
||||||
- {
|
|
||||||
- p->fts_info = fts_stat(sp, p, false);
|
|
||||||
- if (S_ISDIR(p->fts_statp->st_mode)
|
|
||||||
- && p->fts_level != FTS_ROOTLEVEL
|
|
||||||
- && 0 < parent->fts_n_dirs_remaining
|
|
||||||
- && parent->fts_n_dirs_remaining != (nlink_t) -1)
|
|
||||||
- parent->fts_n_dirs_remaining--;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
+ p->fts_info = fts_stat(sp, p, false);
|
|
||||||
else
|
|
||||||
fts_assert (p->fts_statp->st_size == FTS_NO_STAT_REQUIRED);
|
|
||||||
}
|
|
||||||
@@ -1830,11 +1795,6 @@ err: memset(sbp, 0, sizeof(struct stat));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (S_ISDIR(sbp->st_mode)) {
|
|
||||||
- p->fts_n_dirs_remaining
|
|
||||||
- = ((sbp->st_nlink < MIN_DIR_NLINK
|
|
||||||
- || p->fts_level <= FTS_ROOTLEVEL)
|
|
||||||
- ? -1
|
|
||||||
- : sbp->st_nlink - (ISSET (FTS_SEEDOT) ? 0 : MIN_DIR_NLINK));
|
|
||||||
if (ISDOT(p->fts_name)) {
|
|
||||||
/* Command-line "." and ".." are real directories. */
|
|
||||||
return (p->fts_level == FTS_ROOTLEVEL ? FTS_D : FTS_DOT);
|
|
||||||
diff --git a/lib/fts_.h b/lib/fts_.h
|
|
||||||
index d40a116..2e76cc4 100644
|
|
||||||
--- a/lib/fts_.h
|
|
||||||
+++ b/lib/fts_.h
|
|
||||||
@@ -227,11 +227,6 @@ typedef struct _ftsent {
|
|
||||||
|
|
||||||
size_t fts_namelen; /* strlen(fts_name) */
|
|
||||||
|
|
||||||
- /* If not (nlink_t) -1, an upper bound on the number of
|
|
||||||
- remaining subdirectories of interest. If this becomes
|
|
||||||
- zero, some work can be avoided. */
|
|
||||||
- nlink_t fts_n_dirs_remaining;
|
|
||||||
-
|
|
||||||
# define FTS_D 1 /* preorder directory */
|
|
||||||
# define FTS_DC 2 /* directory that causes cycles */
|
|
||||||
# define FTS_DEFAULT 3 /* none of the above */
|
|
||||||
--
|
|
||||||
2.21.1
|
|
||||||
|
|
||||||
|
|
@ -1,153 +0,0 @@
|
||||||
From 8c022656320592dbad146f5d3a3ae1875f419446 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Thu, 5 Mar 2020 17:25:29 -0800
|
|
||||||
Subject: [PATCH 1/2] ls: restore 8.31 behavior on removed directories
|
|
||||||
|
|
||||||
* NEWS: Mention this.
|
|
||||||
* src/ls.c: Do not include <sys/sycall.h>
|
|
||||||
(print_dir): Don't worry about whether the directory is removed.
|
|
||||||
* tests/ls/removed-directory.sh: Adjust to match new (i.e., old)
|
|
||||||
behavior.
|
|
||||||
|
|
||||||
Upstream-commit: 10fcb97bd728f09d4a027eddf8ad2900f0819b0a
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/ls.c | 22 ----------------------
|
|
||||||
tests/ls/removed-directory.sh | 10 ++--------
|
|
||||||
2 files changed, 2 insertions(+), 30 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/ls.c b/src/ls.c
|
|
||||||
index 9d25f62..850ecc2 100644
|
|
||||||
--- a/src/ls.c
|
|
||||||
+++ b/src/ls.c
|
|
||||||
@@ -49,10 +49,6 @@
|
|
||||||
# include <sys/ptem.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#ifdef __linux__
|
|
||||||
-# include <sys/syscall.h>
|
|
||||||
-#endif
|
|
||||||
-
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
@@ -2896,7 +2892,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
|
|
||||||
struct dirent *next;
|
|
||||||
uintmax_t total_blocks = 0;
|
|
||||||
static bool first = true;
|
|
||||||
- bool found_any_entries = false;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
dirp = opendir (name);
|
|
||||||
@@ -2972,7 +2967,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
|
|
||||||
next = readdir (dirp);
|
|
||||||
if (next)
|
|
||||||
{
|
|
||||||
- found_any_entries = true;
|
|
||||||
if (! file_ignored (next->d_name))
|
|
||||||
{
|
|
||||||
enum filetype type = unknown;
|
|
||||||
@@ -3018,22 +3012,6 @@ print_dir (char const *name, char const *realname, bool command_line_arg)
|
|
||||||
if (errno != EOVERFLOW)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
-#ifdef __linux__
|
|
||||||
- else if (! found_any_entries)
|
|
||||||
- {
|
|
||||||
- /* If readdir finds no directory entries at all, not even "." or
|
|
||||||
- "..", then double check that the directory exists. */
|
|
||||||
- if (syscall (SYS_getdents, dirfd (dirp), NULL, 0) == -1
|
|
||||||
- && errno != EINVAL)
|
|
||||||
- {
|
|
||||||
- /* We exclude EINVAL as that pertains to buffer handling,
|
|
||||||
- and we've passed NULL as the buffer for simplicity.
|
|
||||||
- ENOENT is returned if appropriate before buffer handling. */
|
|
||||||
- file_failure (command_line_arg, _("reading directory %s"), name);
|
|
||||||
- }
|
|
||||||
- break;
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
|
|
||||||
diff --git a/tests/ls/removed-directory.sh b/tests/ls/removed-directory.sh
|
|
||||||
index e8c835d..fe8f929 100755
|
|
||||||
--- a/tests/ls/removed-directory.sh
|
|
||||||
+++ b/tests/ls/removed-directory.sh
|
|
||||||
@@ -26,20 +26,14 @@ case $host_triplet in
|
|
||||||
*) skip_ 'non linux kernel' ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
-LS_FAILURE=2
|
|
||||||
-
|
|
||||||
-cat <<\EOF >exp-err || framework_failure_
|
|
||||||
-ls: reading directory '.': No such file or directory
|
|
||||||
-EOF
|
|
||||||
-
|
|
||||||
cwd=$(pwd)
|
|
||||||
mkdir d || framework_failure_
|
|
||||||
cd d || framework_failure_
|
|
||||||
rmdir ../d || framework_failure_
|
|
||||||
|
|
||||||
-returns_ $LS_FAILURE ls >../out 2>../err || fail=1
|
|
||||||
+ls >../out 2>../err || fail=1
|
|
||||||
cd "$cwd" || framework_failure_
|
|
||||||
compare /dev/null out || fail=1
|
|
||||||
-compare exp-err err || fail=1
|
|
||||||
+compare /dev/null err || fail=1
|
|
||||||
|
|
||||||
Exit $fail
|
|
||||||
--
|
|
||||||
2.21.1
|
|
||||||
|
|
||||||
|
|
||||||
From 847324a0debd9d12062c79e7a7a9d3d8ce76390d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Sat, 7 Mar 2020 10:29:51 -0800
|
|
||||||
Subject: [PATCH 2/2] ls: improve removed-directory test
|
|
||||||
|
|
||||||
* tests/ls/removed-directory.sh: Remove host_triplet test.
|
|
||||||
Skip this test if one cannot remove the working directory.
|
|
||||||
From a suggestion by Bernhard Voelker (Bug#39929).
|
|
||||||
|
|
||||||
Upstream-commit: 672819c73f2e94e61386dc0584bddf9da860cc26
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
tests/ls/removed-directory.sh | 13 ++++---------
|
|
||||||
1 file changed, 4 insertions(+), 9 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/tests/ls/removed-directory.sh b/tests/ls/removed-directory.sh
|
|
||||||
index fe8f929..63b209d 100755
|
|
||||||
--- a/tests/ls/removed-directory.sh
|
|
||||||
+++ b/tests/ls/removed-directory.sh
|
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
#!/bin/sh
|
|
||||||
-# If ls is asked to list a removed directory (e.g. the parent process's
|
|
||||||
-# current working directory that has been removed by another process), it
|
|
||||||
-# emits an error message.
|
|
||||||
+# If ls is asked to list a removed directory (e.g., the parent process's
|
|
||||||
+# current working directory has been removed by another process), it
|
|
||||||
+# should not emit an error message merely because the directory is removed.
|
|
||||||
|
|
||||||
# Copyright (C) 2020 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
@@ -21,15 +21,10 @@
|
|
||||||
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
||||||
print_ver_ ls
|
|
||||||
|
|
||||||
-case $host_triplet in
|
|
||||||
- *linux*) ;;
|
|
||||||
- *) skip_ 'non linux kernel' ;;
|
|
||||||
-esac
|
|
||||||
-
|
|
||||||
cwd=$(pwd)
|
|
||||||
mkdir d || framework_failure_
|
|
||||||
cd d || framework_failure_
|
|
||||||
-rmdir ../d || framework_failure_
|
|
||||||
+rmdir ../d || skip_ "can't remove working directory on this platform"
|
|
||||||
|
|
||||||
ls >../out 2>../err || fail=1
|
|
||||||
cd "$cwd" || framework_failure_
|
|
||||||
--
|
|
||||||
2.21.1
|
|
||||||
|
|
||||||
|
|
@ -1,85 +0,0 @@
|
||||||
From 53c6b01e8e3fd338d7f53e5ff817ef86f9efa852 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
|
||||||
Date: Wed, 11 Nov 2020 17:22:33 +0000
|
|
||||||
Subject: [PATCH] ls: fix crash printing SELinux context for unstatable files
|
|
||||||
|
|
||||||
This crash was identified by Cyber Independent Testing Lab:
|
|
||||||
https://cyber-itl.org/2020/10/28/citl-7000-defects.html
|
|
||||||
and was introduced with commit v6.9.90-11-g4245876e2
|
|
||||||
|
|
||||||
* src/ls.c (gobble_file): Ensure scontext is initialized
|
|
||||||
in the case where files are not statable.
|
|
||||||
* tests/ls/selinux-segfault.sh: Renamed from proc-selinux-segfault.sh,
|
|
||||||
and added test case for broken symlinks.
|
|
||||||
* tests/local.mk: Adjust for the renamed test.
|
|
||||||
|
|
||||||
Upstream-commit: 6fc695cb4a26f09dfeef8b1c24895a707055334e
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/ls.c | 3 +++
|
|
||||||
tests/local.mk | 2 +-
|
|
||||||
.../{proc-selinux-segfault.sh => selinux-segfault.sh} | 10 ++++++++--
|
|
||||||
3 files changed, 12 insertions(+), 3 deletions(-)
|
|
||||||
rename tests/ls/{proc-selinux-segfault.sh => selinux-segfault.sh} (77%)
|
|
||||||
|
|
||||||
diff --git a/src/ls.c b/src/ls.c
|
|
||||||
index 4acf5f4..8eb483d 100644
|
|
||||||
--- a/src/ls.c
|
|
||||||
+++ b/src/ls.c
|
|
||||||
@@ -3412,6 +3412,9 @@ gobble_file (char const *name, enum filetype type, ino_t inode,
|
|
||||||
provokes an exit status of 1. */
|
|
||||||
file_failure (command_line_arg,
|
|
||||||
_("cannot access %s"), full_name);
|
|
||||||
+
|
|
||||||
+ f->scontext = UNKNOWN_SECURITY_CONTEXT;
|
|
||||||
+
|
|
||||||
if (command_line_arg)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
diff --git a/tests/local.mk b/tests/local.mk
|
|
||||||
index 2aeff2b..2441fdc 100644
|
|
||||||
--- a/tests/local.mk
|
|
||||||
+++ b/tests/local.mk
|
|
||||||
@@ -616,7 +616,7 @@ all_tests = \
|
|
||||||
tests/ls/multihardlink.sh \
|
|
||||||
tests/ls/no-arg.sh \
|
|
||||||
tests/ls/no-cap.sh \
|
|
||||||
- tests/ls/proc-selinux-segfault.sh \
|
|
||||||
+ tests/ls/selinux-segfault.sh \
|
|
||||||
tests/ls/quote-align.sh \
|
|
||||||
tests/ls/readdir-mountpoint-inode.sh \
|
|
||||||
tests/ls/recursive.sh \
|
|
||||||
diff --git a/tests/ls/proc-selinux-segfault.sh b/tests/ls/selinux-segfault.sh
|
|
||||||
similarity index 77%
|
|
||||||
rename from tests/ls/proc-selinux-segfault.sh
|
|
||||||
rename to tests/ls/selinux-segfault.sh
|
|
||||||
index 831a00e..e2b7ef6 100755
|
|
||||||
--- a/tests/ls/proc-selinux-segfault.sh
|
|
||||||
+++ b/tests/ls/selinux-segfault.sh
|
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
#!/bin/sh
|
|
||||||
-# ls -l /proc/sys would segfault when built against libselinux1 2.0.15-2+b1
|
|
||||||
+# Ensure we don't segfault in selinux handling
|
|
||||||
|
|
||||||
# Copyright (C) 2008-2020 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
@@ -19,9 +19,15 @@
|
|
||||||
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
||||||
print_ver_ ls
|
|
||||||
|
|
||||||
+# ls -l /proc/sys would segfault when built against libselinux1 2.0.15-2+b1
|
|
||||||
f=/proc/sys
|
|
||||||
test -r $f || f=.
|
|
||||||
-
|
|
||||||
ls -l $f > out || fail=1
|
|
||||||
|
|
||||||
+# ls <= 8.32 would segfault when printing
|
|
||||||
+# the security context of broken symlink targets
|
|
||||||
+mkdir sedir || framework_failure_
|
|
||||||
+ln -sf missing sedir/broken || framework_failure_
|
|
||||||
+returns_ 1 ls -L -R -Z -m sedir > out || fail=1
|
|
||||||
+
|
|
||||||
Exit $fail
|
|
||||||
--
|
|
||||||
2.26.2
|
|
||||||
|
|
||||||
|
|
@ -1,186 +0,0 @@
|
||||||
From be77b4ab7cb68fd2daf9de90bd75d844392788ac Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
Date: Thu, 25 Mar 2021 11:57:56 +0100
|
|
||||||
Subject: [PATCH 1/4] ln: fix memory leaks in do_link
|
|
||||||
|
|
||||||
* src/ln.c (do_link): Free memory allocated by convert_abs_rel
|
|
||||||
on all code paths (Bug#47373).
|
|
||||||
|
|
||||||
Upstream-commit: 6e98f67758260579d7d44ea5f2df4c82d28c9f58
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/ln.c | 19 +++++++++++++------
|
|
||||||
1 file changed, 13 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/ln.c b/src/ln.c
|
|
||||||
index ffa278e..9b52602 100644
|
|
||||||
--- a/src/ln.c
|
|
||||||
+++ b/src/ln.c
|
|
||||||
@@ -229,14 +229,14 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
|
|
||||||
if (errno != ENOENT)
|
|
||||||
{
|
|
||||||
error (0, errno, _("failed to access %s"), quoteaf (dest));
|
|
||||||
- return false;
|
|
||||||
+ goto fail;
|
|
||||||
}
|
|
||||||
force = false;
|
|
||||||
}
|
|
||||||
else if (S_ISDIR (dest_stats.st_mode))
|
|
||||||
{
|
|
||||||
error (0, 0, _("%s: cannot overwrite directory"), quotef (dest));
|
|
||||||
- return false;
|
|
||||||
+ goto fail;
|
|
||||||
}
|
|
||||||
else if (seen_file (dest_set, dest, &dest_stats))
|
|
||||||
{
|
|
||||||
@@ -245,7 +245,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
|
|
||||||
error (0, 0,
|
|
||||||
_("will not overwrite just-created %s with %s"),
|
|
||||||
quoteaf_n (0, dest), quoteaf_n (1, source));
|
|
||||||
- return false;
|
|
||||||
+ goto fail;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@@ -274,7 +274,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
|
|
||||||
{
|
|
||||||
error (0, 0, _("%s and %s are the same file"),
|
|
||||||
quoteaf_n (0, source), quoteaf_n (1, dest));
|
|
||||||
- return false;
|
|
||||||
+ goto fail;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -285,7 +285,10 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
|
|
||||||
fprintf (stderr, _("%s: replace %s? "),
|
|
||||||
program_name, quoteaf (dest));
|
|
||||||
if (!yesno ())
|
|
||||||
- return true;
|
|
||||||
+ {
|
|
||||||
+ free(rel_source);
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (backup_type != no_backups)
|
|
||||||
@@ -304,7 +307,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
|
|
||||||
{
|
|
||||||
error (0, rename_errno, _("cannot backup %s"),
|
|
||||||
quoteaf (dest));
|
|
||||||
- return false;
|
|
||||||
+ goto fail;
|
|
||||||
}
|
|
||||||
force = false;
|
|
||||||
}
|
|
||||||
@@ -397,6 +400,10 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
|
|
||||||
free (backup_base);
|
|
||||||
free (rel_source);
|
|
||||||
return link_errno <= 0;
|
|
||||||
+
|
|
||||||
+fail:
|
|
||||||
+ free (rel_source);
|
|
||||||
+ return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
||||||
From c051578e69bd8acf8f8a469566ae34e855345532 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Thu, 25 Mar 2021 09:15:50 -0700
|
|
||||||
Subject: [PATCH 2/4] maint: indenting
|
|
||||||
|
|
||||||
* src/ln.c: Fix indenting.
|
|
||||||
|
|
||||||
Upstream-commit: 8980b7c898046d899646da01c296fd15f0cced21
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/ln.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/ln.c b/src/ln.c
|
|
||||||
index 9b52602..8881d6a 100644
|
|
||||||
--- a/src/ln.c
|
|
||||||
+++ b/src/ln.c
|
|
||||||
@@ -286,7 +286,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
|
|
||||||
program_name, quoteaf (dest));
|
|
||||||
if (!yesno ())
|
|
||||||
{
|
|
||||||
- free(rel_source);
|
|
||||||
+ free (rel_source);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -304,7 +304,7 @@ do_link (char const *source, int destdir_fd, char const *dest_base,
|
|
||||||
free (backup_base);
|
|
||||||
backup_base = NULL;
|
|
||||||
if (rename_errno != ENOENT)
|
|
||||||
- {
|
|
||||||
+ {
|
|
||||||
error (0, rename_errno, _("cannot backup %s"),
|
|
||||||
quoteaf (dest));
|
|
||||||
goto fail;
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
||||||
From 0d6a4afe5bee0e397fb2fc3b205a29b32a69af9d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Thu, 25 Mar 2021 09:16:36 -0700
|
|
||||||
Subject: [PATCH 3/4] hostname: use puts
|
|
||||||
|
|
||||||
* src/hostname.c (main): Prefer puts to printf "%s\n".
|
|
||||||
|
|
||||||
Upstream-commit: c7a588ac3632aae21642d4d568497177950d36bf
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/hostname.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/hostname.c b/src/hostname.c
|
|
||||||
index 0b5c0cf..62cc98c 100644
|
|
||||||
--- a/src/hostname.c
|
|
||||||
+++ b/src/hostname.c
|
|
||||||
@@ -103,7 +103,7 @@ main (int argc, char **argv)
|
|
||||||
hostname = xgethostname ();
|
|
||||||
if (hostname == NULL)
|
|
||||||
die (EXIT_FAILURE, errno, _("cannot determine hostname"));
|
|
||||||
- printf ("%s\n", hostname);
|
|
||||||
+ puts (hostname);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optind + 1 < argc)
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
||||||
From 19c98d2080251edbaad9fb271aa10ad34f953500 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
||||||
Date: Thu, 25 Mar 2021 11:20:18 -0700
|
|
||||||
Subject: [PATCH 4/4] hostname: pacify valgrind
|
|
||||||
|
|
||||||
* src/hostname.c (main) [IF_LINT]: Free hostname (Bug#47384).
|
|
||||||
|
|
||||||
Upstream-commit: 4698e284f37844bc9b9f63f00eb556ccaaed5030
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/hostname.c | 1 +
|
|
||||||
1 file changed, 1 insertion(+)
|
|
||||||
|
|
||||||
diff --git a/src/hostname.c b/src/hostname.c
|
|
||||||
index 62cc98c..7210248 100644
|
|
||||||
--- a/src/hostname.c
|
|
||||||
+++ b/src/hostname.c
|
|
||||||
@@ -104,6 +104,7 @@ main (int argc, char **argv)
|
|
||||||
if (hostname == NULL)
|
|
||||||
die (EXIT_FAILURE, errno, _("cannot determine hostname"));
|
|
||||||
puts (hostname);
|
|
||||||
+ IF_LINT (free (hostname));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optind + 1 < argc)
|
|
||||||
--
|
|
||||||
2.26.3
|
|
||||||
|
|
||||||
|
|
@ -1,104 +0,0 @@
|
||||||
From 09400b7f7f48d8eedc0df55de8073a43bc0aac96 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
|
||||||
Date: Tue, 27 Oct 2020 20:15:43 +0000
|
|
||||||
Subject: [PATCH 1/2] stat,tail: sync file system constants from the linux
|
|
||||||
kernel
|
|
||||||
|
|
||||||
* src/stat.c: Add magic constants for "devmem", and
|
|
||||||
"zonefs" file systems.
|
|
||||||
* NEWS: Mention the improvement.
|
|
||||||
|
|
||||||
Upstream-commit: ff80b6b0a0507e24f39cc1aad09d147f5187430b
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/stat.c | 4 ++++
|
|
||||||
1 file changed, 4 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/src/stat.c b/src/stat.c
|
|
||||||
index 5012622..8cd69da 100644
|
|
||||||
--- a/src/stat.c
|
|
||||||
+++ b/src/stat.c
|
|
||||||
@@ -347,6 +347,8 @@ human_fstype (STRUCT_STATVFS const *statfsbuf)
|
|
||||||
return "debugfs";
|
|
||||||
case S_MAGIC_DEVFS: /* 0x1373 local */
|
|
||||||
return "devfs";
|
|
||||||
+ case S_MAGIC_DEVMEM: /* 0x454D444D local */
|
|
||||||
+ return "devmem";
|
|
||||||
case S_MAGIC_DEVPTS: /* 0x1CD1 local */
|
|
||||||
return "devpts";
|
|
||||||
case S_MAGIC_DMA_BUF: /* 0x444D4142 local */
|
|
||||||
@@ -549,6 +551,8 @@ human_fstype (STRUCT_STATVFS const *statfsbuf)
|
|
||||||
return "z3fold";
|
|
||||||
case S_MAGIC_ZFS: /* 0x2FC12FC1 local */
|
|
||||||
return "zfs";
|
|
||||||
+ case S_MAGIC_ZONEFS: /* 0x5A4F4653 local */
|
|
||||||
+ return "zonefs";
|
|
||||||
case S_MAGIC_ZSMALLOC: /* 0x58295829 local */
|
|
||||||
return "zsmallocfs";
|
|
||||||
|
|
||||||
--
|
|
||||||
2.25.4
|
|
||||||
|
|
||||||
|
|
||||||
From d5948fd41013dfe4d2d10083111821667977c6d1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
|
||||||
Date: Tue, 27 Oct 2020 21:04:14 +0000
|
|
||||||
Subject: [PATCH 2/2] mountlist: recognize more file system types as remote
|
|
||||||
|
|
||||||
Sync "remote" file systems from stat.c in coreutils.
|
|
||||||
Note we only consider file systems that do not use host:resource
|
|
||||||
mount source. I.e. those that don't generally use a colon when
|
|
||||||
mounting, as that case is already considered. Searching for
|
|
||||||
"<fstype> /etc/fstab" was informative for identifying these.
|
|
||||||
The full list of "remote" file systems in coreutils is currently:
|
|
||||||
acfs afs ceph cifs coda fhgfs fuseblk fusectl
|
|
||||||
gfs gfs2 gpfs ibrix k-afs lustre novell nfs nfsd
|
|
||||||
ocfs2 panfs prl_fs smb smb2 snfs vboxsf vmhgfs vxfs
|
|
||||||
Note also we do not include virtual machine file systems,
|
|
||||||
as even though they're remote to the current kernel,
|
|
||||||
they are generally not distributed to separate hosts.
|
|
||||||
|
|
||||||
* lib/mountlist.c (ME_REMOTE): Sync previously unconsidered
|
|
||||||
"remote" file systems from stat.c in coreutils.
|
|
||||||
|
|
||||||
Upstream-commit: dd1fc46be12d671c1a9d9dc5a6fa8c766e99aa2f
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
lib/mountlist.c | 12 ++++++++++--
|
|
||||||
1 file changed, 10 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/mountlist.c b/lib/mountlist.c
|
|
||||||
index 7abe024..e0227b7 100644
|
|
||||||
--- a/lib/mountlist.c
|
|
||||||
+++ b/lib/mountlist.c
|
|
||||||
@@ -221,8 +221,9 @@ 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 (afs or auristorfs)
|
|
||||||
- or Fs_name is equal to "-hosts" (used by autofs to mount remote fs). */
|
|
||||||
+ or if it is of any other of the listed types
|
|
||||||
+ or Fs_name is equal to "-hosts" (used by autofs to mount remote fs).
|
|
||||||
+ "VM" file systems like prl_fs or vboxsf are not considered remote here. */
|
|
||||||
# define ME_REMOTE(Fs_name, Fs_type) \
|
|
||||||
(strchr (Fs_name, ':') != NULL \
|
|
||||||
|| ((Fs_name)[0] == '/' \
|
|
||||||
@@ -230,8 +231,15 @@ me_remote (char const *fs_name, char const *fs_type _GL_UNUSED)
|
|
||||||
&& (strcmp (Fs_type, "smbfs") == 0 \
|
|
||||||
|| strcmp (Fs_type, "smb3") == 0 \
|
|
||||||
|| strcmp (Fs_type, "cifs") == 0)) \
|
|
||||||
+ || strcmp (Fs_type, "acfs") == 0 \
|
|
||||||
|| strcmp (Fs_type, "afs") == 0 \
|
|
||||||
+ || strcmp (Fs_type, "coda") == 0 \
|
|
||||||
|| strcmp (Fs_type, "auristorfs") == 0 \
|
|
||||||
+ || strcmp (Fs_type, "fhgfs") == 0 \
|
|
||||||
+ || strcmp (Fs_type, "gpfs") == 0 \
|
|
||||||
+ || strcmp (Fs_type, "ibrix") == 0 \
|
|
||||||
+ || strcmp (Fs_type, "ocfs2") == 0 \
|
|
||||||
+ || strcmp (Fs_type, "vxfs") == 0 \
|
|
||||||
|| strcmp ("-hosts", Fs_name) == 0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
--
|
|
||||||
2.25.4
|
|
||||||
|
|
||||||
|
|
@ -1,109 +0,0 @@
|
||||||
From 11b37b65d08c2a8b6d967fd866ebbdbe7e864949 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nishant Nayan <nishant.nayan@oracle.com>
|
|
||||||
Date: Thu, 26 Nov 2020 14:35:17 +0000
|
|
||||||
Subject: [PATCH] rm: do not skip files upon failure to remove an empty dir
|
|
||||||
|
|
||||||
When removing a directory fails for some reason, and that directory
|
|
||||||
is empty, the rm_fts code gets the return value of the excise call
|
|
||||||
confused with the return value of its earlier call to prompt,
|
|
||||||
causing fts_skip_tree to be called again and the next file
|
|
||||||
that rm would otherwise have deleted to survive.
|
|
||||||
|
|
||||||
* src/remove.c (rm_fts): Ensure we only skip a single fts entry,
|
|
||||||
when processing empty dirs. I.e. only skip the entry
|
|
||||||
having successfully removed it.
|
|
||||||
* tests/rm/empty-immutable-skip.sh: New root-only test.
|
|
||||||
* tests/local.mk: Add it.
|
|
||||||
* NEWS: Mention the bug fix.
|
|
||||||
Fixes https://bugs.gnu.org/44883
|
|
||||||
|
|
||||||
Upstream-commit: 6bf108358a6104ec1c694c9530b3cd56b95f4b57
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/remove.c | 3 ++-
|
|
||||||
tests/local.mk | 1 +
|
|
||||||
tests/rm/empty-immutable-skip.sh | 46 ++++++++++++++++++++++++++++++++
|
|
||||||
3 files changed, 49 insertions(+), 1 deletion(-)
|
|
||||||
create mode 100755 tests/rm/empty-immutable-skip.sh
|
|
||||||
|
|
||||||
diff --git a/src/remove.c b/src/remove.c
|
|
||||||
index 2d40c55..adf9489 100644
|
|
||||||
--- a/src/remove.c
|
|
||||||
+++ b/src/remove.c
|
|
||||||
@@ -506,7 +506,8 @@ rm_fts (FTS *fts, FTSENT *ent, struct rm_options const *x)
|
|
||||||
/* When we know (from prompt when in interactive mode)
|
|
||||||
that this is an empty directory, don't prompt twice. */
|
|
||||||
s = excise (fts, ent, x, true);
|
|
||||||
- fts_skip_tree (fts, ent);
|
|
||||||
+ if (s == RM_OK)
|
|
||||||
+ fts_skip_tree (fts, ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s != RM_OK)
|
|
||||||
diff --git a/tests/local.mk b/tests/local.mk
|
|
||||||
index 5f7f775..2aeff2b 100644
|
|
||||||
--- a/tests/local.mk
|
|
||||||
+++ b/tests/local.mk
|
|
||||||
@@ -136,6 +136,7 @@ all_root_tests = \
|
|
||||||
tests/rm/no-give-up.sh \
|
|
||||||
tests/rm/one-file-system.sh \
|
|
||||||
tests/rm/read-only.sh \
|
|
||||||
+ tests/rm/empty-immutable-skip.sh \
|
|
||||||
tests/tail-2/append-only.sh \
|
|
||||||
tests/tail-2/end-of-device.sh \
|
|
||||||
tests/touch/now-owned-by-other.sh
|
|
||||||
diff --git a/tests/rm/empty-immutable-skip.sh b/tests/rm/empty-immutable-skip.sh
|
|
||||||
new file mode 100755
|
|
||||||
index 0000000..c91d8d4
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/rm/empty-immutable-skip.sh
|
|
||||||
@@ -0,0 +1,46 @@
|
|
||||||
+#!/bin/sh
|
|
||||||
+# Ensure that rm does not skip extra files after hitting an empty immutable dir.
|
|
||||||
+# Requires root access to do chattr +i, as well as an ext[23] or xfs file system
|
|
||||||
+
|
|
||||||
+# Copyright (C) 2020 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 <https://www.gnu.org/licenses/>.
|
|
||||||
+
|
|
||||||
+. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
|
||||||
+print_ver_ rm
|
|
||||||
+require_root_
|
|
||||||
+
|
|
||||||
+# These simple one-file operations are expected to work even in the
|
|
||||||
+# presence of this bug, and we need them to set up the rest of the test.
|
|
||||||
+chattr_i_works=1
|
|
||||||
+touch f
|
|
||||||
+chattr +i f 2>/dev/null || chattr_i_works=0
|
|
||||||
+rm f 2>/dev/null
|
|
||||||
+test -f f || chattr_i_works=0
|
|
||||||
+chattr -i f 2>/dev/null || chattr_i_works=0
|
|
||||||
+rm f 2>/dev/null || chattr_i_works=0
|
|
||||||
+test -f f && chattr_i_works=0
|
|
||||||
+
|
|
||||||
+if test $chattr_i_works = 0; then
|
|
||||||
+ skip_ "chattr +i doesn't work on this file system"
|
|
||||||
+fi
|
|
||||||
+
|
|
||||||
+mkdir empty || framework_failure_
|
|
||||||
+touch x y || framework_failure_
|
|
||||||
+chattr +i empty || framework_failure_
|
|
||||||
+rm -rf empty x y
|
|
||||||
+{ test -f x || test -f y; } && fail=1
|
|
||||||
+chattr -i empty
|
|
||||||
+
|
|
||||||
+Exit $fail
|
|
||||||
--
|
|
||||||
2.26.2
|
|
||||||
|
|
||||||
|
|
@ -1,100 +0,0 @@
|
||||||
From bb0e7fabcaed9a7e71e30f05e638e9f243cdb13e Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
|
||||||
Date: Mon, 25 Jan 2021 14:12:48 +0000
|
|
||||||
Subject: [PATCH] split: fix --number=K/N to output correct part of file
|
|
||||||
|
|
||||||
This functionality regressed with the adjustments
|
|
||||||
in commit v8.25-4-g62e7af032
|
|
||||||
|
|
||||||
* src/split.c (bytes_chunk_extract): Account for already read data
|
|
||||||
when seeking into the file.
|
|
||||||
* tests/split/b-chunk.sh: Use the hidden ---io-blksize option,
|
|
||||||
to test this functionality.
|
|
||||||
Fixes https://bugs.gnu.org/46048
|
|
||||||
|
|
||||||
Upstream-commit: bb21daa125aeb4e32546309d370918ca47e612db
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/split.c | 2 +-
|
|
||||||
tests/split/b-chunk.sh | 45 ++++++++++++++++++++++++------------------
|
|
||||||
2 files changed, 27 insertions(+), 20 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/split.c b/src/split.c
|
|
||||||
index 09e610b..19248f6 100644
|
|
||||||
--- a/src/split.c
|
|
||||||
+++ b/src/split.c
|
|
||||||
@@ -1001,7 +1001,7 @@ bytes_chunk_extract (uintmax_t k, uintmax_t n, char *buf, size_t bufsize,
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- if (lseek (STDIN_FILENO, start, SEEK_CUR) < 0)
|
|
||||||
+ if (lseek (STDIN_FILENO, start - initial_read, SEEK_CUR) < 0)
|
|
||||||
die (EXIT_FAILURE, errno, "%s", quotef (infile));
|
|
||||||
initial_read = SIZE_MAX;
|
|
||||||
}
|
|
||||||
diff --git a/tests/split/b-chunk.sh b/tests/split/b-chunk.sh
|
|
||||||
index 864ce55..39a6799 100755
|
|
||||||
--- a/tests/split/b-chunk.sh
|
|
||||||
+++ b/tests/split/b-chunk.sh
|
|
||||||
@@ -35,32 +35,39 @@ split -e -n 10 /dev/null || fail=1
|
|
||||||
returns_ 1 stat x?? 2>/dev/null || fail=1
|
|
||||||
|
|
||||||
printf '1\n2\n3\n4\n5\n' > input || framework_failure_
|
|
||||||
+printf '1\n2' > exp-1 || framework_failure_
|
|
||||||
+printf '\n3\n' > exp-2 || framework_failure_
|
|
||||||
+printf '4\n5\n' > exp-3 || framework_failure_
|
|
||||||
|
|
||||||
for file in input /proc/version /sys/kernel/profiling; do
|
|
||||||
test -f $file || continue
|
|
||||||
|
|
||||||
- split -n 3 $file > out || fail=1
|
|
||||||
- split -n 1/3 $file > b1 || fail=1
|
|
||||||
- split -n 2/3 $file > b2 || fail=1
|
|
||||||
- split -n 3/3 $file > b3 || fail=1
|
|
||||||
+ for blksize in 1 2 4096; do
|
|
||||||
+ if ! test "$file" = 'input'; then
|
|
||||||
+ # For /proc like files we must be able to read all
|
|
||||||
+ # into the internal buffer to be able to determine size.
|
|
||||||
+ test "$blksize" = 4096 || continue
|
|
||||||
+ fi
|
|
||||||
|
|
||||||
- case $file in
|
|
||||||
- input)
|
|
||||||
- printf '1\n2' > exp-1
|
|
||||||
- printf '\n3\n' > exp-2
|
|
||||||
- printf '4\n5\n' > exp-3
|
|
||||||
+ split -n 3 ---io-blksize=$blksize $file > out || fail=1
|
|
||||||
+ split -n 1/3 ---io-blksize=$blksize $file > b1 || fail=1
|
|
||||||
+ split -n 2/3 ---io-blksize=$blksize $file > b2 || fail=1
|
|
||||||
+ split -n 3/3 ---io-blksize=$blksize $file > b3 || fail=1
|
|
||||||
|
|
||||||
- compare exp-1 xaa || fail=1
|
|
||||||
- compare exp-2 xab || fail=1
|
|
||||||
- compare exp-3 xac || fail=1
|
|
||||||
- ;;
|
|
||||||
- esac
|
|
||||||
+ case $file in
|
|
||||||
+ input)
|
|
||||||
+ compare exp-1 xaa || fail=1
|
|
||||||
+ compare exp-2 xab || fail=1
|
|
||||||
+ compare exp-3 xac || fail=1
|
|
||||||
+ ;;
|
|
||||||
+ esac
|
|
||||||
|
|
||||||
- compare xaa b1 || fail=1
|
|
||||||
- compare xab b2 || fail=1
|
|
||||||
- compare xac b3 || fail=1
|
|
||||||
- cat xaa xab xac | compare - $file || fail=1
|
|
||||||
- test -f xad && fail=1
|
|
||||||
+ compare xaa b1 || fail=1
|
|
||||||
+ compare xab b2 || fail=1
|
|
||||||
+ compare xac b3 || fail=1
|
|
||||||
+ cat xaa xab xac | compare - $file || fail=1
|
|
||||||
+ test -f xad && fail=1
|
|
||||||
+ done
|
|
||||||
done
|
|
||||||
|
|
||||||
Exit $fail
|
|
||||||
--
|
|
||||||
2.26.2
|
|
||||||
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
From b87f944c87ffe04db6e5476b007a8e4979de933d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
Date: Thu, 18 Feb 2021 11:18:04 +0100
|
|
||||||
Subject: [PATCH] stat,tail: add support for the exfat file system
|
|
||||||
|
|
||||||
Bug: https://bugzilla.redhat.com/1921427
|
|
||||||
|
|
||||||
* src/stat.c (human_fstype): Add case for the 'exfat' file system type.
|
|
||||||
Fixes https://bugs.gnu.org/46613
|
|
||||||
|
|
||||||
Upstream-commit: a5e0d8f387e81e854427addbbaf2504541bbf4b9
|
|
||||||
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
|
|
||||||
---
|
|
||||||
src/stat.c | 2 ++
|
|
||||||
1 file changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/src/stat.c b/src/stat.c
|
|
||||||
index 8cd69da..4e1c8e3 100644
|
|
||||||
--- a/src/stat.c
|
|
||||||
+++ b/src/stat.c
|
|
||||||
@@ -361,6 +361,8 @@ human_fstype (STRUCT_STATVFS const *statfsbuf)
|
|
||||||
return "efs";
|
|
||||||
case S_MAGIC_EROFS_V1: /* 0xE0F5E1E2 local */
|
|
||||||
return "erofs";
|
|
||||||
+ case S_MAGIC_EXFAT: /* 0x2011BAB0 local */
|
|
||||||
+ return "exfat";
|
|
||||||
case S_MAGIC_EXFS: /* 0x45584653 local */
|
|
||||||
return "exfs";
|
|
||||||
case S_MAGIC_EXOFS: /* 0x5DF5 local */
|
|
||||||
--
|
|
||||||
2.26.2
|
|
||||||
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iQIzBAABCAAdFiEEbDfcEhIaUAa8HbgE32/ZcTBgN9kFAl5hC5MACgkQ32/ZcTBg
|
|
||||||
N9n92Q//Td2GE1f8AZKkxCNI76Q/TqbxAwhjbkR+KdzvsyMePmgHcMgHG6sO2MNF
|
|
||||||
g6DIBmHpO3vWGzvUxUZRRhuW5QBOnMxHb/WXZ0p/g45d5MQdn4i0dA0wUJgByOqn
|
|
||||||
/WVfygNg9mrWFx/uTeCdhrwL11m71C7j/eQVu7Wr5DIb20VJ8+nVC2IWW33ZvxRj
|
|
||||||
Goa0wwDpeeD9qYe/Y+E5ZyhDYHJGRmNAlS03SXLO3+RfsbZFwdQEtzvr+v1VN6/S
|
|
||||||
9OsoI/GLdRjY1tByppaoZ63ZybB6iF5zZfJiWDF7Nw4MduJpjZQDSywiNleJ9vOi
|
|
||||||
fwR1180PjMV6aTXvPwqbqQxZjDl7nqvO36ghlTvErJbqdJVIYxmUGNjeJyjqI85l
|
|
||||||
Lhckh0GWos9K/kl13Ry9KWsxNQgfjNhtgjXGh+W47ojrho2kCiK5BTwDFeVU0jtU
|
|
||||||
H/1EePSGAIUF/Sfjz3rmGgLaaBwPiRiyzEIuZMyd4NCJWwfOTqgOshOYw15GCWYq
|
|
||||||
wGesN/4LWzEja7Au5lHP7imXjP0bp4qE/sYrOb4WzVVLCn+z2hu6SEIzjJzSm+D+
|
|
||||||
8Wv3Ia1/ypVpR+Z7gUt7VtEvI8zAwlySd/6Jw5U7TL0rzvZsTVWmCvEjPp+o3jCB
|
|
||||||
Fy/4ybao1gowBFtT1AtPMmxmiJ41KWCxLFrTuGJpFYCGvBH2y8s=
|
|
||||||
=yHV6
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
|
|
||||||
index 400e135..47e4480 100644
|
|
||||||
--- a/doc/coreutils.texi
|
|
||||||
+++ b/doc/coreutils.texi
|
|
||||||
@@ -10074,6 +10074,8 @@ incorrect. @xref{Directory Setuid and Setgid}, for how the
|
|
||||||
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
|
|
||||||
28
coreutils-9.9-fix-cut-test-aarch64.patch
Normal file
28
coreutils-9.9-fix-cut-test-aarch64.patch
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
From 95044cb5eaea83d02f768feb5ab79fcf5e6ad782 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?P=C3=A1draig=20Brady?= <P@draigBrady.com>
|
||||||
|
Date: Mon, 22 Dec 2025 17:12:48 +0000
|
||||||
|
Subject: [PATCH] tests: avoid false failure due to ulimit on aarch64
|
||||||
|
|
||||||
|
* tests/cut/cut-huge-range.sh: Add an extra 1MiB headroom,
|
||||||
|
which was seen with aarch64.
|
||||||
|
Reported at https://bugzilla.redhat.com/2424302
|
||||||
|
|
||||||
|
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
|
||||||
|
Upstream-commit: 95044cb5eaea83d02f768feb5ab79fcf5e6ad782
|
||||||
|
---
|
||||||
|
tests/cut/cut-huge-range.sh | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/tests/cut/cut-huge-range.sh b/tests/cut/cut-huge-range.sh
|
||||||
|
index 4bd1b129d8..98d7e8f0b9 100755
|
||||||
|
--- a/tests/cut/cut-huge-range.sh
|
||||||
|
+++ b/tests/cut/cut-huge-range.sh
|
||||||
|
@@ -22,6 +22,7 @@ getlimits_
|
||||||
|
|
||||||
|
vm=$(get_min_ulimit_v_ returns_ 0 cut -b1 /dev/null) \
|
||||||
|
|| skip_ 'shell lacks ulimit, or ASAN enabled'
|
||||||
|
+vm=$(($vm+1000)) # https://bugzilla.redhat.com/2424302
|
||||||
|
|
||||||
|
# Ensure we can cut up to our sentinel value.
|
||||||
|
# Don't use expr to subtract one,
|
||||||
|
|
||||||
169
coreutils-9.9-gnulib-c23.patch
Normal file
169
coreutils-9.9-gnulib-c23.patch
Normal file
|
|
@ -0,0 +1,169 @@
|
||||||
|
From 891761bca1aa78336e5b18c121075b6e4696c5d4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
Date: Sun, 23 Nov 2025 00:50:40 -0800
|
||||||
|
Subject: [PATCH] Port to C23 qualifier-generic fns like strchr
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This ports Gnulib to strict C23 platforms that reject code
|
||||||
|
like ‘char *q = strchr (P, 'x');’ when P is a pointer to const,
|
||||||
|
because in C23 strchr is a qualifier-generic function so
|
||||||
|
strchr (P, 'x') returns char const *.
|
||||||
|
This patch does not attempt to do the following two things,
|
||||||
|
which might be useful in the future:
|
||||||
|
1. When compiling on non-C23 platforms, check user code for
|
||||||
|
portability to platforms that define qualifier-generic functions.
|
||||||
|
2. Port Gnulib to platforms that have qualifier-generic functions
|
||||||
|
not listed in the C23 standard, e.g., strchrnul. I don’t know
|
||||||
|
of any such platforms.
|
||||||
|
* lib/mbschr.c (mbschr):
|
||||||
|
* lib/memchr2.c (memchr2):
|
||||||
|
Port to C23, where functions like strchr are qualifier-generic.
|
||||||
|
* lib/c++defs.h (_GL_FUNCDECL_SYS_NAME): New macro.
|
||||||
|
* lib/c++defs.h (_GL_FUNCDECL_SYS):
|
||||||
|
* lib/stdlib.in.h (bsearch):
|
||||||
|
Use it, to prevent C23 names like strchr from acting like macros.
|
||||||
|
* lib/string.in.h (memchr, strchr, strpbrk, strrchr):
|
||||||
|
Do not #undef when GNULIB_POSIXCHECK is defined, as this could
|
||||||
|
cause conforming C23 code to fail to conform. It’s not clear why
|
||||||
|
_GL_WARN_ON_USE_CXX; perhaps it was needed but isn’t any more?
|
||||||
|
But for now, limit the removal of #undef to these four functions
|
||||||
|
where #undeffing is clearly undesirable in C23.
|
||||||
|
* lib/wchar.in.h (wmemchr): Parenthesize function name in decl,
|
||||||
|
to prevent it from acting like a macro.
|
||||||
|
|
||||||
|
Cherry-picked-by: Lukáš Zaoral <lzaoral@redhat.com>
|
||||||
|
Upstream-commit: df17f4f37ed3ca373d23ad42eae51122bdb96626
|
||||||
|
---
|
||||||
|
lib/c++defs.h | 12 +++++++++++-
|
||||||
|
lib/mbschr.c | 2 +-
|
||||||
|
lib/memchr2.c | 2 +-
|
||||||
|
lib/stdlib.in.h | 6 +++---
|
||||||
|
lib/string.in.h | 4 ----
|
||||||
|
lib/wchar.in.h | 2 +-
|
||||||
|
6 files changed, 17 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/c++defs.h b/lib/c++defs.h
|
||||||
|
index b77979a..7384457 100644
|
||||||
|
--- a/lib/c++defs.h
|
||||||
|
+++ b/lib/c++defs.h
|
||||||
|
@@ -127,6 +127,16 @@
|
||||||
|
#define _GL_FUNCDECL_RPL_1(rpl_func,rettype,parameters,...) \
|
||||||
|
_GL_EXTERN_C_FUNC __VA_ARGS__ rettype rpl_func parameters
|
||||||
|
|
||||||
|
+/* _GL_FUNCDECL_SYS_NAME (func) expands to plain func if C++, and to
|
||||||
|
+ parenthsized func otherwise. Parenthesization is needed in C23 if
|
||||||
|
+ the function is like strchr and so is a qualifier-generic macro
|
||||||
|
+ that expands to something more complicated. */
|
||||||
|
+#ifdef __cplusplus
|
||||||
|
+# define _GL_FUNCDECL_SYS_NAME(func) func
|
||||||
|
+#else
|
||||||
|
+# define _GL_FUNCDECL_SYS_NAME(func) (func)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* _GL_FUNCDECL_SYS (func, rettype, parameters, [attributes]);
|
||||||
|
declares the system function, named func, with the given prototype,
|
||||||
|
consisting of return type, parameters, and attributes.
|
||||||
|
@@ -139,7 +149,7 @@
|
||||||
|
_GL_FUNCDECL_SYS (posix_openpt, int, (int flags), _GL_ATTRIBUTE_NODISCARD);
|
||||||
|
*/
|
||||||
|
#define _GL_FUNCDECL_SYS(func,rettype,parameters,...) \
|
||||||
|
- _GL_EXTERN_C_FUNC __VA_ARGS__ rettype func parameters
|
||||||
|
+ _GL_EXTERN_C_FUNC __VA_ARGS__ rettype _GL_FUNCDECL_SYS_NAME (func) parameters
|
||||||
|
|
||||||
|
/* _GL_CXXALIAS_RPL (func, rettype, parameters);
|
||||||
|
declares a C++ alias called GNULIB_NAMESPACE::func
|
||||||
|
diff --git a/lib/mbschr.c b/lib/mbschr.c
|
||||||
|
index c9e14b5..6582134 100644
|
||||||
|
--- a/lib/mbschr.c
|
||||||
|
+++ b/lib/mbschr.c
|
||||||
|
@@ -65,5 +65,5 @@ mbschr (const char *string, int c)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- return strchr (string, c);
|
||||||
|
+ return (char *) strchr (string, c);
|
||||||
|
}
|
||||||
|
diff --git a/lib/memchr2.c b/lib/memchr2.c
|
||||||
|
index 7493823..d7724ae 100644
|
||||||
|
--- a/lib/memchr2.c
|
||||||
|
+++ b/lib/memchr2.c
|
||||||
|
@@ -55,7 +55,7 @@ memchr2 (void const *s, int c1_in, int c2_in, size_t n)
|
||||||
|
c2 = (unsigned char) c2_in;
|
||||||
|
|
||||||
|
if (c1 == c2)
|
||||||
|
- return memchr (s, c1, n);
|
||||||
|
+ return (void *) memchr (s, c1, n);
|
||||||
|
|
||||||
|
/* Handle the first few bytes by reading one byte at a time.
|
||||||
|
Do this until VOID_PTR is aligned on a longword boundary. */
|
||||||
|
diff --git a/lib/stdlib.in.h b/lib/stdlib.in.h
|
||||||
|
index bef0aaa..fd0e1e0 100644
|
||||||
|
--- a/lib/stdlib.in.h
|
||||||
|
+++ b/lib/stdlib.in.h
|
||||||
|
@@ -224,9 +224,9 @@ _GL_INLINE_HEADER_BEGIN
|
||||||
|
|
||||||
|
/* Declarations for ISO C N3322. */
|
||||||
|
#if defined __GNUC__ && __GNUC__ >= 15 && !defined __clang__
|
||||||
|
-_GL_EXTERN_C void *bsearch (const void *__key,
|
||||||
|
- const void *__base, size_t __nmemb, size_t __size,
|
||||||
|
- int (*__compare) (const void *, const void *))
|
||||||
|
+_GL_EXTERN_C void *_GL_FUNCDECL_SYS_NAME (bsearch)
|
||||||
|
+ (const void *__key, const void *__base, size_t __nmemb, size_t __size,
|
||||||
|
+ int (*__compare) (const void *, const void *))
|
||||||
|
_GL_ATTRIBUTE_NONNULL_IF_NONZERO (2, 3) _GL_ARG_NONNULL ((5));
|
||||||
|
_GL_EXTERN_C void qsort (void *__base, size_t __nmemb, size_t __size,
|
||||||
|
int (*__compare) (const void *, const void *))
|
||||||
|
diff --git a/lib/string.in.h b/lib/string.in.h
|
||||||
|
index fdcdd21..8b56acf 100644
|
||||||
|
--- a/lib/string.in.h
|
||||||
|
+++ b/lib/string.in.h
|
||||||
|
@@ -409,7 +409,6 @@ _GL_CXXALIASWARN1 (memchr, void const *,
|
||||||
|
_GL_CXXALIASWARN (memchr);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
-# undef memchr
|
||||||
|
/* Assume memchr is always declared. */
|
||||||
|
_GL_WARN_ON_USE (memchr, "memchr has platform-specific bugs - "
|
||||||
|
"use gnulib module memchr for portability" );
|
||||||
|
@@ -674,7 +673,6 @@ _GL_WARN_ON_USE (stpncpy, "stpncpy is unportable - "
|
||||||
|
#if defined GNULIB_POSIXCHECK
|
||||||
|
/* strchr() does not work with multibyte strings if the locale encoding is
|
||||||
|
GB18030 and the character to be searched is a digit. */
|
||||||
|
-# undef strchr
|
||||||
|
/* Assume strchr is always declared. */
|
||||||
|
_GL_WARN_ON_USE_CXX (strchr,
|
||||||
|
const char *, char *, (const char *, int),
|
||||||
|
@@ -981,7 +979,6 @@ _GL_CXXALIASWARN (strpbrk);
|
||||||
|
Even in this simple case, it does not work with multibyte strings if the
|
||||||
|
locale encoding is GB18030 and one of the characters to be searched is a
|
||||||
|
digit. */
|
||||||
|
-# undef strpbrk
|
||||||
|
_GL_WARN_ON_USE_CXX (strpbrk,
|
||||||
|
const char *, char *, (const char *, const char *),
|
||||||
|
"strpbrk cannot work correctly on character strings "
|
||||||
|
@@ -1011,7 +1008,6 @@ _GL_WARN_ON_USE (strspn, "strspn cannot work correctly on character strings "
|
||||||
|
#if defined GNULIB_POSIXCHECK
|
||||||
|
/* strrchr() does not work with multibyte strings if the locale encoding is
|
||||||
|
GB18030 and the character to be searched is a digit. */
|
||||||
|
-# undef strrchr
|
||||||
|
/* Assume strrchr is always declared. */
|
||||||
|
_GL_WARN_ON_USE_CXX (strrchr,
|
||||||
|
const char *, char *, (const char *, int),
|
||||||
|
diff --git a/lib/wchar.in.h b/lib/wchar.in.h
|
||||||
|
index ab602a2..6be4515 100644
|
||||||
|
--- a/lib/wchar.in.h
|
||||||
|
+++ b/lib/wchar.in.h
|
||||||
|
@@ -301,7 +301,7 @@ _GL_EXTERN_C int wcsncmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n)
|
||||||
|
_GL_ATTRIBUTE_NONNULL_IF_NONZERO (1, 3)
|
||||||
|
_GL_ATTRIBUTE_NONNULL_IF_NONZERO (2, 3);
|
||||||
|
# ifndef __cplusplus
|
||||||
|
-_GL_EXTERN_C wchar_t *wmemchr (const wchar_t *__s, wchar_t __wc, size_t __n)
|
||||||
|
+_GL_EXTERN_C wchar_t *(wmemchr) (const wchar_t *__s, wchar_t __wc, size_t __n)
|
||||||
|
_GL_ATTRIBUTE_NONNULL_IF_NONZERO (1, 3);
|
||||||
|
# endif
|
||||||
|
_GL_EXTERN_C wchar_t *wmemset (wchar_t *__s, wchar_t __wc, size_t __n)
|
||||||
|
--
|
||||||
|
2.52.0
|
||||||
|
|
||||||
|
|
@ -15,11 +15,6 @@ alias l. 'ls -d .*'
|
||||||
set COLORS=/etc/DIR_COLORS
|
set COLORS=/etc/DIR_COLORS
|
||||||
|
|
||||||
if ($?TERM) then
|
if ($?TERM) then
|
||||||
if ( -e "/etc/DIR_COLORS.256color" && -e "/usr/bin/tput" ) then
|
|
||||||
if ( "`/usr/bin/tput colors`" == "256" ) then
|
|
||||||
set COLORS=/etc/DIR_COLORS.256color
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
if ( -e "/etc/DIR_COLORS.$TERM" ) then
|
if ( -e "/etc/DIR_COLORS.$TERM" ) then
|
||||||
set COLORS="/etc/DIR_COLORS.$TERM"
|
set COLORS="/etc/DIR_COLORS.$TERM"
|
||||||
endif
|
endif
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,6 @@ if [ -z "$USER_LS_COLORS" ]; then
|
||||||
[ -z "$COLORS" ] && [ -e "/etc/DIR_COLORS.$TERM" ] && \
|
[ -z "$COLORS" ] && [ -e "/etc/DIR_COLORS.$TERM" ] && \
|
||||||
COLORS="/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" ] && \
|
[ -z "$COLORS" ] && [ -e "/etc/DIR_COLORS" ] && \
|
||||||
COLORS="/etc/DIR_COLORS"
|
COLORS="/etc/DIR_COLORS"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,20 @@
|
||||||
|
From 91be1a584108a6a3d96f64382bbf206c4213b3db Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kamil Dudka <kdudka@redhat.com>
|
||||||
|
Date: Mon, 29 Mar 2010 17:20:34 +0000
|
||||||
|
Subject: [PATCH] coreutils-df-direct.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
doc/coreutils.texi | 7 ++++++
|
||||||
|
src/df.c | 34 ++++++++++++++++++++++++++--
|
||||||
|
tests/df/direct.sh | 55 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 94 insertions(+), 2 deletions(-)
|
||||||
|
create mode 100755 tests/df/direct.sh
|
||||||
|
|
||||||
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
|
diff --git a/doc/coreutils.texi b/doc/coreutils.texi
|
||||||
index a507280..400e135 100644
|
index b420606..0ccb368 100644
|
||||||
--- a/doc/coreutils.texi
|
--- a/doc/coreutils.texi
|
||||||
+++ b/doc/coreutils.texi
|
+++ b/doc/coreutils.texi
|
||||||
@@ -11303,6 +11303,13 @@ some systems (notably SunOS), doing this yields more up to date results,
|
@@ -12597,6 +12597,13 @@ some systems (notably Solaris), doing this yields more up to date results,
|
||||||
but in general this option makes @command{df} much slower, especially when
|
but in general this option makes @command{df} much slower, especially when
|
||||||
there are many or very busy file systems.
|
there are many or very busy file systems.
|
||||||
|
|
||||||
|
|
@ -15,12 +27,12 @@ index a507280..400e135 100644
|
||||||
+
|
+
|
||||||
@item --total
|
@item --total
|
||||||
@opindex --total
|
@opindex --total
|
||||||
@cindex grand total of disk size, usage and available space
|
@cindex grand total of file system size, usage and available space
|
||||||
diff --git a/src/df.c b/src/df.c
|
diff --git a/src/df.c b/src/df.c
|
||||||
index 8f760db..a7385fd 100644
|
index 75e638c..ef9f0a7 100644
|
||||||
--- a/src/df.c
|
--- a/src/df.c
|
||||||
+++ b/src/df.c
|
+++ b/src/df.c
|
||||||
@@ -120,6 +120,9 @@ static bool print_type;
|
@@ -121,6 +121,9 @@ static bool print_type;
|
||||||
/* If true, print a grand total at the end. */
|
/* If true, print a grand total at the end. */
|
||||||
static bool print_grand_total;
|
static bool print_grand_total;
|
||||||
|
|
||||||
|
|
@ -30,7 +42,7 @@ index 8f760db..a7385fd 100644
|
||||||
/* Grand total data. */
|
/* Grand total data. */
|
||||||
static struct fs_usage grand_fsu;
|
static struct fs_usage grand_fsu;
|
||||||
|
|
||||||
@@ -247,13 +250,15 @@ enum
|
@@ -248,13 +251,15 @@ enum
|
||||||
NO_SYNC_OPTION = CHAR_MAX + 1,
|
NO_SYNC_OPTION = CHAR_MAX + 1,
|
||||||
SYNC_OPTION,
|
SYNC_OPTION,
|
||||||
TOTAL_OPTION,
|
TOTAL_OPTION,
|
||||||
|
|
@ -41,16 +53,16 @@ index 8f760db..a7385fd 100644
|
||||||
|
|
||||||
static struct option const long_options[] =
|
static struct option const long_options[] =
|
||||||
{
|
{
|
||||||
{"all", no_argument, NULL, 'a'},
|
{"all", no_argument, nullptr, 'a'},
|
||||||
{"block-size", required_argument, NULL, 'B'},
|
{"block-size", required_argument, nullptr, 'B'},
|
||||||
+ {"direct", no_argument, NULL, DIRECT_OPTION},
|
+ {"direct", no_argument, nullptr, DIRECT_OPTION},
|
||||||
{"inodes", no_argument, NULL, 'i'},
|
{"inodes", no_argument, nullptr, 'i'},
|
||||||
{"human-readable", no_argument, NULL, 'h'},
|
{"human-readable", no_argument, nullptr, 'h'},
|
||||||
{"si", no_argument, NULL, 'H'},
|
{"si", no_argument, nullptr, 'H'},
|
||||||
@@ -509,7 +514,10 @@ get_header (void)
|
@@ -571,7 +576,10 @@ get_header (void)
|
||||||
for (col = 0; col < ncolumns; col++)
|
for (idx_t col = 0; col < ncolumns; col++)
|
||||||
{
|
{
|
||||||
char *cell = NULL;
|
char *cell;
|
||||||
- char const *header = _(columns[col]->caption);
|
- char const *header = _(columns[col]->caption);
|
||||||
+ char const *header = (columns[col]->field == TARGET_FIELD
|
+ char const *header = (columns[col]->field == TARGET_FIELD
|
||||||
+ && direct_statfs)?
|
+ && direct_statfs)?
|
||||||
|
|
@ -59,7 +71,7 @@ index 8f760db..a7385fd 100644
|
||||||
|
|
||||||
if (columns[col]->field == SIZE_FIELD
|
if (columns[col]->field == SIZE_FIELD
|
||||||
&& (header_mode == DEFAULT_MODE
|
&& (header_mode == DEFAULT_MODE
|
||||||
@@ -1397,6 +1405,19 @@ get_point (const char *point, const struct stat *statp)
|
@@ -1446,6 +1454,17 @@ get_point (char const *point, const struct stat *statp)
|
||||||
static void
|
static void
|
||||||
get_entry (char const *name, struct stat const *statp)
|
get_entry (char const *name, struct stat const *statp)
|
||||||
{
|
{
|
||||||
|
|
@ -67,19 +79,17 @@ index 8f760db..a7385fd 100644
|
||||||
+ {
|
+ {
|
||||||
+ char *resolved = canonicalize_file_name (name);
|
+ char *resolved = canonicalize_file_name (name);
|
||||||
+ if (resolved)
|
+ if (resolved)
|
||||||
+ {
|
+ {
|
||||||
+ char *mp = find_mount_point (name, statp);
|
+ get_dev (NULL, resolved, name, NULL, NULL, false, false, NULL, false);
|
||||||
+ get_dev (NULL, mp, resolved, NULL, NULL, false, false, NULL, false);
|
+ free (resolved);
|
||||||
+ free(mp);
|
+ return;
|
||||||
+ free (resolved);
|
+ }
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
if ((S_ISBLK (statp->st_mode) || S_ISCHR (statp->st_mode))
|
if ((S_ISBLK (statp->st_mode) || S_ISCHR (statp->st_mode))
|
||||||
&& get_disk (name))
|
&& get_device (name))
|
||||||
return;
|
return;
|
||||||
@@ -1467,6 +1488,7 @@ or all file systems by default.\n\
|
@@ -1516,6 +1535,7 @@ or all file systems by default.\n\
|
||||||
-B, --block-size=SIZE scale sizes by SIZE before printing them; e.g.,\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\
|
'-BM' prints sizes in units of 1,048,576 bytes;\n\
|
||||||
see SIZE format below\n\
|
see SIZE format below\n\
|
||||||
|
|
@ -87,7 +97,7 @@ index 8f760db..a7385fd 100644
|
||||||
-h, --human-readable print sizes in powers of 1024 (e.g., 1023M)\n\
|
-h, --human-readable print sizes in powers of 1024 (e.g., 1023M)\n\
|
||||||
-H, --si print sizes in powers of 1000 (e.g., 1.1G)\n\
|
-H, --si print sizes in powers of 1000 (e.g., 1.1G)\n\
|
||||||
"), stdout);
|
"), stdout);
|
||||||
@@ -1557,6 +1579,9 @@ main (int argc, char **argv)
|
@@ -1610,6 +1630,9 @@ main (int argc, char **argv)
|
||||||
xstrtol_fatal (e, oi, c, long_options, optarg);
|
xstrtol_fatal (e, oi, c, long_options, optarg);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -97,14 +107,14 @@ index 8f760db..a7385fd 100644
|
||||||
case 'i':
|
case 'i':
|
||||||
if (header_mode == OUTPUT_MODE)
|
if (header_mode == OUTPUT_MODE)
|
||||||
{
|
{
|
||||||
@@ -1653,6 +1678,13 @@ main (int argc, char **argv)
|
@@ -1706,6 +1729,13 @@ main (int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ if (direct_statfs && show_local_fs)
|
+ if (direct_statfs && show_local_fs)
|
||||||
+ {
|
+ {
|
||||||
+ error (0, 0, _("options --direct and --local (-l) are mutually "
|
+ error (0, 0, _("options --direct and --local (-l) are mutually "
|
||||||
+ "exclusive"));
|
+ "exclusive"));
|
||||||
+ usage (EXIT_FAILURE);
|
+ usage (EXIT_FAILURE);
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
|
@ -172,3 +182,6 @@ index 0000000..8e4cfb8
|
||||||
+compare file_out file_exp || fail=1
|
+compare file_out file_exp || fail=1
|
||||||
+
|
+
|
||||||
+Exit $fail
|
+Exit $fail
|
||||||
|
--
|
||||||
|
2.52.0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,94 +0,0 @@
|
||||||
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>
|
|
||||||
@@ -126,3 +129,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
|
|
||||||
@@ -31,6 +31,7 @@
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "getugroups.h"
|
|
||||||
+#include "xalloc.h"
|
|
||||||
#include "xalloc-oversized.h"
|
|
||||||
|
|
||||||
/* Work around an incompatibility of OS X 10.11: getgrouplist
|
|
||||||
@@ -121,9 +122,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.
|
|
||||||
@@ -145,10 +154,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
|
|
||||||
@@ -82,6 +82,7 @@ AC_DEFUN([coreutils_MACROS],
|
|
||||||
fchown
|
|
||||||
fchmod
|
|
||||||
ftruncate
|
|
||||||
+ getgrouplist
|
|
||||||
iswspace
|
|
||||||
mkfifo
|
|
||||||
mbrlen
|
|
||||||
|
|
@ -1,565 +0,0 @@
|
||||||
diff --git a/src/cut.c b/src/cut.c
|
|
||||||
index 7ab6be4..022d0ad 100644
|
|
||||||
--- a/src/cut.c
|
|
||||||
+++ b/src/cut.c
|
|
||||||
@@ -28,6 +28,11 @@
|
|
||||||
#include <assert.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
+
|
|
||||||
+/* Get mbstate_t, mbrtowc(). */
|
|
||||||
+#if HAVE_WCHAR_H
|
|
||||||
+# include <wchar.h>
|
|
||||||
+#endif
|
|
||||||
#include "system.h"
|
|
||||||
|
|
||||||
#include "error.h"
|
|
||||||
@@ -38,6 +43,18 @@
|
|
||||||
|
|
||||||
#include "set-fields.h"
|
|
||||||
|
|
||||||
+/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC
|
|
||||||
+ installation; work around this configuration error. */
|
|
||||||
+#if !defined MB_LEN_MAX || MB_LEN_MAX < 2
|
|
||||||
+# undef MB_LEN_MAX
|
|
||||||
+# define MB_LEN_MAX 16
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */
|
|
||||||
+#if HAVE_MBRTOWC && defined mbstate_t
|
|
||||||
+# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0)
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
/* The official name of this program (e.g., no 'g' prefix). */
|
|
||||||
#define PROGRAM_NAME "cut"
|
|
||||||
|
|
||||||
@@ -54,6 +71,52 @@
|
|
||||||
} \
|
|
||||||
while (0)
|
|
||||||
|
|
||||||
+/* Refill the buffer BUF to get a multibyte character. */
|
|
||||||
+#define REFILL_BUFFER(BUF, BUFPOS, BUFLEN, STREAM) \
|
|
||||||
+ do \
|
|
||||||
+ { \
|
|
||||||
+ if (BUFLEN < MB_LEN_MAX && !feof (STREAM) && !ferror (STREAM)) \
|
|
||||||
+ { \
|
|
||||||
+ memmove (BUF, BUFPOS, BUFLEN); \
|
|
||||||
+ BUFLEN += fread (BUF + BUFLEN, sizeof(char), BUFSIZ, STREAM); \
|
|
||||||
+ BUFPOS = BUF; \
|
|
||||||
+ } \
|
|
||||||
+ } \
|
|
||||||
+ while (0)
|
|
||||||
+
|
|
||||||
+/* Get wide character on BUFPOS. BUFPOS is not included after that.
|
|
||||||
+ If byte sequence is not valid as a character, CONVFAIL is true. Otherwise false. */
|
|
||||||
+#define GET_NEXT_WC_FROM_BUFFER(WC, BUFPOS, BUFLEN, MBLENGTH, STATE, CONVFAIL) \
|
|
||||||
+ do \
|
|
||||||
+ { \
|
|
||||||
+ mbstate_t state_bak; \
|
|
||||||
+ \
|
|
||||||
+ if (BUFLEN < 1) \
|
|
||||||
+ { \
|
|
||||||
+ WC = WEOF; \
|
|
||||||
+ break; \
|
|
||||||
+ } \
|
|
||||||
+ \
|
|
||||||
+ /* Get a wide character. */ \
|
|
||||||
+ CONVFAIL = false; \
|
|
||||||
+ state_bak = STATE; \
|
|
||||||
+ MBLENGTH = mbrtowc ((wchar_t *)&WC, BUFPOS, BUFLEN, &STATE); \
|
|
||||||
+ \
|
|
||||||
+ switch (MBLENGTH) \
|
|
||||||
+ { \
|
|
||||||
+ case (size_t)-1: \
|
|
||||||
+ case (size_t)-2: \
|
|
||||||
+ CONVFAIL = true; \
|
|
||||||
+ STATE = state_bak; \
|
|
||||||
+ /* Fall througn. */ \
|
|
||||||
+ \
|
|
||||||
+ case 0: \
|
|
||||||
+ MBLENGTH = 1; \
|
|
||||||
+ break; \
|
|
||||||
+ } \
|
|
||||||
+ } \
|
|
||||||
+ while (0)
|
|
||||||
+
|
|
||||||
|
|
||||||
/* Pointer inside RP. When checking if a byte or field is selected
|
|
||||||
by a finite range, we check if it is between CURRENT_RP.LO
|
|
||||||
@@ -61,6 +124,9 @@
|
|
||||||
CURRENT_RP.HI then we make CURRENT_RP to point to the next range pair. */
|
|
||||||
static struct field_range_pair *current_rp;
|
|
||||||
|
|
||||||
+/* Length of the delimiter given as argument to -d. */
|
|
||||||
+size_t delimlen;
|
|
||||||
+
|
|
||||||
/* This buffer is used to support the semantics of the -s option
|
|
||||||
(or lack of same) when the specified field list includes (does
|
|
||||||
not include) the first field. In both of those cases, the entire
|
|
||||||
@@ -77,15 +143,25 @@ enum operating_mode
|
|
||||||
{
|
|
||||||
undefined_mode,
|
|
||||||
|
|
||||||
- /* Output characters that are in the given bytes. */
|
|
||||||
+ /* Output bytes that are at the given positions. */
|
|
||||||
byte_mode,
|
|
||||||
|
|
||||||
+ /* Output characters that are at the given positions. */
|
|
||||||
+ character_mode,
|
|
||||||
+
|
|
||||||
/* Output the given delimiter-separated fields. */
|
|
||||||
field_mode
|
|
||||||
};
|
|
||||||
|
|
||||||
static enum operating_mode operating_mode;
|
|
||||||
|
|
||||||
+/* If nonzero, when in byte mode, don't split multibyte characters. */
|
|
||||||
+static int byte_mode_character_aware;
|
|
||||||
+
|
|
||||||
+/* If nonzero, the function for single byte locale is work
|
|
||||||
+ if this program runs on multibyte locale. */
|
|
||||||
+static int force_singlebyte_mode;
|
|
||||||
+
|
|
||||||
/* If true do not output lines containing no delimiter characters.
|
|
||||||
Otherwise, all such lines are printed. This option is valid only
|
|
||||||
with field mode. */
|
|
||||||
@@ -97,6 +173,9 @@ static bool complement;
|
|
||||||
|
|
||||||
/* The delimiter character for field mode. */
|
|
||||||
static unsigned char delim;
|
|
||||||
+#if HAVE_WCHAR_H
|
|
||||||
+static wchar_t wcdelim;
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
/* The delimiter for each line/record. */
|
|
||||||
static unsigned char line_delim = '\n';
|
|
||||||
@@ -164,7 +243,7 @@ Print selected parts of lines from each FILE to standard output.\n\
|
|
||||||
-f, --fields=LIST select only these fields; also print any line\n\
|
|
||||||
that contains no delimiter character, unless\n\
|
|
||||||
the -s option is specified\n\
|
|
||||||
- -n (ignored)\n\
|
|
||||||
+ -n with -b: don't split multibyte characters\n\
|
|
||||||
"), stdout);
|
|
||||||
fputs (_("\
|
|
||||||
--complement complement the set of selected bytes, characters\n\
|
|
||||||
@@ -280,6 +359,82 @@ cut_bytes (FILE *stream)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+#if HAVE_MBRTOWC
|
|
||||||
+/* This function is in use for the following case.
|
|
||||||
+
|
|
||||||
+ 1. Read from the stream STREAM, printing to standard output any selected
|
|
||||||
+ characters.
|
|
||||||
+
|
|
||||||
+ 2. Read from stream STREAM, printing to standard output any selected bytes,
|
|
||||||
+ without splitting multibyte characters. */
|
|
||||||
+
|
|
||||||
+static void
|
|
||||||
+cut_characters_or_cut_bytes_no_split (FILE *stream)
|
|
||||||
+{
|
|
||||||
+ uintmax_t idx; /* number of bytes or characters in the line so far. */
|
|
||||||
+ char buf[MB_LEN_MAX + BUFSIZ]; /* For spooling a read byte sequence. */
|
|
||||||
+ char *bufpos; /* Next read position of BUF. */
|
|
||||||
+ size_t buflen; /* The length of the byte sequence in buf. */
|
|
||||||
+ wint_t wc; /* A gotten wide character. */
|
|
||||||
+ size_t mblength; /* The byte size of a multibyte character which shows
|
|
||||||
+ as same character as WC. */
|
|
||||||
+ mbstate_t state; /* State of the stream. */
|
|
||||||
+ bool convfail = false; /* true, when conversion failed. Otherwise false. */
|
|
||||||
+ /* Whether to begin printing delimiters between ranges for the current line.
|
|
||||||
+ Set after we've begun printing data corresponding to the first range. */
|
|
||||||
+ bool print_delimiter = false;
|
|
||||||
+
|
|
||||||
+ idx = 0;
|
|
||||||
+ buflen = 0;
|
|
||||||
+ bufpos = buf;
|
|
||||||
+ memset (&state, '\0', sizeof(mbstate_t));
|
|
||||||
+
|
|
||||||
+ current_rp = frp;
|
|
||||||
+
|
|
||||||
+ while (1)
|
|
||||||
+ {
|
|
||||||
+ REFILL_BUFFER (buf, bufpos, buflen, stream);
|
|
||||||
+
|
|
||||||
+ GET_NEXT_WC_FROM_BUFFER (wc, bufpos, buflen, mblength, state, convfail);
|
|
||||||
+ (void) convfail; /* ignore unused */
|
|
||||||
+
|
|
||||||
+ if (wc == WEOF)
|
|
||||||
+ {
|
|
||||||
+ if (idx > 0)
|
|
||||||
+ putchar (line_delim);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ else if (wc == line_delim)
|
|
||||||
+ {
|
|
||||||
+ putchar (line_delim);
|
|
||||||
+ idx = 0;
|
|
||||||
+ print_delimiter = false;
|
|
||||||
+ current_rp = frp;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ next_item (&idx);
|
|
||||||
+ if (print_kth (idx))
|
|
||||||
+ {
|
|
||||||
+ if (output_delimiter_specified)
|
|
||||||
+ {
|
|
||||||
+ if (print_delimiter && is_range_start_index (idx))
|
|
||||||
+ {
|
|
||||||
+ fwrite (output_delimiter_string, sizeof (char),
|
|
||||||
+ output_delimiter_length, stdout);
|
|
||||||
+ }
|
|
||||||
+ print_delimiter = true;
|
|
||||||
+ }
|
|
||||||
+ fwrite (bufpos, mblength, sizeof(char), stdout);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ buflen -= mblength;
|
|
||||||
+ bufpos += mblength;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
/* Read from stream STREAM, printing to standard output any selected fields. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
@@ -425,13 +580,211 @@ cut_fields (FILE *stream)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+#if HAVE_MBRTOWC
|
|
||||||
+static void
|
|
||||||
+cut_fields_mb (FILE *stream)
|
|
||||||
+{
|
|
||||||
+ int c;
|
|
||||||
+ uintmax_t field_idx;
|
|
||||||
+ int found_any_selected_field;
|
|
||||||
+ int buffer_first_field;
|
|
||||||
+ int empty_input;
|
|
||||||
+ char buf[MB_LEN_MAX + BUFSIZ]; /* For spooling a read byte sequence. */
|
|
||||||
+ char *bufpos; /* Next read position of BUF. */
|
|
||||||
+ size_t buflen; /* The length of the byte sequence in buf. */
|
|
||||||
+ wint_t wc = 0; /* A gotten wide character. */
|
|
||||||
+ size_t mblength; /* The byte size of a multibyte character which shows
|
|
||||||
+ as same character as WC. */
|
|
||||||
+ mbstate_t state; /* State of the stream. */
|
|
||||||
+ bool convfail = false; /* true, when conversion failed. Otherwise false. */
|
|
||||||
+
|
|
||||||
+ current_rp = frp;
|
|
||||||
+
|
|
||||||
+ found_any_selected_field = 0;
|
|
||||||
+ field_idx = 1;
|
|
||||||
+ bufpos = buf;
|
|
||||||
+ buflen = 0;
|
|
||||||
+ memset (&state, '\0', sizeof(mbstate_t));
|
|
||||||
+
|
|
||||||
+ c = getc (stream);
|
|
||||||
+ empty_input = (c == EOF);
|
|
||||||
+ if (c != EOF)
|
|
||||||
+ {
|
|
||||||
+ ungetc (c, stream);
|
|
||||||
+ wc = 0;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ wc = WEOF;
|
|
||||||
+
|
|
||||||
+ /* To support the semantics of the -s flag, we may have to buffer
|
|
||||||
+ all of the first field to determine whether it is `delimited.'
|
|
||||||
+ But that is unnecessary if all non-delimited lines must be printed
|
|
||||||
+ and the first field has been selected, or if non-delimited lines
|
|
||||||
+ must be suppressed and the first field has *not* been selected.
|
|
||||||
+ That is because a non-delimited line has exactly one field. */
|
|
||||||
+ buffer_first_field = (suppress_non_delimited ^ !print_kth (1));
|
|
||||||
+
|
|
||||||
+ while (1)
|
|
||||||
+ {
|
|
||||||
+ if (field_idx == 1 && buffer_first_field)
|
|
||||||
+ {
|
|
||||||
+ int len = 0;
|
|
||||||
+
|
|
||||||
+ while (1)
|
|
||||||
+ {
|
|
||||||
+ REFILL_BUFFER (buf, bufpos, buflen, stream);
|
|
||||||
+
|
|
||||||
+ GET_NEXT_WC_FROM_BUFFER
|
|
||||||
+ (wc, bufpos, buflen, mblength, state, convfail);
|
|
||||||
+
|
|
||||||
+ if (wc == WEOF)
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ field_1_buffer = xrealloc (field_1_buffer, len + mblength);
|
|
||||||
+ memcpy (field_1_buffer + len, bufpos, mblength);
|
|
||||||
+ len += mblength;
|
|
||||||
+ buflen -= mblength;
|
|
||||||
+ bufpos += mblength;
|
|
||||||
+
|
|
||||||
+ if (!convfail && (wc == line_delim || wc == wcdelim))
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (len <= 0 && wc == WEOF)
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ /* If the first field extends to the end of line (it is not
|
|
||||||
+ delimited) and we are printing all non-delimited lines,
|
|
||||||
+ print this one. */
|
|
||||||
+ if (convfail || (!convfail && wc != wcdelim))
|
|
||||||
+ {
|
|
||||||
+ if (suppress_non_delimited)
|
|
||||||
+ {
|
|
||||||
+ /* Empty. */
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ fwrite (field_1_buffer, sizeof (char), len, stdout);
|
|
||||||
+ /* Make sure the output line is newline terminated. */
|
|
||||||
+ if (convfail || (!convfail && wc != line_delim))
|
|
||||||
+ putchar (line_delim);
|
|
||||||
+ }
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (print_kth (1))
|
|
||||||
+ {
|
|
||||||
+ /* Print the field, but not the trailing delimiter. */
|
|
||||||
+ fwrite (field_1_buffer, sizeof (char), len - 1, stdout);
|
|
||||||
+ found_any_selected_field = 1;
|
|
||||||
+ }
|
|
||||||
+ next_item (&field_idx);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (wc != WEOF)
|
|
||||||
+ {
|
|
||||||
+ if (print_kth (field_idx))
|
|
||||||
+ {
|
|
||||||
+ if (found_any_selected_field)
|
|
||||||
+ {
|
|
||||||
+ fwrite (output_delimiter_string, sizeof (char),
|
|
||||||
+ output_delimiter_length, stdout);
|
|
||||||
+ }
|
|
||||||
+ found_any_selected_field = 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ while (1)
|
|
||||||
+ {
|
|
||||||
+ REFILL_BUFFER (buf, bufpos, buflen, stream);
|
|
||||||
+
|
|
||||||
+ GET_NEXT_WC_FROM_BUFFER
|
|
||||||
+ (wc, bufpos, buflen, mblength, state, convfail);
|
|
||||||
+
|
|
||||||
+ if (wc == WEOF)
|
|
||||||
+ break;
|
|
||||||
+ else if (!convfail && (wc == wcdelim || wc == line_delim))
|
|
||||||
+ {
|
|
||||||
+ buflen -= mblength;
|
|
||||||
+ bufpos += mblength;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (print_kth (field_idx))
|
|
||||||
+ fwrite (bufpos, mblength, sizeof(char), stdout);
|
|
||||||
+
|
|
||||||
+ buflen -= mblength;
|
|
||||||
+ bufpos += mblength;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if ((!convfail || wc == line_delim) && buflen < 1)
|
|
||||||
+ wc = WEOF;
|
|
||||||
+
|
|
||||||
+ if (!convfail && wc == wcdelim)
|
|
||||||
+ next_item (&field_idx);
|
|
||||||
+ else if (wc == WEOF || (!convfail && wc == line_delim))
|
|
||||||
+ {
|
|
||||||
+ if (found_any_selected_field
|
|
||||||
+ || (!empty_input && !(suppress_non_delimited && field_idx == 1)))
|
|
||||||
+ putchar (line_delim);
|
|
||||||
+ if (wc == WEOF)
|
|
||||||
+ break;
|
|
||||||
+ field_idx = 1;
|
|
||||||
+ current_rp = frp;
|
|
||||||
+ found_any_selected_field = 0;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
static void
|
|
||||||
cut_stream (FILE *stream)
|
|
||||||
{
|
|
||||||
- if (operating_mode == byte_mode)
|
|
||||||
- cut_bytes (stream);
|
|
||||||
+#if HAVE_MBRTOWC
|
|
||||||
+ if (MB_CUR_MAX > 1 && !force_singlebyte_mode)
|
|
||||||
+ {
|
|
||||||
+ switch (operating_mode)
|
|
||||||
+ {
|
|
||||||
+ case byte_mode:
|
|
||||||
+ if (byte_mode_character_aware)
|
|
||||||
+ cut_characters_or_cut_bytes_no_split (stream);
|
|
||||||
+ else
|
|
||||||
+ cut_bytes (stream);
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ case character_mode:
|
|
||||||
+ cut_characters_or_cut_bytes_no_split (stream);
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ case field_mode:
|
|
||||||
+ if (delimlen == 1)
|
|
||||||
+ {
|
|
||||||
+ /* Check if we have utf8 multibyte locale, so we can use this
|
|
||||||
+ optimization because of uniqueness of characters, which is
|
|
||||||
+ not true for e.g. SJIS */
|
|
||||||
+ char * loc = setlocale(LC_CTYPE, NULL);
|
|
||||||
+ if (loc && (strstr (loc, "UTF-8") || strstr (loc, "utf-8") ||
|
|
||||||
+ strstr (loc, "UTF8") || strstr (loc, "utf8")))
|
|
||||||
+ {
|
|
||||||
+ cut_fields (stream);
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ cut_fields_mb (stream);
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ default:
|
|
||||||
+ abort ();
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
else
|
|
||||||
- cut_fields (stream);
|
|
||||||
+#endif
|
|
||||||
+ {
|
|
||||||
+ if (operating_mode == field_mode)
|
|
||||||
+ cut_fields (stream);
|
|
||||||
+ else
|
|
||||||
+ cut_bytes (stream);
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Process file FILE to standard output.
|
|
||||||
@@ -483,6 +836,7 @@ main (int argc, char **argv)
|
|
||||||
bool ok;
|
|
||||||
bool delim_specified = false;
|
|
||||||
char *spec_list_string IF_LINT ( = NULL);
|
|
||||||
+ char mbdelim[MB_LEN_MAX + 1];
|
|
||||||
|
|
||||||
initialize_main (&argc, &argv);
|
|
||||||
set_program_name (argv[0]);
|
|
||||||
@@ -505,7 +859,6 @@ main (int argc, char **argv)
|
|
||||||
switch (optc)
|
|
||||||
{
|
|
||||||
case 'b':
|
|
||||||
- case 'c':
|
|
||||||
/* Build the byte list. */
|
|
||||||
if (operating_mode != undefined_mode)
|
|
||||||
FATAL_ERROR (_("only one type of list may be specified"));
|
|
||||||
@@ -513,6 +866,14 @@ main (int argc, char **argv)
|
|
||||||
spec_list_string = optarg;
|
|
||||||
break;
|
|
||||||
|
|
||||||
+ case 'c':
|
|
||||||
+ /* Build the character list. */
|
|
||||||
+ if (operating_mode != undefined_mode)
|
|
||||||
+ FATAL_ERROR (_("only one type of list may be specified"));
|
|
||||||
+ operating_mode = character_mode;
|
|
||||||
+ spec_list_string = optarg;
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
case 'f':
|
|
||||||
/* Build the field list. */
|
|
||||||
if (operating_mode != undefined_mode)
|
|
||||||
@@ -524,10 +885,38 @@ main (int argc, char **argv)
|
|
||||||
case 'd':
|
|
||||||
/* New delimiter. */
|
|
||||||
/* Interpret -d '' to mean 'use the NUL byte as the delimiter.' */
|
|
||||||
- if (optarg[0] != '\0' && optarg[1] != '\0')
|
|
||||||
- FATAL_ERROR (_("the delimiter must be a single character"));
|
|
||||||
- delim = optarg[0];
|
|
||||||
- delim_specified = true;
|
|
||||||
+ {
|
|
||||||
+#if HAVE_MBRTOWC
|
|
||||||
+ if(MB_CUR_MAX > 1)
|
|
||||||
+ {
|
|
||||||
+ mbstate_t state;
|
|
||||||
+
|
|
||||||
+ memset (&state, '\0', sizeof(mbstate_t));
|
|
||||||
+ delimlen = mbrtowc (&wcdelim, optarg, strnlen(optarg, MB_LEN_MAX), &state);
|
|
||||||
+
|
|
||||||
+ if (delimlen == (size_t)-1 || delimlen == (size_t)-2)
|
|
||||||
+ ++force_singlebyte_mode;
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ delimlen = (delimlen < 1) ? 1 : delimlen;
|
|
||||||
+ if (wcdelim != L'\0' && *(optarg + delimlen) != '\0')
|
|
||||||
+ FATAL_ERROR (_("the delimiter must be a single character"));
|
|
||||||
+ memcpy (mbdelim, optarg, delimlen);
|
|
||||||
+ mbdelim[delimlen] = '\0';
|
|
||||||
+ if (delimlen == 1)
|
|
||||||
+ delim = *optarg;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (MB_CUR_MAX <= 1 || force_singlebyte_mode)
|
|
||||||
+#endif
|
|
||||||
+ {
|
|
||||||
+ if (optarg[0] != '\0' && optarg[1] != '\0')
|
|
||||||
+ FATAL_ERROR (_("the delimiter must be a single character"));
|
|
||||||
+ delim = (unsigned char) optarg[0];
|
|
||||||
+ }
|
|
||||||
+ delim_specified = true;
|
|
||||||
+ }
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OUTPUT_DELIMITER_OPTION:
|
|
||||||
@@ -540,6 +929,7 @@ main (int argc, char **argv)
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'n':
|
|
||||||
+ byte_mode_character_aware = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 's':
|
|
||||||
@@ -579,15 +969,34 @@ main (int argc, char **argv)
|
|
||||||
| (complement ? SETFLD_COMPLEMENT : 0) );
|
|
||||||
|
|
||||||
if (!delim_specified)
|
|
||||||
- delim = '\t';
|
|
||||||
+ {
|
|
||||||
+ delim = '\t';
|
|
||||||
+#ifdef HAVE_MBRTOWC
|
|
||||||
+ wcdelim = L'\t';
|
|
||||||
+ mbdelim[0] = '\t';
|
|
||||||
+ mbdelim[1] = '\0';
|
|
||||||
+ delimlen = 1;
|
|
||||||
+#endif
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (output_delimiter_string == NULL)
|
|
||||||
{
|
|
||||||
- static char dummy[2];
|
|
||||||
- dummy[0] = delim;
|
|
||||||
- dummy[1] = '\0';
|
|
||||||
- output_delimiter_string = dummy;
|
|
||||||
- output_delimiter_length = 1;
|
|
||||||
+#ifdef HAVE_MBRTOWC
|
|
||||||
+ if (MB_CUR_MAX > 1 && !force_singlebyte_mode)
|
|
||||||
+ {
|
|
||||||
+ output_delimiter_string = xstrdup(mbdelim);
|
|
||||||
+ output_delimiter_length = delimlen;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (MB_CUR_MAX <= 1 || force_singlebyte_mode)
|
|
||||||
+#endif
|
|
||||||
+ {
|
|
||||||
+ static char dummy[2];
|
|
||||||
+ dummy[0] = delim;
|
|
||||||
+ dummy[1] = '\0';
|
|
||||||
+ output_delimiter_string = dummy;
|
|
||||||
+ output_delimiter_length = 1;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
|
|
||||||
if (optind == argc)
|
|
||||||
|
|
@ -1,864 +0,0 @@
|
||||||
From e87ab5b991b08092a7e07af82b3ec822a8604151 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Ondrej Oprala <ooprala@redhat.com>
|
|
||||||
Date: Wed, 5 Aug 2015 09:15:09 +0200
|
|
||||||
Subject: [PATCH] expand,unexpand: add multibyte support
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
* NEWS: Mention the changes.
|
|
||||||
* bootstrap.conf: Add mbfile to the list of modules.
|
|
||||||
* configure.ac: Properly initialize mbfile.
|
|
||||||
* src/expand.c (expand): Iterate over multibyte characters properly.
|
|
||||||
* src/unexpand.c (unexpand): Iterate over multibyte characters
|
|
||||||
properly.
|
|
||||||
* tests/local.mk: Add new tests.
|
|
||||||
* tests/{expand,unexpand}/mb.sh: New tests.
|
|
||||||
|
|
||||||
Co-authored-by: Pádraig Brady <pbrady@redhat.com>
|
|
||||||
---
|
|
||||||
bootstrap.conf | 1 +
|
|
||||||
configure.ac | 2 +
|
|
||||||
lib/mbfile.c | 3 +
|
|
||||||
lib/mbfile.h | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
m4/mbfile.m4 | 14 +++
|
|
||||||
src/expand.c | 43 +++++----
|
|
||||||
src/local.mk | 4 +-
|
|
||||||
src/unexpand.c | 54 +++++++----
|
|
||||||
tests/expand/mb.sh | 98 ++++++++++++++++++++
|
|
||||||
tests/local.mk | 2 +
|
|
||||||
tests/unexpand/mb.sh | 97 ++++++++++++++++++++
|
|
||||||
10 files changed, 535 insertions(+), 34 deletions(-)
|
|
||||||
create mode 100644 lib/mbfile.c
|
|
||||||
create mode 100644 lib/mbfile.h
|
|
||||||
create mode 100644 m4/mbfile.m4
|
|
||||||
create mode 100755 tests/expand/mb.sh
|
|
||||||
create mode 100755 tests/unexpand/mb.sh
|
|
||||||
|
|
||||||
diff --git a/bootstrap.conf b/bootstrap.conf
|
|
||||||
index 8a0ff31..a1c78b2 100644
|
|
||||||
--- a/bootstrap.conf
|
|
||||||
+++ b/bootstrap.conf
|
|
||||||
@@ -152,6 +152,7 @@ gnulib_modules="
|
|
||||||
maintainer-makefile
|
|
||||||
malloc-gnu
|
|
||||||
manywarnings
|
|
||||||
+ mbfile
|
|
||||||
mbrlen
|
|
||||||
mbrtowc
|
|
||||||
mbsalign
|
|
||||||
diff --git a/configure.ac b/configure.ac
|
|
||||||
index 1e74b36..24c9725 100644
|
|
||||||
--- a/configure.ac
|
|
||||||
+++ b/configure.ac
|
|
||||||
@@ -427,6 +427,8 @@ fi
|
|
||||||
# I'm leaving it here for now. This whole thing needs to be modernized...
|
|
||||||
gl_WINSIZE_IN_PTEM
|
|
||||||
|
|
||||||
+gl_MBFILE
|
|
||||||
+
|
|
||||||
gl_HEADER_TIOCGWINSZ_IN_TERMIOS_H
|
|
||||||
|
|
||||||
if test $gl_cv_sys_tiocgwinsz_needs_termios_h = no && \
|
|
||||||
diff --git a/lib/mbfile.c b/lib/mbfile.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..b0a468e
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/lib/mbfile.c
|
|
||||||
@@ -0,0 +1,3 @@
|
|
||||||
+#include <config.h>
|
|
||||||
+#define MBFILE_INLINE _GL_EXTERN_INLINE
|
|
||||||
+#include "mbfile.h"
|
|
||||||
diff --git a/lib/mbfile.h b/lib/mbfile.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..11f1b12
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/lib/mbfile.h
|
|
||||||
@@ -0,0 +1,255 @@
|
|
||||||
+/* Multibyte character I/O: macros for multi-byte encodings.
|
|
||||||
+ Copyright (C) 2001, 2005, 2009-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/>. */
|
|
||||||
+
|
|
||||||
+/* Written by Mitsuru Chinen <mchinen@yamato.ibm.com>
|
|
||||||
+ and Bruno Haible <bruno@clisp.org>. */
|
|
||||||
+
|
|
||||||
+/* The macros in this file implement multi-byte character input from a
|
|
||||||
+ stream.
|
|
||||||
+
|
|
||||||
+ mb_file_t
|
|
||||||
+ is the type for multibyte character input stream, usable for variable
|
|
||||||
+ declarations.
|
|
||||||
+
|
|
||||||
+ mbf_char_t
|
|
||||||
+ is the type for multibyte character or EOF, usable for variable
|
|
||||||
+ declarations.
|
|
||||||
+
|
|
||||||
+ mbf_init (mbf, stream)
|
|
||||||
+ initializes the MB_FILE for reading from stream.
|
|
||||||
+
|
|
||||||
+ mbf_getc (mbc, mbf)
|
|
||||||
+ reads the next multibyte character from mbf and stores it in mbc.
|
|
||||||
+
|
|
||||||
+ mb_iseof (mbc)
|
|
||||||
+ returns true if mbc represents the EOF value.
|
|
||||||
+
|
|
||||||
+ Here are the function prototypes of the macros.
|
|
||||||
+
|
|
||||||
+ extern void mbf_init (mb_file_t mbf, FILE *stream);
|
|
||||||
+ extern void mbf_getc (mbf_char_t mbc, mb_file_t mbf);
|
|
||||||
+ extern bool mb_iseof (const mbf_char_t mbc);
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#ifndef _MBFILE_H
|
|
||||||
+#define _MBFILE_H 1
|
|
||||||
+
|
|
||||||
+#include <assert.h>
|
|
||||||
+#include <stdbool.h>
|
|
||||||
+#include <stdio.h>
|
|
||||||
+#include <string.h>
|
|
||||||
+
|
|
||||||
+/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
|
|
||||||
+ <wchar.h>.
|
|
||||||
+ BSD/OS 4.1 has a bug: <stdio.h> and <time.h> must be included before
|
|
||||||
+ <wchar.h>. */
|
|
||||||
+#include <stdio.h>
|
|
||||||
+#include <time.h>
|
|
||||||
+#include <wchar.h>
|
|
||||||
+
|
|
||||||
+#include "mbchar.h"
|
|
||||||
+
|
|
||||||
+#ifndef _GL_INLINE_HEADER_BEGIN
|
|
||||||
+ #error "Please include config.h first."
|
|
||||||
+#endif
|
|
||||||
+_GL_INLINE_HEADER_BEGIN
|
|
||||||
+#ifndef MBFILE_INLINE
|
|
||||||
+# define MBFILE_INLINE _GL_INLINE
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+struct mbfile_multi {
|
|
||||||
+ FILE *fp;
|
|
||||||
+ bool eof_seen;
|
|
||||||
+ bool have_pushback;
|
|
||||||
+ mbstate_t state;
|
|
||||||
+ unsigned int bufcount;
|
|
||||||
+ char buf[MBCHAR_BUF_SIZE];
|
|
||||||
+ struct mbchar pushback;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+MBFILE_INLINE void
|
|
||||||
+mbfile_multi_getc (struct mbchar *mbc, struct mbfile_multi *mbf)
|
|
||||||
+{
|
|
||||||
+ size_t bytes;
|
|
||||||
+
|
|
||||||
+ /* If EOF has already been seen, don't use getc. This matters if
|
|
||||||
+ mbf->fp is connected to an interactive tty. */
|
|
||||||
+ if (mbf->eof_seen)
|
|
||||||
+ goto eof;
|
|
||||||
+
|
|
||||||
+ /* Return character pushed back, if there is one. */
|
|
||||||
+ if (mbf->have_pushback)
|
|
||||||
+ {
|
|
||||||
+ mb_copy (mbc, &mbf->pushback);
|
|
||||||
+ mbf->have_pushback = false;
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Before using mbrtowc, we need at least one byte. */
|
|
||||||
+ if (mbf->bufcount == 0)
|
|
||||||
+ {
|
|
||||||
+ int c = getc (mbf->fp);
|
|
||||||
+ if (c == EOF)
|
|
||||||
+ {
|
|
||||||
+ mbf->eof_seen = true;
|
|
||||||
+ goto eof;
|
|
||||||
+ }
|
|
||||||
+ mbf->buf[0] = (unsigned char) c;
|
|
||||||
+ mbf->bufcount++;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Handle most ASCII characters quickly, without calling mbrtowc(). */
|
|
||||||
+ if (mbf->bufcount == 1 && mbsinit (&mbf->state) && is_basic (mbf->buf[0]))
|
|
||||||
+ {
|
|
||||||
+ /* These characters are part of the basic character set. ISO C 99
|
|
||||||
+ guarantees that their wide character code is identical to their
|
|
||||||
+ char code. */
|
|
||||||
+ mbc->wc = mbc->buf[0] = mbf->buf[0];
|
|
||||||
+ mbc->wc_valid = true;
|
|
||||||
+ mbc->ptr = &mbc->buf[0];
|
|
||||||
+ mbc->bytes = 1;
|
|
||||||
+ mbf->bufcount = 0;
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Use mbrtowc on an increasing number of bytes. Read only as many bytes
|
|
||||||
+ from mbf->fp as needed. This is needed to give reasonable interactive
|
|
||||||
+ behaviour when mbf->fp is connected to an interactive tty. */
|
|
||||||
+ for (;;)
|
|
||||||
+ {
|
|
||||||
+ /* We don't know whether the 'mbrtowc' function updates the state when
|
|
||||||
+ it returns -2, - this is the ISO C 99 and glibc-2.2 behaviour - or
|
|
||||||
+ not - amended ANSI C, glibc-2.1 and Solaris 2.7 behaviour. We
|
|
||||||
+ don't have an autoconf test for this, yet.
|
|
||||||
+ The new behaviour would allow us to feed the bytes one by one into
|
|
||||||
+ mbrtowc. But the old behaviour forces us to feed all bytes since
|
|
||||||
+ the end of the last character into mbrtowc. Since we want to retry
|
|
||||||
+ with more bytes when mbrtowc returns -2, we must backup the state
|
|
||||||
+ before calling mbrtowc, because implementations with the new
|
|
||||||
+ behaviour will clobber it. */
|
|
||||||
+ mbstate_t backup_state = mbf->state;
|
|
||||||
+
|
|
||||||
+ bytes = mbrtowc (&mbc->wc, &mbf->buf[0], mbf->bufcount, &mbf->state);
|
|
||||||
+
|
|
||||||
+ if (bytes == (size_t) -1)
|
|
||||||
+ {
|
|
||||||
+ /* An invalid multibyte sequence was encountered. */
|
|
||||||
+ /* Return a single byte. */
|
|
||||||
+ bytes = 1;
|
|
||||||
+ mbc->wc_valid = false;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ else if (bytes == (size_t) -2)
|
|
||||||
+ {
|
|
||||||
+ /* An incomplete multibyte character. */
|
|
||||||
+ mbf->state = backup_state;
|
|
||||||
+ if (mbf->bufcount == MBCHAR_BUF_SIZE)
|
|
||||||
+ {
|
|
||||||
+ /* An overlong incomplete multibyte sequence was encountered. */
|
|
||||||
+ /* Return a single byte. */
|
|
||||||
+ bytes = 1;
|
|
||||||
+ mbc->wc_valid = false;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ /* Read one more byte and retry mbrtowc. */
|
|
||||||
+ int c = getc (mbf->fp);
|
|
||||||
+ if (c == EOF)
|
|
||||||
+ {
|
|
||||||
+ /* An incomplete multibyte character at the end. */
|
|
||||||
+ mbf->eof_seen = true;
|
|
||||||
+ bytes = mbf->bufcount;
|
|
||||||
+ mbc->wc_valid = false;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ mbf->buf[mbf->bufcount] = (unsigned char) c;
|
|
||||||
+ mbf->bufcount++;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ if (bytes == 0)
|
|
||||||
+ {
|
|
||||||
+ /* A null wide character was encountered. */
|
|
||||||
+ bytes = 1;
|
|
||||||
+ assert (mbf->buf[0] == '\0');
|
|
||||||
+ assert (mbc->wc == 0);
|
|
||||||
+ }
|
|
||||||
+ mbc->wc_valid = true;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Return the multibyte sequence mbf->buf[0..bytes-1]. */
|
|
||||||
+ mbc->ptr = &mbc->buf[0];
|
|
||||||
+ memcpy (&mbc->buf[0], &mbf->buf[0], bytes);
|
|
||||||
+ mbc->bytes = bytes;
|
|
||||||
+
|
|
||||||
+ mbf->bufcount -= bytes;
|
|
||||||
+ if (mbf->bufcount > 0)
|
|
||||||
+ {
|
|
||||||
+ /* It's not worth calling memmove() for so few bytes. */
|
|
||||||
+ unsigned int count = mbf->bufcount;
|
|
||||||
+ char *p = &mbf->buf[0];
|
|
||||||
+
|
|
||||||
+ do
|
|
||||||
+ {
|
|
||||||
+ *p = *(p + bytes);
|
|
||||||
+ p++;
|
|
||||||
+ }
|
|
||||||
+ while (--count > 0);
|
|
||||||
+ }
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+eof:
|
|
||||||
+ /* An mbchar_t with bytes == 0 is used to indicate EOF. */
|
|
||||||
+ mbc->ptr = NULL;
|
|
||||||
+ mbc->bytes = 0;
|
|
||||||
+ mbc->wc_valid = false;
|
|
||||||
+ return;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+MBFILE_INLINE void
|
|
||||||
+mbfile_multi_ungetc (const struct mbchar *mbc, struct mbfile_multi *mbf)
|
|
||||||
+{
|
|
||||||
+ mb_copy (&mbf->pushback, mbc);
|
|
||||||
+ mbf->have_pushback = true;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+typedef struct mbfile_multi mb_file_t;
|
|
||||||
+
|
|
||||||
+typedef mbchar_t mbf_char_t;
|
|
||||||
+
|
|
||||||
+#define mbf_init(mbf, stream) \
|
|
||||||
+ ((mbf).fp = (stream), \
|
|
||||||
+ (mbf).eof_seen = false, \
|
|
||||||
+ (mbf).have_pushback = false, \
|
|
||||||
+ memset (&(mbf).state, '\0', sizeof (mbstate_t)), \
|
|
||||||
+ (mbf).bufcount = 0)
|
|
||||||
+
|
|
||||||
+#define mbf_getc(mbc, mbf) mbfile_multi_getc (&(mbc), &(mbf))
|
|
||||||
+
|
|
||||||
+#define mbf_ungetc(mbc, mbf) mbfile_multi_ungetc (&(mbc), &(mbf))
|
|
||||||
+
|
|
||||||
+#define mb_iseof(mbc) ((mbc).bytes == 0)
|
|
||||||
+
|
|
||||||
+#ifndef _GL_INLINE_HEADER_BEGIN
|
|
||||||
+ #error "Please include config.h first."
|
|
||||||
+#endif
|
|
||||||
+_GL_INLINE_HEADER_BEGIN
|
|
||||||
+
|
|
||||||
+#endif /* _MBFILE_H */
|
|
||||||
diff --git a/m4/mbfile.m4 b/m4/mbfile.m4
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..8589902
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/m4/mbfile.m4
|
|
||||||
@@ -0,0 +1,14 @@
|
|
||||||
+# mbfile.m4 serial 7
|
|
||||||
+dnl Copyright (C) 2005, 2008-2015 Free Software Foundation, Inc.
|
|
||||||
+dnl This file is free software; the Free Software Foundation
|
|
||||||
+dnl gives unlimited permission to copy and/or distribute it,
|
|
||||||
+dnl with or without modifications, as long as this notice is preserved.
|
|
||||||
+
|
|
||||||
+dnl autoconf tests required for use of mbfile.h
|
|
||||||
+dnl From Bruno Haible.
|
|
||||||
+
|
|
||||||
+AC_DEFUN([gl_MBFILE],
|
|
||||||
+[
|
|
||||||
+ AC_REQUIRE([AC_TYPE_MBSTATE_T])
|
|
||||||
+ :
|
|
||||||
+])
|
|
||||||
diff --git a/src/expand.c b/src/expand.c
|
|
||||||
index 9fa2e10..380e020 100644
|
|
||||||
--- a/src/expand.c
|
|
||||||
+++ b/src/expand.c
|
|
||||||
@@ -37,6 +37,9 @@
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
+
|
|
||||||
+#include <mbfile.h>
|
|
||||||
+
|
|
||||||
#include "system.h"
|
|
||||||
#include "die.h"
|
|
||||||
#include "xstrndup.h"
|
|
||||||
@@ -100,19 +103,19 @@ expand (void)
|
|
||||||
{
|
|
||||||
/* Input stream. */
|
|
||||||
FILE *fp = next_file (NULL);
|
|
||||||
+ mb_file_t mbf;
|
|
||||||
+ mbf_char_t c;
|
|
||||||
|
|
||||||
if (!fp)
|
|
||||||
return;
|
|
||||||
|
|
||||||
+ mbf_init (mbf, fp);
|
|
||||||
+
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
- /* Input character, or EOF. */
|
|
||||||
- int c;
|
|
||||||
-
|
|
||||||
/* If true, perform translations. */
|
|
||||||
bool convert = true;
|
|
||||||
|
|
||||||
-
|
|
||||||
/* The following variables have valid values only when CONVERT
|
|
||||||
is true: */
|
|
||||||
|
|
||||||
@@ -122,17 +125,23 @@ expand (void)
|
|
||||||
/* Index in TAB_LIST of next tab stop to examine. */
|
|
||||||
size_t tab_index = 0;
|
|
||||||
|
|
||||||
-
|
|
||||||
/* Convert a line of text. */
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
- while ((c = getc (fp)) < 0 && (fp = next_file (fp)))
|
|
||||||
- continue;
|
|
||||||
+ do {
|
|
||||||
+ mbf_getc (c, mbf);
|
|
||||||
+ if (mb_iseof (c))
|
|
||||||
+ {
|
|
||||||
+ mbf_init (mbf, fp = next_file (fp));
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ while (false);
|
|
||||||
|
|
||||||
if (convert)
|
|
||||||
{
|
|
||||||
- if (c == '\t')
|
|
||||||
+ if (mb_iseq (c, '\t'))
|
|
||||||
{
|
|
||||||
/* Column the next input tab stop is on. */
|
|
||||||
uintmax_t next_tab_column;
|
|
||||||
@@ -151,32 +160,34 @@ expand (void)
|
|
||||||
if (putchar (' ') < 0)
|
|
||||||
die (EXIT_FAILURE, errno, _("write error"));
|
|
||||||
|
|
||||||
- c = ' ';
|
|
||||||
+ mb_setascii (&c, ' ');
|
|
||||||
}
|
|
||||||
- else if (c == '\b')
|
|
||||||
+ else if (mb_iseq (c, '\b'))
|
|
||||||
{
|
|
||||||
/* Go back one column, and force recalculation of the
|
|
||||||
next tab stop. */
|
|
||||||
column -= !!column;
|
|
||||||
tab_index -= !!tab_index;
|
|
||||||
}
|
|
||||||
- else
|
|
||||||
+ /* A leading control character could make us trip over. */
|
|
||||||
+ else if (!mb_iscntrl (c))
|
|
||||||
{
|
|
||||||
- column++;
|
|
||||||
+ column += mb_width (c);
|
|
||||||
if (!column)
|
|
||||||
die (EXIT_FAILURE, 0, _("input line is too long"));
|
|
||||||
}
|
|
||||||
|
|
||||||
- convert &= convert_entire_line || !! isblank (c);
|
|
||||||
+ convert &= convert_entire_line || mb_isblank (c);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (c < 0)
|
|
||||||
+ if (mb_iseof (c))
|
|
||||||
return;
|
|
||||||
|
|
||||||
- if (putchar (c) < 0)
|
|
||||||
+ mb_putc (c, stdout);
|
|
||||||
+ if (ferror (stdout))
|
|
||||||
die (EXIT_FAILURE, errno, _("write error"));
|
|
||||||
}
|
|
||||||
- while (c != '\n');
|
|
||||||
+ while (!mb_iseq (c, '\n'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/src/local.mk b/src/local.mk
|
|
||||||
index 72db9c704..ef3bfa469 100644
|
|
||||||
--- a/src/local.mk
|
|
||||||
+++ b/src/local.mk
|
|
||||||
@@ -415,8 +415,8 @@ src_basenc_CPPFLAGS = -DBASE_TYPE=42 $(AM_CPPFLAGS)
|
|
||||||
|
|
||||||
src_ginstall_CPPFLAGS = -DENABLE_MATCHPATHCON=1 $(AM_CPPFLAGS)
|
|
||||||
|
|
||||||
-src_expand_SOURCES = src/expand.c src/expand-common.c
|
|
||||||
-src_unexpand_SOURCES = src/unexpand.c src/expand-common.c
|
|
||||||
+src_expand_SOURCES = src/expand.c src/expand-common.c lib/mbfile.c
|
|
||||||
+src_unexpand_SOURCES = src/unexpand.c src/expand-common.c lib/mbfile.c
|
|
||||||
|
|
||||||
# Ensure we don't link against libcoreutils.a as that lib is
|
|
||||||
# not compiled with -fPIC which causes issues on 64 bit at least
|
|
||||||
diff --git a/src/unexpand.c b/src/unexpand.c
|
|
||||||
index 7801274..569a7ee 100644
|
|
||||||
--- a/src/unexpand.c
|
|
||||||
+++ b/src/unexpand.c
|
|
||||||
@@ -38,6 +38,9 @@
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
+
|
|
||||||
+#include <mbfile.h>
|
|
||||||
+
|
|
||||||
#include "system.h"
|
|
||||||
#include "die.h"
|
|
||||||
#include "xstrndup.h"
|
|
||||||
@@ -107,11 +110,12 @@ unexpand (void)
|
|
||||||
{
|
|
||||||
/* Input stream. */
|
|
||||||
FILE *fp = next_file (NULL);
|
|
||||||
+ mb_file_t mbf;
|
|
||||||
|
|
||||||
/* The array of pending blanks. In non-POSIX locales, blanks can
|
|
||||||
include characters other than spaces, so the blanks must be
|
|
||||||
stored, not merely counted. */
|
|
||||||
- char *pending_blank;
|
|
||||||
+ mbf_char_t *pending_blank;
|
|
||||||
|
|
||||||
if (!fp)
|
|
||||||
return;
|
|
||||||
@@ -119,12 +123,14 @@ unexpand (void)
|
|
||||||
/* The worst case is a non-blank character, then one blank, then a
|
|
||||||
tab stop, then MAX_COLUMN_WIDTH - 1 blanks, then a non-blank; so
|
|
||||||
allocate MAX_COLUMN_WIDTH bytes to store the blanks. */
|
|
||||||
- pending_blank = xmalloc (max_column_width);
|
|
||||||
+ pending_blank = xmalloc (max_column_width * sizeof (mbf_char_t));
|
|
||||||
+
|
|
||||||
+ mbf_init (mbf, fp);
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
/* Input character, or EOF. */
|
|
||||||
- int c;
|
|
||||||
+ mbf_char_t c;
|
|
||||||
|
|
||||||
/* If true, perform translations. */
|
|
||||||
bool convert = true;
|
|
||||||
@@ -158,12 +164,19 @@ unexpand (void)
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
- while ((c = getc (fp)) < 0 && (fp = next_file (fp)))
|
|
||||||
- continue;
|
|
||||||
+ do {
|
|
||||||
+ mbf_getc (c, mbf);
|
|
||||||
+ if (mb_iseof (c))
|
|
||||||
+ {
|
|
||||||
+ mbf_init (mbf, fp = next_file (fp));
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ while (false);
|
|
||||||
|
|
||||||
if (convert)
|
|
||||||
{
|
|
||||||
- bool blank = !! isblank (c);
|
|
||||||
+ bool blank = mb_isblank (c);
|
|
||||||
|
|
||||||
if (blank)
|
|
||||||
{
|
|
||||||
@@ -180,16 +193,16 @@ unexpand (void)
|
|
||||||
if (next_tab_column < column)
|
|
||||||
die (EXIT_FAILURE, 0, _("input line is too long"));
|
|
||||||
|
|
||||||
- if (c == '\t')
|
|
||||||
+ if (mb_iseq (c, '\t'))
|
|
||||||
{
|
|
||||||
column = next_tab_column;
|
|
||||||
|
|
||||||
if (pending)
|
|
||||||
- pending_blank[0] = '\t';
|
|
||||||
+ mb_setascii (&pending_blank[0], '\t');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- column++;
|
|
||||||
+ column += mb_width (c);
|
|
||||||
|
|
||||||
if (! (prev_blank && column == next_tab_column))
|
|
||||||
{
|
|
||||||
@@ -197,13 +210,14 @@ unexpand (void)
|
|
||||||
will be replaced by tabs. */
|
|
||||||
if (column == next_tab_column)
|
|
||||||
one_blank_before_tab_stop = true;
|
|
||||||
- pending_blank[pending++] = c;
|
|
||||||
+ mb_copy (&pending_blank[pending++], &c);
|
|
||||||
prev_blank = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Replace the pending blanks by a tab or two. */
|
|
||||||
- pending_blank[0] = c = '\t';
|
|
||||||
+ mb_setascii (&c, '\t');
|
|
||||||
+ mb_setascii (&pending_blank[0], '\t');
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Discard pending blanks, unless it was a single
|
|
||||||
@@ -211,7 +225,7 @@ unexpand (void)
|
|
||||||
pending = one_blank_before_tab_stop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- else if (c == '\b')
|
|
||||||
+ else if (mb_iseq (c, '\b'))
|
|
||||||
{
|
|
||||||
/* Go back one column, and force recalculation of the
|
|
||||||
next tab stop. */
|
|
||||||
@@ -221,7 +235,7 @@ unexpand (void)
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
- column++;
|
|
||||||
+ column += mb_width (c);
|
|
||||||
if (!column)
|
|
||||||
die (EXIT_FAILURE, 0, _("input line is too long"));
|
|
||||||
}
|
|
||||||
@@ -229,8 +243,11 @@ unexpand (void)
|
|
||||||
if (pending)
|
|
||||||
{
|
|
||||||
if (pending > 1 && one_blank_before_tab_stop)
|
|
||||||
- pending_blank[0] = '\t';
|
|
||||||
- if (fwrite (pending_blank, 1, pending, stdout) != pending)
|
|
||||||
+ mb_setascii (&pending_blank[0], '\t');
|
|
||||||
+
|
|
||||||
+ for (int n = 0; n < pending; ++n)
|
|
||||||
+ mb_putc (pending_blank[n], stdout);
|
|
||||||
+ if (ferror (stdout))
|
|
||||||
die (EXIT_FAILURE, errno, _("write error"));
|
|
||||||
pending = 0;
|
|
||||||
one_blank_before_tab_stop = false;
|
|
||||||
@@ -240,16 +257,17 @@ unexpand (void)
|
|
||||||
convert &= convert_entire_line || blank;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (c < 0)
|
|
||||||
+ if (mb_iseof (c))
|
|
||||||
{
|
|
||||||
free (pending_blank);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (putchar (c) < 0)
|
|
||||||
+ mb_putc (c, stdout);
|
|
||||||
+ if (ferror (stdout))
|
|
||||||
die (EXIT_FAILURE, errno, _("write error"));
|
|
||||||
}
|
|
||||||
- while (c != '\n');
|
|
||||||
+ while (!mb_iseq (c, '\n'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/tests/expand/mb.sh b/tests/expand/mb.sh
|
|
||||||
new file mode 100755
|
|
||||||
index 0000000..7971e18
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/expand/mb.sh
|
|
||||||
@@ -0,0 +1,98 @@
|
|
||||||
+#!/bin/sh
|
|
||||||
+
|
|
||||||
+# 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
|
|
||||||
+# 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_ expand
|
|
||||||
+
|
|
||||||
+export LC_ALL=en_US.UTF-8
|
|
||||||
+
|
|
||||||
+#input containing multibyte characters
|
|
||||||
+cat <<\EOF > in || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+EOF
|
|
||||||
+env printf ' äöü\t. öüä. \tä xx\n' >> in || framework_failure_
|
|
||||||
+
|
|
||||||
+cat <<\EOF > exp || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+expand < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+#test characters with display widths != 1
|
|
||||||
+env printf '12345678
|
|
||||||
+e\t|ascii(1)
|
|
||||||
+\u00E9\t|composed(1)
|
|
||||||
+e\u0301\t|decomposed(1)
|
|
||||||
+\u3000\t|ideo-space(2)
|
|
||||||
+\uFF0D\t|full-hypen(2)
|
|
||||||
+' > in || framework_failure_
|
|
||||||
+
|
|
||||||
+env printf '12345678
|
|
||||||
+e |ascii(1)
|
|
||||||
+\u00E9 |composed(1)
|
|
||||||
+e\u0301 |decomposed(1)
|
|
||||||
+\u3000 |ideo-space(2)
|
|
||||||
+\uFF0D |full-hypen(2)
|
|
||||||
+' > exp || framework_failure_
|
|
||||||
+
|
|
||||||
+expand < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+#shouldn't fail with "input line too long"
|
|
||||||
+#when a line starts with a control character
|
|
||||||
+env printf '\n' > in || framework_failure_
|
|
||||||
+
|
|
||||||
+expand < in > out || fail=1
|
|
||||||
+compare in out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+#non-Unicode characters interspersed between Unicode ones
|
|
||||||
+env printf '12345678
|
|
||||||
+\t\xFF|
|
|
||||||
+\xFF\t|
|
|
||||||
+\t\xFFä|
|
|
||||||
+ä\xFF\t|
|
|
||||||
+\tä\xFF|
|
|
||||||
+\xFF\tä|
|
|
||||||
+äbcdef\xFF\t|
|
|
||||||
+' > in || framework_failure_
|
|
||||||
+
|
|
||||||
+env printf '12345678
|
|
||||||
+ \xFF|
|
|
||||||
+\xFF |
|
|
||||||
+ \xFFä|
|
|
||||||
+ä\xFF |
|
|
||||||
+ ä\xFF|
|
|
||||||
+\xFF ä|
|
|
||||||
+äbcdef\xFF |
|
|
||||||
+' > exp || framework_failure_
|
|
||||||
+
|
|
||||||
+expand < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+exit $fail
|
|
||||||
diff --git a/tests/local.mk b/tests/local.mk
|
|
||||||
index 192f776..8053397 100644
|
|
||||||
--- a/tests/local.mk
|
|
||||||
+++ b/tests/local.mk
|
|
||||||
@@ -544,6 +544,7 @@ all_tests = \
|
|
||||||
tests/du/threshold.sh \
|
|
||||||
tests/du/trailing-slash.sh \
|
|
||||||
tests/du/two-args.sh \
|
|
||||||
+ tests/expand/mb.sh \
|
|
||||||
tests/id/gnu-zero-uids.sh \
|
|
||||||
tests/id/no-context.sh \
|
|
||||||
tests/id/context.sh \
|
|
||||||
@@ -684,6 +685,7 @@ all_tests = \
|
|
||||||
tests/touch/read-only.sh \
|
|
||||||
tests/touch/relative.sh \
|
|
||||||
tests/touch/trailing-slash.sh \
|
|
||||||
+ tests/unexpand/mb.sh \
|
|
||||||
$(all_root_tests)
|
|
||||||
|
|
||||||
# See tests/factor/create-test.sh.
|
|
||||||
diff --git a/tests/unexpand/mb.sh b/tests/unexpand/mb.sh
|
|
||||||
new file mode 100755
|
|
||||||
index 0000000..60d4c1a
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/unexpand/mb.sh
|
|
||||||
@@ -0,0 +1,97 @@
|
|
||||||
+#!/bin/sh
|
|
||||||
+
|
|
||||||
+# 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
|
|
||||||
+# 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_ unexpand
|
|
||||||
+
|
|
||||||
+export LC_ALL=en_US.UTF-8
|
|
||||||
+
|
|
||||||
+#input containing multibyte characters
|
|
||||||
+cat > in <<\EOF
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+cat > exp <<\EOF
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+unexpand -a < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+#test characters with a display width larger than 1
|
|
||||||
+
|
|
||||||
+env printf '12345678
|
|
||||||
+e |ascii(1)
|
|
||||||
+\u00E9 |composed(1)
|
|
||||||
+e\u0301 |decomposed(1)
|
|
||||||
+\u3000 |ideo-space(2)
|
|
||||||
+\uFF0D |full-hypen(2)
|
|
||||||
+' > in || framework_failure_
|
|
||||||
+
|
|
||||||
+env printf '12345678
|
|
||||||
+e\t|ascii(1)
|
|
||||||
+\u00E9\t|composed(1)
|
|
||||||
+e\u0301\t|decomposed(1)
|
|
||||||
+\u3000\t|ideo-space(2)
|
|
||||||
+\uFF0D\t|full-hypen(2)
|
|
||||||
+' > exp || framework_failure_
|
|
||||||
+
|
|
||||||
+unexpand -a < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+#test input where a blank of width > 1 is not being substituted
|
|
||||||
+in="$(LC_ALL=en_US.UTF-8 printf ' \u3000 ö ü ß')"
|
|
||||||
+exp=' ö ü ß'
|
|
||||||
+
|
|
||||||
+unexpand -a < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+#non-Unicode characters interspersed between Unicode ones
|
|
||||||
+env printf '12345678
|
|
||||||
+ \xFF|
|
|
||||||
+\xFF |
|
|
||||||
+ \xFFä|
|
|
||||||
+ä\xFF |
|
|
||||||
+ ä\xFF|
|
|
||||||
+\xFF ä|
|
|
||||||
+äbcdef\xFF |
|
|
||||||
+' > in || framework_failure_
|
|
||||||
+
|
|
||||||
+env printf '12345678
|
|
||||||
+\t\xFF|
|
|
||||||
+\xFF\t|
|
|
||||||
+\t\xFFä|
|
|
||||||
+ä\xFF\t|
|
|
||||||
+\tä\xFF|
|
|
||||||
+\xFF\tä|
|
|
||||||
+äbcdef\xFF\t|
|
|
||||||
+' > exp || framework_failure_
|
|
||||||
+
|
|
||||||
+unexpand -a < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
From 02424bfcd719bbaa695f4e1c3ef17ad91b0d23c0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Lubomir Rintel <lkundrak@v3.sk>
|
|
||||||
Date: Thu, 28 Jan 2016 20:57:22 +0100
|
|
||||||
Subject: [PATCH] unexpand: fix blank line handling
|
|
||||||
|
|
||||||
echo '' |./src/unexpand -a
|
|
||||||
|
|
||||||
Really?
|
|
||||||
---
|
|
||||||
src/unexpand.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/src/unexpand.c b/src/unexpand.c
|
|
||||||
index 569a7ee..3bbbd66 100644
|
|
||||||
--- a/src/unexpand.c
|
|
||||||
+++ b/src/unexpand.c
|
|
||||||
@@ -233,7 +233,7 @@ unexpand (void)
|
|
||||||
next_tab_column = column;
|
|
||||||
tab_index -= !!tab_index;
|
|
||||||
}
|
|
||||||
- else
|
|
||||||
+ else if (!mb_iseq (c, '\n'))
|
|
||||||
{
|
|
||||||
column += mb_width (c);
|
|
||||||
if (!column)
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
||||||
|
|
@ -1,108 +0,0 @@
|
||||||
diff --git a/src/expand.c b/src/expand.c
|
|
||||||
index 380e020..310b349 100644
|
|
||||||
--- a/src/expand.c
|
|
||||||
+++ b/src/expand.c
|
|
||||||
@@ -129,15 +129,19 @@ expand (void)
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
- do {
|
|
||||||
+ while (true) {
|
|
||||||
mbf_getc (c, mbf);
|
|
||||||
- if (mb_iseof (c))
|
|
||||||
+ if ((mb_iseof (c)) && (fp = next_file (fp)))
|
|
||||||
{
|
|
||||||
- mbf_init (mbf, fp = next_file (fp));
|
|
||||||
+ mbf_init (mbf, fp);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
- while (false);
|
|
||||||
+
|
|
||||||
|
|
||||||
if (convert)
|
|
||||||
{
|
|
||||||
diff --git a/src/unexpand.c b/src/unexpand.c
|
|
||||||
index 3bbbd66..863a90a 100644
|
|
||||||
--- a/src/unexpand.c
|
|
||||||
+++ b/src/unexpand.c
|
|
||||||
@@ -164,15 +164,19 @@ unexpand (void)
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
- do {
|
|
||||||
+ while (true) {
|
|
||||||
mbf_getc (c, mbf);
|
|
||||||
- if (mb_iseof (c))
|
|
||||||
+ if ((mb_iseof (c)) && (fp = next_file (fp)))
|
|
||||||
{
|
|
||||||
- mbf_init (mbf, fp = next_file (fp));
|
|
||||||
+ mbf_init (mbf, fp);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
- while (false);
|
|
||||||
+
|
|
||||||
|
|
||||||
if (convert)
|
|
||||||
{
|
|
||||||
diff --git a/tests/expand/mb.sh b/tests/expand/mb.sh
|
|
||||||
index 7971e18..031be7a 100755
|
|
||||||
--- a/tests/expand/mb.sh
|
|
||||||
+++ b/tests/expand/mb.sh
|
|
||||||
@@ -44,6 +44,20 @@ EOF
|
|
||||||
expand < in > out || fail=1
|
|
||||||
compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
|
|
||||||
+#multiple files as an input
|
|
||||||
+cat <<\EOF >> exp || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+expand ./in ./in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
#test characters with display widths != 1
|
|
||||||
env printf '12345678
|
|
||||||
e\t|ascii(1)
|
|
||||||
diff --git a/tests/unexpand/mb.sh b/tests/unexpand/mb.sh
|
|
||||||
index 60d4c1a..8d75652 100755
|
|
||||||
--- a/tests/unexpand/mb.sh
|
|
||||||
+++ b/tests/unexpand/mb.sh
|
|
||||||
@@ -44,6 +44,22 @@ EOF
|
|
||||||
unexpand -a < in > out || fail=1
|
|
||||||
compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
|
|
||||||
+
|
|
||||||
+#multiple files as an input
|
|
||||||
+cat >> exp <<\EOF
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+unexpand -a ./in ./in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
#test characters with a display width larger than 1
|
|
||||||
|
|
||||||
env printf '12345678
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
||||||
From ff424639fe863cbd6963add1a79b97290c1606c6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: rpm-build <rpm-build>
|
|
||||||
Date: Fri, 3 Feb 2017 12:26:53 +0100
|
|
||||||
Subject: [PATCH] fold.c: preserve new-lines in mutlibyte text
|
|
||||||
|
|
||||||
---
|
|
||||||
src/fold.c | 49 ++++++++++++++++++++++++-------------------------
|
|
||||||
1 file changed, 24 insertions(+), 25 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/fold.c b/src/fold.c
|
|
||||||
index d23edd5..8c232a7 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'\b':
|
|
||||||
- increment = (column > 0) ? -1 : 0;
|
|
||||||
- break;
|
|
||||||
+ case L'\r':
|
|
||||||
+ increment = -1 * column;
|
|
||||||
+ break;
|
|
||||||
|
|
||||||
- case L'\r':
|
|
||||||
- increment = -1 * column;
|
|
||||||
- break;
|
|
||||||
+ case L'\t':
|
|
||||||
+ increment = 8 - column % 8;
|
|
||||||
+ break;
|
|
||||||
|
|
||||||
- case L'\t':
|
|
||||||
- increment = 8 - column % 8;
|
|
||||||
- break;
|
|
||||||
-
|
|
||||||
- default:
|
|
||||||
- increment = wcwidth (wc);
|
|
||||||
- increment = (increment < 0) ? 0 : increment;
|
|
||||||
- }
|
|
||||||
+ default:
|
|
||||||
+ increment = wcwidth (wc);
|
|
||||||
+ increment = (increment < 0) ? 0 : increment;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
2.7.4
|
|
||||||
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
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
|
|
||||||
@@ -2304,12 +2304,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
|
|
||||||
|
|
||||||
|
|
@ -1,456 +0,0 @@
|
||||||
From 7a7c776a4e228d180e74614fd8c8afcad5d4bdf7 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jakub Martisko <jamartis@redhat.com>
|
|
||||||
Date: Thu, 7 Jul 2016 12:53:26 +0200
|
|
||||||
Subject: [PATCH] coreutils-i18n-un-expand-BOM.patch
|
|
||||||
|
|
||||||
---
|
|
||||||
src/expand-common.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
||||||
src/expand-common.h | 12 ++++++
|
|
||||||
src/expand.c | 45 +++++++++++++++++++-
|
|
||||||
src/unexpand.c | 43 ++++++++++++++++++-
|
|
||||||
tests/expand/mb.sh | 71 ++++++++++++++++++++++++++++++++
|
|
||||||
tests/unexpand/mb.sh | 59 ++++++++++++++++++++++++++
|
|
||||||
6 files changed, 342 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/expand-common.c b/src/expand-common.c
|
|
||||||
index 4657e46..97cbb09 100644
|
|
||||||
--- a/src/expand-common.c
|
|
||||||
+++ b/src/expand-common.c
|
|
||||||
@@ -19,6 +19,7 @@
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
+#include <mbfile.h>
|
|
||||||
#include "system.h"
|
|
||||||
#include "die.h"
|
|
||||||
#include "error.h"
|
|
||||||
@@ -126,6 +127,119 @@ set_increment_size (uintmax_t tabval)
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
+extern int
|
|
||||||
+set_utf_locale (void)
|
|
||||||
+{
|
|
||||||
+ /*try using some predefined locale */
|
|
||||||
+ const char* predef_locales[] = {"C.UTF8","en_US.UTF8","en_GB.UTF8"};
|
|
||||||
+
|
|
||||||
+ const int predef_locales_count=3;
|
|
||||||
+ for (int i=0;i<predef_locales_count;i++)
|
|
||||||
+ {
|
|
||||||
+ if (setlocale(LC_ALL,predef_locales[i])!=NULL)
|
|
||||||
+ {
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ else if (i==predef_locales_count-1)
|
|
||||||
+ {
|
|
||||||
+ return 1;
|
|
||||||
+ error (EXIT_FAILURE, errno, _("cannot set UTF-8 locale"));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+extern bool
|
|
||||||
+check_utf_locale(void)
|
|
||||||
+{
|
|
||||||
+ char* locale = setlocale (LC_CTYPE , NULL);
|
|
||||||
+ if (locale == NULL)
|
|
||||||
+ {
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ else if (strcasestr(locale, "utf8") == NULL && strcasestr(locale, "utf-8") == NULL)
|
|
||||||
+ {
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ return true;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+extern bool
|
|
||||||
+check_bom(FILE* fp, mb_file_t *mbf)
|
|
||||||
+{
|
|
||||||
+ int c;
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+ c=fgetc(fp);
|
|
||||||
+
|
|
||||||
+ /*test BOM header of the first file */
|
|
||||||
+ mbf->bufcount=0;
|
|
||||||
+ if (c == 0xEF)
|
|
||||||
+ {
|
|
||||||
+ c=fgetc(fp);
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ if (c != EOF)
|
|
||||||
+ {
|
|
||||||
+ ungetc(c,fp);
|
|
||||||
+ }
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (c == 0xBB)
|
|
||||||
+ {
|
|
||||||
+ c=fgetc(fp);
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ if ( c!= EOF )
|
|
||||||
+ {
|
|
||||||
+ mbf->buf[0]=(unsigned char) 0xEF;
|
|
||||||
+ mbf->bufcount=1;
|
|
||||||
+ ungetc(c,fp);
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ ungetc(0xEF,fp);
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (c == 0xBF)
|
|
||||||
+ {
|
|
||||||
+ mbf->bufcount=0;
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ if (c != EOF)
|
|
||||||
+ {
|
|
||||||
+ mbf->buf[0]=(unsigned char) 0xEF;
|
|
||||||
+ mbf->buf[1]=(unsigned char) 0xBB;
|
|
||||||
+ mbf->bufcount=2;
|
|
||||||
+ ungetc(c,fp);
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ mbf->buf[0]=(unsigned char) 0xEF;
|
|
||||||
+ mbf->bufcount=1;
|
|
||||||
+ ungetc(0xBB,fp);
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return false;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+extern void
|
|
||||||
+print_bom(void)
|
|
||||||
+{
|
|
||||||
+ putc (0xEF, stdout);
|
|
||||||
+ putc (0xBB, stdout);
|
|
||||||
+ putc (0xBF, stdout);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/* Add the comma or blank separated list of tab stops STOPS
|
|
||||||
to the list of tab stops. */
|
|
||||||
extern void
|
|
||||||
diff --git a/src/expand-common.h b/src/expand-common.h
|
|
||||||
index 8cb2079..763bfda 100644
|
|
||||||
--- a/src/expand-common.h
|
|
||||||
+++ b/src/expand-common.h
|
|
||||||
@@ -34,6 +34,18 @@ extern size_t max_column_width;
|
|
||||||
/* The desired exit status. */
|
|
||||||
extern int exit_status;
|
|
||||||
|
|
||||||
+extern int
|
|
||||||
+set_utf_locale (void);
|
|
||||||
+
|
|
||||||
+extern bool
|
|
||||||
+check_utf_locale(void);
|
|
||||||
+
|
|
||||||
+extern bool
|
|
||||||
+check_bom(FILE* fp, mb_file_t *mbf);
|
|
||||||
+
|
|
||||||
+extern void
|
|
||||||
+print_bom(void);
|
|
||||||
+
|
|
||||||
/* Add tab stop TABVAL to the end of 'tab_list'. */
|
|
||||||
extern void
|
|
||||||
add_tab_stop (uintmax_t tabval);
|
|
||||||
diff --git a/src/expand.c b/src/expand.c
|
|
||||||
index 310b349..4136824 100644
|
|
||||||
--- a/src/expand.c
|
|
||||||
+++ b/src/expand.c
|
|
||||||
@@ -103,11 +103,33 @@ expand (void)
|
|
||||||
FILE *fp = next_file (NULL);
|
|
||||||
mb_file_t mbf;
|
|
||||||
mbf_char_t c;
|
|
||||||
+ /* True if the starting locale is utf8. */
|
|
||||||
+ bool using_utf_locale;
|
|
||||||
+
|
|
||||||
+ /* True if the first file contains BOM header. */
|
|
||||||
+ bool found_bom;
|
|
||||||
+ using_utf_locale=check_utf_locale();
|
|
||||||
|
|
||||||
if (!fp)
|
|
||||||
return;
|
|
||||||
-
|
|
||||||
mbf_init (mbf, fp);
|
|
||||||
+ found_bom=check_bom(fp,&mbf);
|
|
||||||
+
|
|
||||||
+ if (using_utf_locale == false && found_bom == true)
|
|
||||||
+ {
|
|
||||||
+ /*try using some predefined locale */
|
|
||||||
+
|
|
||||||
+ if (set_utf_locale () != 0)
|
|
||||||
+ {
|
|
||||||
+ error (EXIT_FAILURE, errno, _("cannot set UTF-8 locale"));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+ if (found_bom == true)
|
|
||||||
+ {
|
|
||||||
+ print_bom();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
@@ -132,6 +154,27 @@ expand (void)
|
|
||||||
if ((mb_iseof (c)) && (fp = next_file (fp)))
|
|
||||||
{
|
|
||||||
mbf_init (mbf, fp);
|
|
||||||
+ if (fp!=NULL)
|
|
||||||
+ {
|
|
||||||
+ if (check_bom(fp,&mbf)==true)
|
|
||||||
+ {
|
|
||||||
+ /*Not the first file - check BOM header*/
|
|
||||||
+ if (using_utf_locale==false && found_bom==false)
|
|
||||||
+ {
|
|
||||||
+ /*BOM header in subsequent file but not in the first one. */
|
|
||||||
+ error (EXIT_FAILURE, errno, _("combination of files with and without BOM header"));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ if(using_utf_locale==false && found_bom==true)
|
|
||||||
+ {
|
|
||||||
+ /*First file conatined BOM header - locale was switched to UTF
|
|
||||||
+ *all subsequent files should contain BOM. */
|
|
||||||
+ error (EXIT_FAILURE, errno, _("combination of files with and without BOM header"));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
diff --git a/src/unexpand.c b/src/unexpand.c
|
|
||||||
index 863a90a..5681b58 100644
|
|
||||||
--- a/src/unexpand.c
|
|
||||||
+++ b/src/unexpand.c
|
|
||||||
@@ -116,16 +116,36 @@ unexpand (void)
|
|
||||||
include characters other than spaces, so the blanks must be
|
|
||||||
stored, not merely counted. */
|
|
||||||
mbf_char_t *pending_blank;
|
|
||||||
+ /* True if the starting locale is utf8. */
|
|
||||||
+ bool using_utf_locale;
|
|
||||||
+
|
|
||||||
+ /* True if the first file contains BOM header. */
|
|
||||||
+ bool found_bom;
|
|
||||||
+ using_utf_locale=check_utf_locale();
|
|
||||||
|
|
||||||
if (!fp)
|
|
||||||
return;
|
|
||||||
+ mbf_init (mbf, fp);
|
|
||||||
+ found_bom=check_bom(fp,&mbf);
|
|
||||||
+
|
|
||||||
+ if (using_utf_locale == false && found_bom == true)
|
|
||||||
+ {
|
|
||||||
+ /*try using some predefined locale */
|
|
||||||
|
|
||||||
+ if (set_utf_locale () != 0)
|
|
||||||
+ {
|
|
||||||
+ error (EXIT_FAILURE, errno, _("cannot set UTF-8 locale"));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
/* The worst case is a non-blank character, then one blank, then a
|
|
||||||
tab stop, then MAX_COLUMN_WIDTH - 1 blanks, then a non-blank; so
|
|
||||||
allocate MAX_COLUMN_WIDTH bytes to store the blanks. */
|
|
||||||
pending_blank = xmalloc (max_column_width * sizeof (mbf_char_t));
|
|
||||||
|
|
||||||
- mbf_init (mbf, fp);
|
|
||||||
+ if (found_bom == true)
|
|
||||||
+ {
|
|
||||||
+ print_bom();
|
|
||||||
+ }
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
@@ -169,6 +189,27 @@ unexpand (void)
|
|
||||||
if ((mb_iseof (c)) && (fp = next_file (fp)))
|
|
||||||
{
|
|
||||||
mbf_init (mbf, fp);
|
|
||||||
+ if (fp!=NULL)
|
|
||||||
+ {
|
|
||||||
+ if (check_bom(fp,&mbf)==true)
|
|
||||||
+ {
|
|
||||||
+ /*Not the first file - check BOM header*/
|
|
||||||
+ if (using_utf_locale==false && found_bom==false)
|
|
||||||
+ {
|
|
||||||
+ /*BOM header in subsequent file but not in the first one. */
|
|
||||||
+ error (EXIT_FAILURE, errno, _("combination of files with and without BOM header"));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ if(using_utf_locale==false && found_bom==true)
|
|
||||||
+ {
|
|
||||||
+ /*First file conatined BOM header - locale was switched to UTF
|
|
||||||
+ *all subsequent files should contain BOM. */
|
|
||||||
+ error (EXIT_FAILURE, errno, _("combination of files with and without BOM header"));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
diff --git a/tests/expand/mb.sh b/tests/expand/mb.sh
|
|
||||||
index 031be7a..1621c84 100755
|
|
||||||
--- a/tests/expand/mb.sh
|
|
||||||
+++ b/tests/expand/mb.sh
|
|
||||||
@@ -109,4 +109,75 @@ env printf '12345678
|
|
||||||
expand < in > out || fail=1
|
|
||||||
compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+#BOM header test 1
|
|
||||||
+printf "\xEF\xBB\xBF" > in; cat <<\EOF >> in || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+EOF
|
|
||||||
+env printf ' äöü\t. öüä. \tä xx\n' >> in || framework_failure_
|
|
||||||
+
|
|
||||||
+printf "\xEF\xBB\xBF" > exp; cat <<\EOF >> exp || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+expand < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+LANG=C expand < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+LC_ALL=C expand < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+printf '\xEF\xBB\xBF' > in1; cat <<\EOF >> in1 || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+EOF
|
|
||||||
+env printf ' äöü\t. öüä. \tä xx\n' >> in1 || framework_failure_
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+printf '\xEF\xBB\xBF' > exp; cat <<\EOF >> exp || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+expand in1 in1 > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+LANG=C expand in1 in1 > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+LC_ALL=C expand in1 in1 > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
exit $fail
|
|
||||||
diff --git a/tests/unexpand/mb.sh b/tests/unexpand/mb.sh
|
|
||||||
index 8d75652..9d4ee3e 100755
|
|
||||||
--- a/tests/unexpand/mb.sh
|
|
||||||
+++ b/tests/unexpand/mb.sh
|
|
||||||
@@ -111,3 +111,62 @@ env printf '12345678
|
|
||||||
|
|
||||||
unexpand -a < in > out || fail=1
|
|
||||||
compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+#BOM header test 1
|
|
||||||
+printf "\xEF\xBB\xBF" > in; cat <<\EOF >> in || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+env printf ' äöü\t. öüä. \tä xx\n' >> in || framework_failure_
|
|
||||||
+
|
|
||||||
+printf "\xEF\xBB\xBF" > exp; cat <<\EOF >> exp || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+unexpand < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+LANG=C unexpand < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+LC_ALL=C unexpand < in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+printf "\xEF\xBB\xBF" > exp; cat <<\EOF >> exp || framework_failure_
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+1234567812345678123456781
|
|
||||||
+. . . .
|
|
||||||
+a b c d
|
|
||||||
+. . . .
|
|
||||||
+ä ö ü ß
|
|
||||||
+. . . .
|
|
||||||
+ äöü . öüä. ä xx
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+unexpand in in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+LANG=C unexpand in in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
+
|
|
||||||
+LC_ALL=C unexpand in in > out || fail=1
|
|
||||||
+compare exp out > /dev/null 2>&1 || fail=1
|
|
||||||
--
|
|
||||||
2.9.3
|
|
||||||
|
|
||||||
3581
coreutils-i18n.patch
3581
coreutils-i18n.patch
File diff suppressed because it is too large
Load diff
312
coreutils-keyring.gpg
Normal file
312
coreutils-keyring.gpg
Normal file
|
|
@ -0,0 +1,312 @@
|
||||||
|
Release GPG keyring of coreutils group.
|
||||||
|
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
|
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
|
||||||
|
0rQiUMOhZHJhaWcgQnJhZHkgPHBicmFkeUByZWRoYXQuY29tPokCHwQwAQIACQUC
|
||||||
|
Vp+cpgIdIAAKCRDfb9lxMGA32UftD/9jYqsCfNAzb0vhDOaU1AchzaQa1pIKEjoL
|
||||||
|
6d4AMeXFSBpMi4nYJpN+rmM8DAzcbenBcSoIqecdfENp3mY+hI8mYdnMiVpldsro
|
||||||
|
EAl/SDxY6//pPd0Dnmoe6sNodBB2uwHxhQi9ubz72iWX5WiKP8+OUAj91cLMl9nK
|
||||||
|
IYfcHy3iinSRqT02JP33DGDwsHCoAMmp59g6AHnf0sjCtZEtK79MtKiKTkUdMazP
|
||||||
|
VGs81x1jCO2kvvmy0fDZxkGuyso0inae2hsaMSqqoga5lC0jQanFIXSEkLZgJglj
|
||||||
|
LmiWPO0IGHPFth/e//51atGUmpdd2ufQ/QVoxSnQKRFQ98eO/SQ75bO5vbE8dGv8
|
||||||
|
oX9S3M9NjKOY9VnXC/JDyMXt2aMDs9tqSo22lJuT2Wq20wM5hlszxKI7c9QphnuH
|
||||||
|
yPNtszzXo1+5/UEuCNIQoe59MoscGmx7GN5WvlENaixGg7tzpZ+wdftN7BUcpJfC
|
||||||
|
gsEQurHzPEIomlszp3xraX0G84plClas13Ie8CIVM7UPbF0Cwx6XwhryjaDTkq3f
|
||||||
|
+mjQXtNJQk487q8cc9dxplslXiDqBYVngV+oDKOjrqc5PXSQm2M8EYRn9SXuFnT8
|
||||||
|
iF5SkuFYtgOEj3KNZ04ZB1I7AQebylS2LGwWan8yWJSAs22eR9urWBVpmre6GUGZ
|
||||||
|
fo7YBdOvbLQiUMOhZHJhaWcgQnJhZHkgPHBpeGVsYmVhdEBnbnUub3JnPokCOAQT
|
||||||
|
AQIAIgUCTnyAtAIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ32/ZcTBg
|
||||||
|
N9moHg/+Mjq/O1RnNg7kdUjRK1wOflym7itgE8kq4G55EJvLSxo6wIgd7ZKUj+cv
|
||||||
|
X+iXQpGRc3bicpNTsKcW6EjDtyg+VCSWD7qJ3EtwxVf9mN3bIqWSVwP0k8kc1N+t
|
||||||
|
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
|
||||||
|
ELphkzjc6eM3CaOZ73u4GVXotheeUabUHQ==
|
||||||
|
=drvb
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
Provides: bundled(gnulib)
|
|
||||||
|
|
||||||
# make it possible to install the latest available Adobe Reader RPM for Linux
|
|
||||||
Provides: /bin/cat
|
|
||||||
Provides: /bin/chmod
|
|
||||||
Provides: /bin/echo
|
|
||||||
Provides: /bin/ln
|
|
||||||
Provides: /bin/rm
|
|
||||||
Provides: /bin/touch
|
|
||||||
65
coreutils-python3.patch
Normal file
65
coreutils-python3.patch
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
From 8927d505ecb5334f09c48ef98ef1f464f581d0f7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: rpm-build <rpm-build>
|
||||||
|
Date: Tue, 2 Apr 2024 14:11:26 +0100
|
||||||
|
Subject: [PATCH] coreutils-python3.patch
|
||||||
|
|
||||||
|
---
|
||||||
|
init.cfg | 4 ++--
|
||||||
|
tests/d_type-check | 2 +-
|
||||||
|
tests/du/move-dir-while-traversing.sh | 6 +++---
|
||||||
|
3 files changed, 6 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/init.cfg b/init.cfg
|
||||||
|
index ac05f7b..26d9516 100644
|
||||||
|
--- a/init.cfg
|
||||||
|
+++ b/init.cfg
|
||||||
|
@@ -601,10 +601,10 @@ seek_data_capable_()
|
||||||
|
# Skip the current test if "." lacks d_type support.
|
||||||
|
require_dirent_d_type_()
|
||||||
|
{
|
||||||
|
- python < /dev/null \
|
||||||
|
+ python3 < /dev/null \
|
||||||
|
|| skip_ python missing: assuming no d_type support
|
||||||
|
|
||||||
|
- python "$abs_srcdir"/tests/d_type-check \
|
||||||
|
+ python3 "$abs_srcdir"/tests/d_type-check \
|
||||||
|
|| skip_ requires d_type support
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/tests/d_type-check b/tests/d_type-check
|
||||||
|
index 1a2f76f..42d3924 100644
|
||||||
|
--- a/tests/d_type-check
|
||||||
|
+++ b/tests/d_type-check
|
||||||
|
@@ -1,4 +1,4 @@
|
||||||
|
-#!/usr/bin/python
|
||||||
|
+#!/usr/bin/python3
|
||||||
|
# Exit 0 if "." and "./tempfile" have useful d_type information, else 1.
|
||||||
|
# Intended to exit 0 only on Linux/GNU systems.
|
||||||
|
import os
|
||||||
|
diff --git a/tests/du/move-dir-while-traversing.sh b/tests/du/move-dir-while-traversing.sh
|
||||||
|
index adf482b..cf9214a 100755
|
||||||
|
--- a/tests/du/move-dir-while-traversing.sh
|
||||||
|
+++ b/tests/du/move-dir-while-traversing.sh
|
||||||
|
@@ -21,8 +21,8 @@ print_ver_ du
|
||||||
|
require_trap_signame_
|
||||||
|
|
||||||
|
# We use a python-inotify script, so...
|
||||||
|
-python -m pyinotify -h > /dev/null \
|
||||||
|
- || skip_ 'python inotify package not installed'
|
||||||
|
+python3 -m pyinotify -h > /dev/null \
|
||||||
|
+ || skip_ 'python3 inotify package not installed'
|
||||||
|
|
||||||
|
# Move a directory "up" while du is processing its sub-directories.
|
||||||
|
# While du is processing a hierarchy .../B/C/D/... this script
|
||||||
|
@@ -33,7 +33,7 @@ python -m pyinotify -h > /dev/null \
|
||||||
|
# rename syscall before du finishes processing the subtree under D/.
|
||||||
|
|
||||||
|
cat <<'EOF' > inotify-watch-for-dir-access.py
|
||||||
|
-#!/usr/bin/env python
|
||||||
|
+#!/usr/bin/env python3
|
||||||
|
import pyinotify as pn
|
||||||
|
import os,sys
|
||||||
|
|
||||||
|
--
|
||||||
|
2.51.0
|
||||||
|
|
||||||
|
|
@ -1,120 +0,0 @@
|
||||||
diff --git a/man/chcon.x b/man/chcon.x
|
|
||||||
index 8c1ff6f..c84fb96 100644
|
|
||||||
--- a/man/chcon.x
|
|
||||||
+++ b/man/chcon.x
|
|
||||||
@@ -1,4 +1,4 @@
|
|
||||||
[NAME]
|
|
||||||
-chcon \- change file security context
|
|
||||||
+chcon \- change file SELinux security context
|
|
||||||
[DESCRIPTION]
|
|
||||||
.\" Add any additional description here
|
|
||||||
diff --git a/man/runcon.x b/man/runcon.x
|
|
||||||
index d2df13e..5c5f5d8 100644
|
|
||||||
--- a/man/runcon.x
|
|
||||||
+++ b/man/runcon.x
|
|
||||||
@@ -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 --git a/src/cp.c b/src/cp.c
|
|
||||||
index 1b528c6..25dbb88 100644
|
|
||||||
--- a/src/cp.c
|
|
||||||
+++ b/src/cp.c
|
|
||||||
@@ -203,6 +203,9 @@ Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.\n\
|
|
||||||
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);
|
|
||||||
@@ -929,7 +932,7 @@ main (int argc, char **argv)
|
|
||||||
selinux_enabled = (0 < is_selinux_enabled ());
|
|
||||||
cp_option_init (&x);
|
|
||||||
|
|
||||||
- while ((c = getopt_long (argc, argv, "abdfHilLnprst:uvxPRS:TZ",
|
|
||||||
+ while ((c = getopt_long (argc, argv, "abcdfHilLnprst:uvxPRS:TZ",
|
|
||||||
long_opts, NULL))
|
|
||||||
!= -1)
|
|
||||||
{
|
|
||||||
@@ -977,6 +980,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 --git a/doc/coreutils.texi b/doc/coreutils.texi
|
|
||||||
index 47e4480..cff2ead 100644
|
|
||||||
--- a/doc/coreutils.texi
|
|
||||||
+++ b/doc/coreutils.texi
|
|
||||||
@@ -8083,6 +8083,11 @@ done
|
|
||||||
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 --git a/src/install.c b/src/install.c
|
|
||||||
index d79d597..437889a 100644
|
|
||||||
--- a/src/install.c
|
|
||||||
+++ b/src/install.c
|
|
||||||
@@ -673,7 +673,7 @@ In the 4th form, create all components of the given DIRECTORY(ies).\n\
|
|
||||||
-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 set SELinux security context of destination\n\
|
|
||||||
file and each created directory to default type\n\
|
|
||||||
--context[=CTX] like -Z, or if CTX is specified then set the\n\
|
|
||||||
@@ -824,7 +824,7 @@ main (int argc, char **argv)
|
|
||||||
dir_arg = false;
|
|
||||||
umask (0);
|
|
||||||
|
|
||||||
- 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)
|
|
||||||
@@ -885,6 +885,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)
|
|
||||||
{
|
|
||||||
@@ -892,6 +894,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;
|
|
||||||
347
coreutils.spec
347
coreutils.spec
|
|
@ -1,102 +1,50 @@
|
||||||
Summary: A set of basic GNU tools commonly used in shell scripts
|
Summary: A set of basic GNU tools commonly used in shell scripts
|
||||||
Name: coreutils
|
Name: coreutils
|
||||||
Version: 8.32
|
Version: 9.9
|
||||||
Release: 22%{?dist}
|
Release: 2%{?dist}
|
||||||
License: GPLv3+
|
# some used parts of gnulib are under various variants of LGPL
|
||||||
|
License: GPL-3.0-or-later AND GFDL-1.3-no-invariants-or-later AND LGPL-2.1-or-later AND LGPL-3.0-or-later
|
||||||
Url: https://www.gnu.org/software/coreutils/
|
Url: https://www.gnu.org/software/coreutils/
|
||||||
Source0: https://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz
|
Source0: https://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz
|
||||||
|
Source1: https://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz.sig
|
||||||
|
# From https://savannah.gnu.org/project/release-gpgkeys.php?group=coreutils&download=1
|
||||||
|
# which is linked as project keyring on https://savannah.gnu.org/projects/coreutils
|
||||||
|
Source2: coreutils-keyring.gpg
|
||||||
Source50: supported_utils
|
Source50: supported_utils
|
||||||
Source51: coreutils-provides.inc
|
|
||||||
Source105: coreutils-colorls.sh
|
Source105: coreutils-colorls.sh
|
||||||
Source106: coreutils-colorls.csh
|
Source106: coreutils-colorls.csh
|
||||||
|
|
||||||
# do not make coreutils-single depend on /usr/bin/coreutils
|
# do not make coreutils-single depend on /usr/bin/coreutils
|
||||||
%global __requires_exclude ^%{_bindir}/coreutils$
|
%global __requires_exclude ^%{_bindir}/coreutils$
|
||||||
|
|
||||||
# ls: restore 8.31 behavior on removed directories
|
|
||||||
Patch1: coreutils-8.32-ls-removed-dir.patch
|
|
||||||
|
|
||||||
# du: simplify leaf optimization for XFS (#1823247)
|
|
||||||
Patch2: coreutils-8.32-leaf-opt-xfs.patch
|
|
||||||
|
|
||||||
# cp: default to --reflink=auto (#1861108)
|
|
||||||
Patch3: coreutils-8.32-cp-reflink-auto.patch
|
|
||||||
|
|
||||||
# eliminate unportable gnulib tests
|
|
||||||
Patch4: coreutils-8.32-gnulib-perror-test.patch
|
|
||||||
|
|
||||||
# df,stat,tail: recognize more file system types
|
|
||||||
Patch5: coreutils-8.32-new-fs-types.patch
|
|
||||||
|
|
||||||
# rm: do not skip files upon failure to remove an empty dir (#1905481)
|
|
||||||
Patch6: coreutils-8.32-rm-stray-skip.patch
|
|
||||||
|
|
||||||
# expr: fix invalid read with unmatched \(...\) (#1919775)
|
|
||||||
Patch7: coreutils-8.32-expr-unmatched-par.patch
|
|
||||||
|
|
||||||
# split: fix --number=K/N to output correct part of file (#1921246)
|
|
||||||
Patch8: coreutils-8.32-split-number.patch
|
|
||||||
|
|
||||||
# ls: fix crash printing SELinux context for unstatable files (#1921249)
|
|
||||||
Patch9: coreutils-8.32-ls-scontext-crash.patch
|
|
||||||
|
|
||||||
# stat: add support for the exfat file system (#1921427)
|
|
||||||
Patch10: coreutils-8.32-stat-exfat.patch
|
|
||||||
|
|
||||||
# cp: use copy_file_range if available
|
|
||||||
Patch11: coreutils-8.32-cp-file-range.patch
|
|
||||||
|
|
||||||
# hostname,ln: fix memory leaks detected by Coverity
|
|
||||||
Patch12: coreutils-8.32-mem-leaks.patch
|
|
||||||
|
|
||||||
# utimens: fix confusing arg type in internal func
|
|
||||||
Patch13: coreutils-8.32-coverity-utimens.patch
|
|
||||||
|
|
||||||
# disable the test-lock gnulib test prone to deadlock
|
# disable the test-lock gnulib test prone to deadlock
|
||||||
Patch100: coreutils-8.26-test-lock.patch
|
Patch100: coreutils-8.26-test-lock.patch
|
||||||
|
|
||||||
# require_selinux_(): use selinuxenabled(8) if available
|
# require_selinux_(): use selinuxenabled(8) if available
|
||||||
Patch105: coreutils-8.26-selinuxenable.patch
|
Patch101: coreutils-8.26-selinuxenable.patch
|
||||||
|
|
||||||
# downstream changes to default DIR_COLORS
|
# downstream changes to default DIR_COLORS
|
||||||
Patch102: coreutils-8.32-DIR_COLORS.patch
|
Patch102: coreutils-8.32-DIR_COLORS.patch
|
||||||
#do display processor type for uname -p/-i based on uname(2) syscall
|
|
||||||
Patch103: coreutils-8.2-uname-processortype.patch
|
|
||||||
#df --direct
|
|
||||||
Patch104: coreutils-df-direct.patch
|
|
||||||
#add note about mkdir --mode behaviour into info documentation(#610559)
|
|
||||||
Patch107: coreutils-8.4-mkdir-modenote.patch
|
|
||||||
|
|
||||||
# sh-utils
|
# use python3 in tests
|
||||||
#add info about TZ envvar to date manpage
|
Patch103: coreutils-python3.patch
|
||||||
Patch703: sh-utils-2.0.11-dateman.patch
|
|
||||||
Patch713: coreutils-4.5.3-langinfo.patch
|
# df --direct
|
||||||
|
Patch104: coreutils-df-direct.patch
|
||||||
|
|
||||||
|
# gnulib C23 support
|
||||||
|
# https://github.com/coreutils/gnulib/commit/df17f4f37ed3ca373d23ad42eae51122bdb96626
|
||||||
|
Patch105: coreutils-9.9-gnulib-c23.patch
|
||||||
|
|
||||||
|
# fix cut test failure on aarch64 rawhide (rhbz#2424302)
|
||||||
|
# https://github.com/coreutils/coreutils/commit/95044cb5eaea83d02f768feb5ab79fcf5e6ad782
|
||||||
|
Patch106: coreutils-9.9-fix-cut-test-aarch64.patch
|
||||||
|
|
||||||
# (sb) lin18nux/lsb compliance - multibyte functionality patch
|
# (sb) lin18nux/lsb compliance - multibyte functionality patch
|
||||||
Patch800: coreutils-i18n.patch
|
Patch800: coreutils-i18n.patch
|
||||||
# (sb) lin18nux/lsb compliance - expand/unexpand
|
|
||||||
Patch801: coreutils-i18n-expand-unexpand.patch
|
|
||||||
# i18n patch for cut - old version - used
|
|
||||||
Patch804: coreutils-i18n-cut-old.patch
|
|
||||||
# The unexpand patch above is not correct. Sent to the patch authors
|
|
||||||
Patch803: coreutils-i18n-fix-unexpand.patch
|
|
||||||
#(un)expand - allow multiple files on input - broken by patch 801
|
|
||||||
Patch805: coreutils-i18n-fix2-expand-unexpand.patch
|
|
||||||
#(un)expand - test BOM headers
|
|
||||||
Patch806: coreutils-i18n-un-expand-BOM.patch
|
|
||||||
# make 'sort -h' work for arbitrary column even when using UTF-8 locales
|
|
||||||
Patch807: coreutils-i18n-sort-human.patch
|
|
||||||
# fold: preserve new-lines in mutlibyte text (#1418505)
|
|
||||||
Patch808: coreutils-i18n-fold-newline.patch
|
|
||||||
|
|
||||||
#getgrouplist() patch from Ulrich Drepper.
|
|
||||||
Patch908: coreutils-getgrouplist.patch
|
|
||||||
|
|
||||||
#SELINUX Patch - implements Redhat changes
|
|
||||||
#(upstream did some SELinux implementation unlike with RedHat patch)
|
|
||||||
Patch950: coreutils-selinux.patch
|
|
||||||
|
|
||||||
Conflicts: filesystem < 3
|
Conflicts: filesystem < 3
|
||||||
|
|
||||||
# To avoid clobbering installs
|
# To avoid clobbering installs
|
||||||
Conflicts: coreutils-single
|
Conflicts: coreutils-single
|
||||||
|
|
||||||
|
|
@ -115,22 +63,40 @@ BuildRequires: libselinux-utils
|
||||||
BuildRequires: make
|
BuildRequires: make
|
||||||
BuildRequires: openssl-devel
|
BuildRequires: openssl-devel
|
||||||
BuildRequires: strace
|
BuildRequires: strace
|
||||||
|
BuildRequires: systemd-devel
|
||||||
BuildRequires: texinfo
|
BuildRequires: texinfo
|
||||||
|
|
||||||
|
# For gpg verification of source tarball
|
||||||
|
BuildRequires: gnupg2
|
||||||
|
|
||||||
# test-only dependencies
|
# test-only dependencies
|
||||||
|
BuildRequires: acl
|
||||||
|
BuildRequires: gdb
|
||||||
BuildRequires: perl-interpreter
|
BuildRequires: perl-interpreter
|
||||||
BuildRequires: perl(FileHandle)
|
BuildRequires: perl(FileHandle)
|
||||||
|
BuildRequires: python3
|
||||||
|
BuildRequires: tzdata
|
||||||
|
%ifarch %valgrind_arches
|
||||||
|
BuildRequires: valgrind
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%if 0%{?fedora}
|
||||||
|
BuildRequires: perl(Expect)
|
||||||
|
BuildRequires: python3-inotify
|
||||||
|
%endif
|
||||||
|
|
||||||
%if 23 < 0%{?fedora} || 7 < 0%{?rhel}
|
%if 23 < 0%{?fedora} || 7 < 0%{?rhel}
|
||||||
# needed by i18n test-cases
|
# needed by i18n test-cases
|
||||||
BuildRequires: glibc-langpack-en
|
BuildRequires: glibc-langpack-en
|
||||||
BuildRequires: glibc-langpack-fr
|
BuildRequires: glibc-langpack-fr
|
||||||
BuildRequires: glibc-langpack-ko
|
BuildRequires: glibc-langpack-ko
|
||||||
|
BuildRequires: glibc-langpack-sv
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
Requires: %{name}-common = %{version}-%{release}
|
Requires: %{name}-common = %{version}-%{release}
|
||||||
|
|
||||||
Provides: coreutils-full = %{version}-%{release}
|
Provides: coreutils-full = %{version}-%{release}
|
||||||
%include %{SOURCE51}
|
Provides: bundled(gnulib)
|
||||||
Obsoletes: %{name} < 8.24-100
|
Obsoletes: %{name} < 8.24-100
|
||||||
|
|
||||||
%description
|
%description
|
||||||
|
|
@ -142,7 +108,7 @@ Summary: coreutils multicall binary
|
||||||
Suggests: coreutils-common
|
Suggests: coreutils-common
|
||||||
Provides: coreutils = %{version}-%{release}
|
Provides: coreutils = %{version}-%{release}
|
||||||
Provides: coreutils%{?_isa} = %{version}-%{release}
|
Provides: coreutils%{?_isa} = %{version}-%{release}
|
||||||
%include %{SOURCE51}
|
Provides: bundled(gnulib)
|
||||||
# To avoid clobbering installs
|
# To avoid clobbering installs
|
||||||
Conflicts: coreutils < 8.24-100
|
Conflicts: coreutils < 8.24-100
|
||||||
# Note RPM doesn't support separate buildroots for %files
|
# Note RPM doesn't support separate buildroots for %files
|
||||||
|
|
@ -159,16 +125,19 @@ packaged as a single multicall binary.
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1107973#c7
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1107973#c7
|
||||||
Obsoletes: %{name} < 8.24-100
|
Obsoletes: %{name} < 8.24-100
|
||||||
|
|
||||||
# info doc refers to "Specifying the Time Zone" from glibc-doc (#959597)
|
# Gnulib translations are maintained seprately since coreutils 9.6 (#2393892)
|
||||||
Recommends: glibc-doc
|
Requires: gnulib-l10n
|
||||||
|
|
||||||
|
# info doc refers to "Specifying the Time Zone" from glibc-doc (#959597)
|
||||||
|
Suggests: glibc-doc
|
||||||
|
|
||||||
Recommends: ncurses
|
|
||||||
Summary: coreutils common optional components
|
Summary: coreutils common optional components
|
||||||
%description common
|
%description common
|
||||||
Optional though recommended components,
|
Optional though recommended components,
|
||||||
including documentation and translations.
|
including documentation and translations.
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
|
%{gpgverify} --keyring='%{SOURCE2}' --signature='%{SOURCE1}' --data='%{SOURCE0}'
|
||||||
%autosetup -N
|
%autosetup -N
|
||||||
|
|
||||||
# will be regenerated in the build directories
|
# will be regenerated in the build directories
|
||||||
|
|
@ -193,16 +162,15 @@ sed src/dircolors.hin \
|
||||||
find tests -name '*.sh' -perm 0644 -print -exec chmod 0755 '{}' '+'
|
find tests -name '*.sh' -perm 0644 -print -exec chmod 0755 '{}' '+'
|
||||||
(echo "<<< done") 2>/dev/null
|
(echo "<<< done") 2>/dev/null
|
||||||
|
|
||||||
|
# FIXME: Force a newer gettext version to workaround `autoreconf -i` errors
|
||||||
|
# with coreutils 9.6 and bundled gettext 0.19.2 from gettext-common-devel.
|
||||||
|
sed -i "s/0.19.2/$(rpm -q --queryformat '%%{VERSION}\n' gettext-devel)/" bootstrap.conf configure.ac
|
||||||
|
|
||||||
autoreconf -fiv
|
autoreconf -fiv
|
||||||
|
|
||||||
%build
|
%build
|
||||||
export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing -fpic"
|
export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing -fpic"
|
||||||
|
|
||||||
# disable -flto on ppc64le to make test-float pass (#1789115)
|
|
||||||
%ifarch ppc64le
|
|
||||||
CFLAGS="$CFLAGS -fno-lto"
|
|
||||||
%endif
|
|
||||||
|
|
||||||
# Upstream suggests to build with -Dlint for static analyzers:
|
# Upstream suggests to build with -Dlint for static analyzers:
|
||||||
# https://lists.gnu.org/archive/html/coreutils/2018-06/msg00110.html
|
# https://lists.gnu.org/archive/html/coreutils/2018-06/msg00110.html
|
||||||
# ... and even for production binary RPMs:
|
# ... and even for production binary RPMs:
|
||||||
|
|
@ -223,7 +191,7 @@ for type in separate single; do
|
||||||
if test $type = 'single'; then
|
if test $type = 'single'; then
|
||||||
config_single='--enable-single-binary'
|
config_single='--enable-single-binary'
|
||||||
config_single="$config_single --without-openssl" # smaller/slower sha*sum
|
config_single="$config_single --without-openssl" # smaller/slower sha*sum
|
||||||
config_single="$config_single --without-gmp" # expr/factor machine ints
|
config_single="$config_single --without-libgmp" # expr/factor machine ints
|
||||||
else
|
else
|
||||||
config_single='--with-openssl' # faster sha*sum
|
config_single='--with-openssl' # faster sha*sum
|
||||||
fi
|
fi
|
||||||
|
|
@ -231,6 +199,7 @@ for type in separate single; do
|
||||||
--cache-file=../config.cache \
|
--cache-file=../config.cache \
|
||||||
--enable-install-program=arch \
|
--enable-install-program=arch \
|
||||||
--enable-no-install-program=kill,uptime \
|
--enable-no-install-program=kill,uptime \
|
||||||
|
--enable-systemd \
|
||||||
--with-tty-group \
|
--with-tty-group \
|
||||||
DEFAULT_POSIX2_VERSION=200112 alternative=199209 || :
|
DEFAULT_POSIX2_VERSION=200112 alternative=199209 || :
|
||||||
%make_build all V=1
|
%make_build all V=1
|
||||||
|
|
@ -257,14 +226,20 @@ for type in separate single; do
|
||||||
fi
|
fi
|
||||||
(cd $type && make DESTDIR=$RPM_BUILD_ROOT/$subdir $install)
|
(cd $type && make DESTDIR=$RPM_BUILD_ROOT/$subdir $install)
|
||||||
|
|
||||||
|
%if "%{_sbindir}" != "%{_bindir}"
|
||||||
# chroot was in /usr/sbin :
|
# chroot was in /usr/sbin :
|
||||||
mkdir -p $RPM_BUILD_ROOT/$subdir/{%{_bindir},%{_sbindir}}
|
mkdir -p $RPM_BUILD_ROOT/$subdir/%_sbindir
|
||||||
mv $RPM_BUILD_ROOT/$subdir/{%_bindir,%_sbindir}/chroot
|
mv $RPM_BUILD_ROOT/$subdir/{%_bindir,%_sbindir}/chroot
|
||||||
|
%endif
|
||||||
|
|
||||||
# Move multicall variants to *.single.
|
# Move multicall variants to *.single.
|
||||||
# RemovePathPostfixes will strip that later.
|
# RemovePathPostfixes will strip that later.
|
||||||
if test $type = 'single'; then
|
if test $type = 'single'; then
|
||||||
for dir in %{_bindir} %{_sbindir} %{_libexecdir}/%{name}; do
|
for dir in %{_bindir} \
|
||||||
|
%if "%{_sbindir}" != "%{_bindir}"
|
||||||
|
%{_sbindir} \
|
||||||
|
%endif
|
||||||
|
%{_libexecdir}/%{name}; do
|
||||||
for bin in $RPM_BUILD_ROOT/%{_libexecdir}/%{name}/$dir/*; do
|
for bin in $RPM_BUILD_ROOT/%{_libexecdir}/%{name}/$dir/*; do
|
||||||
basebin=$(basename $bin)
|
basebin=$(basename $bin)
|
||||||
mv $bin $RPM_BUILD_ROOT/$dir/$basebin.single
|
mv $bin $RPM_BUILD_ROOT/$dir/$basebin.single
|
||||||
|
|
@ -292,7 +267,9 @@ rm -f $RPM_BUILD_ROOT%{_infodir}/dir
|
||||||
|
|
||||||
%files single
|
%files single
|
||||||
%{_bindir}/*.single
|
%{_bindir}/*.single
|
||||||
|
%if "%{_sbindir}" != "%{_bindir}"
|
||||||
%{_sbindir}/chroot.single
|
%{_sbindir}/chroot.single
|
||||||
|
%endif
|
||||||
%dir %{_libexecdir}/coreutils
|
%dir %{_libexecdir}/coreutils
|
||||||
%{_libexecdir}/coreutils/*.so.single
|
%{_libexecdir}/coreutils/*.so.single
|
||||||
# duplicate the license because coreutils-common does not need to be installed
|
# duplicate the license because coreutils-common does not need to be installed
|
||||||
|
|
@ -309,7 +286,201 @@ rm -f $RPM_BUILD_ROOT%{_infodir}/dir
|
||||||
%license COPYING
|
%license COPYING
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Jan 13 2026 Lukáš Zaoral <lzaoral@redhat.com> - 9.9-2
|
||||||
|
- fix cut test failure on aarch64 rawhide (rhbz#2424302)
|
||||||
|
|
||||||
|
* Wed Nov 26 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.9-1
|
||||||
|
- rebase to latest upstream release (rhbz#2413803)
|
||||||
|
|
||||||
|
* Mon Sep 29 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.8-3
|
||||||
|
- require gnulib-l10n for translations of gnulib messages (rhbz#2393892)
|
||||||
|
|
||||||
|
* Thu Sep 25 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.8-2
|
||||||
|
- tail: fix tailing larger number of lines in regular files (rhbz#2398008)
|
||||||
|
|
||||||
|
* Wed Sep 24 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.8-1
|
||||||
|
- rebase to latest upstream release (rhbz#2397467)
|
||||||
|
- remove downstream patch for selinux options deprecated since 2009
|
||||||
|
|
||||||
|
* Wed Jul 23 2025 Fedora Release Engineering <releng@fedoraproject.org> - 9.7-5
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Jun 30 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.7-4
|
||||||
|
- stty: add support for arbitrary baud rates (rhbz#2375439)
|
||||||
|
|
||||||
|
* Wed May 28 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.7-3
|
||||||
|
- sort: fix buffer under-read (CVE-2025-5278)
|
||||||
|
|
||||||
|
* Mon May 19 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.7-2
|
||||||
|
- cp/mv: do not fail when copying of trivial NFSv4 ACLs fails (rhbz#2363149)
|
||||||
|
|
||||||
|
* Wed Apr 09 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.7-1
|
||||||
|
- rebase to latest upstream release (rhbz#2358624)
|
||||||
|
|
||||||
|
* Tue Feb 25 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.6-2
|
||||||
|
- fix 'who -m' with guessed tty names (rhbz#2343998)
|
||||||
|
|
||||||
|
* Mon Jan 20 2025 Lukáš Zaoral <lzaoral@redhat.com> - 9.6-1
|
||||||
|
- rebase to latest upstream version (rhbz#2338620)
|
||||||
|
- sync i18n patch with SUSE (Kudos to Berny Völker!)
|
||||||
|
|
||||||
|
* Thu Jan 16 2025 Fedora Release Engineering <releng@fedoraproject.org> - 9.5-13
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sun Jan 12 2025 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 9.5-12
|
||||||
|
- Rebuilt for the bin-sbin merge (2nd attempt)
|
||||||
|
|
||||||
|
* Wed Nov 13 2024 Florian Weimer <fweimer@redhat.com> - 9.5-11
|
||||||
|
- Affinity mask handling in nproc for large CPU counts (rhbz#2325167)
|
||||||
|
|
||||||
|
* Fri Sep 27 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.5-10
|
||||||
|
- fix fold -b with UTF8 locale (RHEL-60295)
|
||||||
|
|
||||||
|
* Tue Aug 27 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.5-9
|
||||||
|
- show web sessions in who output (rhbz#2307847)
|
||||||
|
|
||||||
|
* Wed Aug 21 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.5-8
|
||||||
|
- add missing systemd-devel buildrequires
|
||||||
|
|
||||||
|
* Wed Jul 17 2024 Fedora Release Engineering <releng@fedoraproject.org> - 9.5-7
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Jul 15 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.5-6
|
||||||
|
- Rebuilt for the bin-sbin merge
|
||||||
|
|
||||||
|
* Mon Jul 15 2024 Sohum Mendon <sohum.mendon@proton.me> - 9.5-5
|
||||||
|
- fix incorrect exit status when fold is called with a non-existent file
|
||||||
|
|
||||||
|
* Tue Jul 09 2024 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 9.5-4
|
||||||
|
- Rebuilt for the bin-sbin merge
|
||||||
|
|
||||||
|
* Thu Jul 04 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.5-3
|
||||||
|
- do not buildrequire perl(Expect) on ELN
|
||||||
|
|
||||||
|
* Tue Jun 04 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.5-2
|
||||||
|
- enable LTO on ppc64le
|
||||||
|
|
||||||
|
* Tue Apr 02 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.5-1
|
||||||
|
- rebase to latest upstream version (rhbz#2272063)
|
||||||
|
- sync i18n patch with SUSE (Kudos to Berny Völker!)
|
||||||
|
- add some test dependencies to execute additional part of the upstream test-suite
|
||||||
|
|
||||||
|
* Mon Jan 29 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.4-6
|
||||||
|
- fix tail on kernels with 64k page sizes (RHEL-22866)
|
||||||
|
|
||||||
|
* Wed Jan 24 2024 Fedora Release Engineering <releng@fedoraproject.org> - 9.4-5
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||||
|
|
||||||
|
* Fri Jan 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 9.4-4
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||||
|
|
||||||
|
* Thu Jan 18 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.4-3
|
||||||
|
- fix compilation on i686
|
||||||
|
|
||||||
|
* Thu Jan 18 2024 Lukáš Zaoral <lzaoral@redhat.com> - 9.4-2
|
||||||
|
- fix buffer overflow in split (CVE-2024-0684)
|
||||||
|
|
||||||
|
* Fri Sep 15 2023 Lukáš Zaoral <lzaoral@redhat.com> - 9.4-1
|
||||||
|
- new upstream release 9.4 (#2235759)
|
||||||
|
- enable integration with systemd
|
||||||
|
- fix the license field
|
||||||
|
|
||||||
|
* Wed Jul 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 9.3-2
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||||
|
|
||||||
|
* Tue Apr 18 2023 Kamil Dudka <kdudka@redhat.com> - 9.3-1
|
||||||
|
- remove obsolete Provides for absolute paths
|
||||||
|
- new upstream release 9.3
|
||||||
|
|
||||||
|
* Tue Apr 11 2023 Lukáš Zaoral <lzaoral@redhat.com> - 9.2-4
|
||||||
|
- migrate to SPDX license format
|
||||||
|
|
||||||
|
* Fri Mar 24 2023 Kamil Dudka <kdudka@redhat.com> - 9.2-3
|
||||||
|
- copy: fix --reflink=auto to fallback in more cases (#2180056)
|
||||||
|
- cksum: fix reporting of failed checks (#2180056)
|
||||||
|
|
||||||
|
* Wed Mar 22 2023 Kamil Dudka <kdudka@redhat.com> - 9.2-2
|
||||||
|
- coreutils-getgrouplist.patch: drop a patch no longer needed
|
||||||
|
|
||||||
|
* Wed Mar 22 2023 Kamil Dudka <kdudka@redhat.com> - 9.2-1
|
||||||
|
- new upstream release 9.2
|
||||||
|
|
||||||
|
* Thu Jan 19 2023 Fedora Release Engineering <releng@fedoraproject.org>
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Jan 02 2023 Kamil Dudka <kdudka@redhat.com> - 9.1-10
|
||||||
|
- drop obsolete downstream-only extension of date(1) man page
|
||||||
|
- undocument downstream SELinux options deprecated since 2009
|
||||||
|
|
||||||
|
* Mon Jan 02 2023 Kamil Dudka <kdudka@redhat.com> - 9.1-9
|
||||||
|
- basic support for checking NFSv4 ACLs (#2137866)
|
||||||
|
|
||||||
|
* Mon Sep 19 2022 Kamil Dudka <kdudka@redhat.com> - 9.1-8
|
||||||
|
- remove obsolete extension of mkdir(1) info documentation
|
||||||
|
|
||||||
|
* Tue Aug 23 2022 Kamil Dudka <kdudka@redhat.com> - 9.1-7
|
||||||
|
- remove non-upstream patch for uname -i/-p (#548834)
|
||||||
|
|
||||||
|
* Mon Aug 08 2022 Kamil Dudka <kdudka@redhat.com> - 9.1-6
|
||||||
|
- improve wording of a comment in /etc/DIR_COLORS (#2112593)
|
||||||
|
|
||||||
|
* Mon Aug 08 2022 Kamil Dudka <kdudka@redhat.com> - 9.1-5
|
||||||
|
- improve handling of control characters in unexpand (#2112870)
|
||||||
|
|
||||||
|
* Mon Aug 01 2022 Kamil Dudka <kdudka@redhat.com> - 9.1-4
|
||||||
|
- prevent unexpand from failing on control characters (#2112870)
|
||||||
|
|
||||||
|
* Wed Jul 20 2022 Fedora Release Engineering <releng@fedoraproject.org>
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||||
|
|
||||||
|
* Sat Apr 23 2022 Pádraig Brady <P@draigBrady.com> - 9.1-2
|
||||||
|
- make simple backups in correct dir; broken in 9.1
|
||||||
|
|
||||||
|
* Tue Apr 19 2022 Kamil Dudka <kdudka@redhat.com> - 9.1-1
|
||||||
|
- new upstream release 9.1
|
||||||
|
|
||||||
|
* Mon Mar 21 2022 Kamil Dudka <kdudka@redhat.com> - 9.0-5
|
||||||
|
- ls, stat: avoid triggering automounts (#2044981)
|
||||||
|
|
||||||
|
* Tue Mar 01 2022 Kamil Dudka <kdudka@redhat.com> - 9.0-4
|
||||||
|
- make `df --direct` work again (#2058686)
|
||||||
|
|
||||||
|
* Wed Jan 19 2022 Fedora Release Engineering <releng@fedoraproject.org>
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||||
|
|
||||||
|
* Mon Oct 04 2021 Kamil Dudka <kdudka@redhat.com> - 9.0-2
|
||||||
|
- chmod: fix exit status when ignoring symlinks
|
||||||
|
|
||||||
|
* Sun Sep 26 2021 Kamil Dudka <kdudka@redhat.com> - 9.0-1
|
||||||
|
- new upstream release 9.0
|
||||||
|
|
||||||
|
* Tue Sep 14 2021 Sahana Prasad <sahana@redhat.com>
|
||||||
|
- Rebuilt with OpenSSL 3.0.0
|
||||||
|
|
||||||
|
* Wed Jul 21 2021 Fedora Release Engineering <releng@fedoraproject.org>
|
||||||
|
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||||
|
|
||||||
|
* Wed Jul 07 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-30
|
||||||
|
- df: fix duplicated remote entries due to bind mounts (#1979814)
|
||||||
|
|
||||||
|
* Thu Jul 01 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-28
|
||||||
|
- tail: fix stack out-of-bounds write with --follow
|
||||||
|
|
||||||
|
* Tue Jun 08 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-27
|
||||||
|
- mountlist: recognize fuse.portal as dummy file system (#1913358)
|
||||||
|
|
||||||
|
* Mon May 17 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-26
|
||||||
|
- cp: pick additional copy_file_range()-related fixes from upstream
|
||||||
|
|
||||||
|
* Mon May 03 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-24
|
||||||
|
- copy: ensure we enforce --reflink=never (#1956080)
|
||||||
|
|
||||||
|
* Tue Apr 27 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-23
|
||||||
|
- copy: do not refuse to copy a swap file
|
||||||
|
|
||||||
* Fri Apr 09 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-22
|
* Fri Apr 09 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-22
|
||||||
|
- weaken the dependency on glibc-doc to reduce minimal installations
|
||||||
|
- drop the last use of ncurses no longer needed (#1830318)
|
||||||
- utimens: fix confusing arg type in internal func
|
- utimens: fix confusing arg type in internal func
|
||||||
|
|
||||||
* Fri Mar 26 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-21
|
* Fri Mar 26 2021 Kamil Dudka <kdudka@redhat.com> - 8.32-21
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -1,12 +0,0 @@
|
||||||
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 @@ calendar date, time of day, time zone, day of week, relative time,
|
|
||||||
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.
|
|
||||||
3
sources
3
sources
|
|
@ -1 +1,2 @@
|
||||||
SHA512 (coreutils-8.32.tar.xz) = 1c8f3584efd61b4b02e7ac5db8e103b63cfb2063432caaf1e64cb2dcc56d8c657d1133bbf10bd41468d6a1f31142e6caa81d16ae68fa3e6e84075c253613a145
|
SHA512 (coreutils-9.9.tar.xz.sig) = 0a3dfdfa6b4234e2e1d42142269f959bdf3cf8f6605a50270a27eff84dd22588f182121f7dd3eeb04be45f5109d02690215065b3d3b43882874d0e165a1435d0
|
||||||
|
SHA512 (coreutils-9.9.tar.xz) = e7b0e59f7732d2c098ea4934014f470248bd5c4764210e9200a698010a8e3b95bbb26e543f0cd73ed5a4b8e1f8cda932c73f39954d68175e4deaa47526610c65
|
||||||
|
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Makefile of /CoreOS/coreutils/readlink-cannot-handle-recursive-symlink s
|
|
||||||
# Description: Test for readlink cannot handle recursive symlinks
|
|
||||||
# Author: Jan Scotka <jscotka@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2010 Red Hat, Inc. All rights reserved.
|
|
||||||
#
|
|
||||||
# This copyrighted material is made available to anyone wishing
|
|
||||||
# to use, modify, copy, or redistribute it subject to the terms
|
|
||||||
# and conditions of the GNU General Public License version 2.
|
|
||||||
#
|
|
||||||
# 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, write to the Free
|
|
||||||
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
export TEST=/CoreOS/coreutils/readlink-cannot-handle-recursive-symlinks
|
|
||||||
export TESTVERSION=1.0
|
|
||||||
|
|
||||||
BUILT_FILES=
|
|
||||||
|
|
||||||
FILES=$(METADATA) runtest.sh Makefile PURPOSE
|
|
||||||
|
|
||||||
.PHONY: all install download clean
|
|
||||||
|
|
||||||
run: $(FILES) build
|
|
||||||
./runtest.sh
|
|
||||||
|
|
||||||
build: $(BUILT_FILES)
|
|
||||||
chmod a+x runtest.sh
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *~ $(BUILT_FILES)
|
|
||||||
|
|
||||||
|
|
||||||
include /usr/share/rhts/lib/rhts-make.include
|
|
||||||
|
|
||||||
$(METADATA): Makefile
|
|
||||||
@echo "Owner: Jan Scotka <jscotka@redhat.com>" > $(METADATA)
|
|
||||||
@echo "Name: $(TEST)" >> $(METADATA)
|
|
||||||
@echo "TestVersion: $(TESTVERSION)" >> $(METADATA)
|
|
||||||
@echo "Path: $(TEST_DIR)" >> $(METADATA)
|
|
||||||
@echo "Description: Test for readlink cannot handle recursive symlinks" >> $(METADATA)
|
|
||||||
@echo "Type: Sanity" >> $(METADATA)
|
|
||||||
@echo "TestTime: 5m" >> $(METADATA)
|
|
||||||
@echo "RunFor: coreutils" >> $(METADATA)
|
|
||||||
@echo "Requires: coreutils" >> $(METADATA)
|
|
||||||
@echo "Priority: Normal" >> $(METADATA)
|
|
||||||
@echo "License: GPLv2" >> $(METADATA)
|
|
||||||
@echo "Confidential: no" >> $(METADATA)
|
|
||||||
@echo "Destructive: no" >> $(METADATA)
|
|
||||||
|
|
||||||
rhts-lint $(METADATA)
|
|
||||||
|
|
@ -1,54 +0,0 @@
|
||||||
PURPOSE of /CoreOS/coreutils/readlink-cannot-handle-recursive-symlinks
|
|
||||||
Description: Test for readlink cannot handle recursive symlinks
|
|
||||||
Author: Jan Scotka <jscotka@redhat.com>
|
|
||||||
Bug summary: readlink cannot handle recursive symlinks
|
|
||||||
|
|
||||||
Description:
|
|
||||||
|
|
||||||
Description of problem:
|
|
||||||
The readlink command fails with an error "Too many levels of symbolic links", even if there are only 2 levels.
|
|
||||||
|
|
||||||
The readlink command from RHEL 3 and RHEL 4 and from Fedora 11 all work fine.
|
|
||||||
|
|
||||||
Among other changes between RHEL 4 and RHEL 5, RHEL 5's coreutils added calls to cycle_check() in lib/canonicalize.c, but in upstream canonicalize.c (now in gnulib instead of coreutils), we see the comment:
|
|
||||||
/* Detect loops. We cannot use the cycle-check module here,
|
|
||||||
since it's actually possible to encounter the same symlink
|
|
||||||
more than once in a given traversal. However, encountering
|
|
||||||
the same symlink,NAME pair twice does indicate a loop. */
|
|
||||||
|
|
||||||
http://git.savannah.gnu.org/gitweb/?p=gnulib.git;a=blob;f=lib/canonicalize.c;h=4f348398fd69ae516396313d18ac294a4ca3dde3;hb=b653eda3ac4864de205419d9f41eec267cb89eeb#l262
|
|
||||||
|
|
||||||
The latest canonicalize.c uses seen_triple() instead of cycle_check().
|
|
||||||
|
|
||||||
|
|
||||||
Version-Release number of selected component (if applicable):
|
|
||||||
coreutils-5.97-19.el5
|
|
||||||
|
|
||||||
How reproducible:
|
|
||||||
every time
|
|
||||||
|
|
||||||
Steps to Reproduce:
|
|
||||||
1. Create a directory with a symlink to itself
|
|
||||||
mkdir /tmp/dir
|
|
||||||
cd /tmp/dir
|
|
||||||
ln -s ../dir dirlink
|
|
||||||
|
|
||||||
2. Run readlink using the 'dirlink' symlink recursively
|
|
||||||
readlink -v -f dirlink
|
|
||||||
readlink -v -f dirlink/dirlink
|
|
||||||
readlink -v -f dirlink/dirlink/dirlink
|
|
||||||
|
|
||||||
Actual results:
|
|
||||||
The first readlink command on just dirlink succeeds, but the 2nd and 3rd commands fail with
|
|
||||||
readlink: dirlink/dirlink: Too many levels of symbolic links
|
|
||||||
|
|
||||||
Expected results:
|
|
||||||
$ readlink -v -f dirlink
|
|
||||||
/tmp/dir
|
|
||||||
$ readlink -v -f dirlink/dirlink
|
|
||||||
/tmp/dir
|
|
||||||
$ readlink -v -f dirlink/dirlink/dirlink
|
|
||||||
/tmp/dir
|
|
||||||
|
|
||||||
|
|
||||||
Additional info:
|
|
||||||
|
|
@ -1,60 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# runtest.sh of /CoreOS/coreutils/readlink-cannot-handle-recursive-symlinks
|
|
||||||
# Description: Test for readlink cannot handle recursive symlinks
|
|
||||||
# Author: Jan Scotka <jscotka@redhat.com>
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
#
|
|
||||||
# Copyright (c) 2010 Red Hat, Inc. All rights reserved.
|
|
||||||
#
|
|
||||||
# This copyrighted material is made available to anyone wishing
|
|
||||||
# to use, modify, copy, or redistribute it subject to the terms
|
|
||||||
# and conditions of the GNU General Public License version 2.
|
|
||||||
#
|
|
||||||
# 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, write to the Free
|
|
||||||
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
# Include rhts environment
|
|
||||||
. /usr/bin/rhts-environment.sh
|
|
||||||
. /usr/lib/beakerlib/beakerlib.sh
|
|
||||||
|
|
||||||
PACKAGE="coreutils"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun "TmpDir=\`mktemp -d\`" 0 "Creating tmp directory"
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlRun "mkdir link" 0 "Creating test directory"
|
|
||||||
rlRun "cd link" 0 "cd to this dir"
|
|
||||||
rlRun "ln -s ../link link" 0 "creating symlink to ../link -> link"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlLog "Test of readlink up to 20 iteration"
|
|
||||||
export TMPVAR="link"
|
|
||||||
for foo in `seq 20`
|
|
||||||
do echo $TMPVAR
|
|
||||||
rlRun "readlink -v -f $TMPVAR" 0 "readlink of $TMPVAR"
|
|
||||||
TMPVAR="$TMPVAR/link"
|
|
||||||
done
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalPrintText
|
|
||||||
rlJournalEnd
|
|
||||||
|
|
@ -1,39 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Checks that touch ls rm and foo work
|
|
||||||
# https://www.mankier.com/1/beakerlib#Examples
|
|
||||||
. /usr/share/beakerlib/beakerlib.sh
|
|
||||||
|
|
||||||
# Set the full test name
|
|
||||||
TEST="/examples/beakerlib/Sanity/phases"
|
|
||||||
|
|
||||||
# Package being tested
|
|
||||||
PACKAGE="coreutils"
|
|
||||||
|
|
||||||
rlJournalStart
|
|
||||||
# Setup phase: Prepare test directory
|
|
||||||
rlPhaseStartSetup
|
|
||||||
rlAssertRpm $PACKAGE
|
|
||||||
rlRun 'TmpDir=$(mktemp -d)' 0 'Creating tmp directory' # no-reboot
|
|
||||||
rlRun "pushd $TmpDir"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
# Test phase: Testing touch, ls and rm commands
|
|
||||||
rlPhaseStartTest
|
|
||||||
rlRun "touch foo" 0 "Creating the foo test file"
|
|
||||||
rlAssertExists "foo"
|
|
||||||
rlRun "ls -l foo" 0 "Listing the foo test file"
|
|
||||||
rlRun "rm foo" 0 "Removing the foo test file"
|
|
||||||
rlAssertNotExists "foo"
|
|
||||||
rlRun "ls -l foo" 2 "Listing foo should now report an error"
|
|
||||||
rlPhaseEnd
|
|
||||||
|
|
||||||
# Cleanup phase: Remove test directory
|
|
||||||
rlPhaseStartCleanup
|
|
||||||
rlRun "popd"
|
|
||||||
rlRun "rm -r $TmpDir" 0 "Removing tmp directory"
|
|
||||||
rlPhaseEnd
|
|
||||||
rlJournalEnd
|
|
||||||
|
|
||||||
# Print the test report
|
|
||||||
rlJournalPrintText
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
---
|
|
||||||
# This first play always runs on the local staging system
|
|
||||||
- hosts: localhost
|
|
||||||
tags:
|
|
||||||
- atomic
|
|
||||||
- classic
|
|
||||||
- container
|
|
||||||
roles:
|
|
||||||
- { role: standard-test-beakerlib, tests: [ test-basics, readlink-cannot-handle-recursive-symlinks ] }
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
# Fedora Continuous Integration: https://fedoraproject.org/wiki/CI
|
|
||||||
- include: test_basics.yml
|
|
||||||
123
upstream-key.gpg
123
upstream-key.gpg
|
|
@ -1,123 +0,0 @@
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
Version: GnuPG v1.4.6 (GNU/Linux)
|
|
||||||
|
|
||||||
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
|
|
||||||
Ke4=
|
|
||||||
=zRdO
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue