Paul Townsend <[EMAIL PROTECTED]> wrote: > I put the above plus a couple of other commands in a script. Below is > the output of `ksh -xv tst'.
I've applied your patch and written a test for the bug. Would you please see if it detects the problem with the previous version of du and that it succeeds with your patch? If you put the attached file in coreutils-5.9/tests/du/, make it executable, and then run it like this (it relies on a new file, tests/very-expensive, which you won't have -- just touch it to create an empty file): env srcdir=. ./2g it should fail when src/du is the old one and succeed with the new.
#!/bin/sh # Ensure that du can handle a 2GB file (i.e., a file of size 2^31 bytes) # Before coreutils-5.93, on systems with a signed, 32-bit stat.st_blocks # one of du's computations would overflow. if test "$VERBOSE" = yes; then set -x du --version fi . $srcdir/../envvar-check # Creating a 2GB file counts as `expensive'. . $srcdir/../very-expensive 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 if test $framework_failure = 1; then echo "$0: failure in testing framework" 1>&2 (exit 1); exit 1 fi fail=0 # Get number of free kilobytes on current partition, so we can # skip this test if there is insufficient free space. # This technique relies on the fact that the `Available' kilobyte # count is the number just before the one with a trailing `%'. free_kb=`df -kP .|tail -1|sed 's/ [0-9][0-9]*%.*//;s/ *$//;s/.* //'` case "$free_kb" in [0-9]*) ;; *) echo "invalid size from df: $free_kb" 1>&2; (exit 77); exit 77;; esac # Require about 3GB free. min_kb=3000000 test $min_kb -lt $free_kb || { echo "$0: skipping this test:" echo "too little free space on current partition: $free_kb (need $min_kb KB)" \ 1>&2; (exit 77); exit 77 } big=big rm -f $big test -t 1 || printf 'creating a 2GB file...\n' for i in `seq 100`; do # Note: 2147483648 == 2^31. Print floor(2^31/100) per iteration. printf %21474836s x >> $big || fail=1 # On the final iteration, append the remaining 48 bytes. test $i = 100 && { printf %48s x >> $big || fail=1; } test -t 1 && printf 'creating a 2GB file: %d%% complete\r' $i done echo du -k $big > out1 || fail=1 rm -f $big sed 's/^2[0-9][0-9][0-9][0-9][0-9][0-9] '$big'$/~2M/' out1 > out cat <<\EOF > exp || fail=1 ~2M EOF cmp out exp || fail=1 test $fail = 1 && diff out exp 2> /dev/null (exit $fail); exit $fail
_______________________________________________ Bug-coreutils mailing list Bug-coreutils@gnu.org http://lists.gnu.org/mailman/listinfo/bug-coreutils