Projects
Mega:23.03
coreutils
_service:tar_scm:openEuler-coreutils-df-direct....
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:tar_scm:openEuler-coreutils-df-direct.patch of Package coreutils
From f11a739f6aabbf280fa68a8013974de7d0855ecd Mon Sep 17 00:00:00 2001 From: xueyamao <xueyamao@kylinos.cn> 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 <xueyamao@kylinos.cn> --- 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 <http://www.gnu.org/licenses/>. + +. "${srcdir=.}/init.sh"; path_prepend_ ../src +print_ver_ df + +df || skip_ "df fails" + +DIR=`pwd` || framework_failure +FILE="$DIR/file" +touch "$FILE" || framework_failure +echo "$FILE" > file_exp || framework_failure +echo "Mounted on" > header_mounted_exp || framework_failure +echo "File" > header_file_exp || framework_failure + +fail=0 + +df --portability "$FILE" > df_out || fail=1 +df --portability --direct "$FILE" > df_direct_out || fail=1 +df --portability --direct --local "$FILE" > /dev/null 2>&1 && fail=1 + +# check df header +$AWK '{ if (NR==1) print $6 " " $7; }' df_out > header_mounted_out \ + || framework_failure +$AWK '{ if (NR==1) print $6; }' df_direct_out > header_file_out \ + || framework_failure +compare header_mounted_out header_mounted_exp || fail=1 +compare header_file_out header_file_exp || fail=1 + +# check df output (without --direct) +$AWK '{ if (NR==2) print $6; }' df_out > file_out \ + || framework_failure +compare file_out file_exp && fail=1 + +# check df output (with --direct) +$AWK '{ if (NR==2) print $6; }' df_direct_out > file_out \ + || framework_failure +compare file_out file_exp || fail=1 + +Exit $fail + -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2