2 # make sure that dd doesn't allocate memory unnecessarily
4 # Copyright (C) 2013-2015 Free Software Foundation, Inc.
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 .
"${srcdir=.}/tests/init.sh"; path_prepend_ .
/src
23 # count and skip are zero, we don't need to allocate memory
24 (ulimit -v 20000; dd bs
=30M count
=0) || fail
=1
25 (ulimit -v 20000; dd ibs
=30M count
=0) || fail
=1
26 (ulimit -v 20000; dd obs
=30M count
=0) || fail
=1
28 check_dd_seek_alloc
() {
31 test "$file" = 'in' && { dd_file
=if; dd_op
=skip
; }
32 test "$file" = 'out' && { dd_file
=of
; dd_op
=seek
; }
33 test "$buf" = 'in' && { dd_buf
=ibs
; }
34 test "$buf" = 'out' && { dd_buf
=obs
; }
35 test "$buf" = 'both' && { dd_buf
=bs
; }
37 # Provide input to the "tape"
38 timeout
10 dd count
=1 if=/dev
/zero of
=tape
&
40 # Allocate buffer and read from the "tape"
41 (ulimit -v 20000; timeout
10 dd $dd_buf=30M
$dd_op=1 count
=0 $dd_file=tape
)
44 # Be defensive in case the tape reader is blocked for some reason
45 test $ret = 124 && framework_failure_
47 # This should happen without delay,
48 # and is used to ensure we've not multiple writers to the "tape"
51 # We want the "tape" reader to fail iff allocating
52 # a large buffer corresponding to the file being read
54 inout|outin
) test $ret = 0;;
59 # Use a fifo for which seek fails, but read does not.
60 # For non seekable output we need to allocate a buffer
61 # when simulating seeking with a read.
63 for file in 'in' 'out'; do
64 for buf
in 'both' 'in' 'out'; do
65 check_dd_seek_alloc
"$file" "$buf" || fail
=1