1#!/bin/sh 2# Verify that mkdir's '-m MODE' option works properly 3# with various umask settings. 4 5# Copyright (C) 2000-2023 Free Software Foundation, Inc. 6 7# This program is free software: you can redistribute it and/or modify 8# it under the terms of the GNU General Public License as published by 9# the Free Software Foundation, either version 3 of the License, or 10# (at your option) any later version. 11 12# This program is distributed in the hope that it will be useful, 13# but WITHOUT ANY WARRANTY; without even the implied warranty of 14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15# GNU General Public License for more details. 16 17# You should have received a copy of the GNU General Public License 18# along with this program. If not, see <https://www.gnu.org/licenses/>. 19 20. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src 21print_ver_ mkdir 22skip_if_setgid_ 23require_no_default_acl_ . 24 25working_umask_or_skip_ 26 27 28# parent parent/dir 29# umask -m option resulting perm resulting perm 30tests=' 31 000 : empty : drwxrwxrwx : drwxrwxrwx : 32 000 : -m 016 : drwxrwxrwx : d-----xrw- : 33 077 : empty : drwx------ : drwx------ : 34 050 : empty : drwx-w-rwx : drwx-w-rwx : 35 050 : -m 312 : drwx-w-rwx : d-wx--x-w- : 36 160 : empty : drwx--xrwx : drw---xrwx : 37 160 : -m 743 : drwx--xrwx : drwxr---wx : 38 022 : -m o-w : drwxr-xr-x : drwxrwxr-x : 39 027 : -m =+x : drwxr-x--- : d--x--x--- : 40 027 : -m =+X : drwxr-x--- : d--x--x--- : 41 - : - : last : last : 42 ' 43colon_tests=$(echo $tests | sed 's/^ *//; s/ *: */:/g') 44 45for p in empty -p; do 46 test _$p = _empty && p= 47 48 old_IFS=$IFS 49 IFS=':' 50 set $colon_tests 51 IFS=$old_IFS 52 53 while :; do 54 test "$VERBOSE" = yes && set -x 55 umask=$1 mode=$2 parent_perms=$3 sub_perms=$4 56 test "_$mode" = _empty && mode= 57 test $sub_perms = last && break 58 # echo p=$p umask=$1 mode=$2 parent_perms=$3 sub_perms=$4 59 shift; shift; shift; shift 60 umask $umask 61 62 # If we're not using -p, then create the parent manually, 63 # and adjust expectations accordingly. 64 test x$p = x && 65 { 66 mkdir -m =,u=rwx parent || fail=1 67 parent_perms=drwx------ 68 } 69 70 mkdir $p $mode parent/sub || fail=1 71 72 perms=$(stat --printf %A parent) 73 test "$parent_perms" = "$perms" \ 74 || { fail=1; echo parent: expected $parent_perms, got $perms; } 75 76 perms=$(stat --printf %A parent/sub) 77 test "$sub_perms" = "$perms" \ 78 || { fail=1; echo parent/sub: expected $sub_perms, got $perms; } 79 80 chmod -R u+rwx parent 81 rm -rf parent || fail=1 82 done 83done 84 85Exit $fail 86