diff --git a/coreutils-8.2-uname-processortype.patch b/coreutils-8.2-uname-processortype.patch
new file mode 100644
index 0000000000000000000000000000000000000000..ed01ab80d03c9f619f49bb05051702f5876a800e
--- /dev/null
+++ b/coreutils-8.2-uname-processortype.patch
@@ -0,0 +1,49 @@
+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)
diff --git a/coreutils-df-direct.patch b/coreutils-df-direct.patch
new file mode 100644
index 0000000000000000000000000000000000000000..248a6aecbf454bf1447a79dcfc6cf91b915654bc
--- /dev/null
+++ b/coreutils-df-direct.patch
@@ -0,0 +1,174 @@
+diff --git a/doc/coreutils.texi b/doc/coreutils.texi
+index a507280..400e135 100644
+--- a/doc/coreutils.texi
++++ b/doc/coreutils.texi
+@@ -11303,6 +11303,13 @@ some systems (notably SunOS), doing this yields more up to date results,
+ but in general this option makes @command{df} much slower, especially when
+ there are many or very busy file systems.
+
++@item --direct
++@opindex --direct
++@cindex direct statfs for a file
++Do not resolve mount point and show statistics directly for a file. It can be
++especially useful for NFS mount points if there is a boundary between two
++storage policies behind the mount point.
++
+ @item --total
+ @opindex --total
+ @cindex grand total of disk size, usage and available space
+diff --git a/src/df.c b/src/df.c
+index 8f760db..a7385fd 100644
+--- a/src/df.c
++++ b/src/df.c
+@@ -120,6 +120,9 @@ static bool print_type;
+ /* If true, print a grand total at the end. */
+ static bool print_grand_total;
+
++/* If true, show statistics for a file instead of mount point. */
++static bool direct_statfs;
++
+ /* Grand total data. */
+ static struct fs_usage grand_fsu;
+
+@@ -247,13 +250,15 @@ enum
+ NO_SYNC_OPTION = CHAR_MAX + 1,
+ SYNC_OPTION,
+ TOTAL_OPTION,
+- OUTPUT_OPTION
++ OUTPUT_OPTION,
++ DIRECT_OPTION
+ };
+
+ static struct option const long_options[] =
+ {
+ {"all", no_argument, NULL, 'a'},
+ {"block-size", required_argument, NULL, 'B'},
++ {"direct", no_argument, NULL, DIRECT_OPTION},
+ {"inodes", no_argument, NULL, 'i'},
+ {"human-readable", no_argument, NULL, 'h'},
+ {"si", no_argument, NULL, 'H'},
+@@ -509,7 +514,10 @@ get_header (void)
+ for (col = 0; col < ncolumns; col++)
+ {
+ char *cell = NULL;
+- char const *header = _(columns[col]->caption);
++ char const *header = (columns[col]->field == TARGET_FIELD
++ && direct_statfs)?
++ _("File") :
++ _(columns[col]->caption);
+
+ if (columns[col]->field == SIZE_FIELD
+ && (header_mode == DEFAULT_MODE
+@@ -1397,6 +1405,19 @@ get_point (const char *point, const struct stat *statp)
+ static void
+ get_entry (char const *name, struct stat const *statp)
+ {
++ if (direct_statfs)
++ {
++ char *resolved = canonicalize_file_name (name);
++ if (resolved)
++ {
++ char *mp = find_mount_point (name, statp);
++ get_dev (NULL, mp, resolved, NULL, NULL, false, false, NULL, false);
++ free(mp);
++ free (resolved);
++ return;
++ }
++ }
++
+ if ((S_ISBLK (statp->st_mode) || S_ISCHR (statp->st_mode))
+ && get_disk (name))
+ return;
+@@ -1467,6 +1488,7 @@ or all file systems by default.\n\
+ -B, --block-size=SIZE scale sizes by SIZE before printing them; e.g.,\n\
+ '-BM' prints sizes in units of 1,048,576 bytes;\n\
+ see SIZE format below\n\
++ --direct show statistics for a file instead of mount point\n\
+ -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\
+ "), stdout);
+@@ -1557,6 +1579,9 @@ main (int argc, char **argv)
+ xstrtol_fatal (e, oi, c, long_options, optarg);
+ }
+ break;
++ case DIRECT_OPTION:
++ direct_statfs = true;
++ break;
+ case 'i':
+ if (header_mode == OUTPUT_MODE)
+ {
+@@ -1653,6 +1678,13 @@ main (int argc, char **argv)
+ }
+ }
+
++ if (direct_statfs && show_local_fs)
++ {
++ error (0, 0, _("options --direct and --local (-l) are mutually "
++ "exclusive"));
++ usage (EXIT_FAILURE);
++ }
++
+ if (human_output_opts == -1)
+ {
+ if (posix_format)
+diff --git a/tests/df/direct.sh b/tests/df/direct.sh
+new file mode 100755
+index 0000000..8e4cfb8
+--- /dev/null
++++ b/tests/df/direct.sh
+@@ -0,0 +1,55 @@
++#!/bin/sh
++# Ensure "df --direct" works as documented
++
++# Copyright (C) 2010 Free Software Foundation, Inc.
++
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 3 of the License, or
++# (at your option) any later version.
++
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see .
++
++. "${srcdir=.}/init.sh"; path_prepend_ ../src
++print_ver_ df
++
++df || skip_ "df fails"
++
++DIR=`pwd` || framework_failure
++FILE="$DIR/file"
++touch "$FILE" || framework_failure
++echo "$FILE" > file_exp || framework_failure
++echo "Mounted on" > header_mounted_exp || framework_failure
++echo "File" > header_file_exp || framework_failure
++
++fail=0
++
++df --portability "$FILE" > df_out || fail=1
++df --portability --direct "$FILE" > df_direct_out || fail=1
++df --portability --direct --local "$FILE" > /dev/null 2>&1 && fail=1
++
++# check df header
++$AWK '{ if (NR==1) print $6 " " $7; }' df_out > header_mounted_out \
++ || framework_failure
++$AWK '{ if (NR==1) print $6; }' df_direct_out > header_file_out \
++ || framework_failure
++compare header_mounted_out header_mounted_exp || fail=1
++compare header_file_out header_file_exp || fail=1
++
++# check df output (without --direct)
++$AWK '{ if (NR==2) print $6; }' df_out > file_out \
++ || framework_failure
++compare file_out file_exp && fail=1
++
++# check df output (with --direct)
++$AWK '{ if (NR==2) print $6; }' df_direct_out > file_out \
++ || framework_failure
++compare file_out file_exp || fail=1
++
++Exit $fail
diff --git a/coreutils.spec b/coreutils.spec
index 0af327d30b579c1dadec965735862aadd18481ab..b2e60f27b1be86a51c4de5e76219eda9b98b9f8c 100644
--- a/coreutils.spec
+++ b/coreutils.spec
@@ -1,6 +1,6 @@
Name: coreutils
Version: 8.31
-Release: 2
+Release: 3
License: GPLv3+
Summary: A set of basic GNU tools commonly used in shell scripts
Url: https://www.gnu.org/software/coreutils/
@@ -8,13 +8,18 @@ Source0: https://ftp.gnu.org/gnu/%{name}/%{name}-%{version}.tar.xz
# do not make coreutils-single depend on /usr/bin/coreutils
%global __requires_exclude ^%{_bindir}/coreutils$
+%global user `ls -ld $USR_SCONF|awk '{print $3}'`
Patch1: 0001-coreutils-8.31-i18n.patch
Patch2: 0001-disable-test-of-rwlock.patch
+# uname -p/-i to display processor type
+Patch3: coreutils-8.2-uname-processortype.patch
+# df --direct
+Patch4: coreutils-df-direct.patch
-Patch6000: bugfix-remove-usr-local-lib-from-m4.patch
-Patch6001: bugfix-dummy_help2man.patch
-Patch6002: bugfix-selinux-flask.patch
+Patch5: bugfix-remove-usr-local-lib-from-m4.patch
+Patch6: bugfix-dummy_help2man.patch
+Patch7: bugfix-selinux-flask.patch
Conflicts: filesystem < 3
# To avoid clobbering installs
@@ -63,6 +68,9 @@ find tests -name '*.sh' -perm 0644 -print -exec chmod 0755 '{}' '+'
autoreconf -fiv
%build
+if [ %user = root ]; then
+ export FORCE_UNSAFE_CONFIGURE=1
+fi
export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing -fpic"
%{expand:%%global optflags %{optflags} -D_GNU_SOURCE=1}
mkdir separate && \
@@ -90,6 +98,11 @@ mv $RPM_BUILD_ROOT/{%_bindir,%_sbindir}/chroot
# Add the %%lang(xyz) ownership for the LC_TIME dirs as well...
grep LC_TIME %name.lang | cut -d'/' -f1-6 | sed -e 's/) /) %%dir /g' >>%name.lang
+%check
+pushd separate
+make check VERBOSE=yes
+popd
+
%preun
if [ $1 = 0 ]; then
if [ -f %{_infodir}/%{name}.info.gz ]; then
@@ -117,6 +130,9 @@ fi
%{_mandir}/man*/*
%changelog
+* Thu Feb 13 2020 openEuler Buildteam - 8.31-3
+- Enable check and uname -p/-i as well as df --direct
+
* Fri Jan 10 2020 openEuler Buildteam - 8.31-2
- Strengthen patch