#
# Copyright (c) 2017 Spectra Logic Corporation
# Copyright (c) 2023 Klara, Inc.
#
# SPDX-License-Identifier: BSD-2-Clause
#
atf_test_case max_seek
max_seek_head()
{
atf_set "descr" "dd(1) can seek by the maximum amount"
}
max_seek_body()
{
case $(df -T . | tail -n 1 | cut -wf 2) in
"ufs")
atf_skip "UFS's maximum file size is too small"
;;
"zfs")
# ZFS is fine
;;
"tmpfs")
atf_skip "tmpfs can't create arbitrarily large sparse files"
;;
*)
atf_skip "Unknown file system"
;;
esac
touch f.in
seek=$(bc -e "2^63 / 4096 - 1")
atf_check -s exit:0 -e ignore dd if=f.in of=f.out bs=4096 seek=$seek
}
atf_test_case seek_overflow
seek_overflow_head()
{
atf_set "descr" "dd(1) should reject too-large seek values"
}
seek_overflow_body()
{
touch f.in
seek=$(bc -e "2^63 / 4096")
atf_check -s not-exit:0 -e match:"seek offsets cannot be larger than" \
dd if=f.in of=f.out bs=4096 seek=$seek
atf_check -s not-exit:0 -e match:"seek offsets cannot be larger than" \
dd if=f.in of=f.out bs=4096 seek=-1
}
atf_test_case sigint
sigint_open_head()
{
atf_set "descr" "SIGINT while opening destination"
}
sigint_open_body()
{
atf_check mkfifo fifo
set -m
dd if=fifo of=/dev/null 2>stderr &
pid=$!
sleep 3
kill -INT $pid
wait $pid
rv=$?
atf_check test "$rv" -gt 128
atf_check -o inline:"INT\n" kill -l $((rv-128))
atf_check test -s stderr
}
atf_test_case sigint
sigint_read_head()
{
atf_set "descr" "SIGINT while reading source"
}
sigint_read_body()
{
atf_check mkfifo fifo
(sleep 30 >fifo &) # ensures that dd does not block on open
set -m
dd if=fifo of=/dev/null 2>stderr &
pid=$!
sleep 3
kill -INT $pid
wait $pid
rv=$?
atf_check test "$rv" -gt 128
atf_check -o inline:"INT\n" kill -l $((rv-128))
atf_check test -s stderr
}
atf_init_test_cases()
{
atf_add_test_case max_seek
atf_add_test_case seek_overflow
atf_add_test_case sigint_open
atf_add_test_case sigint_read
}