Index: head/contrib/pjdfstest/tests/ftruncate/11.t =================================================================== --- head/contrib/pjdfstest/tests/ftruncate/11.t (revision 296765) +++ head/contrib/pjdfstest/tests/ftruncate/11.t (revision 296766) @@ -1,18 +1,20 @@ #!/bin/sh # $FreeBSD: head/tools/regression/pjdfstest/tests/truncate/11.t 211352 2010-08-15 21:24:17Z pjd $ desc="truncate returns ETXTBSY the file is a pure procedure (shared text) file that is being executed" dir=`dirname $0` . ${dir}/../misc.sh [ "${os}" = "FreeBSD" ] || quick_exit +requires_exec + echo "1..2" n0=`namegen` cp -pf `which sleep` ${n0} ./${n0} 3 & expect ETXTBSY truncate ${n0} 123 expect 0 unlink ${n0} Index: head/contrib/pjdfstest/tests/misc.sh =================================================================== --- head/contrib/pjdfstest/tests/misc.sh (revision 296765) +++ head/contrib/pjdfstest/tests/misc.sh (revision 296766) @@ -1,221 +1,255 @@ # $FreeBSD$ ntest=1 case "${dir}" in /*) maindir="${dir}/../.." ;; *) maindir="`pwd`/${dir}/../.." ;; esac fstest="${maindir}/pjdfstest" . ${maindir}/tests/conf expect() { e="${1}" shift r=`${fstest} $* 2>/dev/null | tail -1` echo "${r}" | ${GREP} -Eq '^'${e}'$' if [ $? -eq 0 ]; then if [ -z "${todomsg}" ]; then echo "ok ${ntest}" else echo "ok ${ntest} # TODO ${todomsg}" fi else if [ -z "${todomsg}" ]; then echo "not ok ${ntest} - tried '$*', expected ${e}, got ${r}" else echo "not ok ${ntest} # TODO ${todomsg}" fi fi todomsg="" ntest=$((ntest+1)) } jexpect() { s="${1}" d="${2}" e="${3}" shift 3 r=`jail -s ${s} / pjdfstest 127.0.0.1 /bin/sh -c "cd ${d} && ${fstest} $* 2>/dev/null" | tail -1` echo "${r}" | ${GREP} -Eq '^'${e}'$' if [ $? -eq 0 ]; then if [ -z "${todomsg}" ]; then echo "ok ${ntest}" else echo "ok ${ntest} # TODO ${todomsg}" fi else if [ -z "${todomsg}" ]; then echo "not ok ${ntest} - tried '$*', expected ${e}, got ${r}" else echo "not ok ${ntest} # TODO ${todomsg}" fi fi todomsg="" ntest=$((ntest+1)) } test_check() { if [ $* ]; then if [ -z "${todomsg}" ]; then echo "ok ${ntest}" else echo "ok ${ntest} # TODO ${todomsg}" fi else if [ -z "${todomsg}" ]; then echo "not ok ${ntest}" else echo "not ok ${ntest} # TODO ${todomsg}" fi fi todomsg="" ntest=$((ntest+1)) } todo() { if [ "${os}" = "${1}" -o "${os}:${fs}" = "${1}" ]; then todomsg="${2}" fi } namegen() { echo "pjdfstest_`dd if=/dev/urandom bs=1k count=1 2>/dev/null | openssl md5 | awk '{print $NF}'`" } namegen_len() { len="${1}" name="" while :; do namepart="`dd if=/dev/urandom bs=64 count=1 2>/dev/null | openssl md5 | awk '{print $NF}'`" name="${name}${namepart}" curlen=`printf "%s" "${name}" | wc -c` [ ${curlen} -lt ${len} ] || break done name=`echo "${name}" | cut -b -${len}` printf "%s" "${name}" } # POSIX: # {NAME_MAX} # Maximum number of bytes in a filename (not including terminating null). namegen_max() { name_max=`${fstest} pathconf . _PC_NAME_MAX` namegen_len ${name_max} } # POSIX: # {PATH_MAX} # Maximum number of bytes in a pathname, including the terminating null character. dirgen_max() { name_max=`${fstest} pathconf . _PC_NAME_MAX` complen=$((name_max/2)) path_max=`${fstest} pathconf . _PC_PATH_MAX` # "...including the terminating null character." path_max=$((path_max-1)) name="" while :; do name="${name}`namegen_len ${complen}`/" curlen=`printf "%s" "${name}" | wc -c` [ ${curlen} -lt ${path_max} ] || break done name=`echo "${name}" | cut -b -${path_max}` name=`echo "${name}" | sed -E 's@/$@x@'` printf "%s" "${name}" } quick_exit() { echo "1..1" echo "ok 1" exit 0 } supported() { case "${1}" in lchmod) if [ "${os}" != "FreeBSD" ]; then return 1 fi ;; chflags) if [ "${os}" != "FreeBSD" ]; then return 1 fi ;; chflags_SF_SNAPSHOT) if [ "${os}" != "FreeBSD" -o "${fs}" != "UFS" ]; then return 1 fi ;; esac return 0 } require() { if supported ${1}; then return fi quick_exit } # usage: # create_file # create_file # create_file # create_file create_file() { type="${1}" name="${2}" case "${type}" in none) return ;; regular) expect 0 create ${name} 0644 ;; dir) expect 0 mkdir ${name} 0755 ;; fifo) expect 0 mkfifo ${name} 0644 ;; block) expect 0 mknod ${name} b 0644 1 2 ;; char) expect 0 mknod ${name} c 0644 1 2 ;; socket) expect 0 bind ${name} ;; symlink) expect 0 symlink test ${name} ;; esac if [ -n "${3}" -a -n "${4}" -a -n "${5}" ]; then expect 0 lchmod ${name} ${3} expect 0 lchown ${name} ${4} ${5} elif [ -n "${3}" -a -n "${4}" ]; then expect 0 lchown ${name} ${3} ${4} elif [ -n "${3}" ]; then expect 0 lchmod ${name} ${3} fi } + +# Tests for whether or not a filesystem is mounted with a particular option +# with -o, e.g. `mount -o noexec`. +# +# Parameters: +# - mount_option - noatime, noexec, etc. +# +# Returns: +# - 0 if mounted with the option. +# - 1 otherwise. +has_mount_option() +{ + local IFS=, + local mount_opt + + local mount_option_search=$1 + + # XXX: mountpoint is defined in .../tests/sys/pjdfstest/tests/conf + for mount_opt in $(mount -d -p | awk '$2 == "'$mountpoint'" { print $4 }'); do + if [ "$mount_opt" = "$mount_option_search" ]; then + return 0 + fi + done + return 1 +} + +# Filesystem must be mounted with -o exec +requires_exec() +{ + if has_mount_option noexec; then + echo "1..0 # SKIP filesystem mounted with -o noexec" + exit 0 + fi +} Index: head/contrib/pjdfstest/tests/open/20.t =================================================================== --- head/contrib/pjdfstest/tests/open/20.t (revision 296765) +++ head/contrib/pjdfstest/tests/open/20.t (revision 296766) @@ -1,24 +1,26 @@ #!/bin/sh # $FreeBSD: head/tools/regression/pjdfstest/tests/open/20.t 211352 2010-08-15 21:24:17Z pjd $ desc="open returns ETXTBSY when the file is a pure procedure (shared text) file that is being executed and the open() system call requests write access" dir=`dirname $0` . ${dir}/../misc.sh [ "${os}:${fs}" = "FreeBSD:UFS" ] || quick_exit +requires_exec + echo "1..4" n0=`namegen` cp -pf `which sleep` ${n0} ./${n0} 3 & while ! pkill -0 -f ./${n0}; do sleep 0.1 done expect ETXTBSY open ${n0} O_WRONLY expect ETXTBSY open ${n0} O_RDWR expect ETXTBSY open ${n0} O_RDONLY,O_TRUNC pkill -9 -f ./${n0} expect 0 unlink ${n0} Index: head/contrib/pjdfstest/tests/truncate/11.t =================================================================== --- head/contrib/pjdfstest/tests/truncate/11.t (revision 296765) +++ head/contrib/pjdfstest/tests/truncate/11.t (revision 296766) @@ -1,22 +1,24 @@ #!/bin/sh # $FreeBSD: head/tools/regression/pjdfstest/tests/truncate/11.t 211352 2010-08-15 21:24:17Z pjd $ desc="truncate returns ETXTBSY the file is a pure procedure (shared text) file that is being executed" dir=`dirname $0` . ${dir}/../misc.sh [ "${os}" = "FreeBSD" ] || quick_exit +requires_exec + echo "1..2" n0=`namegen` cp -pf `which sleep` ${n0} ./${n0} 3 & while ! pkill -0 -f ./${n0}; do sleep 0.1 done expect ETXTBSY truncate ${n0} 123 pkill -9 -f ./${n0} expect 0 unlink ${n0}