1*64c2a712SDag-Erling Smørgrav# 2*64c2a712SDag-Erling Smørgrav# Copyright (c) 2023 Klara, Inc. 3*64c2a712SDag-Erling Smørgrav# 4*64c2a712SDag-Erling Smørgrav# SPDX-License-Identifier: BSD-2-Clause 5*64c2a712SDag-Erling Smørgrav# 6*64c2a712SDag-Erling Smørgrav 7*64c2a712SDag-Erling Smørgravtftp_dir="${TMPDIR:-/tmp}/tftp.dir" 8*64c2a712SDag-Erling Smørgravinetd_conf="${TMPDIR:-/tmp}/inetd.conf" 9*64c2a712SDag-Erling Smørgravinetd_pid="${TMPDIR:-/tmp}/inetd.pid" 10*64c2a712SDag-Erling Smørgrav 11*64c2a712SDag-Erling Smørgravstart_tftpd() { 12*64c2a712SDag-Erling Smørgrav if ! [ -z "$(sockstat -PUDP -p69 -q)" ] ; then 13*64c2a712SDag-Erling Smørgrav atf_skip "the tftp port is in use" 14*64c2a712SDag-Erling Smørgrav fi 15*64c2a712SDag-Erling Smørgrav echo "starting inetd for $(atf_get ident)" >&2 16*64c2a712SDag-Erling Smørgrav rm -rf "${tftp_dir}" 17*64c2a712SDag-Erling Smørgrav mkdir "${tftp_dir}" 18*64c2a712SDag-Erling Smørgrav cat >"${inetd_conf}" <<EOF 19*64c2a712SDag-Erling Smørgravtftp dgram udp wait root /usr/libexec/tftpd tftpd -d15 -l ${tftp_dir} 20*64c2a712SDag-Erling Smørgravtftp dgram udp6 wait root /usr/libexec/tftpd tftpd -d15 -l ${tftp_dir} 21*64c2a712SDag-Erling SmørgravEOF 22*64c2a712SDag-Erling Smørgrav /usr/sbin/inetd -a localhost -p "${inetd_pid}" "${inetd_conf}" 23*64c2a712SDag-Erling Smørgrav} 24*64c2a712SDag-Erling Smørgrav 25*64c2a712SDag-Erling Smørgravstop_tftpd() { 26*64c2a712SDag-Erling Smørgrav echo "stopping inetd for $(atf_get ident)" >&2 27*64c2a712SDag-Erling Smørgrav # Send SIGTERM to inetd, then SIGKILL until it's gone 28*64c2a712SDag-Erling Smørgrav local sig=TERM 29*64c2a712SDag-Erling Smørgrav while pkill -$sig -LF "${inetd_pid}" inetd ; do 30*64c2a712SDag-Erling Smørgrav echo "waiting for inetd to stop" >&2 31*64c2a712SDag-Erling Smørgrav sleep 1 32*64c2a712SDag-Erling Smørgrav sig=KILL 33*64c2a712SDag-Erling Smørgrav done 34*64c2a712SDag-Erling Smørgrav rm -rf "${tftp_dir}" "${inetd_conf}" "${inetd_pid}" 35*64c2a712SDag-Erling Smørgrav} 36*64c2a712SDag-Erling Smørgrav 37*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_big cleanup 38*64c2a712SDag-Erling Smørgravtftp_get_big_head() { 39*64c2a712SDag-Erling Smørgrav atf_set "descr" "get command with big file" 40*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 41*64c2a712SDag-Erling Smørgrav} 42*64c2a712SDag-Erling Smørgravtftp_get_big_body() { 43*64c2a712SDag-Erling Smørgrav start_tftpd 44*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/remote.bin" 45*64c2a712SDag-Erling Smørgrav dd if=/dev/urandom of="${remote_file}" bs=1m count=16 status=none 46*64c2a712SDag-Erling Smørgrav local local_file="local.bin" 47*64c2a712SDag-Erling Smørgrav echo "get ${remote_file##*/} ${local_file}" >client-script 48*64c2a712SDag-Erling Smørgrav atf_check -o match:"Received [0-9]+ bytes" \ 49*64c2a712SDag-Erling Smørgrav tftp localhost <client-script 50*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${local_file}" "${remote_file}" 51*64c2a712SDag-Erling Smørgrav} 52*64c2a712SDag-Erling Smørgravtftp_get_big_cleanup() { 53*64c2a712SDag-Erling Smørgrav stop_tftpd 54*64c2a712SDag-Erling Smørgrav} 55*64c2a712SDag-Erling Smørgrav 56*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_host cleanup 57*64c2a712SDag-Erling Smørgravtftp_get_host_head() { 58*64c2a712SDag-Erling Smørgrav atf_set "descr" "get command with host name" 59*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 60*64c2a712SDag-Erling Smørgrav} 61*64c2a712SDag-Erling Smørgravtftp_get_host_body() { 62*64c2a712SDag-Erling Smørgrav start_tftpd 63*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/hello.txt" 64*64c2a712SDag-Erling Smørgrav echo "Hello, $$!" >"${remote_file}" 65*64c2a712SDag-Erling Smørgrav local local_file="${remote_file##*/}" 66*64c2a712SDag-Erling Smørgrav echo "get localhost:${remote_file##*/}" >client-script 67*64c2a712SDag-Erling Smørgrav atf_check -o match:"Received [0-9]+ bytes" \ 68*64c2a712SDag-Erling Smørgrav tftp <client-script 69*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${local_file}" "${remote_file}" 70*64c2a712SDag-Erling Smørgrav} 71*64c2a712SDag-Erling Smørgravtftp_get_host_cleanup() { 72*64c2a712SDag-Erling Smørgrav stop_tftpd 73*64c2a712SDag-Erling Smørgrav} 74*64c2a712SDag-Erling Smørgrav 75*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_ipv4 cleanup 76*64c2a712SDag-Erling Smørgravtftp_get_ipv4_head() { 77*64c2a712SDag-Erling Smørgrav atf_set "descr" "get command with ipv4 address" 78*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 79*64c2a712SDag-Erling Smørgrav} 80*64c2a712SDag-Erling Smørgravtftp_get_ipv4_body() { 81*64c2a712SDag-Erling Smørgrav start_tftpd 82*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/hello.txt" 83*64c2a712SDag-Erling Smørgrav echo "Hello, $$!" >"${remote_file}" 84*64c2a712SDag-Erling Smørgrav local local_file="${remote_file##*/}" 85*64c2a712SDag-Erling Smørgrav echo "get 127.0.0.1:${remote_file##*/}" >client-script 86*64c2a712SDag-Erling Smørgrav atf_check -o match:"Received [0-9]+ bytes" \ 87*64c2a712SDag-Erling Smørgrav tftp <client-script 88*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${local_file}" "${remote_file}" 89*64c2a712SDag-Erling Smørgrav} 90*64c2a712SDag-Erling Smørgravtftp_get_ipv4_cleanup() { 91*64c2a712SDag-Erling Smørgrav stop_tftpd 92*64c2a712SDag-Erling Smørgrav} 93*64c2a712SDag-Erling Smørgrav 94*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_ipv6 cleanup 95*64c2a712SDag-Erling Smørgravtftp_get_ipv6_head() { 96*64c2a712SDag-Erling Smørgrav atf_set "descr" "get command with ipv6 address" 97*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 98*64c2a712SDag-Erling Smørgrav} 99*64c2a712SDag-Erling Smørgravtftp_get_ipv6_body() { 100*64c2a712SDag-Erling Smørgrav sysctl -q kern.features.inet6 || atf_skip "This test requires IPv6 support" 101*64c2a712SDag-Erling Smørgrav start_tftpd 102*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/hello.txt" 103*64c2a712SDag-Erling Smørgrav echo "Hello, $$!" >"${remote_file}" 104*64c2a712SDag-Erling Smørgrav local local_file="${remote_file##*/}" 105*64c2a712SDag-Erling Smørgrav echo "get [::1]:${remote_file##*/}" >client-script 106*64c2a712SDag-Erling Smørgrav atf_check -o match:"Received [0-9]+ bytes" \ 107*64c2a712SDag-Erling Smørgrav tftp <client-script 108*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${local_file}" "${remote_file}" 109*64c2a712SDag-Erling Smørgrav} 110*64c2a712SDag-Erling Smørgravtftp_get_ipv6_cleanup() { 111*64c2a712SDag-Erling Smørgrav stop_tftpd 112*64c2a712SDag-Erling Smørgrav} 113*64c2a712SDag-Erling Smørgrav 114*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_one cleanup 115*64c2a712SDag-Erling Smørgravtftp_get_one_head() { 116*64c2a712SDag-Erling Smørgrav atf_set "descr" "get command with one argument" 117*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 118*64c2a712SDag-Erling Smørgrav} 119*64c2a712SDag-Erling Smørgravtftp_get_one_body() { 120*64c2a712SDag-Erling Smørgrav start_tftpd 121*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/hello.txt" 122*64c2a712SDag-Erling Smørgrav echo "Hello, $$!" >"${remote_file}" 123*64c2a712SDag-Erling Smørgrav local local_file="${remote_file##*/}" 124*64c2a712SDag-Erling Smørgrav echo "get ${remote_file##*/}" >client-script 125*64c2a712SDag-Erling Smørgrav atf_check -o match:"Received [0-9]+ bytes" \ 126*64c2a712SDag-Erling Smørgrav tftp localhost <client-script 127*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${local_file}" "${remote_file}" 128*64c2a712SDag-Erling Smørgrav} 129*64c2a712SDag-Erling Smørgravtftp_get_one_cleanup() { 130*64c2a712SDag-Erling Smørgrav stop_tftpd 131*64c2a712SDag-Erling Smørgrav} 132*64c2a712SDag-Erling Smørgrav 133*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_two cleanup 134*64c2a712SDag-Erling Smørgravtftp_get_two_head() { 135*64c2a712SDag-Erling Smørgrav atf_set "descr" "get command with two arguments" 136*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 137*64c2a712SDag-Erling Smørgrav} 138*64c2a712SDag-Erling Smørgravtftp_get_two_body() { 139*64c2a712SDag-Erling Smørgrav start_tftpd 140*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/hello.txt" 141*64c2a712SDag-Erling Smørgrav echo "Hello, $$!" >"${remote_file}" 142*64c2a712SDag-Erling Smørgrav local local_file="world.txt" 143*64c2a712SDag-Erling Smørgrav echo "get ${remote_file##*/} ${local_file}" >client-script 144*64c2a712SDag-Erling Smørgrav atf_check -o match:"Received [0-9]+ bytes" \ 145*64c2a712SDag-Erling Smørgrav tftp localhost <client-script 146*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${local_file}" "${remote_file}" 147*64c2a712SDag-Erling Smørgrav} 148*64c2a712SDag-Erling Smørgravtftp_get_two_cleanup() { 149*64c2a712SDag-Erling Smørgrav stop_tftpd 150*64c2a712SDag-Erling Smørgrav} 151*64c2a712SDag-Erling Smørgrav 152*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_more cleanup 153*64c2a712SDag-Erling Smørgravtftp_get_more_head() { 154*64c2a712SDag-Erling Smørgrav atf_set "descr" "get command with three or more arguments" 155*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 156*64c2a712SDag-Erling Smørgrav} 157*64c2a712SDag-Erling Smørgravtftp_get_more_body() { 158*64c2a712SDag-Erling Smørgrav start_tftpd 159*64c2a712SDag-Erling Smørgrav for n in 3 4 5 6 7 ; do 160*64c2a712SDag-Erling Smørgrav echo -n "get" >client-script 161*64c2a712SDag-Erling Smørgrav for f in $(jot -c $n 97) ; do 162*64c2a712SDag-Erling Smørgrav echo "test file $$/$f/$n" >"${tftp_dir}/${f}.txt" 163*64c2a712SDag-Erling Smørgrav echo -n " ${f}.txt" >>client-script 164*64c2a712SDag-Erling Smørgrav rm -f "${f}.txt" 165*64c2a712SDag-Erling Smørgrav done 166*64c2a712SDag-Erling Smørgrav echo >>client-script 167*64c2a712SDag-Erling Smørgrav atf_check -o match:"Received [0-9]+ bytes" \ 168*64c2a712SDag-Erling Smørgrav tftp localhost <client-script 169*64c2a712SDag-Erling Smørgrav for f in $(jot -c $n 97) ; do 170*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${f}.txt" "${tftp_dir}/${f}.txt" 171*64c2a712SDag-Erling Smørgrav done 172*64c2a712SDag-Erling Smørgrav done 173*64c2a712SDag-Erling Smørgrav} 174*64c2a712SDag-Erling Smørgravtftp_get_more_cleanup() { 175*64c2a712SDag-Erling Smørgrav stop_tftpd 176*64c2a712SDag-Erling Smørgrav} 177*64c2a712SDag-Erling Smørgrav 178*64c2a712SDag-Erling Smørgravatf_test_case tftp_get_multi_host cleanup 179*64c2a712SDag-Erling Smørgravtftp_get_multi_host_head() { 180*64c2a712SDag-Erling Smørgrav atf_set "descr" "get command with multiple files and host name" 181*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 182*64c2a712SDag-Erling Smørgrav} 183*64c2a712SDag-Erling Smørgravtftp_get_multi_host_body() { 184*64c2a712SDag-Erling Smørgrav start_tftpd 185*64c2a712SDag-Erling Smørgrav for f in a b c ; do 186*64c2a712SDag-Erling Smørgrav echo "test file $$/$f/$n" >"${tftp_dir}/${f}.txt" 187*64c2a712SDag-Erling Smørgrav rm -f "${f}.txt" 188*64c2a712SDag-Erling Smørgrav done 189*64c2a712SDag-Erling Smørgrav echo "get localhost:a.txt b.txt c.txt" >client-script 190*64c2a712SDag-Erling Smørgrav atf_check -o match:"Received [0-9]+ bytes" \ 191*64c2a712SDag-Erling Smørgrav tftp localhost <client-script 192*64c2a712SDag-Erling Smørgrav for f in a b c ; do 193*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${f}.txt" "${tftp_dir}/${f}.txt" 194*64c2a712SDag-Erling Smørgrav done 195*64c2a712SDag-Erling Smørgrav} 196*64c2a712SDag-Erling Smørgravtftp_get_multi_host_cleanup() { 197*64c2a712SDag-Erling Smørgrav stop_tftpd 198*64c2a712SDag-Erling Smørgrav} 199*64c2a712SDag-Erling Smørgrav 200*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_big cleanup 201*64c2a712SDag-Erling Smørgravtftp_put_big_head() { 202*64c2a712SDag-Erling Smørgrav atf_set "descr" "put command with big file" 203*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 204*64c2a712SDag-Erling Smørgrav} 205*64c2a712SDag-Erling Smørgravtftp_put_big_body() { 206*64c2a712SDag-Erling Smørgrav start_tftpd 207*64c2a712SDag-Erling Smørgrav local local_file="local.bin" 208*64c2a712SDag-Erling Smørgrav dd if=/dev/urandom of="${local_file}" bs=1m count=16 status=none 209*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/random.bin" 210*64c2a712SDag-Erling Smørgrav truncate -s 0 "${remote_file}" 211*64c2a712SDag-Erling Smørgrav chown nobody:nogroup "${remote_file}" 212*64c2a712SDag-Erling Smørgrav chmod 0666 "${remote_file}" 213*64c2a712SDag-Erling Smørgrav echo "put ${local_file} ${remote_file##*/}" >client-script 214*64c2a712SDag-Erling Smørgrav atf_check -o match:"Sent [0-9]+ bytes" \ 215*64c2a712SDag-Erling Smørgrav tftp localhost <client-script 216*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${remote_file}" "${local_file}" 217*64c2a712SDag-Erling Smørgrav} 218*64c2a712SDag-Erling Smørgravtftp_put_big_cleanup() { 219*64c2a712SDag-Erling Smørgrav stop_tftpd 220*64c2a712SDag-Erling Smørgrav} 221*64c2a712SDag-Erling Smørgrav 222*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_host cleanup 223*64c2a712SDag-Erling Smørgravtftp_put_host_head() { 224*64c2a712SDag-Erling Smørgrav atf_set "descr" "put command with host name" 225*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 226*64c2a712SDag-Erling Smørgrav} 227*64c2a712SDag-Erling Smørgravtftp_put_host_body() { 228*64c2a712SDag-Erling Smørgrav start_tftpd 229*64c2a712SDag-Erling Smørgrav local local_file="local.txt" 230*64c2a712SDag-Erling Smørgrav echo "test file $$" >"${local_file}" 231*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/remote.txt" 232*64c2a712SDag-Erling Smørgrav truncate -s 0 "${remote_file}" 233*64c2a712SDag-Erling Smørgrav chown nobody:nogroup "${remote_file}" 234*64c2a712SDag-Erling Smørgrav chmod 0666 "${remote_file}" 235*64c2a712SDag-Erling Smørgrav echo "put ${local_file} localhost:${remote_file##*/}" >client-script 236*64c2a712SDag-Erling Smørgrav atf_check -o match:"Sent [0-9]+ bytes" \ 237*64c2a712SDag-Erling Smørgrav tftp <client-script 238*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${remote_file}" "${local_file}" 239*64c2a712SDag-Erling Smørgrav} 240*64c2a712SDag-Erling Smørgravtftp_put_host_cleanup() { 241*64c2a712SDag-Erling Smørgrav stop_tftpd 242*64c2a712SDag-Erling Smørgrav} 243*64c2a712SDag-Erling Smørgrav 244*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_ipv4 cleanup 245*64c2a712SDag-Erling Smørgravtftp_put_ipv4_head() { 246*64c2a712SDag-Erling Smørgrav atf_set "descr" "put command with ipv4 address" 247*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 248*64c2a712SDag-Erling Smørgrav} 249*64c2a712SDag-Erling Smørgravtftp_put_ipv4_body() { 250*64c2a712SDag-Erling Smørgrav start_tftpd 251*64c2a712SDag-Erling Smørgrav local local_file="local.txt" 252*64c2a712SDag-Erling Smørgrav echo "test file $$" >"${local_file}" 253*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/remote.txt" 254*64c2a712SDag-Erling Smørgrav truncate -s 0 "${remote_file}" 255*64c2a712SDag-Erling Smørgrav chown nobody:nogroup "${remote_file}" 256*64c2a712SDag-Erling Smørgrav chmod 0666 "${remote_file}" 257*64c2a712SDag-Erling Smørgrav echo "put ${local_file} 127.0.0.1:${remote_file##*/}" >client-script 258*64c2a712SDag-Erling Smørgrav atf_check -o match:"Sent [0-9]+ bytes" \ 259*64c2a712SDag-Erling Smørgrav tftp <client-script 260*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${remote_file}" "${local_file}" 261*64c2a712SDag-Erling Smørgrav} 262*64c2a712SDag-Erling Smørgravtftp_put_ipv4_cleanup() { 263*64c2a712SDag-Erling Smørgrav stop_tftpd 264*64c2a712SDag-Erling Smørgrav} 265*64c2a712SDag-Erling Smørgrav 266*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_ipv6 cleanup 267*64c2a712SDag-Erling Smørgravtftp_put_ipv6_head() { 268*64c2a712SDag-Erling Smørgrav atf_set "descr" "put command with ipv6 address" 269*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 270*64c2a712SDag-Erling Smørgrav} 271*64c2a712SDag-Erling Smørgravtftp_put_ipv6_body() { 272*64c2a712SDag-Erling Smørgrav sysctl -q kern.features.inet6 || atf_skip "This test requires IPv6 support" 273*64c2a712SDag-Erling Smørgrav start_tftpd 274*64c2a712SDag-Erling Smørgrav local local_file="local.txt" 275*64c2a712SDag-Erling Smørgrav echo "test file $$" >"${local_file}" 276*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/remote.txt" 277*64c2a712SDag-Erling Smørgrav truncate -s 0 "${remote_file}" 278*64c2a712SDag-Erling Smørgrav chown nobody:nogroup "${remote_file}" 279*64c2a712SDag-Erling Smørgrav chmod 0666 "${remote_file}" 280*64c2a712SDag-Erling Smørgrav echo "put ${local_file} [::1]:${remote_file##*/}" >client-script 281*64c2a712SDag-Erling Smørgrav atf_check -o match:"Sent [0-9]+ bytes" \ 282*64c2a712SDag-Erling Smørgrav tftp <client-script 283*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${remote_file}" "${local_file}" 284*64c2a712SDag-Erling Smørgrav} 285*64c2a712SDag-Erling Smørgravtftp_put_ipv6_cleanup() { 286*64c2a712SDag-Erling Smørgrav stop_tftpd 287*64c2a712SDag-Erling Smørgrav} 288*64c2a712SDag-Erling Smørgrav 289*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_one cleanup 290*64c2a712SDag-Erling Smørgravtftp_put_one_head() { 291*64c2a712SDag-Erling Smørgrav atf_set "descr" "put command with one argument" 292*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 293*64c2a712SDag-Erling Smørgrav} 294*64c2a712SDag-Erling Smørgravtftp_put_one_body() { 295*64c2a712SDag-Erling Smørgrav start_tftpd 296*64c2a712SDag-Erling Smørgrav local local_file="file.txt" 297*64c2a712SDag-Erling Smørgrav echo "test file $$" >"${local_file}" 298*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/${local_file}" 299*64c2a712SDag-Erling Smørgrav truncate -s 0 "${remote_file}" 300*64c2a712SDag-Erling Smørgrav chown nobody:nogroup "${remote_file}" 301*64c2a712SDag-Erling Smørgrav chmod 0666 "${remote_file}" 302*64c2a712SDag-Erling Smørgrav echo "put ${local_file}" >client-script 303*64c2a712SDag-Erling Smørgrav atf_check -o match:"Sent [0-9]+ bytes" \ 304*64c2a712SDag-Erling Smørgrav tftp localhost <client-script 305*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${remote_file}" "${local_file}" 306*64c2a712SDag-Erling Smørgrav} 307*64c2a712SDag-Erling Smørgravtftp_put_one_cleanup() { 308*64c2a712SDag-Erling Smørgrav stop_tftpd 309*64c2a712SDag-Erling Smørgrav} 310*64c2a712SDag-Erling Smørgrav 311*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_two cleanup 312*64c2a712SDag-Erling Smørgravtftp_put_two_head() { 313*64c2a712SDag-Erling Smørgrav atf_set "descr" "put command with two arguments" 314*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 315*64c2a712SDag-Erling Smørgrav} 316*64c2a712SDag-Erling Smørgravtftp_put_two_body() { 317*64c2a712SDag-Erling Smørgrav start_tftpd 318*64c2a712SDag-Erling Smørgrav local local_file="local.txt" 319*64c2a712SDag-Erling Smørgrav echo "test file $$" >"${local_file}" 320*64c2a712SDag-Erling Smørgrav local remote_file="${tftp_dir}/remote.txt" 321*64c2a712SDag-Erling Smørgrav truncate -s 0 "${remote_file}" 322*64c2a712SDag-Erling Smørgrav chown nobody:nogroup "${remote_file}" 323*64c2a712SDag-Erling Smørgrav chmod 0666 "${remote_file}" 324*64c2a712SDag-Erling Smørgrav echo "put ${local_file} ${remote_file##*/}" >client-script 325*64c2a712SDag-Erling Smørgrav atf_check -o match:"Sent [0-9]+ bytes" \ 326*64c2a712SDag-Erling Smørgrav tftp localhost <client-script 327*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${remote_file}" "${local_file}" 328*64c2a712SDag-Erling Smørgrav} 329*64c2a712SDag-Erling Smørgravtftp_put_two_cleanup() { 330*64c2a712SDag-Erling Smørgrav stop_tftpd 331*64c2a712SDag-Erling Smørgrav} 332*64c2a712SDag-Erling Smørgrav 333*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_more cleanup 334*64c2a712SDag-Erling Smørgravtftp_put_more_head() { 335*64c2a712SDag-Erling Smørgrav atf_set "descr" "put command with three or more arguments" 336*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 337*64c2a712SDag-Erling Smørgrav} 338*64c2a712SDag-Erling Smørgravtftp_put_more_body() { 339*64c2a712SDag-Erling Smørgrav start_tftpd 340*64c2a712SDag-Erling Smørgrav mkdir "${tftp_dir}/subdir" 341*64c2a712SDag-Erling Smørgrav for n in 2 3 4 5 6 ; do 342*64c2a712SDag-Erling Smørgrav echo -n "put" >client-script 343*64c2a712SDag-Erling Smørgrav for f in $(jot -c $n 97) ; do 344*64c2a712SDag-Erling Smørgrav echo "test file $$/$f/$n" >"${f}.txt" 345*64c2a712SDag-Erling Smørgrav truncate -s 0 "${tftp_dir}/subdir/${f}.txt" 346*64c2a712SDag-Erling Smørgrav chown nobody:nogroup "${tftp_dir}/subdir/${f}.txt" 347*64c2a712SDag-Erling Smørgrav chmod 0666 "${tftp_dir}/subdir/${f}.txt" 348*64c2a712SDag-Erling Smørgrav echo -n " ${f}.txt" >>client-script 349*64c2a712SDag-Erling Smørgrav done 350*64c2a712SDag-Erling Smørgrav echo " subdir" >>client-script 351*64c2a712SDag-Erling Smørgrav atf_check -o match:"Sent [0-9]+ bytes" \ 352*64c2a712SDag-Erling Smørgrav tftp localhost <client-script 353*64c2a712SDag-Erling Smørgrav for f in $(jot -c $n 97) ; do 354*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${tftp_dir}/subdir/${f}.txt" "${f}.txt" 355*64c2a712SDag-Erling Smørgrav done 356*64c2a712SDag-Erling Smørgrav done 357*64c2a712SDag-Erling Smørgrav} 358*64c2a712SDag-Erling Smørgravtftp_put_more_cleanup() { 359*64c2a712SDag-Erling Smørgrav stop_tftpd 360*64c2a712SDag-Erling Smørgrav} 361*64c2a712SDag-Erling Smørgrav 362*64c2a712SDag-Erling Smørgravatf_test_case tftp_put_multi_host cleanup 363*64c2a712SDag-Erling Smørgravtftp_put_multi_host_head() { 364*64c2a712SDag-Erling Smørgrav atf_set "descr" "put command with multiple files and host name" 365*64c2a712SDag-Erling Smørgrav atf_set "require.user" "root" 366*64c2a712SDag-Erling Smørgrav} 367*64c2a712SDag-Erling Smørgravtftp_put_multi_host_body() { 368*64c2a712SDag-Erling Smørgrav start_tftpd 369*64c2a712SDag-Erling Smørgrav mkdir "${tftp_dir}/subdir" 370*64c2a712SDag-Erling Smørgrav echo -n "put" >client-script 371*64c2a712SDag-Erling Smørgrav for f in a b c ; do 372*64c2a712SDag-Erling Smørgrav echo "test file $$/$f" >"${f}.txt" 373*64c2a712SDag-Erling Smørgrav truncate -s 0 "${tftp_dir}/subdir/${f}.txt" 374*64c2a712SDag-Erling Smørgrav chown nobody:nogroup "${tftp_dir}/subdir/${f}.txt" 375*64c2a712SDag-Erling Smørgrav chmod 0666 "${tftp_dir}/subdir/${f}.txt" 376*64c2a712SDag-Erling Smørgrav echo -n " ${f}.txt" >>client-script 377*64c2a712SDag-Erling Smørgrav done 378*64c2a712SDag-Erling Smørgrav echo " localhost:subdir" >>client-script 379*64c2a712SDag-Erling Smørgrav atf_check -o match:"Sent [0-9]+ bytes" \ 380*64c2a712SDag-Erling Smørgrav tftp <client-script 381*64c2a712SDag-Erling Smørgrav for f in a b c ; do 382*64c2a712SDag-Erling Smørgrav atf_check cmp -s "${tftp_dir}/subdir/${f}.txt" "${f}.txt" 383*64c2a712SDag-Erling Smørgrav done 384*64c2a712SDag-Erling Smørgrav} 385*64c2a712SDag-Erling Smørgravtftp_put_multi_host_cleanup() { 386*64c2a712SDag-Erling Smørgrav stop_tftpd 387*64c2a712SDag-Erling Smørgrav} 388*64c2a712SDag-Erling Smørgrav 389*64c2a712SDag-Erling Smørgravatf_init_test_cases() { 390*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_get_big 391*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_get_host 392*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_get_ipv4 393*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_get_ipv6 394*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_get_one 395*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_get_two 396*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_get_more 397*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_get_multi_host 398*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_put_big 399*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_put_host 400*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_put_ipv4 401*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_put_ipv6 402*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_put_one 403*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_put_two 404*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_put_more 405*64c2a712SDag-Erling Smørgrav atf_add_test_case tftp_put_multi_host 406*64c2a712SDag-Erling Smørgrav} 407