#!/bin/sh # Compare actual numbers from du, assuming block size matches mine. # Copyright (C) 2003, 2006-2007 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, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. if test "$VERBOSE" = yes; then set -x du --version fi # DU_BLOCK_SIZE could cause problems . $srcdir/../envvar-check . $srcdir/../lang-default pwd=`pwd` t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$ trap 'status=$?; cd "$pwd" && chmod -R u+rwx $t0 && rm -rf $t0 && exit $status' 0 trap '(exit $?); exit $?' 1 2 13 15 framework_failure=0 mkdir -p $tmp || framework_failure=1 cd $tmp || framework_failure=1 mkdir -p a/b d d/sub || framework_failure=1 # Ensure that these files contain more than 64 bytes, so that we don't # immediately disqualify file systems (e.g., NetApp) on which smaller # files take up zero disk blocks. printf '%*s' 257 make-sure-the-file-is-non-empty > a/b/F || framework_failure=1 printf %4096s x > d/1 cp d/1 d/sub/2 if test $framework_failure = 1; then echo "$0: failure in testing framework" 1>&2 (exit 1); exit 1 fi fail=0 B=`stat --format=%B a/b/F` du --block-size=$B -a a > out || fail=1 echo === >> out du --block-size=$B -a -S a >> out || fail=1 echo === >> out du --block-size=$B -s a >> out || fail=1 f=`stat --format=%b a/b/F` b=`stat --format=%b a/b` a=`stat --format=%b a` bf=`expr $b + $f` tot=`expr $bf + $a` cat < exp $f a/b/F $bf a/b $tot a === $f a/b/F # size of file, a/b/F $bf a/b # size of dir entry, a/b, + size of file, a/b/F $a a # size of dir entry, a === $tot a EOF cmp out exp || fail=1 test $fail = 1 && diff -u out exp 2> /dev/null # Perform this test only if "." is on a local file system. # Otherwise, it would fail e.g., on an NFS-mounted Solaris ZFS file system. if df --local . >/dev/null 2>&1; then rm -f out exp du --block-size=$B -a d | sort -r -k2,2 > out || fail=1 echo === >> out du --block-size=$B -S d | sort -r -k2,2 >> out || fail=1 t2=`stat --format=%b d/sub/2` ts=`stat --format=%b d/sub` t1=`stat --format=%b d/1` td=`stat --format=%b d` tot=`expr $t1 + $t2 + $ts + $td` d1=`expr $td + $t1` s2=`expr $ts + $t2` cat < exp $t2 d/sub/2 $s2 d/sub $t1 d/1 $tot d === $s2 d/sub $d1 d # d + d/1; don't count the dir. entry for d/sub EOF cmp out exp || fail=1 test $fail = 1 && diff out exp 2> /dev/null fi (exit $fail); exit $fail