#!/bin/sh # # Check that watching a process's file descriptors works as expected. # Dummy assignments for "shellcheck". testSubject="${testSubject:-false}"; workFile1="${workFile1:-.tmp1}"; workFile2="${workFile2:-.tmp2}"; workFile3="${workFile3:-.tmp3}" # Skip the test if "-d" is not available. if ! "${testSubject}" -h | grep -Fq ' -d'; then echo "no \`--watchfd' / \`-d' option on this platform" exit 77 fi seq 1 100 > "${workFile1}" seq 1 300 > "${workFile2}" # Run a background process to perform a few reads from a file, opening a # second file after a moment. # NB we just export line to make shellcheck think it's used. ( export line sleep 1 read -r line exec 9<"${workFile2}" sleep 1 read -r line sleep 1 ) <"${workFile1}" & pid=$! sleep 0.1 "${testSubject}" -d "${pid}" -f -i 0.5 >/dev/null 2>"${workFile3}" # Skip the test if "-d" does not work. if grep -Fq ' -d: not available' "${workFile3}"; then echo "no \`--watchfd' / \`-d' option on this platform" exit 77 fi # Process the output to make it easier to handle. # NB "ESC [ A" is "cursor up", we turn that into "-" and a newline. tr '\r' '\n' < "${workFile3}" | sed 's/.\[A/-!/g' | tr '!' '\n' > "${workFile1}" # We should see at least 2 file positions for fd 0. positionsReported="$(awk '/^ *0:/ {print $2}' < "${workFile1}" | sort -n | uniq)" differentNumbers="$(printf "%s\n" "${positionsReported}" | grep -Ec .)" if ! test "${differentNumbers}" -gt 1; then printf "%s\n" "Expected at least 2 different numbers to be output for fd 0" printf "%s:\n%s\n" "Positions reported" "${positionsReported}" printf "%s: %s\n" "Number of different values seen" "${differentNumbers}" printf "%s\n" "Raw output:" cat "${workFile1}" exit 1 fi # We should see file descriptor 9 appear. if ! grep -Eq '^ *9:' < "${workFile1}"; then printf "%s\n" "Expected to see information for fd 9" printf "%s\n" "Raw output:" cat "${workFile1}" exit 1 fi # We should see the last 6 characters of fd 9's filename appear. lastChars="$(printf "%s\n" "${workFile2}" | rev | cut -b1-6 | rev)" if ! grep -Fq "${lastChars}:" < "${workFile1}"; then printf "%s\n" "Expected to see a filename for fd 9" printf "%s\n" "Raw output:" cat "${workFile1}" exit 1 fi exit 0