8fa2c49b2b06b857c362aefb1503f114bb3718a4
[platform/upstream/coreutils.git] / tests / mkdir / perm
1 #!/bin/sh
2 # Verify that mkdir's `-m MODE' option works properly
3 # with various umask settings.
4
5 if test "$VERBOSE" = yes; then
6   set -x
7   mkdir --version
8 fi
9
10 pwd=`pwd`
11 t0=`echo "$0"|sed 's,.*/,,'`.tmp; tmp=$t0/$$
12 trap 'status=$?; cd $pwd; chmod -R u+rwx $t0; rm -rf $t0 && exit $status' 0
13 trap '(exit $?); exit' 1 2 13 15
14
15 framework_failure=0
16
17 # Record absolute path of srcdir and cd back to current dir.
18 cd $srcdir || framework_failure=1
19 abs_srcdir=`pwd`
20 cd $pwd || framework_failure=1
21
22 mkdir -p $tmp || framework_failure=1
23 cd $tmp || framework_failure=1
24
25 if test $framework_failure = 1; then
26   echo 'failure in testing framework'
27   (exit 1); exit 1
28 fi
29
30 . $abs_srcdir/../setgid-check
31 . $abs_srcdir/../umask-check
32
33 fail=0
34
35 #                         parent        parent/dir
36 # umask   -m option   resulting perm  resulting perm
37 tests='
38     000  :   empty    : drwxrwxrwx : drwxrwxrwx :
39     000  :   -m 016   : drwxrwxrwx : d-----xrw- :
40     077  :   empty    : drwx------ : drwx------ :
41     050  :   empty    : drwx-w-rwx : drwx-w-rwx :
42     050  :   -m 312   : drwx-w-rwx : d-wx--x-w- :
43     160  :   empty    : drwx--xrwx : drw---xrwx :
44     160  :   -m 743   : drwx--xrwx : drwxr---wx :
45     027  :   -m =+x   : drwxr-x--- : d--x--x--- :
46     027  :   -m =+X   : drwxr-x--- : d--x--x--- :
47     -    :   -        : last       : last       :
48     '
49 colon_tests=`echo $tests | sed 's/^ *//; s/ *: */:/g'`
50
51 for p in empty -p; do
52   test _$p = _empty && p=
53
54   old_IFS=$IFS
55   IFS=':'
56   set $colon_tests
57   IFS=$old_IFS
58
59   while :; do
60     test "$VERBOSE" = yes && set -x
61     umask=$1 mode=$2 parent_perms=$3 sub_perms=$4
62     test "_$mode" = _empty && mode=
63     test $sub_perms = last && break
64     # echo p=$p umask=$1 mode=$2 parent_perms=$3 sub_perms=$4
65     shift; shift; shift; shift
66     umask $umask
67
68     # If we're not using -p, then create the parent manually,
69     # and adjust expectations accordingly.
70     test x$p = x && \
71       {
72         mkdir -m =,u=rwx parent || fail=1
73         parent_perms=drwx------
74       }
75
76     mkdir $p $mode parent/sub || fail=1
77
78     perms=`ls -ld parent | sed 's/ .*//; s/+$//'`
79     test "$parent_perms" = "$perms" \
80       || { fail=1; echo parent: expected $parent_perms, got $perms; }
81
82     perms=`ls -ld parent/sub | sed 's/ .*//; s/+$//'`
83     test "$sub_perms" = "$perms" \
84       || { fail=1; echo parent/sub: expected $sub_perms, got $perms; }
85
86     chmod -R u+rwx parent
87     rm -rf parent || fail=1
88   done
89 done
90
91 (exit $fail); exit $fail