summaryrefslogtreecommitdiffstats
path: root/contrib/pjdfstest/tests/rename
diff options
context:
space:
mode:
authorngie <ngie@FreeBSD.org>2014-12-05 11:44:18 +0000
committerngie <ngie@FreeBSD.org>2014-12-05 11:44:18 +0000
commit2ceba1b1340a12cfe78aa2589bb0bba87f7b33d9 (patch)
treee08795fd1d98cb1be488d6510c6b57e60398f2fa /contrib/pjdfstest/tests/rename
parentf88754a36c36675f66d041b57d0da1b2ea102c62 (diff)
downloadFreeBSD-src-2ceba1b1340a12cfe78aa2589bb0bba87f7b33d9.zip
FreeBSD-src-2ceba1b1340a12cfe78aa2589bb0bba87f7b33d9.tar.gz
MFC r272057,r272083,r272084,r272087,r274016:
r272057: Import pjdfstest from ^/vendor/pjdfstest/abf03c3a47745d4521b0e4aa141317553ca48f91 - Remove tools/regression/pjdfstest - Add upgrade directions for contrib/pjdfstest - Add a note to UPDATING for the move (the reachover Makefiles are coming soon) Functional differences: - ftruncate testcases are added from upstream (github) Non-functional differences: - The copyright for the project has been updated to 2012 - pjd's contact information has been updated Discussed with: -testing, jmmv, pjd Sponsored by: EMC / Isilon Storage Division r272083: Expect ELOOP on Darwin/Linux with "O_NOFOLLOW was specified and the target is a symbolic link" case. Assume EMLINK on the rest of the OSes (FreeBSD, Solaris, etc) Sponsored by: EMC / Isilon Storage Division r272084: Fix the executed testplan count Sponsored by: EMC / Isilon Storage Division r272087: Increase the memory disk size in the following testcases to avoid mount failures, which would cause cascade failures in the rest of the test run: link/15.t, open/19.t, mkdir/11.t, mkfifo/11.t, symlink/11.t Fail quickly in all of the testcases if mdconfig, mount, umount, etc fails to avoid issues similar to this in the future Submitted by: Casey Peel <cpeel@isilon.com> Sponsored by: EMC / Isilon Storage Division r274016: Integrate pjdfstest test suite execution into kyua pjdfstest execution is opt-in and must be done as root due to some of the assumptions made by the test suite and lack of error checking in the non-root case A description of how to execute pjdfstest with kyua is provided in share/pjdfstest/README Phabric: D824 (an earlier prototype patch) Relnotes: yes Sponsored by: EMC / Isilon Storage Division
Diffstat (limited to 'contrib/pjdfstest/tests/rename')
-rw-r--r--contrib/pjdfstest/tests/rename/00.t91
-rw-r--r--contrib/pjdfstest/tests/rename/01.t23
-rw-r--r--contrib/pjdfstest/tests/rename/02.t24
-rw-r--r--contrib/pjdfstest/tests/rename/03.t20
-rw-r--r--contrib/pjdfstest/tests/rename/04.t43
-rw-r--r--contrib/pjdfstest/tests/rename/05.t41
-rw-r--r--contrib/pjdfstest/tests/rename/06.t61
-rw-r--r--contrib/pjdfstest/tests/rename/07.t66
-rw-r--r--contrib/pjdfstest/tests/rename/08.t63
-rw-r--r--contrib/pjdfstest/tests/rename/09.t191
-rw-r--r--contrib/pjdfstest/tests/rename/10.t156
-rw-r--r--contrib/pjdfstest/tests/rename/11.t24
-rw-r--r--contrib/pjdfstest/tests/rename/12.t24
-rw-r--r--contrib/pjdfstest/tests/rename/13.t24
-rw-r--r--contrib/pjdfstest/tests/rename/14.t24
-rw-r--r--contrib/pjdfstest/tests/rename/15.t34
-rw-r--r--contrib/pjdfstest/tests/rename/16.t32
-rw-r--r--contrib/pjdfstest/tests/rename/17.t20
-rw-r--r--contrib/pjdfstest/tests/rename/18.t22
-rw-r--r--contrib/pjdfstest/tests/rename/19.t22
-rw-r--r--contrib/pjdfstest/tests/rename/20.t29
-rw-r--r--contrib/pjdfstest/tests/rename/21.t47
22 files changed, 1081 insertions, 0 deletions
diff --git a/contrib/pjdfstest/tests/rename/00.t b/contrib/pjdfstest/tests/rename/00.t
new file mode 100644
index 0000000..2126a86
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/00.t
@@ -0,0 +1,91 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/00.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename changes file name"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..150"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+n3=`namegen`
+
+expect 0 mkdir ${n3} 0755
+cdir=`pwd`
+cd ${n3}
+
+for type in regular fifo block char socket; do
+ create_file ${type} ${n0} 0644
+ expect ${type},0644,1 lstat ${n0} type,mode,nlink
+ inode=`${fstest} lstat ${n0} inode`
+ expect 0 rename ${n0} ${n1}
+ expect ENOENT lstat ${n0} type,mode,nlink
+ expect ${type},${inode},0644,1 lstat ${n1} type,inode,mode,nlink
+ expect 0 link ${n1} ${n0}
+ expect ${type},${inode},0644,2 lstat ${n0} type,inode,mode,nlink
+ expect ${type},${inode},0644,2 lstat ${n1} type,inode,mode,nlink
+ expect 0 rename ${n1} ${n2}
+ expect ${type},${inode},0644,2 lstat ${n0} type,inode,mode,nlink
+ expect ENOENT lstat ${n1} type,mode,nlink
+ expect ${type},${inode},0644,2 lstat ${n2} type,inode,mode,nlink
+ expect 0 unlink ${n0}
+ expect 0 unlink ${n2}
+done
+
+expect 0 mkdir ${n0} 0755
+expect dir,0755 lstat ${n0} type,mode
+inode=`${fstest} lstat ${n0} inode`
+expect 0 rename ${n0} ${n1}
+expect ENOENT lstat ${n0} type,mode
+expect dir,${inode},0755 lstat ${n1} type,inode,mode
+expect 0 rmdir ${n1}
+
+expect 0 create ${n0} 0644
+rinode=`${fstest} lstat ${n0} inode`
+expect regular,0644 lstat ${n0} type,mode
+expect 0 symlink ${n0} ${n1}
+sinode=`${fstest} lstat ${n1} inode`
+expect regular,${rinode},0644 stat ${n1} type,inode,mode
+expect symlink,${sinode} lstat ${n1} type,inode
+expect 0 rename ${n1} ${n2}
+expect regular,${rinode},0644 stat ${n0} type,inode,mode
+expect ENOENT lstat ${n1} type,mode
+expect symlink,${sinode} lstat ${n2} type,inode
+expect 0 unlink ${n0}
+expect 0 unlink ${n2}
+
+# successful rename(2) updates ctime.
+for type in regular dir fifo block char socket symlink; do
+ create_file ${type} ${n0}
+ ctime1=`${fstest} lstat ${n0} ctime`
+ sleep 1
+ expect 0 rename ${n0} ${n1}
+ ctime2=`${fstest} lstat ${n1} ctime`
+ test_check $ctime1 -lt $ctime2
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n1}
+ else
+ expect 0 unlink ${n1}
+ fi
+done
+
+# unsuccessful link(2) does not update ctime.
+for type in regular dir fifo block char socket symlink; do
+ create_file ${type} ${n0}
+ ctime1=`${fstest} lstat ${n0} ctime`
+ sleep 1
+ expect EACCES -u 65534 rename ${n0} ${n1}
+ ctime2=`${fstest} lstat ${n0} ctime`
+ test_check $ctime1 -eq $ctime2
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n0}
+ else
+ expect 0 unlink ${n0}
+ fi
+done
+
+cd ${cdir}
+expect 0 rmdir ${n3}
diff --git a/contrib/pjdfstest/tests/rename/01.t b/contrib/pjdfstest/tests/rename/01.t
new file mode 100644
index 0000000..dbb9c06
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/01.t
@@ -0,0 +1,23 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/01.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns ENAMETOOLONG if a component of either pathname exceeded {NAME_MAX} characters"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..8"
+
+n0=`namegen`
+nx=`namegen_max`
+nxx="${nx}x"
+
+expect 0 create ${nx} 0644
+expect 0 rename ${nx} ${n0}
+expect 0 rename ${n0} ${nx}
+expect 0 unlink ${nx}
+
+expect 0 create ${n0} 0644
+expect ENAMETOOLONG rename ${n0} ${nxx}
+expect 0 unlink ${n0}
+expect ENAMETOOLONG rename ${nxx} ${n0}
diff --git a/contrib/pjdfstest/tests/rename/02.t b/contrib/pjdfstest/tests/rename/02.t
new file mode 100644
index 0000000..23425ba
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/02.t
@@ -0,0 +1,24 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/02.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns ENAMETOOLONG if an entire length of either path name exceeded {PATH_MAX} characters"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..6"
+
+n0=`namegen`
+nx=`dirgen_max`
+nxx="${nx}x"
+
+mkdir -p "${nx%/*}"
+
+expect 0 create ${n0} 0644
+expect 0 rename ${n0} ${nx}
+expect 0 rename ${nx} ${n0}
+expect ENAMETOOLONG rename ${n0} ${nxx}
+expect 0 unlink ${n0}
+expect ENAMETOOLONG rename ${nxx} ${n0}
+
+rm -rf "${nx%%/*}"
diff --git a/contrib/pjdfstest/tests/rename/03.t b/contrib/pjdfstest/tests/rename/03.t
new file mode 100644
index 0000000..fb1d16f
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/03.t
@@ -0,0 +1,20 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/03.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns ENOENT if a component of the 'from' path does not exist, or a path prefix of 'to' does not exist"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..6"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 mkdir ${n0} 0755
+expect ENOENT rename ${n0}/${n1}/test ${n2}
+expect 0 create ${n2} 0644
+expect ENOENT rename ${n2} ${n0}/${n1}/test
+expect 0 unlink ${n2}
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/04.t b/contrib/pjdfstest/tests/rename/04.t
new file mode 100644
index 0000000..19d1791
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/04.t
@@ -0,0 +1,43 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/04.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EACCES when a component of either path prefix denies search permission"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..18"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+n3=`namegen`
+n4=`namegen`
+
+expect 0 mkdir ${n0} 0755
+cdir=`pwd`
+cd ${n0}
+
+expect 0 mkdir ${n1} 0755
+expect 0 chown ${n1} 65534 65534
+expect 0 mkdir ${n2} 0755
+expect 0 chown ${n2} 65534 65534
+expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644
+
+expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4}
+expect 0 -u 65534 -g 65534 rename ${n2}/${n4} ${n1}/${n3}
+
+expect 0 chmod ${n1} 0644
+expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n1}/${n4}
+expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4}
+
+expect 0 chmod ${n1} 0755
+expect 0 chmod ${n2} 0644
+expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4}
+
+expect 0 unlink ${n1}/${n3}
+expect 0 rmdir ${n1}
+expect 0 rmdir ${n2}
+
+cd ${cdir}
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/05.t b/contrib/pjdfstest/tests/rename/05.t
new file mode 100644
index 0000000..52deac1
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/05.t
@@ -0,0 +1,41 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/05.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EACCES when the requested link requires writing in a directory with a mode that denies write permission"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..17"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+n3=`namegen`
+n4=`namegen`
+
+expect 0 mkdir ${n0} 0755
+cdir=`pwd`
+cd ${n0}
+
+expect 0 mkdir ${n1} 0755
+expect 0 chown ${n1} 65534 65534
+expect 0 mkdir ${n2} 0755
+expect 0 chown ${n2} 65534 65534
+expect 0 -u 65534 -g 65534 create ${n1}/${n3} 0644
+
+expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4}
+expect 0 -u 65534 -g 65534 rename ${n2}/${n4} ${n1}/${n3}
+
+expect 0 chmod ${n2} 0555
+expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n2}/${n4}
+expect 0 chmod ${n1} 0555
+expect EACCES -u 65534 -g 65534 rename ${n1}/${n3} ${n1}/${n4}
+expect 0 chmod ${n1} 0755
+
+expect 0 unlink ${n1}/${n3}
+expect 0 rmdir ${n1}
+expect 0 rmdir ${n2}
+
+cd ${cdir}
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/06.t b/contrib/pjdfstest/tests/rename/06.t
new file mode 100644
index 0000000..ffcf61e
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/06.t
@@ -0,0 +1,61 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/06.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EPERM if the file pointed at by the 'from' argument has its immutable, undeletable or append-only flag set"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+require chflags
+
+case "${os}:${fs}" in
+FreeBSD:ZFS)
+ flags="SF_IMMUTABLE SF_NOUNLINK SF_APPEND"
+ echo "1..195"
+ ;;
+FreeBSD:UFS)
+ flags="SF_IMMUTABLE SF_NOUNLINK SF_APPEND UF_IMMUTABLE UF_NOUNLINK UF_APPEND"
+ echo "1..351"
+ ;;
+*)
+ quick_exit
+esac
+
+n0=`namegen`
+n1=`namegen`
+
+for type in regular dir fifo block char socket symlink; do
+ if [ "${type}" != "symlink" ]; then
+ create_file ${type} ${n0}
+ for flag in ${flags}; do
+ expect 0 chflags ${n0} ${flag}
+ expect ${flag} stat ${n0} flags
+ [ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
+ expect EPERM rename ${n0} ${n1}
+ [ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
+ expect ENOENT rename ${n1} ${n0}
+ done
+ expect 0 chflags ${n0} none
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n0}
+ else
+ expect 0 unlink ${n0}
+ fi
+ fi
+
+ create_file ${type} ${n0}
+ for flag in ${flags}; do
+ expect 0 lchflags ${n0} ${flag}
+ expect ${flag} lstat ${n0} flags
+ [ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
+ expect EPERM rename ${n0} ${n1}
+ [ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
+ expect ENOENT rename ${n1} ${n0}
+ done
+ expect 0 lchflags ${n0} none
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n0}
+ else
+ expect 0 unlink ${n0}
+ fi
+done
diff --git a/contrib/pjdfstest/tests/rename/07.t b/contrib/pjdfstest/tests/rename/07.t
new file mode 100644
index 0000000..522e67d
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/07.t
@@ -0,0 +1,66 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/07.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EPERM if the parent directory of the file pointed at by the 'from' argument has its immutable or append-only flag set"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+require chflags
+
+case "${os}:${fs}" in
+FreeBSD:ZFS)
+ flags1="SF_IMMUTABLE SF_APPEND"
+ flags2="SF_NOUNLINK"
+ echo "1..128"
+ ;;
+FreeBSD:UFS)
+ flags1="SF_IMMUTABLE SF_APPEND UF_IMMUTABLE UF_APPEND"
+ flags2="SF_NOUNLINK UF_NOUNLINK"
+ echo "1..212"
+ ;;
+*)
+ quick_exit
+esac
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 mkdir ${n0} 0755
+
+for type in regular dir fifo block char socket symlink; do
+ create_file ${type} ${n0}/${n1}
+ for flag in ${flags1}; do
+ expect 0 chflags ${n0} ${flag}
+ expect ${flag} stat ${n0} flags
+ [ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
+ expect EPERM rename ${n0}/${n1} ${n2}
+ [ "${flag}" = "SF_APPEND" ] && todo FreeBSD:ZFS "Renaming a file protected by SF_APPEND should return EPERM."
+ expect ENOENT rename ${n2} ${n0}/${n1}
+ done
+ expect 0 chflags ${n0} none
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n0}/${n1}
+ else
+ expect 0 unlink ${n0}/${n1}
+ fi
+done
+
+for type in regular dir fifo block char socket symlink; do
+ create_file ${type} ${n0}/${n1}
+ for flag in ${flags2}; do
+ expect 0 chflags ${n0} ${flag}
+ expect ${flag} stat ${n0} flags
+ expect 0 rename ${n0}/${n1} ${n2}
+ expect 0 rename ${n2} ${n0}/${n1}
+ done
+ expect 0 chflags ${n0} none
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n0}/${n1}
+ else
+ expect 0 unlink ${n0}/${n1}
+ fi
+done
+
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/08.t b/contrib/pjdfstest/tests/rename/08.t
new file mode 100644
index 0000000..beffb41
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/08.t
@@ -0,0 +1,63 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/08.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EPERM if the parent directory of the file pointed at by the 'to' argument has its immutable flag set"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+require chflags
+
+case "${os}:${fs}" in
+FreeBSD:ZFS)
+ flags1="SF_IMMUTABLE"
+ flags2="SF_NOUNLINK SF_APPEND"
+ echo "1..128"
+ ;;
+FreeBSD:UFS)
+ flags1="SF_IMMUTABLE UF_IMMUTABLE"
+ flags2="SF_NOUNLINK SF_APPEND UF_NOUNLINK UF_APPEND"
+ echo "1..219"
+ ;;
+*)
+ quick_exit
+esac
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 mkdir ${n0} 0755
+
+for type in regular dir fifo block char socket symlink; do
+ create_file ${type} ${n1}
+ for flag in ${flags1}; do
+ expect 0 chflags ${n0} ${flag}
+ expect ${flag} stat ${n0} flags
+ expect EPERM rename ${n1} ${n0}/${n2}
+ done
+ expect 0 chflags ${n0} none
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n1}
+ else
+ expect 0 unlink ${n1}
+ fi
+done
+
+for type in regular dir fifo block char socket symlink; do
+ create_file ${type} ${n1}
+ for flag in ${flags2}; do
+ expect 0 chflags ${n0} ${flag}
+ expect ${flag} stat ${n0} flags
+ expect 0 rename ${n1} ${n0}/${n2}
+ expect 0 chflags ${n0} none
+ expect 0 rename ${n0}/${n2} ${n1}
+ done
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n1}
+ else
+ expect 0 unlink ${n1}
+ fi
+done
+
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/09.t b/contrib/pjdfstest/tests/rename/09.t
new file mode 100644
index 0000000..299ff64
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/09.t
@@ -0,0 +1,191 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/09.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EACCES or EPERM if the directory containing 'from' is marked sticky, and neither the containing directory nor 'from' are owned by the effective user ID"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..2353"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+n3=`namegen`
+n4=`namegen`
+
+expect 0 mkdir ${n4} 0755
+cdir=`pwd`
+cd ${n4}
+
+expect 0 mkdir ${n0} 0755
+expect 0 chmod ${n0} 01777
+expect 0 chown ${n0} 65534 65534
+
+expect 0 mkdir ${n1} 0755
+expect 0 chown ${n1} 65534 65534
+
+for type in regular fifo block char socket symlink; do
+ # User owns both: the source sticky directory and the source file.
+ expect 0 chown ${n0} 65534 65534
+ create_file ${type} ${n0}/${n2} 65534 65534
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ for type in none regular fifo block char socket symlink; do
+ create_file ${type} ${n1}/${n3} 65534 65534
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} inode
+ expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
+ expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
+ expect ${inode} lstat ${n0}/${n2} inode
+ expect ENOENT lstat ${n1}/${n3} inode
+ done
+
+ expect 0 unlink ${n0}/${n2}
+
+ # User owns the source sticky directory, but doesn't own the source file.
+ for id in 0 65533; do
+ expect 0 chown ${n0} 65534 65534
+ create_file ${type} ${n0}/${n2} ${id} ${id}
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ for type in none regular fifo block char socket symlink; do
+ create_file ${type} ${n1}/${n3} 65534 65534
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} inode
+ expect ${inode},${id},${id} lstat ${n1}/${n3} inode,uid,gid
+ expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
+ expect ${inode} lstat ${n0}/${n2} inode
+ expect ENOENT lstat ${n1}/${n3} inode
+ done
+
+ expect 0 unlink ${n0}/${n2}
+ done
+
+ # User owns the source file, but doesn't own the source sticky directory.
+ for id in 0 65533; do
+ expect 0 chown ${n0} ${id} ${id}
+ create_file ${type} ${n0}/${n2} 65534 65534
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ for type in none regular fifo block char socket symlink; do
+ create_file ${type} ${n1}/${n3} 65534 65534
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} inode
+ expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
+ expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
+ expect ${inode} lstat ${n0}/${n2} inode
+ expect ENOENT lstat ${n1}/${n3} inode
+ done
+
+ expect 0 unlink ${n0}/${n2}
+ done
+
+ # User doesn't own the source sticky directory nor the source file.
+ for id in 0 65533; do
+ expect 0 chown ${n0} ${id} ${id}
+ create_file ${type} ${n0}/${n2} ${id} ${id}
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ for type in none regular fifo block char socket symlink; do
+ create_file ${type} ${n1}/${n3} 65534 65534
+ expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
+ if [ "${type}" != "none" ]; then
+ expect 65534,65534 lstat ${n1}/${n3} uid,gid
+ expect 0 unlink ${n1}/${n3}
+ fi
+ done
+
+ expect 0 unlink ${n0}/${n2}
+ done
+done
+
+# User owns both: the source sticky directory and the source directory.
+expect 0 chown ${n0} 65534 65534
+create_file dir ${n0}/${n2} 65534 65534
+inode=`${fstest} lstat ${n0}/${n2} inode`
+
+expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+expect ENOENT lstat ${n0}/${n2} type
+expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
+expect 0 rename ${n1}/${n3} ${n0}/${n2}
+
+expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
+expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+expect ENOENT lstat ${n0}/${n2} type
+expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
+expect 0 rmdir ${n1}/${n3}
+
+# User owns the source sticky directory, but doesn't own the source directory.
+# This fails when changing parent directory, because this will modify
+# source directory inode (the .. link in it), but we can still rename it
+# without changing its parent directory.
+for id in 0 65533; do
+ expect 0 chown ${n0} 65534 65534
+ create_file dir ${n0}/${n2} ${id} ${id}
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
+ expect ENOENT lstat ${n1}/${n3} type
+
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3}
+ expect ENOENT lstat ${n0}/${n2} type
+ expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid
+ expect 0 rename ${n0}/${n3} ${n0}/${n2}
+
+ expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
+ expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
+ expect dir,${id},${id} lstat ${n0}/${n2} type,uid,gid
+ expect 0 rmdir ${n1}/${n3}
+
+ expect 0 -u 65534 -g 65534 mkdir ${n0}/${n3} 0755
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n0}/${n3}
+ expect ENOENT lstat ${n0}/${n2} type
+ expect ${inode},${id},${id} lstat ${n0}/${n3} inode,uid,gid
+ expect 0 rmdir ${n0}/${n3}
+done
+
+# User owns the source directory, but doesn't own the source sticky directory.
+for id in 0 65533; do
+ expect 0 chown ${n0} ${id} ${id}
+ create_file dir ${n0}/${n2} 65534 65534
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} type
+ expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
+ expect 0 rename ${n1}/${n3} ${n0}/${n2}
+
+ expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} type
+ expect ${inode},65534,65534 lstat ${n1}/${n3} inode,uid,gid
+ expect 0 rmdir ${n1}/${n3}
+done
+
+# User doesn't own the source sticky directory nor the source directory.
+for id in 0 65533; do
+ expect 0 chown ${n0} ${id} ${id}
+ create_file dir ${n0}/${n2} ${id} ${id}
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
+ expect ENOENT lstat ${n1}/${n3} type
+
+ expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
+ expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ${inode},${id},${id} lstat ${n0}/${n2} inode,uid,gid
+ expect dir,65534,65534 lstat ${n1}/${n3} type,uid,gid
+ expect 0 rmdir ${n0}/${n2}
+ expect 0 rmdir ${n1}/${n3}
+done
+
+expect 0 rmdir ${n1}
+expect 0 rmdir ${n0}
+
+cd ${cdir}
+expect 0 rmdir ${n4}
diff --git a/contrib/pjdfstest/tests/rename/10.t b/contrib/pjdfstest/tests/rename/10.t
new file mode 100644
index 0000000..268c3b6
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/10.t
@@ -0,0 +1,156 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/10.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EACCES or EPERM if the file pointed at by the 'to' argument exists, the directory containing 'to' is marked sticky, and neither the containing directory nor 'to' are owned by the effective user ID"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..2099"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+n3=`namegen`
+n4=`namegen`
+
+expect 0 mkdir ${n4} 0755
+cdir=`pwd`
+cd ${n4}
+
+expect 0 mkdir ${n0} 0755
+expect 0 chown ${n0} 65534 65534
+
+expect 0 mkdir ${n1} 0755
+expect 0 chmod ${n1} 01777
+
+for type in regular fifo block char socket symlink; do
+ # User owns both: the sticky directory and the destination file.
+ expect 0 chown ${n1} 65534 65534
+ create_file ${type} ${n0}/${n2} 65534 65534
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ for type in regular fifo block char socket symlink; do
+ create_file ${type} ${n1}/${n3} 65534 65534
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} inode
+ expect ${inode} lstat ${n1}/${n3} inode
+ expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
+ expect ${inode} lstat ${n0}/${n2} inode
+ expect ENOENT lstat ${n1}/${n3} inode
+ done
+
+ expect 0 unlink ${n0}/${n2}
+
+ # User owns the sticky directory, but doesn't own the destination file.
+ for id in 0 65533; do
+ expect 0 chown ${n1} 65534 65534
+ create_file ${type} ${n0}/${n2} 65534 65534
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ for type in regular fifo block char socket symlink; do
+ create_file ${type} ${n1}/${n3} ${id} ${id}
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} inode
+ expect ${inode} lstat ${n1}/${n3} inode
+ expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
+ expect ${inode} lstat ${n0}/${n2} inode
+ expect ENOENT lstat ${n1}/${n3} inode
+ done
+
+ expect 0 unlink ${n0}/${n2}
+ done
+
+ # User owns the destination file, but doesn't own the sticky directory.
+ for id in 0 65533; do
+ expect 0 chown ${n1} ${id} ${id}
+ create_file ${type} ${n0}/${n2} 65534 65534
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ for type in regular fifo block char socket symlink; do
+ create_file ${type} ${n1}/${n3} 65534 65534
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} inode
+ expect ${inode} lstat ${n1}/${n3} inode
+ expect 0 -u 65534 -g 65534 rename ${n1}/${n3} ${n0}/${n2}
+ expect ${inode} lstat ${n0}/${n2} inode
+ expect ENOENT lstat ${n1}/${n3} inode
+ done
+
+ expect 0 unlink ${n0}/${n2}
+ done
+
+ # User doesn't own the sticky directory nor the destination file.
+ for id in 0 65533; do
+ expect 0 chown ${n1} ${id} ${id}
+ create_file ${type} ${n0}/${n2} 65534 65534
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ for type in regular fifo block char socket symlink; do
+ create_file ${type} ${n1}/${n3} ${id} ${id}
+ expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ${inode} lstat ${n0}/${n2} inode
+ expect ${id},${id} lstat ${n1}/${n3} uid,gid
+ expect 0 unlink ${n1}/${n3}
+ done
+
+ expect 0 unlink ${n0}/${n2}
+ done
+done
+
+# User owns both: the sticky directory and the destination directory.
+expect 0 chown ${n1} 65534 65534
+expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
+inode=`${fstest} lstat ${n0}/${n2} inode`
+
+expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
+expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+expect ENOENT lstat ${n0}/${n2} type
+expect ${inode} lstat ${n1}/${n3} inode
+expect 0 rmdir ${n1}/${n3}
+
+# User owns the sticky directory, but doesn't own the destination directory.
+for id in 0 65533; do
+ expect 0 chown ${n1} 65534 65534
+ expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ expect 0 -u ${id} -g ${id} mkdir ${n1}/${n3} 0755
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} type
+ expect ${inode} lstat ${n1}/${n3} inode
+ expect 0 rmdir ${n1}/${n3}
+done
+
+# User owns the destination directory, but doesn't own the sticky directory.
+for id in 0 65533; do
+ expect 0 chown ${n1} ${id} ${id}
+ expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ expect 0 -u 65534 -g 65534 mkdir ${n1}/${n3} 0755
+ expect 0 -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ENOENT lstat ${n0}/${n2} type
+ expect ${inode} lstat ${n1}/${n3} inode
+ expect 0 rmdir ${n1}/${n3}
+done
+
+# User doesn't own the sticky directory nor the destination directory.
+for id in 0 65533; do
+ expect 0 chown ${n1} ${id} ${id}
+ expect 0 -u 65534 -g 65534 mkdir ${n0}/${n2} 0755
+ inode=`${fstest} lstat ${n0}/${n2} inode`
+
+ expect 0 -u ${id} -g ${id} mkdir ${n1}/${n3} 0755
+ expect "EACCES|EPERM" -u 65534 -g 65534 rename ${n0}/${n2} ${n1}/${n3}
+ expect ${inode} lstat ${n0}/${n2} inode
+ expect ${id},${id} lstat ${n1}/${n3} uid,gid
+ expect 0 rmdir ${n0}/${n2}
+ expect 0 rmdir ${n1}/${n3}
+done
+
+expect 0 rmdir ${n1}
+expect 0 rmdir ${n0}
+
+cd ${cdir}
+expect 0 rmdir ${n4}
diff --git a/contrib/pjdfstest/tests/rename/11.t b/contrib/pjdfstest/tests/rename/11.t
new file mode 100644
index 0000000..3bcd97e
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/11.t
@@ -0,0 +1,24 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/11.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns ELOOP if too many symbolic links were encountered in translating one of the pathnames"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..10"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 symlink ${n0} ${n1}
+expect 0 symlink ${n1} ${n0}
+expect ELOOP rename ${n0}/test ${n2}
+expect ELOOP rename ${n1}/test ${n2}
+expect 0 create ${n2} 0644
+expect ELOOP rename ${n2} ${n0}/test
+expect ELOOP rename ${n2} ${n1}/test
+expect 0 unlink ${n0}
+expect 0 unlink ${n1}
+expect 0 unlink ${n2}
diff --git a/contrib/pjdfstest/tests/rename/12.t b/contrib/pjdfstest/tests/rename/12.t
new file mode 100644
index 0000000..c8939fe
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/12.t
@@ -0,0 +1,24 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/12.t 211474 2010-08-18 22:06:43Z pjd $
+
+desc="rename returns ENOTDIR if a component of either path prefix is not a directory"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..32"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 mkdir ${n0} 0755
+for type in regular fifo block char socket; do
+ create_file ${type} ${n0}/${n1}
+ expect ENOTDIR rename ${n0}/${n1}/test ${n0}/${n2}
+ create_file ${type} ${n0}/${n2}
+ expect ENOTDIR link ${n0}/${n2} ${n0}/${n1}/test
+ expect 0 unlink ${n0}/${n1}
+ expect 0 unlink ${n0}/${n2}
+done
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/13.t b/contrib/pjdfstest/tests/rename/13.t
new file mode 100644
index 0000000..00b0bfb
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/13.t
@@ -0,0 +1,24 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/13.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns ENOTDIR when the 'from' argument is a directory, but 'to' is not a directory"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..32"
+
+n0=`namegen`
+n1=`namegen`
+
+expect 0 mkdir ${n0} 0755
+
+for type in regular fifo block char socket symlink; do
+ create_file ${type} ${n1}
+ expect ENOTDIR rename ${n0} ${n1}
+ expect dir lstat ${n0} type
+ expect ${type} lstat ${n1} type
+ expect 0 unlink ${n1}
+done
+
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/14.t b/contrib/pjdfstest/tests/rename/14.t
new file mode 100644
index 0000000..251a1bd
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/14.t
@@ -0,0 +1,24 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/14.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EISDIR when the 'to' argument is a directory, but 'from' is not a directory"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..32"
+
+n0=`namegen`
+n1=`namegen`
+
+expect 0 mkdir ${n0} 0755
+
+for type in regular fifo block char socket symlink; do
+ create_file ${type} ${n1}
+ expect EISDIR rename ${n1} ${n0}
+ expect dir lstat ${n0} type
+ expect ${type} lstat ${n1} type
+ expect 0 unlink ${n1}
+done
+
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/15.t b/contrib/pjdfstest/tests/rename/15.t
new file mode 100644
index 0000000..cd2e44b
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/15.t
@@ -0,0 +1,34 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/15.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EXDEV if the link named by 'to' and the file named by 'from' are on different file systems"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+[ "${os}" = "FreeBSD" ] || quick_exit
+
+echo "1..23"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 mkdir ${n0} 0755
+n=`mdconfig -a -n -t malloc -s 1m` || exit
+newfs /dev/md${n} >/dev/null || exit
+mount /dev/md${n} ${n0} || exit
+
+for type in regular dir fifo block char socket symlink; do
+ create_file ${type} ${n0}/${n1}
+ expect EXDEV rename ${n0}/${n1} ${n2}
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n0}/${n1}
+ else
+ expect 0 unlink ${n0}/${n1}
+ fi
+done
+
+umount /dev/md${n}
+mdconfig -d -u ${n} || exit
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/16.t b/contrib/pjdfstest/tests/rename/16.t
new file mode 100644
index 0000000..102657d
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/16.t
@@ -0,0 +1,32 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/16.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EROFS if the requested link requires writing in a directory on a read-only file system"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+[ "${os}" = "FreeBSD" ] || quick_exit
+
+echo "1..8"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 mkdir ${n0} 0755
+n=`mdconfig -a -n -t malloc -s 1m` || exit
+newfs /dev/md${n} >/dev/null || exit
+mount /dev/md${n} ${n0} || exit
+expect 0 create ${n0}/${n1} 0644
+mount -ur /dev/md${n}
+
+expect EROFS rename ${n0}/${n1} ${n0}/${n2}
+expect EROFS rename ${n0}/${n1} ${n2}
+expect 0 create ${n2} 0644
+expect EROFS rename ${n2} ${n0}/${n2}
+expect 0 unlink ${n2}
+
+umount /dev/md${n}
+mdconfig -d -u ${n} || exit
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/17.t b/contrib/pjdfstest/tests/rename/17.t
new file mode 100644
index 0000000..6deb7b7
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/17.t
@@ -0,0 +1,20 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/17.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EFAULT if one of the pathnames specified is outside the process's allocated address space"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..8"
+
+n0=`namegen`
+
+expect 0 create ${n0} 0644
+expect EFAULT rename ${n0} NULL
+expect EFAULT rename ${n0} DEADCODE
+expect 0 unlink ${n0}
+expect EFAULT rename NULL ${n0}
+expect EFAULT rename DEADCODE ${n0}
+expect EFAULT rename NULL DEADCODE
+expect EFAULT rename DEADCODE NULL
diff --git a/contrib/pjdfstest/tests/rename/18.t b/contrib/pjdfstest/tests/rename/18.t
new file mode 100644
index 0000000..8a9594e
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/18.t
@@ -0,0 +1,22 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/18.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EINVAL when the 'from' argument is a parent directory of 'to'"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..6"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 mkdir ${n0} 0755
+expect 0 mkdir ${n0}/${n1} 0755
+
+expect EINVAL rename ${n0} ${n0}/${n1}
+expect EINVAL rename ${n0} ${n0}/${n1}/${n2}
+
+expect 0 rmdir ${n0}/${n1}
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/19.t b/contrib/pjdfstest/tests/rename/19.t
new file mode 100644
index 0000000..2cd9561
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/19.t
@@ -0,0 +1,22 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/19.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EINVAL/EBUSY when an attempt is made to rename '.' or '..'"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..6"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 mkdir ${n0} 0755
+expect 0 mkdir ${n0}/${n1} 0755
+
+expect "EINVAL|EBUSY" rename ${n0}/${n1}/. ${n2}
+expect "EINVAL|EBUSY" rename ${n0}/${n1}/.. ${n2}
+
+expect 0 rmdir ${n0}/${n1}
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/20.t b/contrib/pjdfstest/tests/rename/20.t
new file mode 100644
index 0000000..8ec37cf
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/20.t
@@ -0,0 +1,29 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/20.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="rename returns EEXIST or ENOTEMPTY if the 'to' argument is a directory and is not empty"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..25"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+
+expect 0 mkdir ${n0} 0755
+expect 0 mkdir ${n1} 0755
+
+for type in regular dir fifo block char socket symlink; do
+ create_file ${type} ${n1}/${n2}
+ expect "EEXIST|ENOTEMPTY" rename ${n0} ${n1}
+ if [ "${type}" = "dir" ]; then
+ expect 0 rmdir ${n1}/${n2}
+ else
+ expect 0 unlink ${n1}/${n2}
+ fi
+done
+
+expect 0 rmdir ${n1}
+expect 0 rmdir ${n0}
diff --git a/contrib/pjdfstest/tests/rename/21.t b/contrib/pjdfstest/tests/rename/21.t
new file mode 100644
index 0000000..bba1467
--- /dev/null
+++ b/contrib/pjdfstest/tests/rename/21.t
@@ -0,0 +1,47 @@
+#!/bin/sh
+# $FreeBSD: head/tools/regression/pjdfstest/tests/rename/21.t 211352 2010-08-15 21:24:17Z pjd $
+
+desc="write access to subdirectory is required to move it to another directory"
+
+dir=`dirname $0`
+. ${dir}/../misc.sh
+
+echo "1..16"
+
+n0=`namegen`
+n1=`namegen`
+n2=`namegen`
+n3=`namegen`
+
+expect 0 mkdir ${n2} 0777
+expect 0 mkdir ${n3} 0777
+cdir=`pwd`
+
+# Check that write permission on containing directory (${n2}) is enough
+# to rename subdirectory (${n0}). If we rename directory write access
+# to this directory may also be required.
+expect 0 mkdir ${n2}/${n0} 0700
+expect "0|EACCES" -u 65534 -g 65534 rename ${n2}/${n0} ${n2}/${n1}
+expect "0|EACCES" -u 65534 -g 65534 rename ${n2}/${n1} ${n2}/${n0}
+
+# Check that write permission on containing directory (${n2}) is not enough
+# to move subdirectory (${n0}) from that directory.
+# Actually POSIX says that write access to ${n2} and ${n3} may be enough
+# to move ${n0} from ${n2} to ${n3}.
+expect "0|EACCES" -u 65534 -g 65534 rename ${n2}/${n0} ${n3}/${n1}
+
+expect "0|ENOENT" rmdir ${n2}/${n0}
+expect ENOENT rmdir ${n2}/${n0}
+expect "0|ENOENT" rmdir ${n3}/${n1}
+expect ENOENT rmdir ${n3}/${n1}
+
+# Check that write permission on containing directory (${n2}) is enough
+# to move file (${n0}) from that directory.
+expect 0 create ${n2}/${n0} 0644
+expect 0 -u 65534 -g 65534 rename ${n2}/${n0} ${n3}/${n1}
+
+expect 0 unlink ${n3}/${n1}
+expect ENOENT unlink ${n2}/${n0}
+
+expect 0 rmdir ${n3}
+expect 0 rmdir ${n2}
OpenPOWER on IntegriCloud