# $FreeBSD$ ntest=1 confdir=${dir:-$(dirname "$0")} maindir=${dir:-$(dirname "$0")} while [ ! -r "$confdir/conf" -a "$confdir" != / ]; do confdir=$(cd $confdir/..; pwd) done while [ "$maindir" != / ]; do if [ -f "$maindir/pjdfstest" -a -x "$maindir/pjdfstest" ]; then break fi maindir=$(cd $maindir/../; pwd) done fstest="${maindir}/pjdfstest" if ! . ${confdir}/conf; then echo "not ok - could not source configuration file" exit 1 fi if [ ! -x $fstest ]; then echo "not ok - could not find pjdfstest app" exit 1 fi requires_root() { case "$(id -u)" in 0) return 0 ;; *) echo "not ok ${ntest} not root" return 1 ;; esac } 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" 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 ;; posix_fallocate) if [ "${os}" != "FreeBSD" ]; then return 1 fi ;; stat_st_birthtime) case "${os}" in Darwin|FreeBSD) ;; *) return 1 ;; esac ;; utimensat) case ${os} in Darwin) return 1 ;; esac ;; esac return 0 } require() { if supported ${1}; then return fi quick_exit } if [ "${os}" = "FreeBSD" ]; then mountpoint() { df $1 | tail -1 | awk '{ print $6 }' } mount_options() { mount -p | awk '$2 == "'$(mountpoint .)'" { print $4 }' | sed -e 's/,/ /g' } nfsv4acls() { if mount_options | grep -q nfsv4acls; then return 0 fi return 1 } noexec() { if mount_options | grep -q noexec; then return 0 fi return 1 } nosuid() { if mount_options | grep -q nosuid; then return 0 fi return 1 } else mountpoint() { return 1 } mount_options() { return 1 } nfsv4acls() { return 1 } noexec() { return 1 } nosuid() { return 1 } fi # 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 if [ "${type}" = symlink ]; then expect 0 lchmod ${name} ${3} else expect 0 chmod ${name} ${3} fi expect 0 lchown ${name} ${4} ${5} elif [ -n "${3}" -a -n "${4}" ]; then expect 0 lchown ${name} ${3} ${4} elif [ -n "${3}" ]; then if [ "${type}" = symlink ]; then expect 0 lchmod ${name} ${3} else expect 0 chmod ${name} ${3} fi 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 }