diff --git a/coreutils.spec b/coreutils.spec index 77863afb436c8ba4131f5f84d7c9a1b07efda184..0df3f17d161d92a8c9f9738d4643bde140bfb66f 100644 --- a/coreutils.spec +++ b/coreutils.spec @@ -1,6 +1,6 @@ Name: coreutils Version: 9.0 -Release: 4 +Release: 5 License: GPLv3+ Summary: A set of basic GNU tools commonly used in shell scripts Url: https://www.gnu.org/software/coreutils/ @@ -28,6 +28,8 @@ Patch12: backport-ls-avoid-triggering-automounts.patch Patch13: backport-stat-only-automount-with-cached-never.patch Patch14: backport-config-color-alias-for-ls.patch +Patch9000: openEuler-coreutils-df-direct.patch + Conflicts: filesystem < 3 # To avoid clobbering installs Provides: /bin/sh @@ -148,6 +150,9 @@ fi %{_mandir}/man*/* %changelog +* Thu Jul 21 2022 xueyamao - 9.0-5 +- a new option df --direct + * Thu Jul 7 2022 zoulin - 9.0-4 - Auto display color difference when use ls diff --git a/openEuler-coreutils-df-direct.patch b/openEuler-coreutils-df-direct.patch new file mode 100644 index 0000000000000000000000000000000000000000..9bce2c5cf382527d9ed10d4b6214b38041b6508e --- /dev/null +++ b/openEuler-coreutils-df-direct.patch @@ -0,0 +1,194 @@ +From f11a739f6aabbf280fa68a8013974de7d0855ecd Mon Sep 17 00:00:00 2001 +From: xueyamao +Date: Wed, 20 Jul 2022 17:49:23 +0800 +Subject: [PATCH 2/2] coreutils-df-direct add df --direct option,direct statfs + for a file. Do not resolve mount point and show statistics directly for a + file. Signed-off-by: xueyamao + +--- + doc/coreutils.texi | 7 ++++++ + src/df.c | 38 ++++++++++++++++++++++++++++--- + tests/df/direct.sh | 56 ++++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 98 insertions(+), 3 deletions(-) + create mode 100644 tests/df/direct.sh + +diff --git a/doc/coreutils.texi b/doc/coreutils.texi +index cb00eea..7667ace 100644 +--- a/doc/coreutils.texi ++++ b/doc/coreutils.texi +@@ -12067,6 +12067,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 + 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 file system size, usage and available space +diff --git a/src/df.c b/src/df.c +index 6256d0a..1c5fe5f 100644 +--- a/src/df.c ++++ b/src/df.c +@@ -125,6 +125,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; + +@@ -252,13 +255,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'}, +@@ -583,7 +588,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 +@@ -1480,7 +1488,20 @@ get_point (char const *point, const struct stat *statp) + static void + get_entry (char const *name, struct stat const *statp) + { +- if ((S_ISBLK (statp->st_mode) || S_ISCHR (statp->st_mode)) ++ 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_device (name)) + return; + +@@ -1550,6 +1571,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); +@@ -1640,6 +1662,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) + { +@@ -1736,6 +1761,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 100644 +index 0000000..25fbc57 +--- /dev/null ++++ b/tests/df/direct.sh +@@ -0,0 +1,56 @@ ++#!/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 ++ +-- +2.33.0 +