# Process this file with autom4te to create testsuite. -*- Autotest -*-
#
# Test suite for GNU tar.
# Copyright 2013-2023 Free Software Foundation, Inc.
# This file is part of GNU tar.
# GNU tar is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
# GNU tar is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Test description:
#
# Check the storing/restoring with/without default ACLs. When --acls is passed,
# restored directory tree should always match archive contents (even when the
# archive does not contain any ACLs).
#
# References:
# http://www.mail-archive.com/bug-tar@gnu.org/msg04355.html
AT_SETUP([acls: default ACLs])
AT_KEYWORDS([xattrs acls acls03 chdir])
m4_define([ACL_LISTDIR], [
cd $1
$1="$(find d1 | sort | xargs -n 1 getfacl)"
cd ..
])
m4_define([ACL_ASSERT], [
echo "$$1" > $1.log
echo "$$2" > $2.log
if test ! "$$1" "$3" "$$2"; then
echo "bad '$1' against '$2' output"
fi
])
AT_TAR_CHECK([
AT_XATTRS_UTILS_PREREQ
AT_ACLS_PREREQ
AT_SORT_PREREQ
MYNAME=$( id -un )
MYGROUP=$( id -gn )
# Prepare directory structure with default ACLs
mkdir -p pure/d1/d2
genfile --file pure/d1/f2a
genfile --file pure/d1/f2b
genfile --file pure/d1/d2/f3a
genfile --file pure/d1/d2/f3b
setfacl -m g:$MYGROUP:r-x pure/d1
setfacl -d -m g:$MYGROUP:rwx pure/d1
setfacl -d -m u:$MYNAME:rwx pure/d1
# "*a" files have "some" additional ACLs
setfacl -m u:$MYNAME:--- pure/d1/d2/f3a
setfacl -m u:$MYNAME:--- pure/d1/f2a
# use default format (no acls stored)
tar -cf noacl.tar -C pure d1
# use posix format, acls stored
tar --acls -cf acl.tar -C pure d1
# Directory names are chosen based on "how the files were extracted from
# archive". Equivalent no* tags are used also:
# ^sacl_ — extracted archive has stored ACLs
# _def_ — target directory (-C) has default ACLs
# _optacl$ — extraction was done with --acls option
mkdir sacl_def_optacl
mkdir sacl_def_optnoacl
mkdir sacl_nodef_optacl
mkdir sacl_nodef_optnoacl
mkdir nosacl_def_optacl
mkdir nosacl_def_optnoacl
mkdir nosacl_nodef_optacl
mkdir nosacl_nodef_optnoacl
setfacl -d -m u:$MYNAME:--- nosacl_def_optnoacl sacl_def_optnoacl sacl_def_optacl nosacl_def_optacl
setfacl -d -m g:$MYGROUP:--- nosacl_def_optnoacl sacl_def_optnoacl sacl_def_optacl nosacl_def_optacl
tar -xf acl.tar -C sacl_nodef_optnoacl
tar --acls -xf acl.tar -C sacl_nodef_optacl
tar -xf acl.tar -C sacl_def_optnoacl
tar --acls -xf acl.tar -C sacl_def_optacl
tar -xf noacl.tar -C nosacl_def_optnoacl
# _NO_ ACLs in output
tar -xf noacl.tar -C nosacl_nodef_optnoacl
tar -xf noacl.tar -C nosacl_nodef_optacl
tar -cf noacl_repackaged.tar -C nosacl_nodef_optnoacl d1
# _NO_ ACLs in output (even when default ACLs exist)
tar --acls -xf noacl_repackaged.tar -C nosacl_def_optacl
ACL_LISTDIR(pure)
ACL_LISTDIR(sacl_def_optacl)
ACL_LISTDIR(sacl_def_optnoacl)
ACL_LISTDIR(sacl_nodef_optacl)
ACL_LISTDIR(sacl_nodef_optnoacl)
ACL_LISTDIR(nosacl_def_optacl)
ACL_LISTDIR(nosacl_def_optnoacl)
ACL_LISTDIR(nosacl_nodef_optacl)
ACL_LISTDIR(nosacl_nodef_optnoacl)
ACL_ASSERT(pure, sacl_def_optacl, =)
ACL_ASSERT(sacl_def_optacl, sacl_nodef_optacl, =)
ACL_ASSERT(sacl_def_optnoacl, nosacl_def_optnoacl, =)
ACL_ASSERT(sacl_nodef_optnoacl, nosacl_nodef_optnoacl, =)
ACL_ASSERT(nosacl_def_optacl, nosacl_nodef_optacl, =)
ACL_ASSERT(nosacl_def_optacl, nosacl_nodef_optnoacl, =)
ACL_ASSERT(sacl_def_optacl, sacl_def_optnoacl, !=)
ACL_ASSERT(sacl_def_optacl, nosacl_def_optnoacl, !=)
ACL_ASSERT(nosacl_def_optnoacl, nosacl_nodef_optnoacl, !=)
],
[0],
[],
[])
AT_CLEANUP