|  | #!/bin/sh | 
|  |  | 
|  | TEST_FILE=$(mktemp) | 
|  |  | 
|  | echo "== Testing sysctl behavior against ${TARGET} ==" | 
|  |  | 
|  | set_orig() | 
|  | { | 
|  | echo "${ORIG}" > "${TARGET}" | 
|  | } | 
|  |  | 
|  | set_test() | 
|  | { | 
|  | echo "${TEST_STR}" > "${TARGET}" | 
|  | } | 
|  |  | 
|  | verify() | 
|  | { | 
|  | local seen | 
|  | seen=$(cat "$1") | 
|  | if [ "${seen}" != "${TEST_STR}" ]; then | 
|  | return 1 | 
|  | fi | 
|  | return 0 | 
|  | } | 
|  |  | 
|  | trap 'set_orig; rm -f "${TEST_FILE}"' EXIT | 
|  |  | 
|  | rc=0 | 
|  |  | 
|  | echo -n "Writing test file ... " | 
|  | echo "${TEST_STR}" > "${TEST_FILE}" | 
|  | if ! verify "${TEST_FILE}"; then | 
|  | echo "FAIL" >&2 | 
|  | exit 1 | 
|  | else | 
|  | echo "ok" | 
|  | fi | 
|  |  | 
|  | echo -n "Checking sysctl is not set to test value ... " | 
|  | if verify "${TARGET}"; then | 
|  | echo "FAIL" >&2 | 
|  | exit 1 | 
|  | else | 
|  | echo "ok" | 
|  | fi | 
|  |  | 
|  | echo -n "Writing sysctl from shell ... " | 
|  | set_test | 
|  | if ! verify "${TARGET}"; then | 
|  | echo "FAIL" >&2 | 
|  | exit 1 | 
|  | else | 
|  | echo "ok" | 
|  | fi | 
|  |  | 
|  | echo -n "Resetting sysctl to original value ... " | 
|  | set_orig | 
|  | if verify "${TARGET}"; then | 
|  | echo "FAIL" >&2 | 
|  | exit 1 | 
|  | else | 
|  | echo "ok" | 
|  | fi | 
|  |  | 
|  | # Now that we've validated the sanity of "set_test" and "set_orig", | 
|  | # we can use those functions to set starting states before running | 
|  | # specific behavioral tests. | 
|  |  | 
|  | echo -n "Writing entire sysctl in single write ... " | 
|  | set_orig | 
|  | dd if="${TEST_FILE}" of="${TARGET}" bs=4096 2>/dev/null | 
|  | if ! verify "${TARGET}"; then | 
|  | echo "FAIL" >&2 | 
|  | rc=1 | 
|  | else | 
|  | echo "ok" | 
|  | fi | 
|  |  | 
|  | echo -n "Writing middle of sysctl after synchronized seek ... " | 
|  | set_test | 
|  | dd if="${TEST_FILE}" of="${TARGET}" bs=1 seek=1 skip=1 2>/dev/null | 
|  | if ! verify "${TARGET}"; then | 
|  | echo "FAIL" >&2 | 
|  | rc=1 | 
|  | else | 
|  | echo "ok" | 
|  | fi | 
|  |  | 
|  | echo -n "Writing beyond end of sysctl ... " | 
|  | set_orig | 
|  | dd if="${TEST_FILE}" of="${TARGET}" bs=20 seek=2 2>/dev/null | 
|  | if verify "${TARGET}"; then | 
|  | echo "FAIL" >&2 | 
|  | rc=1 | 
|  | else | 
|  | echo "ok" | 
|  | fi | 
|  |  | 
|  | echo -n "Writing sysctl with multiple long writes ... " | 
|  | set_orig | 
|  | (perl -e 'print "A" x 50;'; echo "${TEST_STR}") | \ | 
|  | dd of="${TARGET}" bs=50 2>/dev/null | 
|  | if verify "${TARGET}"; then | 
|  | echo "FAIL" >&2 | 
|  | rc=1 | 
|  | else | 
|  | echo "ok" | 
|  | fi |