overlay: fix _repair_scratch_fs
[xfstests-dev.git] / common / renameat2
1 ##/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # Copyright (c) 2014 Miklos Szeredi.  All Rights Reserved.
4 #
5 # renameat2 helpers
6
7 # Setup source or dest
8 #
9 _setup_one()
10 {
11         local path=$1
12         local type=$2
13
14         case $type in
15                 none)   ;;
16                 regu)   echo foo > $path;;
17                 symb)   ln -s foo $path;;
18                 dire)   mkdir $path;;
19                 tree)   mkdir $path; echo foo > $path/bar;;
20         esac
21 }
22
23 #
24 # Cleanup source or dest
25 #
26 _cleanup_one()
27 {
28         local path=$1
29
30         if test -d $path; then
31                 rm -f $path/bar
32                 rmdir $path
33         else
34                 rm -f $path
35         fi
36 }
37
38 #
39 # Check type of source or destination
40 #
41 _showtype_one()
42 {
43         local path=$1
44
45         if test -e $path -o -h $path; then
46                 if test -d $path -a -e $path/bar; then
47                         echo -n "tree"
48                 else
49                         echo -n `stat -c %F $path | cut -b-4`
50                 fi
51         else
52                 echo -n "none"
53         fi
54 }
55
56 #
57 # This runs renameat2 on all combinations of source and dest
58 #
59 _rename_tests_source_dest()
60 {
61         local source=$1
62         local dest=$2
63         local options=$3
64
65         for stype in none regu symb dire tree; do
66                 for dtype in none regu symb dire tree; do
67                         echo -n "$options $stype/$dtype -> "
68                         _setup_one $source $stype
69                         _setup_one $dest $dtype
70                         src/renameat2 $source $dest $flags
71                         if test $? == 0; then
72                                 _showtype_one $source
73                                 echo -n "/"
74                                 _showtype_one $dest
75                                 echo "."
76                         fi
77                         _cleanup_one $source
78                         _cleanup_one $dest
79                 done
80         done
81 }
82
83 #
84 # This runs _rename_tests_source_dest() for both same-directory and
85 # cross-directory renames
86 #
87 _rename_tests()
88 {
89         local testdir=$1
90         local flags=$2
91
92         #same directory renames
93         _rename_tests_source_dest $testdir/src $testdir/dst     "samedir "
94
95         #cross directory renames
96         mkdir $testdir/x $testdir/y
97         _rename_tests_source_dest $testdir/x/src $testdir/y/dst "crossdir"
98         rmdir $testdir/x $testdir/y
99 }
100
101 #
102 # This checks whether the renameat2 syscall is supported
103 #
104 _requires_renameat2()
105 {
106         if test ! -x src/renameat2; then
107                 _notrun "renameat2 binary not found"
108         fi
109         if ! src/renameat2 -t; then
110                 _notrun "kernel doesn't support renameat2 syscall"
111         fi
112 }