140a8ac8fSEnji Cooper# $FreeBSD$ 240a8ac8fSEnji Cooper 340a8ac8fSEnji Cooperntest=1 440a8ac8fSEnji Cooper 5*3416500aSEnji Cooperconfdir=${dir:-$(dirname "$0")} 6*3416500aSEnji Coopermaindir=${dir:-$(dirname "$0")} 7*3416500aSEnji Cooperwhile [ ! -r "$confdir/conf" -a "$confdir" != / ]; do 8*3416500aSEnji Cooper confdir=$(cd $confdir/..; pwd) 9*3416500aSEnji Cooperdone 10*3416500aSEnji Cooperwhile [ "$maindir" != / ]; do 11*3416500aSEnji Cooper if [ -f "$maindir/pjdfstest" -a -x "$maindir/pjdfstest" ]; then 12*3416500aSEnji Cooper break 13*3416500aSEnji Cooper fi 14*3416500aSEnji Cooper maindir=$(cd $maindir/../; pwd) 15*3416500aSEnji Cooperdone 16*3416500aSEnji Cooperfstest="${maindir}/pjdfstest" 17*3416500aSEnji Cooperif ! . ${confdir}/conf; then 18*3416500aSEnji Cooper echo "not ok - could not source configuration file" 19*3416500aSEnji Cooper exit 1 20*3416500aSEnji Cooperfi 21*3416500aSEnji Cooperif [ ! -x $fstest ]; then 22*3416500aSEnji Cooper echo "not ok - could not find pjdfstest app" 23*3416500aSEnji Cooper exit 1 24*3416500aSEnji Cooperfi 25*3416500aSEnji Cooper 26*3416500aSEnji Cooperrequires_root() 27*3416500aSEnji Cooper{ 28*3416500aSEnji Cooper case "$(id -u)" in 29*3416500aSEnji Cooper 0) 30*3416500aSEnji Cooper return 0 3140a8ac8fSEnji Cooper ;; 3240a8ac8fSEnji Cooper *) 33*3416500aSEnji Cooper echo "not ok ${ntest} not root" 34*3416500aSEnji Cooper return 1 3540a8ac8fSEnji Cooper ;; 3640a8ac8fSEnji Cooper esac 37*3416500aSEnji Cooper} 3840a8ac8fSEnji Cooper 3940a8ac8fSEnji Cooperexpect() 4040a8ac8fSEnji Cooper{ 4140a8ac8fSEnji Cooper e="${1}" 4240a8ac8fSEnji Cooper shift 4340a8ac8fSEnji Cooper r=`${fstest} $* 2>/dev/null | tail -1` 4440a8ac8fSEnji Cooper echo "${r}" | ${GREP} -Eq '^'${e}'$' 4540a8ac8fSEnji Cooper if [ $? -eq 0 ]; then 4640a8ac8fSEnji Cooper if [ -z "${todomsg}" ]; then 4740a8ac8fSEnji Cooper echo "ok ${ntest}" 4840a8ac8fSEnji Cooper else 4940a8ac8fSEnji Cooper echo "ok ${ntest} # TODO ${todomsg}" 5040a8ac8fSEnji Cooper fi 5140a8ac8fSEnji Cooper else 5240a8ac8fSEnji Cooper if [ -z "${todomsg}" ]; then 5340a8ac8fSEnji Cooper echo "not ok ${ntest} - tried '$*', expected ${e}, got ${r}" 5440a8ac8fSEnji Cooper else 5540a8ac8fSEnji Cooper echo "not ok ${ntest} # TODO ${todomsg}" 5640a8ac8fSEnji Cooper fi 5740a8ac8fSEnji Cooper fi 5840a8ac8fSEnji Cooper todomsg="" 5940a8ac8fSEnji Cooper ntest=$((ntest+1)) 6040a8ac8fSEnji Cooper} 6140a8ac8fSEnji Cooper 6240a8ac8fSEnji Cooperjexpect() 6340a8ac8fSEnji Cooper{ 6440a8ac8fSEnji Cooper s="${1}" 6540a8ac8fSEnji Cooper d="${2}" 6640a8ac8fSEnji Cooper e="${3}" 67*3416500aSEnji Cooper 6840a8ac8fSEnji Cooper shift 3 69*3416500aSEnji Cooper r=`jail -s ${s} / pjdfstest 127.0.0.1 /bin/sh -c "cd ${d} && ${fstest} $* 2>/dev/null" 2>/dev/null | tail -1` 7040a8ac8fSEnji Cooper echo "${r}" | ${GREP} -Eq '^'${e}'$' 7140a8ac8fSEnji Cooper if [ $? -eq 0 ]; then 7240a8ac8fSEnji Cooper if [ -z "${todomsg}" ]; then 7340a8ac8fSEnji Cooper echo "ok ${ntest}" 7440a8ac8fSEnji Cooper else 7540a8ac8fSEnji Cooper echo "ok ${ntest} # TODO ${todomsg}" 7640a8ac8fSEnji Cooper fi 7740a8ac8fSEnji Cooper else 7840a8ac8fSEnji Cooper if [ -z "${todomsg}" ]; then 7940a8ac8fSEnji Cooper echo "not ok ${ntest} - tried '$*', expected ${e}, got ${r}" 8040a8ac8fSEnji Cooper else 8140a8ac8fSEnji Cooper echo "not ok ${ntest} # TODO ${todomsg}" 8240a8ac8fSEnji Cooper fi 8340a8ac8fSEnji Cooper fi 8440a8ac8fSEnji Cooper todomsg="" 8540a8ac8fSEnji Cooper ntest=$((ntest+1)) 8640a8ac8fSEnji Cooper} 8740a8ac8fSEnji Cooper 8840a8ac8fSEnji Coopertest_check() 8940a8ac8fSEnji Cooper{ 9040a8ac8fSEnji Cooper if [ $* ]; then 9140a8ac8fSEnji Cooper if [ -z "${todomsg}" ]; then 9240a8ac8fSEnji Cooper echo "ok ${ntest}" 9340a8ac8fSEnji Cooper else 9440a8ac8fSEnji Cooper echo "ok ${ntest} # TODO ${todomsg}" 9540a8ac8fSEnji Cooper fi 9640a8ac8fSEnji Cooper else 9740a8ac8fSEnji Cooper if [ -z "${todomsg}" ]; then 9840a8ac8fSEnji Cooper echo "not ok ${ntest}" 9940a8ac8fSEnji Cooper else 10040a8ac8fSEnji Cooper echo "not ok ${ntest} # TODO ${todomsg}" 10140a8ac8fSEnji Cooper fi 10240a8ac8fSEnji Cooper fi 10340a8ac8fSEnji Cooper todomsg="" 10440a8ac8fSEnji Cooper ntest=$((ntest+1)) 10540a8ac8fSEnji Cooper} 10640a8ac8fSEnji Cooper 10740a8ac8fSEnji Coopertodo() 10840a8ac8fSEnji Cooper{ 10940a8ac8fSEnji Cooper if [ "${os}" = "${1}" -o "${os}:${fs}" = "${1}" ]; then 11040a8ac8fSEnji Cooper todomsg="${2}" 11140a8ac8fSEnji Cooper fi 11240a8ac8fSEnji Cooper} 11340a8ac8fSEnji Cooper 11440a8ac8fSEnji Coopernamegen() 11540a8ac8fSEnji Cooper{ 11640a8ac8fSEnji Cooper echo "pjdfstest_`dd if=/dev/urandom bs=1k count=1 2>/dev/null | openssl md5 | awk '{print $NF}'`" 11740a8ac8fSEnji Cooper} 11840a8ac8fSEnji Cooper 11940a8ac8fSEnji Coopernamegen_len() 12040a8ac8fSEnji Cooper{ 12140a8ac8fSEnji Cooper len="${1}" 12240a8ac8fSEnji Cooper 12340a8ac8fSEnji Cooper name="" 12440a8ac8fSEnji Cooper while :; do 12540a8ac8fSEnji Cooper namepart="`dd if=/dev/urandom bs=64 count=1 2>/dev/null | openssl md5 | awk '{print $NF}'`" 12640a8ac8fSEnji Cooper name="${name}${namepart}" 12740a8ac8fSEnji Cooper curlen=`printf "%s" "${name}" | wc -c` 12840a8ac8fSEnji Cooper [ ${curlen} -lt ${len} ] || break 12940a8ac8fSEnji Cooper done 13040a8ac8fSEnji Cooper name=`echo "${name}" | cut -b -${len}` 13140a8ac8fSEnji Cooper printf "%s" "${name}" 13240a8ac8fSEnji Cooper} 13340a8ac8fSEnji Cooper 13440a8ac8fSEnji Cooper# POSIX: 13540a8ac8fSEnji Cooper# {NAME_MAX} 13640a8ac8fSEnji Cooper# Maximum number of bytes in a filename (not including terminating null). 13740a8ac8fSEnji Coopernamegen_max() 13840a8ac8fSEnji Cooper{ 13940a8ac8fSEnji Cooper name_max=`${fstest} pathconf . _PC_NAME_MAX` 14040a8ac8fSEnji Cooper namegen_len ${name_max} 14140a8ac8fSEnji Cooper} 14240a8ac8fSEnji Cooper 14340a8ac8fSEnji Cooper# POSIX: 14440a8ac8fSEnji Cooper# {PATH_MAX} 14540a8ac8fSEnji Cooper# Maximum number of bytes in a pathname, including the terminating null character. 14640a8ac8fSEnji Cooperdirgen_max() 14740a8ac8fSEnji Cooper{ 14840a8ac8fSEnji Cooper name_max=`${fstest} pathconf . _PC_NAME_MAX` 14940a8ac8fSEnji Cooper complen=$((name_max/2)) 15040a8ac8fSEnji Cooper path_max=`${fstest} pathconf . _PC_PATH_MAX` 15140a8ac8fSEnji Cooper # "...including the terminating null character." 15240a8ac8fSEnji Cooper path_max=$((path_max-1)) 15340a8ac8fSEnji Cooper 15440a8ac8fSEnji Cooper name="" 15540a8ac8fSEnji Cooper while :; do 15640a8ac8fSEnji Cooper name="${name}`namegen_len ${complen}`/" 15740a8ac8fSEnji Cooper curlen=`printf "%s" "${name}" | wc -c` 15840a8ac8fSEnji Cooper [ ${curlen} -lt ${path_max} ] || break 15940a8ac8fSEnji Cooper done 16040a8ac8fSEnji Cooper name=`echo "${name}" | cut -b -${path_max}` 16140a8ac8fSEnji Cooper name=`echo "${name}" | sed -E 's@/$@x@'` 16240a8ac8fSEnji Cooper printf "%s" "${name}" 16340a8ac8fSEnji Cooper} 16440a8ac8fSEnji Cooper 16540a8ac8fSEnji Cooperquick_exit() 16640a8ac8fSEnji Cooper{ 16740a8ac8fSEnji Cooper echo "1..1" 16840a8ac8fSEnji Cooper echo "ok 1" 16940a8ac8fSEnji Cooper exit 0 17040a8ac8fSEnji Cooper} 17140a8ac8fSEnji Cooper 17240a8ac8fSEnji Coopersupported() 17340a8ac8fSEnji Cooper{ 17440a8ac8fSEnji Cooper case "${1}" in 17540a8ac8fSEnji Cooper lchmod) 17640a8ac8fSEnji Cooper if [ "${os}" != "FreeBSD" ]; then 17740a8ac8fSEnji Cooper return 1 17840a8ac8fSEnji Cooper fi 17940a8ac8fSEnji Cooper ;; 18040a8ac8fSEnji Cooper chflags) 18140a8ac8fSEnji Cooper if [ "${os}" != "FreeBSD" ]; then 18240a8ac8fSEnji Cooper return 1 18340a8ac8fSEnji Cooper fi 18440a8ac8fSEnji Cooper ;; 18540a8ac8fSEnji Cooper chflags_SF_SNAPSHOT) 18640a8ac8fSEnji Cooper if [ "${os}" != "FreeBSD" -o "${fs}" != "UFS" ]; then 18740a8ac8fSEnji Cooper return 1 18840a8ac8fSEnji Cooper fi 18940a8ac8fSEnji Cooper ;; 190*3416500aSEnji Cooper posix_fallocate) 191*3416500aSEnji Cooper if [ "${os}" != "FreeBSD" ]; then 192*3416500aSEnji Cooper return 1 193*3416500aSEnji Cooper fi 194*3416500aSEnji Cooper ;; 195*3416500aSEnji Cooper stat_st_birthtime) 196*3416500aSEnji Cooper case "${os}" in 197*3416500aSEnji Cooper Darwin|FreeBSD) 198*3416500aSEnji Cooper ;; 199*3416500aSEnji Cooper *) 200*3416500aSEnji Cooper return 1 201*3416500aSEnji Cooper ;; 202*3416500aSEnji Cooper esac 203*3416500aSEnji Cooper ;; 204*3416500aSEnji Cooper utimensat) 205*3416500aSEnji Cooper case ${os} in 206*3416500aSEnji Cooper Darwin) 207*3416500aSEnji Cooper return 1 208*3416500aSEnji Cooper ;; 209*3416500aSEnji Cooper esac 210*3416500aSEnji Cooper ;; 21140a8ac8fSEnji Cooper esac 21240a8ac8fSEnji Cooper return 0 21340a8ac8fSEnji Cooper} 21440a8ac8fSEnji Cooper 21540a8ac8fSEnji Cooperrequire() 21640a8ac8fSEnji Cooper{ 21740a8ac8fSEnji Cooper if supported ${1}; then 21840a8ac8fSEnji Cooper return 21940a8ac8fSEnji Cooper fi 22040a8ac8fSEnji Cooper quick_exit 22140a8ac8fSEnji Cooper} 22240a8ac8fSEnji Cooper 223*3416500aSEnji Cooperif [ "${os}" = "FreeBSD" ]; then 224*3416500aSEnji Coopermountpoint() 225*3416500aSEnji Cooper{ 226*3416500aSEnji Cooper df $1 | tail -1 | awk '{ print $6 }' 227*3416500aSEnji Cooper} 228*3416500aSEnji Cooper 229*3416500aSEnji Coopermount_options() 230*3416500aSEnji Cooper{ 231*3416500aSEnji Cooper mount -p | awk '$2 == "'$(mountpoint .)'" { print $4 }' | sed -e 's/,/ /g' 232*3416500aSEnji Cooper} 233*3416500aSEnji Cooper 234*3416500aSEnji Coopernfsv4acls() 235*3416500aSEnji Cooper{ 236*3416500aSEnji Cooper if mount_options | grep -q nfsv4acls; then 237*3416500aSEnji Cooper return 0 238*3416500aSEnji Cooper fi 239*3416500aSEnji Cooper return 1 240*3416500aSEnji Cooper} 241*3416500aSEnji Cooper 242*3416500aSEnji Coopernoexec() 243*3416500aSEnji Cooper{ 244*3416500aSEnji Cooper if mount_options | grep -q noexec; then 245*3416500aSEnji Cooper return 0 246*3416500aSEnji Cooper fi 247*3416500aSEnji Cooper return 1 248*3416500aSEnji Cooper} 249*3416500aSEnji Cooper 250*3416500aSEnji Coopernosuid() 251*3416500aSEnji Cooper{ 252*3416500aSEnji Cooper if mount_options | grep -q nosuid; then 253*3416500aSEnji Cooper return 0 254*3416500aSEnji Cooper fi 255*3416500aSEnji Cooper return 1 256*3416500aSEnji Cooper} 257*3416500aSEnji Cooperelse 258*3416500aSEnji Coopermountpoint() 259*3416500aSEnji Cooper{ 260*3416500aSEnji Cooper return 1 261*3416500aSEnji Cooper} 262*3416500aSEnji Coopermount_options() 263*3416500aSEnji Cooper{ 264*3416500aSEnji Cooper return 1 265*3416500aSEnji Cooper} 266*3416500aSEnji Coopernfsv4acls() 267*3416500aSEnji Cooper{ 268*3416500aSEnji Cooper return 1 269*3416500aSEnji Cooper} 270*3416500aSEnji Coopernoexec() 271*3416500aSEnji Cooper{ 272*3416500aSEnji Cooper return 1 273*3416500aSEnji Cooper} 274*3416500aSEnji Coopernosuid() 275*3416500aSEnji Cooper{ 276*3416500aSEnji Cooper return 1 277*3416500aSEnji Cooper} 278*3416500aSEnji Cooperfi 279*3416500aSEnji Cooper 28040a8ac8fSEnji Cooper# usage: 28140a8ac8fSEnji Cooper# create_file <type> <name> 28240a8ac8fSEnji Cooper# create_file <type> <name> <mode> 28340a8ac8fSEnji Cooper# create_file <type> <name> <uid> <gid> 28440a8ac8fSEnji Cooper# create_file <type> <name> <mode> <uid> <gid> 28540a8ac8fSEnji Coopercreate_file() { 28640a8ac8fSEnji Cooper type="${1}" 28740a8ac8fSEnji Cooper name="${2}" 28840a8ac8fSEnji Cooper 28940a8ac8fSEnji Cooper case "${type}" in 29040a8ac8fSEnji Cooper none) 29140a8ac8fSEnji Cooper return 29240a8ac8fSEnji Cooper ;; 29340a8ac8fSEnji Cooper regular) 29440a8ac8fSEnji Cooper expect 0 create ${name} 0644 29540a8ac8fSEnji Cooper ;; 29640a8ac8fSEnji Cooper dir) 29740a8ac8fSEnji Cooper expect 0 mkdir ${name} 0755 29840a8ac8fSEnji Cooper ;; 29940a8ac8fSEnji Cooper fifo) 30040a8ac8fSEnji Cooper expect 0 mkfifo ${name} 0644 30140a8ac8fSEnji Cooper ;; 30240a8ac8fSEnji Cooper block) 30340a8ac8fSEnji Cooper expect 0 mknod ${name} b 0644 1 2 30440a8ac8fSEnji Cooper ;; 30540a8ac8fSEnji Cooper char) 30640a8ac8fSEnji Cooper expect 0 mknod ${name} c 0644 1 2 30740a8ac8fSEnji Cooper ;; 30840a8ac8fSEnji Cooper socket) 30940a8ac8fSEnji Cooper expect 0 bind ${name} 31040a8ac8fSEnji Cooper ;; 31140a8ac8fSEnji Cooper symlink) 31240a8ac8fSEnji Cooper expect 0 symlink test ${name} 31340a8ac8fSEnji Cooper ;; 31440a8ac8fSEnji Cooper esac 31540a8ac8fSEnji Cooper if [ -n "${3}" -a -n "${4}" -a -n "${5}" ]; then 316*3416500aSEnji Cooper if [ "${type}" = symlink ]; then 31740a8ac8fSEnji Cooper expect 0 lchmod ${name} ${3} 318*3416500aSEnji Cooper else 319*3416500aSEnji Cooper expect 0 chmod ${name} ${3} 320*3416500aSEnji Cooper fi 32140a8ac8fSEnji Cooper expect 0 lchown ${name} ${4} ${5} 32240a8ac8fSEnji Cooper elif [ -n "${3}" -a -n "${4}" ]; then 32340a8ac8fSEnji Cooper expect 0 lchown ${name} ${3} ${4} 32440a8ac8fSEnji Cooper elif [ -n "${3}" ]; then 325*3416500aSEnji Cooper if [ "${type}" = symlink ]; then 32640a8ac8fSEnji Cooper expect 0 lchmod ${name} ${3} 327*3416500aSEnji Cooper else 328*3416500aSEnji Cooper expect 0 chmod ${name} ${3} 329*3416500aSEnji Cooper fi 33040a8ac8fSEnji Cooper fi 33140a8ac8fSEnji Cooper} 33245dc13f1SEnji Cooper 33345dc13f1SEnji Cooper# Tests for whether or not a filesystem is mounted with a particular option 33445dc13f1SEnji Cooper# with -o, e.g. `mount -o noexec`. 33545dc13f1SEnji Cooper# 33645dc13f1SEnji Cooper# Parameters: 33745dc13f1SEnji Cooper# - mount_option - noatime, noexec, etc. 33845dc13f1SEnji Cooper# 33945dc13f1SEnji Cooper# Returns: 34045dc13f1SEnji Cooper# - 0 if mounted with the option. 34145dc13f1SEnji Cooper# - 1 otherwise. 34245dc13f1SEnji Cooperhas_mount_option() 34345dc13f1SEnji Cooper{ 34445dc13f1SEnji Cooper local IFS=, 34545dc13f1SEnji Cooper local mount_opt 34645dc13f1SEnji Cooper 34745dc13f1SEnji Cooper local mount_option_search=$1 34845dc13f1SEnji Cooper 34945dc13f1SEnji Cooper # XXX: mountpoint is defined in .../tests/sys/pjdfstest/tests/conf 35045dc13f1SEnji Cooper for mount_opt in $(mount -d -p | awk '$2 == "'$mountpoint'" { print $4 }'); do 35145dc13f1SEnji Cooper if [ "$mount_opt" = "$mount_option_search" ]; then 35245dc13f1SEnji Cooper return 0 35345dc13f1SEnji Cooper fi 35445dc13f1SEnji Cooper done 35545dc13f1SEnji Cooper return 1 35645dc13f1SEnji Cooper} 35745dc13f1SEnji Cooper 35845dc13f1SEnji Cooper# Filesystem must be mounted with -o exec 35945dc13f1SEnji Cooperrequires_exec() 36045dc13f1SEnji Cooper{ 36145dc13f1SEnji Cooper if has_mount_option noexec; then 36245dc13f1SEnji Cooper echo "1..0 # SKIP filesystem mounted with -o noexec" 36345dc13f1SEnji Cooper exit 0 36445dc13f1SEnji Cooper fi 36545dc13f1SEnji Cooper} 366