summaryrefslogtreecommitdiff
path: root/find/testsuite/find.gnu
diff options
context:
space:
mode:
Diffstat (limited to 'find/testsuite/find.gnu')
-rw-r--r--find/testsuite/find.gnu/access.exp14
-rw-r--r--find/testsuite/find.gnu/access.xo11
-rw-r--r--find/testsuite/find.gnu/comma.exp1
-rw-r--r--find/testsuite/find.gnu/comma.xo1
-rw-r--r--find/testsuite/find.gnu/delete.exp7
-rw-r--r--find/testsuite/find.gnu/delete.xo4
-rw-r--r--find/testsuite/find.gnu/deletedir.exp9
-rw-r--r--find/testsuite/find.gnu/deletedir.xo1
-rw-r--r--find/testsuite/find.gnu/deletefile.exp9
-rw-r--r--find/testsuite/find.gnu/deletefile.xo1
-rw-r--r--find/testsuite/find.gnu/depth-d.exp8
-rw-r--r--find/testsuite/find.gnu/depth-d.xo1
-rw-r--r--find/testsuite/find.gnu/depth.exp8
-rw-r--r--find/testsuite/find.gnu/depth.xo1
-rw-r--r--find/testsuite/find.gnu/empty.exp7
-rw-r--r--find/testsuite/find.gnu/empty.xo1
-rw-r--r--find/testsuite/find.gnu/exec-many-rtn-failure.exp4
-rw-r--r--find/testsuite/find.gnu/exec-many-rtn-failure.xo1
-rw-r--r--find/testsuite/find.gnu/exec-many-rtn-success.exp4
-rw-r--r--find/testsuite/find.gnu/exec-many-rtn-success.xo1
-rw-r--r--find/testsuite/find.gnu/exec-one-rtn-fail.exp4
-rw-r--r--find/testsuite/find.gnu/exec-one-rtn-fail.xo1
-rw-r--r--find/testsuite/find.gnu/exec-one-rtn-success.exp3
-rw-r--r--find/testsuite/find.gnu/exec-one-rtn-success.xo1
-rw-r--r--find/testsuite/find.gnu/execdir-hier.exp8
-rw-r--r--find/testsuite/find.gnu/execdir-hier.xo2
-rw-r--r--find/testsuite/find.gnu/execdir-in-unreadable.exp11
-rw-r--r--find/testsuite/find.gnu/execdir-multiple.exp58
-rw-r--r--find/testsuite/find.gnu/execdir-multiple.xo24
-rw-r--r--find/testsuite/find.gnu/execdir-one.exp7
-rw-r--r--find/testsuite/find.gnu/execdir-one.xo1
-rw-r--r--find/testsuite/find.gnu/execdir-pwd.exp20
-rw-r--r--find/testsuite/find.gnu/execdir-pwd1.exp20
-rw-r--r--find/testsuite/find.gnu/execdir-root-only.exp21
-rw-r--r--find/testsuite/find.gnu/execdir-root-only.xo1
-rw-r--r--find/testsuite/find.gnu/false.exp5
-rw-r--r--find/testsuite/find.gnu/false.xo3
-rw-r--r--find/testsuite/find.gnu/follow-arg-parent-symlink.exp6
-rw-r--r--find/testsuite/find.gnu/follow-arg-parent-symlink.xo1
-rw-r--r--find/testsuite/find.gnu/follow-basic.exp10
-rw-r--r--find/testsuite/find.gnu/follow-basic.xo5
-rw-r--r--find/testsuite/find.gnu/fprint-unwritable.exp9
-rw-r--r--find/testsuite/find.gnu/fprint0_stdout.exp5
-rw-r--r--find/testsuite/find.gnu/fprint0_stdout.xobin0 -> 5 bytes
-rw-r--r--find/testsuite/find.gnu/fprintf-samefile.exp26
-rw-r--r--find/testsuite/find.gnu/gnu-or.exp5
-rw-r--r--find/testsuite/find.gnu/gnu-or.xo6
-rw-r--r--find/testsuite/find.gnu/gnuand.exp5
-rw-r--r--find/testsuite/find.gnu/gnuand.xo1
-rw-r--r--find/testsuite/find.gnu/gnunot.exp5
-rw-r--r--find/testsuite/find.gnu/gnunot.xo2
-rw-r--r--find/testsuite/find.gnu/ilname.exp7
-rw-r--r--find/testsuite/find.gnu/ilname.xo1
-rw-r--r--find/testsuite/find.gnu/iname.exp5
-rw-r--r--find/testsuite/find.gnu/iname.xo1
-rw-r--r--find/testsuite/find.gnu/inum.exp7
-rw-r--r--find/testsuite/find.gnu/inum.xo1
-rw-r--r--find/testsuite/find.gnu/ipath.exp5
-rw-r--r--find/testsuite/find.gnu/ipath.xo1
-rw-r--r--find/testsuite/find.gnu/iregex1.exp5
-rw-r--r--find/testsuite/find.gnu/iregex1.xo4
-rw-r--r--find/testsuite/find.gnu/iwholename.exp5
-rw-r--r--find/testsuite/find.gnu/iwholename.xo1
-rw-r--r--find/testsuite/find.gnu/lname.exp7
-rw-r--r--find/testsuite/find.gnu/lname.xo1
-rw-r--r--find/testsuite/find.gnu/mindepth-arg.exp9
-rw-r--r--find/testsuite/find.gnu/mindepth-arg.xo1
-rw-r--r--find/testsuite/find.gnu/mindepth-badarg.exp12
-rw-r--r--find/testsuite/find.gnu/name-opt.exp8
-rw-r--r--find/testsuite/find.gnu/name-opt.xo0
-rw-r--r--find/testsuite/find.gnu/name-period.exp10
-rw-r--r--find/testsuite/find.gnu/name-period.xo2
-rw-r--r--find/testsuite/find.gnu/name-slash.exp2
-rw-r--r--find/testsuite/find.gnu/name-slash.xo2
-rw-r--r--find/testsuite/find.gnu/no-fdleak-test.exp13
-rw-r--r--find/testsuite/find.gnu/no-fdleak-test.xo1
-rw-r--r--find/testsuite/find.gnu/path.exp5
-rw-r--r--find/testsuite/find.gnu/path.xo1
-rw-r--r--find/testsuite/find.gnu/perm-slash.exp19
-rw-r--r--find/testsuite/find.gnu/perm-slash.xo4
-rw-r--r--find/testsuite/find.gnu/perm.exp7
-rw-r--r--find/testsuite/find.gnu/perm.xo1
-rw-r--r--find/testsuite/find.gnu/perm000.exp7
-rw-r--r--find/testsuite/find.gnu/perm000.xo3
-rw-r--r--find/testsuite/find.gnu/posix-dflt.exp10
-rw-r--r--find/testsuite/find.gnu/posix-dflt.xo5
-rw-r--r--find/testsuite/find.gnu/posix-h.exp13
-rw-r--r--find/testsuite/find.gnu/posix-h.xo5
-rw-r--r--find/testsuite/find.gnu/posix-l.exp10
-rw-r--r--find/testsuite/find.gnu/posix-l.xo5
-rw-r--r--find/testsuite/find.gnu/posix-perminvalid.exp16
-rw-r--r--find/testsuite/find.gnu/print0.exp5
-rw-r--r--find/testsuite/find.gnu/print0.xobin0 -> 4 bytes
-rw-r--r--find/testsuite/find.gnu/print_stdout.exp5
-rw-r--r--find/testsuite/find.gnu/print_stdout.xo1
-rw-r--r--find/testsuite/find.gnu/printf-h.exp5
-rw-r--r--find/testsuite/find.gnu/printf-h.xo1
-rw-r--r--find/testsuite/find.gnu/printf-nonlocal-symlink.exp7
-rw-r--r--find/testsuite/find.gnu/printf-nonlocal-symlink.xo1
-rw-r--r--find/testsuite/find.gnu/printf-reserved.exp3
-rw-r--r--find/testsuite/find.gnu/printf-slash.exp1
-rw-r--r--find/testsuite/find.gnu/printf-slash.xo2
-rw-r--r--find/testsuite/find.gnu/printf-symlink.exp6
-rw-r--r--find/testsuite/find.gnu/printf-symlink.xo2
-rw-r--r--find/testsuite/find.gnu/printf.exp6
-rw-r--r--find/testsuite/find.gnu/printf.xo19
-rw-r--r--find/testsuite/find.gnu/printfHdfl.exp2
-rw-r--r--find/testsuite/find.gnu/printfHdfl.xo1
-rw-r--r--find/testsuite/find.gnu/prune-default-print.exp5
-rw-r--r--find/testsuite/find.gnu/prune-default-print.xo1
-rw-r--r--find/testsuite/find.gnu/quit.exp5
-rw-r--r--find/testsuite/find.gnu/quit.xo2
-rw-r--r--find/testsuite/find.gnu/regex1.exp5
-rw-r--r--find/testsuite/find.gnu/regex1.xo4
-rw-r--r--find/testsuite/find.gnu/regex2.exp5
-rw-r--r--find/testsuite/find.gnu/regex2.xo4
-rw-r--r--find/testsuite/find.gnu/samefile-copy.exp8
-rw-r--r--find/testsuite/find.gnu/samefile-copy.xo0
-rw-r--r--find/testsuite/find.gnu/samefile-link.exp9
-rw-r--r--find/testsuite/find.gnu/samefile-link.xo1
-rw-r--r--find/testsuite/find.gnu/samefile-missing.exp2
-rw-r--r--find/testsuite/find.gnu/samefile-p-brokenlink.exp11
-rw-r--r--find/testsuite/find.gnu/samefile-p-brokenlink.xo2
-rw-r--r--find/testsuite/find.gnu/samefile-same.exp6
-rw-r--r--find/testsuite/find.gnu/samefile-same.xo2
-rw-r--r--find/testsuite/find.gnu/samefile-symlink.exp10
-rw-r--r--find/testsuite/find.gnu/samefile-symlink.xo2
-rw-r--r--find/testsuite/find.gnu/sv-bug-12230.exp14
-rw-r--r--find/testsuite/find.gnu/sv-bug-17477.exp2
-rw-r--r--find/testsuite/find.gnu/sv-bug-17490.exp4
-rw-r--r--find/testsuite/find.gnu/sv-bug-17782.exp15
-rw-r--r--find/testsuite/find.gnu/sv-bug-17782.xo1
-rw-r--r--find/testsuite/find.gnu/sv-bug-18222.exp8
-rw-r--r--find/testsuite/find.gnu/sv-bug-18222.xo2
-rw-r--r--find/testsuite/find.gnu/sv-bug-24169.exp47
-rw-r--r--find/testsuite/find.gnu/sv-bug-27563-execdir.exp6
-rw-r--r--find/testsuite/find.gnu/sv-bug-27563-execdir.xo1
-rw-r--r--find/testsuite/find.gnu/true.exp5
-rw-r--r--find/testsuite/find.gnu/true.xo6
-rw-r--r--find/testsuite/find.gnu/used-invarg.exp2
-rw-r--r--find/testsuite/find.gnu/used-missing.exp2
-rw-r--r--find/testsuite/find.gnu/user-invalid.exp4
-rw-r--r--find/testsuite/find.gnu/wholename.exp5
-rw-r--r--find/testsuite/find.gnu/wholename.xo1
-rw-r--r--find/testsuite/find.gnu/xtype-symlink.exp6
-rw-r--r--find/testsuite/find.gnu/xtype-symlink.xo1
-rw-r--r--find/testsuite/find.gnu/xtype.exp8
-rw-r--r--find/testsuite/find.gnu/xtype.xo5
148 files changed, 888 insertions, 0 deletions
diff --git a/find/testsuite/find.gnu/access.exp b/find/testsuite/find.gnu/access.exp
new file mode 100644
index 0000000..c6308b9
--- /dev/null
+++ b/find/testsuite/find.gnu/access.exp
@@ -0,0 +1,14 @@
+# tests for -readable, -writable, -executable
+exec rm -rf tmp
+exec mkdir tmp
+if { ! [ fs_superuser ] } {
+ touch tmp/x tmp/w tmp/r tmp/rw tmp/rwx tmp/0
+ exec chmod 400 tmp/r
+ exec chmod 200 tmp/w
+ exec chmod 100 tmp/x
+ exec chmod 000 tmp/0
+ exec chmod 600 tmp/rw
+ exec chmod 700 tmp/rwx
+ find_start p {tmp -readable -printf "r %p\n" , -writable -printf "w %p\n" , -executable -printf "x %p\n"}
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/access.xo b/find/testsuite/find.gnu/access.xo
new file mode 100644
index 0000000..464957d
--- /dev/null
+++ b/find/testsuite/find.gnu/access.xo
@@ -0,0 +1,11 @@
+r tmp
+r tmp/r
+r tmp/rw
+r tmp/rwx
+w tmp
+w tmp/rw
+w tmp/rwx
+w tmp/w
+x tmp
+x tmp/rwx
+x tmp/x
diff --git a/find/testsuite/find.gnu/comma.exp b/find/testsuite/find.gnu/comma.exp
new file mode 100644
index 0000000..07a768b
--- /dev/null
+++ b/find/testsuite/find.gnu/comma.exp
@@ -0,0 +1 @@
+find_start p {. -maxdepth 2 -false , -name .}
diff --git a/find/testsuite/find.gnu/comma.xo b/find/testsuite/find.gnu/comma.xo
new file mode 100644
index 0000000..9c558e3
--- /dev/null
+++ b/find/testsuite/find.gnu/comma.xo
@@ -0,0 +1 @@
+.
diff --git a/find/testsuite/find.gnu/delete.exp b/find/testsuite/find.gnu/delete.exp
new file mode 100644
index 0000000..f748321
--- /dev/null
+++ b/find/testsuite/find.gnu/delete.exp
@@ -0,0 +1,7 @@
+global FTSFIND
+global FINDFLAGS
+exec rm -rf tmp
+exec mkdir tmp tmp/top tmp/top/one tmp/top/one/foo tmp/top/two
+eval exec $FTSFIND tmp $FINDFLAGS -path tmp/top/two -delete
+find_start p {tmp -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/delete.xo b/find/testsuite/find.gnu/delete.xo
new file mode 100644
index 0000000..c84cffb
--- /dev/null
+++ b/find/testsuite/find.gnu/delete.xo
@@ -0,0 +1,4 @@
+tmp
+tmp/top
+tmp/top/one
+tmp/top/one/foo
diff --git a/find/testsuite/find.gnu/deletedir.exp b/find/testsuite/find.gnu/deletedir.exp
new file mode 100644
index 0000000..8809747
--- /dev/null
+++ b/find/testsuite/find.gnu/deletedir.exp
@@ -0,0 +1,9 @@
+global FTSFIND
+global FINDFLAGS
+exec rm -rf tmp
+exec mkdir tmp tmp/top
+proc createdir {} {
+ exec mkdir tmp/top/dir
+}
+find_start p {tmp -path tmp/top/dir -delete -print} "" "" createdir
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/deletedir.xo b/find/testsuite/find.gnu/deletedir.xo
new file mode 100644
index 0000000..9f0155f
--- /dev/null
+++ b/find/testsuite/find.gnu/deletedir.xo
@@ -0,0 +1 @@
+tmp/top/dir
diff --git a/find/testsuite/find.gnu/deletefile.exp b/find/testsuite/find.gnu/deletefile.exp
new file mode 100644
index 0000000..552cf67
--- /dev/null
+++ b/find/testsuite/find.gnu/deletefile.exp
@@ -0,0 +1,9 @@
+global FTSFIND
+global FINDFLAGS
+exec rm -rf tmp
+exec mkdir tmp tmp/top
+proc touchfile {} {
+ exec touch tmp/top/file
+}
+find_start p {tmp -path tmp/top/file -delete -print} "" "" touchfile
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/deletefile.xo b/find/testsuite/find.gnu/deletefile.xo
new file mode 100644
index 0000000..425c112
--- /dev/null
+++ b/find/testsuite/find.gnu/deletefile.xo
@@ -0,0 +1 @@
+tmp/top/file
diff --git a/find/testsuite/find.gnu/depth-d.exp b/find/testsuite/find.gnu/depth-d.exp
new file mode 100644
index 0000000..8e264a8
--- /dev/null
+++ b/find/testsuite/find.gnu/depth-d.exp
@@ -0,0 +1,8 @@
+exec rm -rf tmp
+exec mkdir tmp
+exec mkdir tmp/top
+exec mkdir tmp/top/one
+exec touch tmp/top/one/foo
+exec mkdir tmp/top/two
+find_start p {tmp/top -d -mindepth 1 -type d -empty -print}
+# exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/depth-d.xo b/find/testsuite/find.gnu/depth-d.xo
new file mode 100644
index 0000000..e5f6986
--- /dev/null
+++ b/find/testsuite/find.gnu/depth-d.xo
@@ -0,0 +1 @@
+tmp/top/two
diff --git a/find/testsuite/find.gnu/depth.exp b/find/testsuite/find.gnu/depth.exp
new file mode 100644
index 0000000..d4913b2
--- /dev/null
+++ b/find/testsuite/find.gnu/depth.exp
@@ -0,0 +1,8 @@
+exec rm -rf tmp
+exec mkdir tmp
+exec mkdir tmp/top
+exec mkdir tmp/top/one
+exec touch tmp/top/one/foo
+exec mkdir tmp/top/two
+find_start p {tmp/top -depth -mindepth 1 -type d -empty -print}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/depth.xo b/find/testsuite/find.gnu/depth.xo
new file mode 100644
index 0000000..e5f6986
--- /dev/null
+++ b/find/testsuite/find.gnu/depth.xo
@@ -0,0 +1 @@
+tmp/top/two
diff --git a/find/testsuite/find.gnu/empty.exp b/find/testsuite/find.gnu/empty.exp
new file mode 100644
index 0000000..78f94d7
--- /dev/null
+++ b/find/testsuite/find.gnu/empty.exp
@@ -0,0 +1,7 @@
+# tests for -empty
+exec rm -rf tmp
+exec mkdir tmp
+exec true > tmp/empty
+exec echo > tmp/notempty
+find_start p { tmp -type f -empty }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/empty.xo b/find/testsuite/find.gnu/empty.xo
new file mode 100644
index 0000000..f352040
--- /dev/null
+++ b/find/testsuite/find.gnu/empty.xo
@@ -0,0 +1 @@
+tmp/empty \ No newline at end of file
diff --git a/find/testsuite/find.gnu/exec-many-rtn-failure.exp b/find/testsuite/find.gnu/exec-many-rtn-failure.exp
new file mode 100644
index 0000000..463f8e2
--- /dev/null
+++ b/find/testsuite/find.gnu/exec-many-rtn-failure.exp
@@ -0,0 +1,4 @@
+# POSIX: If the invoked command fails, -exec still returns true if it
+# was punctuated with +, because that always returns true. However,
+# the program as a whole should return a NON-zero exit status.
+find_start f { /tmp -exec false \{\} + -printf "yep\n" -quit }
diff --git a/find/testsuite/find.gnu/exec-many-rtn-failure.xo b/find/testsuite/find.gnu/exec-many-rtn-failure.xo
new file mode 100644
index 0000000..3b6f27e
--- /dev/null
+++ b/find/testsuite/find.gnu/exec-many-rtn-failure.xo
@@ -0,0 +1 @@
+yep
diff --git a/find/testsuite/find.gnu/exec-many-rtn-success.exp b/find/testsuite/find.gnu/exec-many-rtn-success.exp
new file mode 100644
index 0000000..142929f
--- /dev/null
+++ b/find/testsuite/find.gnu/exec-many-rtn-success.exp
@@ -0,0 +1,4 @@
+# POSIX: If the invoked command succeeds, -exec should return true if
+# it was punctuated with +, because that always returns true. However,
+# the program as a whole should also return a zero exit status.
+find_start p { /tmp -exec true \{\} + -printf "yep\n" -quit }
diff --git a/find/testsuite/find.gnu/exec-many-rtn-success.xo b/find/testsuite/find.gnu/exec-many-rtn-success.xo
new file mode 100644
index 0000000..3b6f27e
--- /dev/null
+++ b/find/testsuite/find.gnu/exec-many-rtn-success.xo
@@ -0,0 +1 @@
+yep
diff --git a/find/testsuite/find.gnu/exec-one-rtn-fail.exp b/find/testsuite/find.gnu/exec-one-rtn-fail.exp
new file mode 100644
index 0000000..b761d1d
--- /dev/null
+++ b/find/testsuite/find.gnu/exec-one-rtn-fail.exp
@@ -0,0 +1,4 @@
+# If -exec \; fails, it should return false. The return
+# value of find should stil; be 0, unless another error has
+# happened.
+find_start p { /tmp -exec false \; -o \( -printf "yep\n" -quit \) }
diff --git a/find/testsuite/find.gnu/exec-one-rtn-fail.xo b/find/testsuite/find.gnu/exec-one-rtn-fail.xo
new file mode 100644
index 0000000..3b6f27e
--- /dev/null
+++ b/find/testsuite/find.gnu/exec-one-rtn-fail.xo
@@ -0,0 +1 @@
+yep
diff --git a/find/testsuite/find.gnu/exec-one-rtn-success.exp b/find/testsuite/find.gnu/exec-one-rtn-success.exp
new file mode 100644
index 0000000..d3c8b99
--- /dev/null
+++ b/find/testsuite/find.gnu/exec-one-rtn-success.exp
@@ -0,0 +1,3 @@
+# POSIX: If the invoked command succeeds, -exec should return true if
+# it was punctuated with ;
+find_start p { /tmp -exec true \; -printf "yep\n" -quit }
diff --git a/find/testsuite/find.gnu/exec-one-rtn-success.xo b/find/testsuite/find.gnu/exec-one-rtn-success.xo
new file mode 100644
index 0000000..3b6f27e
--- /dev/null
+++ b/find/testsuite/find.gnu/exec-one-rtn-success.xo
@@ -0,0 +1 @@
+yep
diff --git a/find/testsuite/find.gnu/execdir-hier.exp b/find/testsuite/find.gnu/execdir-hier.exp
new file mode 100644
index 0000000..59d877b
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-hier.exp
@@ -0,0 +1,8 @@
+# tests for -execdir ... \+
+# Specifically, ensure that output for separate directoires is not mixed.
+if { [ safe_path ] } {
+ exec rm -rf tmp
+ exec mkdir tmp tmp/two
+ find_start p { tmp -execdir echo \{\} \+ }
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/execdir-hier.xo b/find/testsuite/find.gnu/execdir-hier.xo
new file mode 100644
index 0000000..d9fc49d
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-hier.xo
@@ -0,0 +1,2 @@
+./tmp
+./two
diff --git a/find/testsuite/find.gnu/execdir-in-unreadable.exp b/find/testsuite/find.gnu/execdir-in-unreadable.exp
new file mode 100644
index 0000000..fe78d5a
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-in-unreadable.exp
@@ -0,0 +1,11 @@
+# tests for -execdir ... \+ in a directory which is not readable
+if { [ safe_path ] } {
+ exec rm -rf tmp
+ exec mkdir tmp
+ exec chmod 755 tmp
+ exec mkdir tmp/sub
+ exec chmod 300 tmp/sub
+ find_start p { tmp -maxdepth 1 -execdir true \{\} \+ }
+ exec chmod 700 tmp/sub
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/execdir-multiple.exp b/find/testsuite/find.gnu/execdir-multiple.exp
new file mode 100644
index 0000000..f292fff
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-multiple.exp
@@ -0,0 +1,58 @@
+# tests for -execdir ... \+
+
+# Create 4 empty files in each of 6 directories.
+# Also create a shell script in each of those 6 directories.
+# Run a find command which runs the shell script for each empty file.
+# Check to make sure that each file is mentioned exactly once, and that
+# the command was run with the correct working directory.
+#
+# The output is a sequence of lines of this form:
+#
+# cwd ./basename
+#
+# cmd is the basename of the current directory at the time the command
+# is run by -execidr. ./basename is the name of the file that was matched
+# (that is, it's the value passed in {}).
+
+# $body is the body of a shell script we use for testing.
+# It prints a series of lines of the form described above.
+# One line is printed for each command-line argument.
+set body {#! /bin/sh
+set -e
+here=`pwd`
+d=`basename $here`
+
+for arg;
+do
+ echo "$d" "$arg"
+done | LC_ALL=C sort
+}
+
+
+if { [ safe_path ] } {
+ global SKIP_OLD
+
+ exec rm -rf tmp
+ mkdir tmp
+
+ # Put a copy of our shell script in each
+ # directory, plus some files.
+ foreach dir { a b c d e f } {
+ mkdir "tmp/$dir"
+ set script_name "tmp/$dir/runme"
+ set f [open "$script_name" "w" 0700 ]
+ puts $f "$body"
+ close $f
+ foreach item { one two three four } {
+ touch "tmp/$dir/$item"
+ }
+ }
+
+ set SKIP_OLD 1
+ find_start p {tmp -type f -empty -execdir sh ./runme \{\} + } ""
+ # We also repeat this test (with the same expected output) for the
+ # non-multiple case (this detects Savannah bug #29949).
+ find_start p {tmp -type f -empty -execdir sh ./runme \{\} \; } ""
+ set SKIP_OLD 0
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/execdir-multiple.xo b/find/testsuite/find.gnu/execdir-multiple.xo
new file mode 100644
index 0000000..a4f93d9
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-multiple.xo
@@ -0,0 +1,24 @@
+a ./one
+a ./two
+a ./three
+a ./four
+b ./one
+b ./two
+b ./three
+b ./four
+c ./one
+c ./two
+c ./three
+c ./four
+d ./one
+d ./two
+d ./three
+d ./four
+e ./one
+e ./two
+e ./three
+e ./four
+f ./one
+f ./two
+f ./three
+f ./four
diff --git a/find/testsuite/find.gnu/execdir-one.exp b/find/testsuite/find.gnu/execdir-one.exp
new file mode 100644
index 0000000..53f2e00
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-one.exp
@@ -0,0 +1,7 @@
+# tests for -name
+if { [ safe_path ] } {
+ exec rm -rf tmp
+ exec mkdir tmp tmp/fred tmp/jim
+ find_start p {tmp -name fred -execdir echo \{\} \; }
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/execdir-one.xo b/find/testsuite/find.gnu/execdir-one.xo
new file mode 100644
index 0000000..8584084
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-one.xo
@@ -0,0 +1 @@
+./fred
diff --git a/find/testsuite/find.gnu/execdir-pwd.exp b/find/testsuite/find.gnu/execdir-pwd.exp
new file mode 100644
index 0000000..740785f
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-pwd.exp
@@ -0,0 +1,20 @@
+# tests for -execdir pwd \+
+if { [ safe_path ] } {
+ global SKIP_OLD
+
+ exec rm -rf tmp
+ exec mkdir tmp
+
+ # Create an empty shell script.
+ exec touch tmp/foo
+ exec chmod +x tmp/foo
+
+ # The -execdir should find the "foo" in the current directory.
+ # If not, the find command is probably executing the command
+ # built up by -execdir in the wrong directory.
+
+ set SKIP_OLD 1
+ find_start p {tmp -name foo -execdir sh ./foo \{\} + } ""
+ set SKIP_OLD 0
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/execdir-pwd1.exp b/find/testsuite/find.gnu/execdir-pwd1.exp
new file mode 100644
index 0000000..e9863ac
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-pwd1.exp
@@ -0,0 +1,20 @@
+# tests for working directory of -execdir {} \;
+if { [ safe_path ] } {
+ global SKIP_OLD
+
+ exec rm -rf tmp
+ exec mkdir tmp
+
+ # Create an empty shell script.
+ exec touch tmp/foo
+ exec chmod +x tmp/foo
+
+ # The -execdir should find the "foo" in the current directory.
+ # If not, the find command is probably executing the command
+ # built up by -execdir in the wrong directory.
+
+ set SKIP_OLD 1
+ find_start p {tmp -name foo -execdir sh ./foo \{\} \; } ""
+ set SKIP_OLD 0
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/execdir-root-only.exp b/find/testsuite/find.gnu/execdir-root-only.exp
new file mode 100644
index 0000000..c57fd31
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-root-only.exp
@@ -0,0 +1,21 @@
+# Bug report by Bas van Gompel:
+#
+# This appears to work well. However when the rootdir is passed,
+# something looks fishy:
+#
+# find / -mindepth 0 -maxdepth 0 -execdir echo {} \;
+# .//
+#
+# I also spotted, when `+' is used:
+#
+# find / -mindepth 0 -maxdepth 0 -execdir echo == {} +
+# ==
+# == .//
+#
+# (Notice the first line of output, which should not be there.)
+
+
+# This test checks the second of these two cases.
+if { [ safe_path ] } {
+ find_start p { / -mindepth 0 -maxdepth 0 -execdir echo == "{}" + }
+}
diff --git a/find/testsuite/find.gnu/execdir-root-only.xo b/find/testsuite/find.gnu/execdir-root-only.xo
new file mode 100644
index 0000000..c975392
--- /dev/null
+++ b/find/testsuite/find.gnu/execdir-root-only.xo
@@ -0,0 +1 @@
+== /
diff --git a/find/testsuite/find.gnu/false.exp b/find/testsuite/find.gnu/false.exp
new file mode 100644
index 0000000..31f98a5
--- /dev/null
+++ b/find/testsuite/find.gnu/false.exp
@@ -0,0 +1,5 @@
+# test for -false.
+exec rm -rf tmp
+exec mkdir tmp tmp/fred tmp/fred/jim
+find_start p { tmp -depth -print -false -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/false.xo b/find/testsuite/find.gnu/false.xo
new file mode 100644
index 0000000..9baad64
--- /dev/null
+++ b/find/testsuite/find.gnu/false.xo
@@ -0,0 +1,3 @@
+tmp/fred/jim
+tmp/fred
+tmp
diff --git a/find/testsuite/find.gnu/follow-arg-parent-symlink.exp b/find/testsuite/find.gnu/follow-arg-parent-symlink.exp
new file mode 100644
index 0000000..0ab9e47
--- /dev/null
+++ b/find/testsuite/find.gnu/follow-arg-parent-symlink.exp
@@ -0,0 +1,6 @@
+exec rm -rf tmp
+exec mkdir tmp tmp/dir1 tmp/dir1/dir2
+exec touch tmp/dir1/dir2/foo
+exec ln -s dir1 tmp/link1
+find_start p {tmp/link1/dir2 -type f -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/follow-arg-parent-symlink.xo b/find/testsuite/find.gnu/follow-arg-parent-symlink.xo
new file mode 100644
index 0000000..0cf5187
--- /dev/null
+++ b/find/testsuite/find.gnu/follow-arg-parent-symlink.xo
@@ -0,0 +1 @@
+tmp/link1/dir2/foo
diff --git a/find/testsuite/find.gnu/follow-basic.exp b/find/testsuite/find.gnu/follow-basic.exp
new file mode 100644
index 0000000..bc62a2d
--- /dev/null
+++ b/find/testsuite/find.gnu/follow-basic.exp
@@ -0,0 +1,10 @@
+# Verifies that the -follow option is correctly implemented,
+# but does this by using the GNU extension -printf.
+exec rm -rf tmp
+
+exec mkdir tmp
+exec ln -s /etc/passwd tmp/LINK
+exec ln -s /NOSUCHFILE tmp/BROKEN
+
+# Links should all be dereferenced unless they are broken.
+find_start p { tmp/LINK tmp/BROKEN tmp -follow -printf "%y %d %p\n" }
diff --git a/find/testsuite/find.gnu/follow-basic.xo b/find/testsuite/find.gnu/follow-basic.xo
new file mode 100644
index 0000000..f2c7940
--- /dev/null
+++ b/find/testsuite/find.gnu/follow-basic.xo
@@ -0,0 +1,5 @@
+d 0 tmp
+f 0 tmp/LINK
+f 1 tmp/LINK
+l 0 tmp/BROKEN
+l 1 tmp/BROKEN
diff --git a/find/testsuite/find.gnu/fprint-unwritable.exp b/find/testsuite/find.gnu/fprint-unwritable.exp
new file mode 100644
index 0000000..905894d
--- /dev/null
+++ b/find/testsuite/find.gnu/fprint-unwritable.exp
@@ -0,0 +1,9 @@
+# test for -fprint to unwritable dest (we expect this to fail)
+if { ! [ fs_superuser ] } {
+ exec rm -rf tmp
+ file mkdir tmp
+ exec touch tmp/unwritable
+ exec chmod 444 tmp/unwritable
+ find_start f { tmp -fprint tmp/unwritable }
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/fprint0_stdout.exp b/find/testsuite/find.gnu/fprint0_stdout.exp
new file mode 100644
index 0000000..c5a5aa8
--- /dev/null
+++ b/find/testsuite/find.gnu/fprint0_stdout.exp
@@ -0,0 +1,5 @@
+# test for -fprint
+exec rm -rf tmp
+exec touch tmp
+find_start p { tmp -fprint0 /dev/stdout }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/fprint0_stdout.xo b/find/testsuite/find.gnu/fprint0_stdout.xo
new file mode 100644
index 0000000..60688dd
--- /dev/null
+++ b/find/testsuite/find.gnu/fprint0_stdout.xo
Binary files differ
diff --git a/find/testsuite/find.gnu/fprintf-samefile.exp b/find/testsuite/find.gnu/fprintf-samefile.exp
new file mode 100644
index 0000000..63e6fb7
--- /dev/null
+++ b/find/testsuite/find.gnu/fprintf-samefile.exp
@@ -0,0 +1,26 @@
+# This test was added as part of the fix for Savannah bug #24873, but it
+# does not exercise the relevant condition (which is a race). While making
+# the fix I found that there were no tests for -fprintf at all, so I added
+# one.
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/file tmp/top
+exec ln -s file tmp/same
+# This command line should exercise the case where sharefile_fopen
+# Detects that two destination files are actually the same.
+find_start p {tmp/top -fprintf tmp/file "1: %p\n" -fprintf tmp/same "2: %p\n" }
+
+# We get here after the final iteration through the various
+# find binaries and -O option. However -fprintf truncates the
+# output file, so there should be just one set of output in there
+# from
+
+# Check that we got the right output in tmp/file.
+set f [open "tmp/file" "r"]
+set data [read $f]
+close $f
+set expected "1: tmp/top\n2: tmp/top\n"
+if { [string compare $data $expected] } {
+ fail "fprintf-samefile: expected output:\n$expected\nbut got:\n$data"
+}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/gnu-or.exp b/find/testsuite/find.gnu/gnu-or.exp
new file mode 100644
index 0000000..92a2939
--- /dev/null
+++ b/find/testsuite/find.gnu/gnu-or.exp
@@ -0,0 +1,5 @@
+# test for -false.
+exec rm -rf tmp
+exec mkdir tmp tmp/fred tmp/fred/jim
+find_start p { tmp -depth -print -false -or -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/gnu-or.xo b/find/testsuite/find.gnu/gnu-or.xo
new file mode 100644
index 0000000..8484390
--- /dev/null
+++ b/find/testsuite/find.gnu/gnu-or.xo
@@ -0,0 +1,6 @@
+tmp/fred/jim
+tmp/fred/jim
+tmp/fred
+tmp/fred
+tmp
+tmp
diff --git a/find/testsuite/find.gnu/gnuand.exp b/find/testsuite/find.gnu/gnuand.exp
new file mode 100644
index 0000000..2e685ca
--- /dev/null
+++ b/find/testsuite/find.gnu/gnuand.exp
@@ -0,0 +1,5 @@
+# tests for -name
+exec rm -rf tmp
+exec mkdir tmp tmp/fred tmp/jim
+find_start p {tmp -name fred -and -print}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/gnuand.xo b/find/testsuite/find.gnu/gnuand.xo
new file mode 100644
index 0000000..8cc8940
--- /dev/null
+++ b/find/testsuite/find.gnu/gnuand.xo
@@ -0,0 +1 @@
+tmp/fred
diff --git a/find/testsuite/find.gnu/gnunot.exp b/find/testsuite/find.gnu/gnunot.exp
new file mode 100644
index 0000000..4951c1e
--- /dev/null
+++ b/find/testsuite/find.gnu/gnunot.exp
@@ -0,0 +1,5 @@
+# tests for !
+exec rm -rf tmp
+exec mkdir tmp tmp/fred tmp/jim
+find_start p {tmp -not -name fred -print}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/gnunot.xo b/find/testsuite/find.gnu/gnunot.xo
new file mode 100644
index 0000000..776fed4
--- /dev/null
+++ b/find/testsuite/find.gnu/gnunot.xo
@@ -0,0 +1,2 @@
+tmp
+tmp/jim \ No newline at end of file
diff --git a/find/testsuite/find.gnu/ilname.exp b/find/testsuite/find.gnu/ilname.exp
new file mode 100644
index 0000000..2d27617
--- /dev/null
+++ b/find/testsuite/find.gnu/ilname.exp
@@ -0,0 +1,7 @@
+# tests for -ilname
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/one
+exec ln -s one tmp/two
+find_start p {tmp -ilname One -print}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/ilname.xo b/find/testsuite/find.gnu/ilname.xo
new file mode 100644
index 0000000..c7b45df
--- /dev/null
+++ b/find/testsuite/find.gnu/ilname.xo
@@ -0,0 +1 @@
+tmp/two
diff --git a/find/testsuite/find.gnu/iname.exp b/find/testsuite/find.gnu/iname.exp
new file mode 100644
index 0000000..c8c26a4
--- /dev/null
+++ b/find/testsuite/find.gnu/iname.exp
@@ -0,0 +1,5 @@
+# tests for -name
+exec rm -rf tmp
+exec mkdir tmp tmp/fred tmp/jim
+find_start p {tmp -iname frED -print}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/iname.xo b/find/testsuite/find.gnu/iname.xo
new file mode 100644
index 0000000..8cc8940
--- /dev/null
+++ b/find/testsuite/find.gnu/iname.xo
@@ -0,0 +1 @@
+tmp/fred
diff --git a/find/testsuite/find.gnu/inum.exp b/find/testsuite/find.gnu/inum.exp
new file mode 100644
index 0000000..75614f5
--- /dev/null
+++ b/find/testsuite/find.gnu/inum.exp
@@ -0,0 +1,7 @@
+# test for -inum
+exec rm -rf tmp tmp2
+exec touch tmp tmp2
+set list [ split [ exec ls -1i tmp ] ]
+set inode [ lindex $list 0 ]
+find_start p " tmp tmp2 -inum $inode -print "
+exec rm -rf tmp tmp2
diff --git a/find/testsuite/find.gnu/inum.xo b/find/testsuite/find.gnu/inum.xo
new file mode 100644
index 0000000..a9a5aec
--- /dev/null
+++ b/find/testsuite/find.gnu/inum.xo
@@ -0,0 +1 @@
+tmp
diff --git a/find/testsuite/find.gnu/ipath.exp b/find/testsuite/find.gnu/ipath.exp
new file mode 100644
index 0000000..0013e48
--- /dev/null
+++ b/find/testsuite/find.gnu/ipath.exp
@@ -0,0 +1,5 @@
+# test for -path
+exec rm -rf tmp
+exec mkdir tmp tmp/top tmp/top/ONE tmp/top/ONE/two
+find_start p {tmp/top -ipath Tmp/TOP/one -print 2>/dev/null }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/ipath.xo b/find/testsuite/find.gnu/ipath.xo
new file mode 100644
index 0000000..6ac3ca0
--- /dev/null
+++ b/find/testsuite/find.gnu/ipath.xo
@@ -0,0 +1 @@
+tmp/top/ONE
diff --git a/find/testsuite/find.gnu/iregex1.exp b/find/testsuite/find.gnu/iregex1.exp
new file mode 100644
index 0000000..c24cdf0
--- /dev/null
+++ b/find/testsuite/find.gnu/iregex1.exp
@@ -0,0 +1,5 @@
+# test for -iregex
+exec rm -rf tmp
+exec mkdir tmp tmp/d tmp/d/D tmp/d/D/d tmp/d/D/d/e
+find_start p {tmp -iregex {tmp\(/d\)*} -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/iregex1.xo b/find/testsuite/find.gnu/iregex1.xo
new file mode 100644
index 0000000..8901de0
--- /dev/null
+++ b/find/testsuite/find.gnu/iregex1.xo
@@ -0,0 +1,4 @@
+tmp
+tmp/d
+tmp/d/D
+tmp/d/D/d
diff --git a/find/testsuite/find.gnu/iwholename.exp b/find/testsuite/find.gnu/iwholename.exp
new file mode 100644
index 0000000..d58656a
--- /dev/null
+++ b/find/testsuite/find.gnu/iwholename.exp
@@ -0,0 +1,5 @@
+# test for -iwholename
+exec rm -rf tmp
+exec mkdir tmp tmp/top tmp/top/one tmp/top/one/two
+find_start p {tmp/top -iwholename tmP/TOP/One -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/iwholename.xo b/find/testsuite/find.gnu/iwholename.xo
new file mode 100644
index 0000000..66d2877
--- /dev/null
+++ b/find/testsuite/find.gnu/iwholename.xo
@@ -0,0 +1 @@
+tmp/top/one
diff --git a/find/testsuite/find.gnu/lname.exp b/find/testsuite/find.gnu/lname.exp
new file mode 100644
index 0000000..65f8878
--- /dev/null
+++ b/find/testsuite/find.gnu/lname.exp
@@ -0,0 +1,7 @@
+# tests for -lname
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/one
+exec ln -s one tmp/two
+find_start p {tmp -lname one -print}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/lname.xo b/find/testsuite/find.gnu/lname.xo
new file mode 100644
index 0000000..c7b45df
--- /dev/null
+++ b/find/testsuite/find.gnu/lname.xo
@@ -0,0 +1 @@
+tmp/two
diff --git a/find/testsuite/find.gnu/mindepth-arg.exp b/find/testsuite/find.gnu/mindepth-arg.exp
new file mode 100644
index 0000000..ba4d0dc
--- /dev/null
+++ b/find/testsuite/find.gnu/mindepth-arg.exp
@@ -0,0 +1,9 @@
+# Argument validation for -mindepth and -maxdepth
+proc prepare {} {
+ exec rm -rf tmp
+ exec mkdir tmp tmp/top tmp/top/one
+}
+foreach predicate { -mindepth -maxdepth } {
+ find_start p "tmp/top $predicate 0 -print -quit" {} {} prepare
+}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/mindepth-arg.xo b/find/testsuite/find.gnu/mindepth-arg.xo
new file mode 100644
index 0000000..ddcb130
--- /dev/null
+++ b/find/testsuite/find.gnu/mindepth-arg.xo
@@ -0,0 +1 @@
+tmp/top \ No newline at end of file
diff --git a/find/testsuite/find.gnu/mindepth-badarg.exp b/find/testsuite/find.gnu/mindepth-badarg.exp
new file mode 100644
index 0000000..d098af0
--- /dev/null
+++ b/find/testsuite/find.gnu/mindepth-badarg.exp
@@ -0,0 +1,12 @@
+# Argument validation for -mindepth and -maxdepth
+
+exec rm -rf tmp
+exec mkdir tmp tmp/top tmp/top/one
+
+foreach predicate { -mindepth -maxdepth } {
+ # Try a variety of bad arguments.
+ foreach arg { x 0x01 Fnord "" +1 1.2 -3 3e1 } {
+ find_start f "tmp/top $predicate $arg -quit"
+ }
+}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/name-opt.exp b/find/testsuite/find.gnu/name-opt.exp
new file mode 100644
index 0000000..0ec1d8d
--- /dev/null
+++ b/find/testsuite/find.gnu/name-opt.exp
@@ -0,0 +1,8 @@
+# Verifies that -name is not optimized in front of -prune
+exec rm -rf tmp
+exec mkdir tmp
+exec mkdir tmp/top
+exec mkdir tmp/top/one
+exec touch tmp/top/one/foo
+find_start p {tmp/top -prune -name foo}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/name-opt.xo b/find/testsuite/find.gnu/name-opt.xo
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/find/testsuite/find.gnu/name-opt.xo
diff --git a/find/testsuite/find.gnu/name-period.exp b/find/testsuite/find.gnu/name-period.exp
new file mode 100644
index 0000000..42858fe
--- /dev/null
+++ b/find/testsuite/find.gnu/name-period.exp
@@ -0,0 +1,10 @@
+# Verifies that -name '*bar' will match quux/.foobar.
+# See http://standards.ieee.org/reading/ieee/interp/1003-2-92_int/pasc-1003.2-126.html
+# Also see http://savannah.gnu.org/bugs/?func=detailitem&item_id=10757
+exec rm -rf tmp
+exec mkdir tmp
+exec mkdir tmp/top
+exec mkdir tmp/top/.one
+exec mkdir tmp/top/bane
+find_start p {tmp/top -name \*ne -print}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/name-period.xo b/find/testsuite/find.gnu/name-period.xo
new file mode 100644
index 0000000..53cbcdc
--- /dev/null
+++ b/find/testsuite/find.gnu/name-period.xo
@@ -0,0 +1,2 @@
+tmp/top/bane
+tmp/top/.one
diff --git a/find/testsuite/find.gnu/name-slash.exp b/find/testsuite/find.gnu/name-slash.exp
new file mode 100644
index 0000000..bd9a187
--- /dev/null
+++ b/find/testsuite/find.gnu/name-slash.exp
@@ -0,0 +1,2 @@
+# tests for '-name /'
+find_start p {/ /// -maxdepth 0 -name /}
diff --git a/find/testsuite/find.gnu/name-slash.xo b/find/testsuite/find.gnu/name-slash.xo
new file mode 100644
index 0000000..6c24144
--- /dev/null
+++ b/find/testsuite/find.gnu/name-slash.xo
@@ -0,0 +1,2 @@
+/
+///
diff --git a/find/testsuite/find.gnu/no-fdleak-test.exp b/find/testsuite/find.gnu/no-fdleak-test.exp
new file mode 100644
index 0000000..f823047
--- /dev/null
+++ b/find/testsuite/find.gnu/no-fdleak-test.exp
@@ -0,0 +1,13 @@
+# Test with the FD leak check turned off. We make this test, just to
+# avoid failing to detect problems that only occur when the leak check
+# is turned off.
+set oldval $env(GNU_FINDUTILS_FD_LEAK_CHECK)
+unset env(GNU_FINDUTILS_FD_LEAK_CHECK)
+
+if { [ safe_path ] } {
+ exec rm -rf tmp
+ exec mkdir tmp tmp/fred tmp/jim
+ find_start p {tmp -name fred -execdir echo \{\} \; }
+ exec rm -rf tmp
+}
+set env(GNU_FINDUTILS_FD_LEAK_CHECK) $oldval
diff --git a/find/testsuite/find.gnu/no-fdleak-test.xo b/find/testsuite/find.gnu/no-fdleak-test.xo
new file mode 100644
index 0000000..8584084
--- /dev/null
+++ b/find/testsuite/find.gnu/no-fdleak-test.xo
@@ -0,0 +1 @@
+./fred
diff --git a/find/testsuite/find.gnu/path.exp b/find/testsuite/find.gnu/path.exp
new file mode 100644
index 0000000..40fa01e
--- /dev/null
+++ b/find/testsuite/find.gnu/path.exp
@@ -0,0 +1,5 @@
+# test for -path
+exec rm -rf tmp
+exec mkdir tmp tmp/top tmp/top/one tmp/top/one/two
+find_start p {tmp/top -path tmp/top/one -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/path.xo b/find/testsuite/find.gnu/path.xo
new file mode 100644
index 0000000..66d2877
--- /dev/null
+++ b/find/testsuite/find.gnu/path.xo
@@ -0,0 +1 @@
+tmp/top/one
diff --git a/find/testsuite/find.gnu/perm-slash.exp b/find/testsuite/find.gnu/perm-slash.exp
new file mode 100644
index 0000000..252d91a
--- /dev/null
+++ b/find/testsuite/find.gnu/perm-slash.exp
@@ -0,0 +1,19 @@
+# tests for -perm /nnn
+# The slash is a GNU extension
+
+exec rm -rf tmp
+exec mkdir tmp
+
+## set up a selection of test files
+foreach perm { 400 200 555 700 000 050 } {
+ exec touch "tmp/$perm"
+ exec chmod $perm "tmp/$perm"
+}
+
+#
+# The -o operator normally has a short-circuit effect,
+# so we have to use "-exec false \;" to make sure that
+# all the parenthesised expression actually fail.
+#
+find_start p {tmp -mindepth 1 -perm /555 -printf "p/555 %p\n" }
+# exec rm -rf tmp tmp2
diff --git a/find/testsuite/find.gnu/perm-slash.xo b/find/testsuite/find.gnu/perm-slash.xo
new file mode 100644
index 0000000..f84e5b7
--- /dev/null
+++ b/find/testsuite/find.gnu/perm-slash.xo
@@ -0,0 +1,4 @@
+p/555 tmp/050
+p/555 tmp/555
+p/555 tmp/400
+p/555 tmp/700 \ No newline at end of file
diff --git a/find/testsuite/find.gnu/perm.exp b/find/testsuite/find.gnu/perm.exp
new file mode 100644
index 0000000..d4913f8
--- /dev/null
+++ b/find/testsuite/find.gnu/perm.exp
@@ -0,0 +1,7 @@
+# tests for -perm -0100 (-perm with -)
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/fred
+exec chmod 444 tmp/fred
+find_start p {tmp -perm -0100}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/perm.xo b/find/testsuite/find.gnu/perm.xo
new file mode 100644
index 0000000..a9a5aec
--- /dev/null
+++ b/find/testsuite/find.gnu/perm.xo
@@ -0,0 +1 @@
+tmp
diff --git a/find/testsuite/find.gnu/perm000.exp b/find/testsuite/find.gnu/perm000.exp
new file mode 100644
index 0000000..9217129
--- /dev/null
+++ b/find/testsuite/find.gnu/perm000.exp
@@ -0,0 +1,7 @@
+# tests for -perm /000 (Savannah bug #14748).
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/fred tmp/wilma
+exec chmod 000 tmp/fred
+find_start p {tmp -perm /000 -print 2>/dev/null }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/perm000.xo b/find/testsuite/find.gnu/perm000.xo
new file mode 100644
index 0000000..7a1f6e9
--- /dev/null
+++ b/find/testsuite/find.gnu/perm000.xo
@@ -0,0 +1,3 @@
+tmp
+tmp/fred
+tmp/wilma
diff --git a/find/testsuite/find.gnu/posix-dflt.exp b/find/testsuite/find.gnu/posix-dflt.exp
new file mode 100644
index 0000000..3e7d573
--- /dev/null
+++ b/find/testsuite/find.gnu/posix-dflt.exp
@@ -0,0 +1,10 @@
+# Verifies that the POSIX behaviour without -P or -L options is
+# correctly implemented, but does this by using the GNU extension
+# -printf.
+exec rm -rf tmp
+
+exec mkdir tmp
+exec ln -s /etc/passwd tmp/LINK
+exec ln -s /NOSUCHFILE tmp/BROKEN
+
+find_start p { -P tmp/LINK tmp/BROKEN tmp -printf "%y %d %p\n" }
diff --git a/find/testsuite/find.gnu/posix-dflt.xo b/find/testsuite/find.gnu/posix-dflt.xo
new file mode 100644
index 0000000..7359d24
--- /dev/null
+++ b/find/testsuite/find.gnu/posix-dflt.xo
@@ -0,0 +1,5 @@
+d 0 tmp
+l 0 tmp/BROKEN
+l 0 tmp/LINK
+l 1 tmp/BROKEN
+l 1 tmp/LINK
diff --git a/find/testsuite/find.gnu/posix-h.exp b/find/testsuite/find.gnu/posix-h.exp
new file mode 100644
index 0000000..0ecbabe
--- /dev/null
+++ b/find/testsuite/find.gnu/posix-h.exp
@@ -0,0 +1,13 @@
+# Verifies that the POSIX -H option is correctly implemented,
+# but does this by using the GNU extension -printf.
+exec rm -rf tmp
+
+exec mkdir tmp
+exec ln -s /etc/passwd tmp/LINK
+exec ln -s /NOSUCHFILE tmp/BROKEN
+
+# If the file is not on the command line, the link is not
+# dereferenced, and so tmp/LINK should appear at depth 1
+# but as type "l". tmp itself appears first at depth 0 as
+# a directory.
+find_start p { -H tmp/LINK tmp/BROKEN tmp -printf "H1: %y %d %p\n" }
diff --git a/find/testsuite/find.gnu/posix-h.xo b/find/testsuite/find.gnu/posix-h.xo
new file mode 100644
index 0000000..4d503f7
--- /dev/null
+++ b/find/testsuite/find.gnu/posix-h.xo
@@ -0,0 +1,5 @@
+H1: d 0 tmp
+H1: f 0 tmp/LINK
+H1: l 0 tmp/BROKEN
+H1: l 1 tmp/BROKEN
+H1: l 1 tmp/LINK
diff --git a/find/testsuite/find.gnu/posix-l.exp b/find/testsuite/find.gnu/posix-l.exp
new file mode 100644
index 0000000..6055edf
--- /dev/null
+++ b/find/testsuite/find.gnu/posix-l.exp
@@ -0,0 +1,10 @@
+# Verifies that the POSIX -L option is correctly implemented,
+# but does this by using the GNU extension -printf.
+exec rm -rf tmp
+
+exec mkdir tmp
+exec ln -s /etc/passwd tmp/LINK
+exec ln -s /NOSUCHFILE tmp/BROKEN
+
+# Links should all be dereferenced unless they are broken.
+find_start p { -L tmp/LINK tmp/BROKEN tmp -printf "%y %d %p\n" }
diff --git a/find/testsuite/find.gnu/posix-l.xo b/find/testsuite/find.gnu/posix-l.xo
new file mode 100644
index 0000000..f2c7940
--- /dev/null
+++ b/find/testsuite/find.gnu/posix-l.xo
@@ -0,0 +1,5 @@
+d 0 tmp
+f 0 tmp/LINK
+f 1 tmp/LINK
+l 0 tmp/BROKEN
+l 1 tmp/BROKEN
diff --git a/find/testsuite/find.gnu/posix-perminvalid.exp b/find/testsuite/find.gnu/posix-perminvalid.exp
new file mode 100644
index 0000000..b773511
--- /dev/null
+++ b/find/testsuite/find.gnu/posix-perminvalid.exp
@@ -0,0 +1,16 @@
+# tests for non-POSIX-compliant argument to -perm
+# Remember any previous value of POSIXLY_CORRECT (if there was one)
+if [info exists env(POSIXLY_CORRECT)] {
+ set oldval env(POSIXLY_CORRECT)
+}
+
+# Set POSIXLY_CORRECT and perform the test
+set env(POSIXLY_CORRECT) 1
+find_start f {. -perm +a+x}
+
+# Set POSIXLY_CORRECT to its previous value
+if [info exists oldval] {
+ set env(POSIXLY_CORRECT) $oldval
+} else {
+ unset env(POSIXLY_CORRECT)
+}
diff --git a/find/testsuite/find.gnu/print0.exp b/find/testsuite/find.gnu/print0.exp
new file mode 100644
index 0000000..11a3cb6
--- /dev/null
+++ b/find/testsuite/find.gnu/print0.exp
@@ -0,0 +1,5 @@
+# test for -print0.
+exec rm -rf tmp
+exec touch tmp
+find_start p { tmp -print0 }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/print0.xo b/find/testsuite/find.gnu/print0.xo
new file mode 100644
index 0000000..b947b3b
--- /dev/null
+++ b/find/testsuite/find.gnu/print0.xo
Binary files differ
diff --git a/find/testsuite/find.gnu/print_stdout.exp b/find/testsuite/find.gnu/print_stdout.exp
new file mode 100644
index 0000000..5bbeefa
--- /dev/null
+++ b/find/testsuite/find.gnu/print_stdout.exp
@@ -0,0 +1,5 @@
+# test for -fprint
+exec rm -rf tmp
+exec touch tmp
+find_start p { tmp -fprint /dev/stdout }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/print_stdout.xo b/find/testsuite/find.gnu/print_stdout.xo
new file mode 100644
index 0000000..a9a5aec
--- /dev/null
+++ b/find/testsuite/find.gnu/print_stdout.xo
@@ -0,0 +1 @@
+tmp
diff --git a/find/testsuite/find.gnu/printf-h.exp b/find/testsuite/find.gnu/printf-h.exp
new file mode 100644
index 0000000..fb0187c
--- /dev/null
+++ b/find/testsuite/find.gnu/printf-h.exp
@@ -0,0 +1,5 @@
+# Test case for Savannah bug ID #12085.
+exec rm -rf tmp
+exec touch tmp
+find_start p {tmp -printf "RESULT: %h %f\n" }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/printf-h.xo b/find/testsuite/find.gnu/printf-h.xo
new file mode 100644
index 0000000..dc6ce01
--- /dev/null
+++ b/find/testsuite/find.gnu/printf-h.xo
@@ -0,0 +1 @@
+RESULT: . tmp
diff --git a/find/testsuite/find.gnu/printf-nonlocal-symlink.exp b/find/testsuite/find.gnu/printf-nonlocal-symlink.exp
new file mode 100644
index 0000000..f8e61e1
--- /dev/null
+++ b/find/testsuite/find.gnu/printf-nonlocal-symlink.exp
@@ -0,0 +1,7 @@
+exec rm -rf tmp
+exec mkdir tmp
+exec mkdir tmp/foo
+exec touch tmp/foo/file
+exec ln -s file tmp/foo/LINK
+find_start p {tmp -type l -printf "%p: %Y %y\n" }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/printf-nonlocal-symlink.xo b/find/testsuite/find.gnu/printf-nonlocal-symlink.xo
new file mode 100644
index 0000000..fcb338a
--- /dev/null
+++ b/find/testsuite/find.gnu/printf-nonlocal-symlink.xo
@@ -0,0 +1 @@
+tmp/foo/LINK: f l
diff --git a/find/testsuite/find.gnu/printf-reserved.exp b/find/testsuite/find.gnu/printf-reserved.exp
new file mode 100644
index 0000000..3072312
--- /dev/null
+++ b/find/testsuite/find.gnu/printf-reserved.exp
@@ -0,0 +1,3 @@
+find_start f { . -maxdepth 0 -printf '%(' }
+find_start f { . -maxdepth 0 -printf '%\{' }
+find_start f { . -maxdepth 0 -printf '%\[' }
diff --git a/find/testsuite/find.gnu/printf-slash.exp b/find/testsuite/find.gnu/printf-slash.exp
new file mode 100644
index 0000000..3f46023
--- /dev/null
+++ b/find/testsuite/find.gnu/printf-slash.exp
@@ -0,0 +1 @@
+find_start p {/ /// -maxdepth 0 -printf "%p %f\\n"}
diff --git a/find/testsuite/find.gnu/printf-slash.xo b/find/testsuite/find.gnu/printf-slash.xo
new file mode 100644
index 0000000..50f8192
--- /dev/null
+++ b/find/testsuite/find.gnu/printf-slash.xo
@@ -0,0 +1,2 @@
+/ /
+/// /
diff --git a/find/testsuite/find.gnu/printf-symlink.exp b/find/testsuite/find.gnu/printf-symlink.exp
new file mode 100644
index 0000000..6acc3e6
--- /dev/null
+++ b/find/testsuite/find.gnu/printf-symlink.exp
@@ -0,0 +1,6 @@
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/file
+exec ln -s file tmp/LINK
+find_start p {tmp/LINK -printf "RESULT: %y %Y %p\n" -printf "RESULT2: %Y %y %p\n" }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/printf-symlink.xo b/find/testsuite/find.gnu/printf-symlink.xo
new file mode 100644
index 0000000..cc2b69c
--- /dev/null
+++ b/find/testsuite/find.gnu/printf-symlink.xo
@@ -0,0 +1,2 @@
+RESULT: l f tmp/LINK
+RESULT2: f l tmp/LINK
diff --git a/find/testsuite/find.gnu/printf.exp b/find/testsuite/find.gnu/printf.exp
new file mode 100644
index 0000000..ba8e75b
--- /dev/null
+++ b/find/testsuite/find.gnu/printf.exp
@@ -0,0 +1,6 @@
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/file
+exec chmod 600 tmp/file
+find_start p {tmp -type f -printf "a %d\n" -printf "b %f\n" -printf "c %h\n" -printf "d %H\n" -printf "e %l\n" -printf "f %m\n" -printf "g %n\n" -printf "h %p\n" -printf "i %P\n" -printf "j %y\n" -printf "k %Y\n" -printf "percent it%%works%%\n" -printf "string-right !%10p!\n" -printf "string-left !%-10p!\n" -printf "trunc-R !%10.6p!\n" -printf "trunc-L !%-10.6p!\n" -printf "a5 !%5d!\n" -printf "a05 !%05d!\n" -printf "a+ %+d\n" }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/printf.xo b/find/testsuite/find.gnu/printf.xo
new file mode 100644
index 0000000..e607293
--- /dev/null
+++ b/find/testsuite/find.gnu/printf.xo
@@ -0,0 +1,19 @@
+a 1
+a+ +1
+a5 ! 1!
+a05 !00001!
+b file
+c tmp
+d tmp
+e
+f 600
+g 1
+h tmp/file
+i file
+j f
+k f
+percent it%works%
+string-left !tmp/file !
+string-right ! tmp/file!
+trunc-L !tmp/fi !
+trunc-R ! tmp/fi!
diff --git a/find/testsuite/find.gnu/printfHdfl.exp b/find/testsuite/find.gnu/printfHdfl.exp
new file mode 100644
index 0000000..517ecc5
--- /dev/null
+++ b/find/testsuite/find.gnu/printfHdfl.exp
@@ -0,0 +1,2 @@
+# verify that %H with no argument assumes "."
+find_start p { -maxdepth 0 -printf "%H" }
diff --git a/find/testsuite/find.gnu/printfHdfl.xo b/find/testsuite/find.gnu/printfHdfl.xo
new file mode 100644
index 0000000..9c558e3
--- /dev/null
+++ b/find/testsuite/find.gnu/printfHdfl.xo
@@ -0,0 +1 @@
+.
diff --git a/find/testsuite/find.gnu/prune-default-print.exp b/find/testsuite/find.gnu/prune-default-print.exp
new file mode 100644
index 0000000..b43a6b9
--- /dev/null
+++ b/find/testsuite/find.gnu/prune-default-print.exp
@@ -0,0 +1,5 @@
+# Verifies that default -print is used with -prune
+exec rm -rf tmp
+exec mkdir tmp
+find_start p {tmp -prune}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/prune-default-print.xo b/find/testsuite/find.gnu/prune-default-print.xo
new file mode 100644
index 0000000..a9a5aec
--- /dev/null
+++ b/find/testsuite/find.gnu/prune-default-print.xo
@@ -0,0 +1 @@
+tmp
diff --git a/find/testsuite/find.gnu/quit.exp b/find/testsuite/find.gnu/quit.exp
new file mode 100644
index 0000000..610ad7f
--- /dev/null
+++ b/find/testsuite/find.gnu/quit.exp
@@ -0,0 +1,5 @@
+# test for -quit.
+exec rm -rf tmp
+exec mkdir tmp tmp/top tmp/top/one tmp/top/one/foo tmp/top/two
+find_start p {tmp/top/one tmp/top/two -depth -print -name one -quit }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/quit.xo b/find/testsuite/find.gnu/quit.xo
new file mode 100644
index 0000000..14c1d8d
--- /dev/null
+++ b/find/testsuite/find.gnu/quit.xo
@@ -0,0 +1,2 @@
+tmp/top/one/foo
+tmp/top/one
diff --git a/find/testsuite/find.gnu/regex1.exp b/find/testsuite/find.gnu/regex1.exp
new file mode 100644
index 0000000..071dcaf
--- /dev/null
+++ b/find/testsuite/find.gnu/regex1.exp
@@ -0,0 +1,5 @@
+# test for -regex
+exec rm -rf tmp
+exec mkdir tmp tmp/d tmp/d/d tmp/d/d/d tmp/d/d/d/e
+find_start p {tmp -regex {tmp\(/d\)*} -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/regex1.xo b/find/testsuite/find.gnu/regex1.xo
new file mode 100644
index 0000000..c4259bb
--- /dev/null
+++ b/find/testsuite/find.gnu/regex1.xo
@@ -0,0 +1,4 @@
+tmp
+tmp/d
+tmp/d/d
+tmp/d/d/d
diff --git a/find/testsuite/find.gnu/regex2.exp b/find/testsuite/find.gnu/regex2.exp
new file mode 100644
index 0000000..71cc1e3
--- /dev/null
+++ b/find/testsuite/find.gnu/regex2.exp
@@ -0,0 +1,5 @@
+# test for -regex
+exec rm -rf tmp
+exec mkdir tmp tmp/d tmp/d/d tmp/d/d/d tmp/d/d/d/e
+find_start p {tmp -regextype posix-extended -regex {tmp(/d)*} -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/regex2.xo b/find/testsuite/find.gnu/regex2.xo
new file mode 100644
index 0000000..c4259bb
--- /dev/null
+++ b/find/testsuite/find.gnu/regex2.xo
@@ -0,0 +1,4 @@
+tmp
+tmp/d
+tmp/d/d
+tmp/d/d/d
diff --git a/find/testsuite/find.gnu/samefile-copy.exp b/find/testsuite/find.gnu/samefile-copy.exp
new file mode 100644
index 0000000..69e47cd
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-copy.exp
@@ -0,0 +1,8 @@
+# test for -samefile
+exec rm -rf tmp
+exec mkdir tmp tmp/one tmp/two
+exec touch tmp/file1 tmp/file2
+exec cp tmp/file1 tmp/one/link
+exec cp tmp/file2 tmp/two/link
+find_start p {tmp/one tmp/two -samefile tmp/file1 -print}
+# exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/samefile-copy.xo b/find/testsuite/find.gnu/samefile-copy.xo
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-copy.xo
diff --git a/find/testsuite/find.gnu/samefile-link.exp b/find/testsuite/find.gnu/samefile-link.exp
new file mode 100644
index 0000000..e288160
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-link.exp
@@ -0,0 +1,9 @@
+# test for -samefile
+exec rm -rf tmp
+exec mkdir tmp tmp/one tmp/two
+exec touch tmp/file1 tmp/file2
+exec ln tmp/file1 tmp/one/link
+exec ln -s tmp/file1 tmp/one/symlink
+exec ln tmp/file2 tmp/two/link
+find_start p {tmp/one tmp/two -samefile tmp/file1 -print}
+# exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/samefile-link.xo b/find/testsuite/find.gnu/samefile-link.xo
new file mode 100644
index 0000000..e53b73e
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-link.xo
@@ -0,0 +1 @@
+tmp/one/link
diff --git a/find/testsuite/find.gnu/samefile-missing.exp b/find/testsuite/find.gnu/samefile-missing.exp
new file mode 100644
index 0000000..2d509c4
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-missing.exp
@@ -0,0 +1,2 @@
+# test for diagnosis of the fact that the argument to -samefile is missing
+find_start f ". -samefile"
diff --git a/find/testsuite/find.gnu/samefile-p-brokenlink.exp b/find/testsuite/find.gnu/samefile-p-brokenlink.exp
new file mode 100644
index 0000000..8ae1fad
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-p-brokenlink.exp
@@ -0,0 +1,11 @@
+# test for find -P -samefile with a broken link
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/file1
+exec ln tmp/file1 tmp/link
+exec ln -s tmp/file1 tmp/symlink
+exec ln -s tmp/file2 tmp/broken
+exec ln tmp/broken tmp/blink
+
+find_start p { -P tmp -samefile tmp/broken -print}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/samefile-p-brokenlink.xo b/find/testsuite/find.gnu/samefile-p-brokenlink.xo
new file mode 100644
index 0000000..aaa98f3
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-p-brokenlink.xo
@@ -0,0 +1,2 @@
+tmp/blink
+tmp/broken \ No newline at end of file
diff --git a/find/testsuite/find.gnu/samefile-same.exp b/find/testsuite/find.gnu/samefile-same.exp
new file mode 100644
index 0000000..739f6c6
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-same.exp
@@ -0,0 +1,6 @@
+# test for -samefile
+exec rm -rf tmp
+exec mkdir tmp tmp/one tmp/two
+exec touch tmp/file
+find_start p {tmp tmp/file -samefile tmp/file -print}
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/samefile-same.xo b/find/testsuite/find.gnu/samefile-same.xo
new file mode 100644
index 0000000..061fd95
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-same.xo
@@ -0,0 +1,2 @@
+tmp/file
+tmp/file
diff --git a/find/testsuite/find.gnu/samefile-symlink.exp b/find/testsuite/find.gnu/samefile-symlink.exp
new file mode 100644
index 0000000..1c6aa1f
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-symlink.exp
@@ -0,0 +1,10 @@
+# test for -samefile
+exec rm -rf tmp
+exec mkdir tmp tmp/one tmp/two
+exec touch tmp/file1 tmp/file2
+exec ln tmp/file1 tmp/one/link
+exec ln -s ../file1 tmp/one/symlink
+exec ln tmp/file2 tmp/two/link
+exec ln -s ../file2 tmp/two/symlink
+find_start p { -L tmp/one tmp/two -samefile tmp/file1 -print}
+# exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/samefile-symlink.xo b/find/testsuite/find.gnu/samefile-symlink.xo
new file mode 100644
index 0000000..ca1e727
--- /dev/null
+++ b/find/testsuite/find.gnu/samefile-symlink.xo
@@ -0,0 +1,2 @@
+tmp/one/link
+tmp/one/symlink
diff --git a/find/testsuite/find.gnu/sv-bug-12230.exp b/find/testsuite/find.gnu/sv-bug-12230.exp
new file mode 100644
index 0000000..3af22c6
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-12230.exp
@@ -0,0 +1,14 @@
+# Bug report by Dmitry V. Levin.
+#
+# The command:
+# find tmp -false -execdir echo == {} +
+# Actually produces one line of output. It
+# should produce none, because the echo command
+# should never be invoked.
+#
+if { [ safe_path ] } {
+ exec rm -rf tmp
+ exec mkdir tmp
+ find_start p { tmp -false -execdir echo == "{}" + }
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/sv-bug-17477.exp b/find/testsuite/find.gnu/sv-bug-17477.exp
new file mode 100644
index 0000000..2cc7fe3
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-17477.exp
@@ -0,0 +1,2 @@
+# verify that % with no argument fails gracefully
+find_start f { -maxdepth 0 -printf "test: %" }
diff --git a/find/testsuite/find.gnu/sv-bug-17490.exp b/find/testsuite/find.gnu/sv-bug-17490.exp
new file mode 100644
index 0000000..f29bebf
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-17490.exp
@@ -0,0 +1,4 @@
+# test for Savannah bug #17490
+#
+# That bug was a coredump if the argument to -regex was the final argument.
+find_start p {. -maxdepth 0 -regex x }
diff --git a/find/testsuite/find.gnu/sv-bug-17782.exp b/find/testsuite/find.gnu/sv-bug-17782.exp
new file mode 100644
index 0000000..db6dba2
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-17782.exp
@@ -0,0 +1,15 @@
+# Savannah bug #17782.
+# While -execdir echo blah {} works, -execdir echo "blah {}" doesn't.
+# The bug is that the ./ prefix is prepended to the argument containing the
+# braces, not to the expansion of the braces, so you get output like
+# ./blah foo
+# instead of
+# blah ./foo
+#
+if { [ safe_path ] } {
+ exec rm -rf tmp
+ exec mkdir tmp
+ exec touch tmp/foo
+ find_start p { tmp -name foo -execdir echo "saw {}" \; }
+ exec rm -rf tmp
+}
diff --git a/find/testsuite/find.gnu/sv-bug-17782.xo b/find/testsuite/find.gnu/sv-bug-17782.xo
new file mode 100644
index 0000000..2bde550
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-17782.xo
@@ -0,0 +1 @@
+saw ./foo \ No newline at end of file
diff --git a/find/testsuite/find.gnu/sv-bug-18222.exp b/find/testsuite/find.gnu/sv-bug-18222.exp
new file mode 100644
index 0000000..148010a
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-18222.exp
@@ -0,0 +1,8 @@
+# Test for Savannah bug #18222
+#
+# That bug was a case were the expansion of %H is truncated if the name
+# of the second start point is longer than that of the first.
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/short tmp/longer
+find_start p { tmp/short tmp/longer -printf "%H\n" }
diff --git a/find/testsuite/find.gnu/sv-bug-18222.xo b/find/testsuite/find.gnu/sv-bug-18222.xo
new file mode 100644
index 0000000..4f5f863
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-18222.xo
@@ -0,0 +1,2 @@
+tmp/short
+tmp/longer
diff --git a/find/testsuite/find.gnu/sv-bug-24169.exp b/find/testsuite/find.gnu/sv-bug-24169.exp
new file mode 100644
index 0000000..120a18b
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-24169.exp
@@ -0,0 +1,47 @@
+# Bug report by Joey Hess.
+#
+# The command:
+# find -neweraa
+# is not valid because there is a missing argument.
+# The result should be a clean exit with nonzero status.
+# However, it segfaults in 4.4.0.
+#
+
+global FTSFIND
+if {[which $FTSFIND] == 0} then {
+ error "$FTSFIND, program does not exist"
+ exit 1
+}
+
+set scriptname [info script]
+set testbase [file rootname $scriptname]
+set test [file tail $testbase]
+set testname "$test.generic"
+
+set cmd "$FTSFIND -neweraa"
+set expected 1
+
+send_log "$cmd\n"
+eval spawn -noecho $cmd
+expect {
+ eof { set result [wait] }
+}
+send_log "result is '$result'\n"
+if { [ lindex $result 2 ] == 0 } then {
+ set status [ lindex $result 3]
+ if { [llength $result] > 4 } then {
+ if { [lindex $result 4] == "CHILDKILLED" } then {
+ fail "$testname, $cmd was killed: [lrange $result 5 end]"
+ } else {
+ unresolved "$testname, $cmd had unexpected extended status $result"
+ }
+ } else {
+ if { $status != 1 } then {
+ unresolved "$testname, $cmd had unexpected status $status"
+ } else {
+ pass "$testname"
+ }
+ }
+} else {
+ unresolved "$testname, failed to run $cmd"
+}
diff --git a/find/testsuite/find.gnu/sv-bug-27563-execdir.exp b/find/testsuite/find.gnu/sv-bug-27563-execdir.exp
new file mode 100644
index 0000000..c67fc88
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-27563-execdir.exp
@@ -0,0 +1,6 @@
+# tests for Savannah bug 27563 (result of find -L -exec ls {} \;)
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/yyyy
+find_start p {-L tmp -name yyyy -execdir ls \{\} \; }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/sv-bug-27563-execdir.xo b/find/testsuite/find.gnu/sv-bug-27563-execdir.xo
new file mode 100644
index 0000000..285260b
--- /dev/null
+++ b/find/testsuite/find.gnu/sv-bug-27563-execdir.xo
@@ -0,0 +1 @@
+./yyyy
diff --git a/find/testsuite/find.gnu/true.exp b/find/testsuite/find.gnu/true.exp
new file mode 100644
index 0000000..3da595b
--- /dev/null
+++ b/find/testsuite/find.gnu/true.exp
@@ -0,0 +1,5 @@
+# test for -true.
+exec rm -rf tmp
+exec mkdir tmp tmp/fred tmp/fred/jim
+find_start p { tmp -depth -print -true -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/true.xo b/find/testsuite/find.gnu/true.xo
new file mode 100644
index 0000000..8484390
--- /dev/null
+++ b/find/testsuite/find.gnu/true.xo
@@ -0,0 +1,6 @@
+tmp/fred/jim
+tmp/fred/jim
+tmp/fred
+tmp/fred
+tmp
+tmp
diff --git a/find/testsuite/find.gnu/used-invarg.exp b/find/testsuite/find.gnu/used-invarg.exp
new file mode 100644
index 0000000..966341f
--- /dev/null
+++ b/find/testsuite/find.gnu/used-invarg.exp
@@ -0,0 +1,2 @@
+# tests for invalid argument to -used
+find_start f {. -used ZZ}
diff --git a/find/testsuite/find.gnu/used-missing.exp b/find/testsuite/find.gnu/used-missing.exp
new file mode 100644
index 0000000..6218433
--- /dev/null
+++ b/find/testsuite/find.gnu/used-missing.exp
@@ -0,0 +1,2 @@
+# tests for missing argument to -used
+find_start f {. -used }
diff --git a/find/testsuite/find.gnu/user-invalid.exp b/find/testsuite/find.gnu/user-invalid.exp
new file mode 100644
index 0000000..ee1d02a
--- /dev/null
+++ b/find/testsuite/find.gnu/user-invalid.exp
@@ -0,0 +1,4 @@
+# tests for invalid argument to -user
+foreach user { : "" 14JJ 10.3 -4 } {
+ find_start f ". -user $user"
+}
diff --git a/find/testsuite/find.gnu/wholename.exp b/find/testsuite/find.gnu/wholename.exp
new file mode 100644
index 0000000..128d1ac
--- /dev/null
+++ b/find/testsuite/find.gnu/wholename.exp
@@ -0,0 +1,5 @@
+# test for -wholename
+exec rm -rf tmp
+exec mkdir tmp tmp/top tmp/top/one tmp/top/one/two
+find_start p {tmp/top -wholename tmp/top/one -print }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/wholename.xo b/find/testsuite/find.gnu/wholename.xo
new file mode 100644
index 0000000..66d2877
--- /dev/null
+++ b/find/testsuite/find.gnu/wholename.xo
@@ -0,0 +1 @@
+tmp/top/one
diff --git a/find/testsuite/find.gnu/xtype-symlink.exp b/find/testsuite/find.gnu/xtype-symlink.exp
new file mode 100644
index 0000000..d66a5c0
--- /dev/null
+++ b/find/testsuite/find.gnu/xtype-symlink.exp
@@ -0,0 +1,6 @@
+exec rm -rf tmp
+exec mkdir tmp
+exec touch tmp/file
+exec ln -s file tmp/LINK
+find_start p {tmp/LINK -xtype f }
+exec rm -rf tmp
diff --git a/find/testsuite/find.gnu/xtype-symlink.xo b/find/testsuite/find.gnu/xtype-symlink.xo
new file mode 100644
index 0000000..f46bde2
--- /dev/null
+++ b/find/testsuite/find.gnu/xtype-symlink.xo
@@ -0,0 +1 @@
+tmp/LINK
diff --git a/find/testsuite/find.gnu/xtype.exp b/find/testsuite/find.gnu/xtype.exp
new file mode 100644
index 0000000..62cb749
--- /dev/null
+++ b/find/testsuite/find.gnu/xtype.exp
@@ -0,0 +1,8 @@
+# checks for the -xtype test.
+exec rm -rf tmp
+
+exec mkdir tmp
+exec ln -s /etc/passwd tmp/LINK
+exec ln -s /NOSUCHFILE tmp/BROKEN
+
+find_start p { -H tmp/LINK tmp/BROKEN tmp -xtype l -printf "xtype is l: %p\n" , \! -xtype l -printf "xtype is not l: %p\n" }
diff --git a/find/testsuite/find.gnu/xtype.xo b/find/testsuite/find.gnu/xtype.xo
new file mode 100644
index 0000000..92b74ed
--- /dev/null
+++ b/find/testsuite/find.gnu/xtype.xo
@@ -0,0 +1,5 @@
+xtype is l: tmp/LINK
+xtype is l: tmp/BROKEN
+xtype is not l: tmp
+xtype is not l: tmp/LINK
+xtype is l: tmp/BROKEN