Blame libarchive/test/test_acl_platform_nfs4.c

Packit Service 1d0348
/*-
Packit Service 1d0348
 * Copyright (c) 2003-2010 Tim Kientzle
Packit Service 1d0348
 * Copyright (c) 2017 Martin Matuska
Packit Service 1d0348
 * All rights reserved.
Packit Service 1d0348
 *
Packit Service 1d0348
 * Redistribution and use in source and binary forms, with or without
Packit Service 1d0348
 * modification, are permitted provided that the following conditions
Packit Service 1d0348
 * are met:
Packit Service 1d0348
 * 1. Redistributions of source code must retain the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer.
Packit Service 1d0348
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 1d0348
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 1d0348
 *    documentation and/or other materials provided with the distribution.
Packit Service 1d0348
 *
Packit Service 1d0348
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
Packit Service 1d0348
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
Packit Service 1d0348
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
Packit Service 1d0348
 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 1d0348
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
Packit Service 1d0348
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 1d0348
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 1d0348
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 1d0348
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
Packit Service 1d0348
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 1d0348
 */
Packit Service 1d0348
#include "test.h"
Packit Service 1d0348
__FBSDID("$FreeBSD$");
Packit Service 1d0348
Packit Service 1d0348
#if ARCHIVE_ACL_NFS4
Packit Service 1d0348
#if HAVE_SYS_ACL_H
Packit Service 1d0348
#define _ACL_PRIVATE
Packit Service 1d0348
#include <sys/acl.h>
Packit Service 1d0348
#endif
Packit Service 1d0348
#if HAVE_SYS_RICHACL_H
Packit Service 1d0348
#include <sys/richacl.h>
Packit Service 1d0348
#endif
Packit Service 1d0348
#if HAVE_MEMBERSHIP_H
Packit Service 1d0348
#include <membership.h>
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
struct myacl_t {
Packit Service 1d0348
	int type;
Packit Service 1d0348
	int permset;
Packit Service 1d0348
	int tag;
Packit Service 1d0348
	int qual; /* GID or UID of user/group, depending on tag. */
Packit Service 1d0348
	const char *name; /* Name of user/group, depending on tag. */
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
static struct myacl_t acls_reg[] = {
Packit Service 1d0348
#if !ARCHIVE_ACL_DARWIN
Packit Service 1d0348
	/* For this test, we need the file owner to be able to read and write the ACL. */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_READ_ACL | ARCHIVE_ENTRY_ACL_WRITE_ACL | ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS | ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, ""},
Packit Service 1d0348
#endif
Packit Service 1d0348
	/* An entry for each type. */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 108, "user108" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_DENY, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 109, "user109" },
Packit Service 1d0348
Packit Service 1d0348
	/* An entry for each permission. */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 112, "user112" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_DATA,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 113, "user113" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_DATA,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 115, "user115" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_APPEND_DATA,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 117, "user117" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 119, "user119" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 120, "user120" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 122, "user122" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 123, "user123" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_DELETE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 124, "user124" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_ACL,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 125, "user125" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_ACL,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 126, "user126" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_OWNER,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 127, "user127" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 128, "user128" },
Packit Service 1d0348
Packit Service 1d0348
	/* One entry for each qualifier. */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 135, "user135" },
Packit Service 1d0348
//	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
//	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_GROUP, 136, "group136" },
Packit Service 1d0348
#if !ARCHIVE_ACL_DARWIN
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_EVERYONE, -1, "" }
Packit Service 1d0348
#else	/* MacOS - mode 0654 */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_DENY, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ACL |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_ACL |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_OWNER |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_EXECUTE |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ACL |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ACL |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_EVERYONE, -1, "" }
Packit Service 1d0348
#endif
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
static const int acls_reg_cnt = (int)(sizeof(acls_reg)/sizeof(acls_reg[0]));
Packit Service 1d0348
Packit Service 1d0348
static struct myacl_t acls_dir[] = {
Packit Service 1d0348
	/* For this test, we need to be able to read and write the ACL. */
Packit Service 1d0348
#if !ARCHIVE_ACL_DARWIN
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_READ_ACL,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, ""},
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/* An entry for each type. */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_LIST_DIRECTORY,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 101, "user101" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_DENY, ARCHIVE_ENTRY_ACL_LIST_DIRECTORY,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 102, "user102" },
Packit Service 1d0348
Packit Service 1d0348
	/* An entry for each permission. */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_LIST_DIRECTORY,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 201, "user201" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_ADD_FILE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 202, "user202" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 203, "user203" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 204, "user204" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 205, "user205" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_DELETE_CHILD,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 206, "user206" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 207, "user207" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 208, "user208" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_DELETE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 209, "user209" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_READ_ACL,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 210, "user210" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_ACL,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 211, "user211" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_WRITE_OWNER,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 212, "user212" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 213, "user213" },
Packit Service 1d0348
Packit Service 1d0348
	/* One entry with each inheritance value. */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 301, "user301" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 302, "user302" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_READ_DATA |
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT |
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 303, "user303" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_READ_DATA |
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT |
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 304, "user304" },
Packit Service 1d0348
#if !defined(ARCHIVE_ACL_SUNOS_NFS4) || defined(ACE_INHERITED_ACE)
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_INHERITED,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 305, "user305" },
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
#if 0
Packit Service 1d0348
	/* FreeBSD does not support audit entries. */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_AUDIT,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 401, "user401" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_AUDIT,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_READ_DATA | ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 402, "user402" },
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/* One entry for each qualifier. */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_LIST_DIRECTORY,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER, 501, "user501" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_LIST_DIRECTORY,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_GROUP, 502, "group502" },
Packit Service 1d0348
#if !ARCHIVE_ACL_DARWIN
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_LIST_DIRECTORY,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW, ARCHIVE_ENTRY_ACL_LIST_DIRECTORY,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_EVERYONE, -1, "" }
Packit Service 1d0348
#else	/* MacOS - mode 0654 */
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_DENY, ARCHIVE_ENTRY_ACL_EXECUTE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ACL |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_ACL |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_WRITE_OWNER |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_EXECUTE |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ACL |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
Packit Service 1d0348
	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_DATA |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_READ_ACL |
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
Packit Service 1d0348
	  ARCHIVE_ENTRY_ACL_EVERYONE, -1, "" }
Packit Service 1d0348
#endif
Packit Service 1d0348
};
Packit Service 1d0348
Packit Service 1d0348
static const int acls_dir_cnt = (int)(sizeof(acls_dir)/sizeof(acls_dir[0]));
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
set_acls(struct archive_entry *ae, struct myacl_t *acls, int start, int end)
Packit Service 1d0348
{
Packit Service 1d0348
	int i;
Packit Service 1d0348
Packit Service 1d0348
	archive_entry_acl_clear(ae);
Packit Service 1d0348
#if !ARCHIVE_ACL_DARWIN
Packit Service 1d0348
	if (start > 0) {
Packit Service 1d0348
		assertEqualInt(ARCHIVE_OK,
Packit Service 1d0348
			archive_entry_acl_add_entry(ae,
Packit Service 1d0348
			    acls[0].type, acls[0].permset, acls[0].tag,
Packit Service 1d0348
			    acls[0].qual, acls[0].name));
Packit Service 1d0348
	}
Packit Service 1d0348
#endif
Packit Service 1d0348
	for (i = start; i < end; i++) {
Packit Service 1d0348
		assertEqualInt(ARCHIVE_OK,
Packit Service 1d0348
		    archive_entry_acl_add_entry(ae,
Packit Service 1d0348
			acls[i].type, acls[i].permset, acls[i].tag,
Packit Service 1d0348
			acls[i].qual, acls[i].name));
Packit Service 1d0348
	}
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static int
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
acl_permset_to_bitmap(uint32_t mask)
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
acl_permset_to_bitmap(unsigned int mask)
Packit Service 1d0348
#else
Packit Service 1d0348
acl_permset_to_bitmap(acl_permset_t opaque_ps)
Packit Service 1d0348
#endif
Packit Service 1d0348
{
Packit Service 1d0348
	static struct { int portable; int machine; } perms[] = {
Packit Service 1d0348
#ifdef ARCHIVE_ACL_SUNOS_NFS4	/* Solaris NFSv4 ACL permissions */
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_EXECUTE, ACE_EXECUTE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_DATA, ACE_READ_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_LIST_DIRECTORY, ACE_LIST_DIRECTORY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_DATA, ACE_WRITE_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ADD_FILE, ACE_ADD_FILE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_APPEND_DATA, ACE_APPEND_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY, ACE_ADD_SUBDIRECTORY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS, ACE_READ_NAMED_ATTRS},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS, ACE_WRITE_NAMED_ATTRS},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_DELETE_CHILD, ACE_DELETE_CHILD},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES, ACE_READ_ATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES, ACE_WRITE_ATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_DELETE, ACE_DELETE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_ACL, ACE_READ_ACL},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_ACL, ACE_WRITE_ACL},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_OWNER, ACE_WRITE_OWNER},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_SYNCHRONIZE, ACE_SYNCHRONIZE}
Packit Service 1d0348
#elif ARCHIVE_ACL_DARWIN	/* MacOS NFSv4 ACL permissions */
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_DATA, ACL_READ_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_LIST_DIRECTORY, ACL_LIST_DIRECTORY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_DATA, ACL_WRITE_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ADD_FILE, ACL_ADD_FILE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_EXECUTE, ACL_EXECUTE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_DELETE, ACL_DELETE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_APPEND_DATA, ACL_APPEND_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY, ACL_ADD_SUBDIRECTORY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_DELETE_CHILD, ACL_DELETE_CHILD},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES, ACL_READ_ATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES, ACL_WRITE_ATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS, ACL_READ_EXTATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS, ACL_WRITE_EXTATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_ACL, ACL_READ_SECURITY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_ACL, ACL_WRITE_SECURITY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_OWNER, ACL_CHANGE_OWNER},
Packit Service 1d0348
#if HAVE_DECL_ACL_SYNCHRONIZE
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_SYNCHRONIZE, ACL_SYNCHRONIZE}
Packit Service 1d0348
#endif
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_EXECUTE, RICHACE_EXECUTE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_DATA, RICHACE_READ_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_LIST_DIRECTORY, RICHACE_LIST_DIRECTORY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_DATA, RICHACE_WRITE_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ADD_FILE, RICHACE_ADD_FILE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_APPEND_DATA, RICHACE_APPEND_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY, RICHACE_ADD_SUBDIRECTORY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS, RICHACE_READ_NAMED_ATTRS},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS, RICHACE_WRITE_NAMED_ATTRS},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_DELETE_CHILD, RICHACE_DELETE_CHILD},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES, RICHACE_READ_ATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES, RICHACE_WRITE_ATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_DELETE, RICHACE_DELETE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_ACL, RICHACE_READ_ACL},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_ACL, RICHACE_WRITE_ACL},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_OWNER, RICHACE_WRITE_OWNER},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_SYNCHRONIZE, RICHACE_SYNCHRONIZE}
Packit Service 1d0348
#else	/* FreeBSD NFSv4 ACL permissions */
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_EXECUTE, ACL_EXECUTE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_DATA, ACL_READ_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_LIST_DIRECTORY, ACL_LIST_DIRECTORY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_DATA, ACL_WRITE_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ADD_FILE, ACL_ADD_FILE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_APPEND_DATA, ACL_APPEND_DATA},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ADD_SUBDIRECTORY, ACL_ADD_SUBDIRECTORY},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS, ACL_READ_NAMED_ATTRS},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS, ACL_WRITE_NAMED_ATTRS},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_DELETE_CHILD, ACL_DELETE_CHILD},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES, ACL_READ_ATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES, ACL_WRITE_ATTRIBUTES},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_DELETE, ACL_DELETE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_READ_ACL, ACL_READ_ACL},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_ACL, ACL_WRITE_ACL},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_WRITE_OWNER, ACL_WRITE_OWNER},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_SYNCHRONIZE, ACL_SYNCHRONIZE}
Packit Service 1d0348
#endif
Packit Service 1d0348
	};
Packit Service 1d0348
	int i, permset = 0;
Packit Service 1d0348
Packit Service 1d0348
	for (i = 0; i < (int)(sizeof(perms)/sizeof(perms[0])); ++i)
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4 || ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
		if (mask & perms[i].machine)
Packit Service 1d0348
#else
Packit Service 1d0348
		if (acl_get_perm_np(opaque_ps, perms[i].machine))
Packit Service 1d0348
#endif
Packit Service 1d0348
			permset |= perms[i].portable;
Packit Service 1d0348
	return permset;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static int
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
acl_flagset_to_bitmap(uint16_t flags)
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
acl_flagset_to_bitmap(int flags)
Packit Service 1d0348
#else
Packit Service 1d0348
acl_flagset_to_bitmap(acl_flagset_t opaque_fs)
Packit Service 1d0348
#endif
Packit Service 1d0348
{
Packit Service 1d0348
	static struct { int portable; int machine; } perms[] = {
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4	/* Solaris NFSv4 ACL inheritance flags */
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT, ACE_FILE_INHERIT_ACE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT, ACE_DIRECTORY_INHERIT_ACE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT, ACE_NO_PROPAGATE_INHERIT_ACE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY, ACE_INHERIT_ONLY_ACE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS, ACE_SUCCESSFUL_ACCESS_ACE_FLAG},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS, ACE_FAILED_ACCESS_ACE_FLAG},
Packit Service 1d0348
#ifdef ACE_INHERITED_ACE
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_INHERITED, ACE_INHERITED_ACE}
Packit Service 1d0348
#endif
Packit Service 1d0348
#elif ARCHIVE_ACL_DARWIN	/* MacOS NFSv4 ACL inheritance flags */
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_INHERITED, ACL_ENTRY_INHERITED},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT, ACL_ENTRY_FILE_INHERIT},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT, ACL_ENTRY_DIRECTORY_INHERIT},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT, ACL_ENTRY_LIMIT_INHERIT},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY, ACL_ENTRY_ONLY_INHERIT}
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT, RICHACE_FILE_INHERIT_ACE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT, RICHACE_DIRECTORY_INHERIT_ACE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT, RICHACE_NO_PROPAGATE_INHERIT_ACE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY, RICHACE_INHERIT_ONLY_ACE},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_INHERITED, RICHACE_INHERITED_ACE}
Packit Service 1d0348
#else	/* FreeBSD NFSv4 ACL inheritance flags */
Packit Service 1d0348
#ifdef ACL_ENTRY_INHERITED
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_INHERITED, ACL_ENTRY_INHERITED},
Packit Service 1d0348
#endif
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT, ACL_ENTRY_FILE_INHERIT},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT, ACL_ENTRY_DIRECTORY_INHERIT},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT, ACL_ENTRY_NO_PROPAGATE_INHERIT},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS, ACL_ENTRY_SUCCESSFUL_ACCESS},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS, ACL_ENTRY_FAILED_ACCESS},
Packit Service 1d0348
		{ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY, ACL_ENTRY_INHERIT_ONLY}
Packit Service 1d0348
#endif
Packit Service 1d0348
	};
Packit Service 1d0348
	int i, flagset = 0;
Packit Service 1d0348
Packit Service 1d0348
	for (i = 0; i < (int)(sizeof(perms)/sizeof(perms[0])); ++i)
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4 || ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
		if (flags & perms[i].machine)
Packit Service 1d0348
#else
Packit Service 1d0348
		if (acl_get_flag_np(opaque_fs, perms[i].machine))
Packit Service 1d0348
#endif
Packit Service 1d0348
			flagset |= perms[i].portable;
Packit Service 1d0348
	return flagset;
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
static int
Packit Service 1d0348
acl_match(ace_t *ace, struct myacl_t *myacl)
Packit Service 1d0348
{
Packit Service 1d0348
	int perms;
Packit Service 1d0348
Packit Service 1d0348
	perms = acl_permset_to_bitmap(ace->a_access_mask) | acl_flagset_to_bitmap(ace->a_flags);
Packit Service 1d0348
Packit Service 1d0348
	if (perms != myacl->permset)
Packit Service 1d0348
		return (0);
Packit Service 1d0348
Packit Service 1d0348
	switch (ace->a_type) {
Packit Service 1d0348
	case ACE_ACCESS_ALLOWED_ACE_TYPE:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_ALLOW)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACE_ACCESS_DENIED_ACE_TYPE:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_DENY)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACE_SYSTEM_AUDIT_ACE_TYPE:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_AUDIT)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACE_SYSTEM_ALARM_ACE_TYPE:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_ALARM)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	default:
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	if (ace->a_flags & ACE_OWNER) {
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_USER_OBJ)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	} else if (ace->a_flags & ACE_GROUP) {
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_GROUP_OBJ)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	} else if (ace->a_flags & ACE_EVERYONE) {
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_EVERYONE)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	} else if (ace->a_flags & ACE_IDENTIFIER_GROUP) {
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_GROUP)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		if ((gid_t)myacl->qual != ace->a_who)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	} else {
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_USER)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		if ((uid_t)myacl->qual != ace->a_who)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	}
Packit Service 1d0348
	return (1);
Packit Service 1d0348
}
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
static int
Packit Service 1d0348
acl_match(struct richace *richace, struct myacl_t *myacl)
Packit Service 1d0348
{
Packit Service 1d0348
	int perms;
Packit Service 1d0348
Packit Service 1d0348
	perms = acl_permset_to_bitmap(richace->e_mask) |
Packit Service 1d0348
	    acl_flagset_to_bitmap(richace->e_flags);
Packit Service 1d0348
Packit Service 1d0348
	if (perms != myacl->permset)
Packit Service 1d0348
		return (0);
Packit Service 1d0348
Packit Service 1d0348
	switch (richace->e_type) {
Packit Service 1d0348
	case RICHACE_ACCESS_ALLOWED_ACE_TYPE:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_ALLOW)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case RICHACE_ACCESS_DENIED_ACE_TYPE:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_DENY)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	default:
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	if (richace->e_flags & RICHACE_SPECIAL_WHO) {
Packit Service 1d0348
		switch (richace->e_id) {
Packit Service 1d0348
		case RICHACE_OWNER_SPECIAL_ID:
Packit Service 1d0348
			if (myacl->tag != ARCHIVE_ENTRY_ACL_USER_OBJ)
Packit Service 1d0348
				return (0);
Packit Service 1d0348
			break;
Packit Service 1d0348
		case RICHACE_GROUP_SPECIAL_ID:
Packit Service 1d0348
			if (myacl->tag != ARCHIVE_ENTRY_ACL_GROUP_OBJ)
Packit Service 1d0348
				return (0);
Packit Service 1d0348
			break;
Packit Service 1d0348
		case RICHACE_EVERYONE_SPECIAL_ID:
Packit Service 1d0348
			if (myacl->tag != ARCHIVE_ENTRY_ACL_EVERYONE)
Packit Service 1d0348
				return (0);
Packit Service 1d0348
			break;
Packit Service 1d0348
		default:
Packit Service 1d0348
			/* Invalid e_id */
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		}
Packit Service 1d0348
	} else if (richace->e_flags & RICHACE_IDENTIFIER_GROUP) {
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_GROUP)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		if ((gid_t)myacl->qual != richace->e_id)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	} else {
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_USER)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		if ((uid_t)myacl->qual != richace->e_id)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	}
Packit Service 1d0348
	return (1);
Packit Service 1d0348
}
Packit Service 1d0348
#elif ARCHIVE_ACL_DARWIN
Packit Service 1d0348
static int
Packit Service 1d0348
acl_match(acl_entry_t aclent, struct myacl_t *myacl)
Packit Service 1d0348
{
Packit Service 1d0348
	void *q;
Packit Service 1d0348
	uid_t ugid;
Packit Service 1d0348
	int r, idtype;
Packit Service 1d0348
	acl_tag_t tag_type;
Packit Service 1d0348
	acl_permset_t opaque_ps;
Packit Service 1d0348
	acl_flagset_t opaque_fs;
Packit Service 1d0348
	int perms;
Packit Service 1d0348
Packit Service 1d0348
	acl_get_tag_type(aclent, &tag_type);
Packit Service 1d0348
Packit Service 1d0348
	/* translate the silly opaque permset to a bitmap */
Packit Service 1d0348
	acl_get_permset(aclent, &opaque_ps);
Packit Service 1d0348
	acl_get_flagset_np(aclent, &opaque_fs);
Packit Service 1d0348
	perms = acl_permset_to_bitmap(opaque_ps) | acl_flagset_to_bitmap(opaque_fs);
Packit Service 1d0348
	if (perms != myacl->permset)
Packit Service 1d0348
		return (0);
Packit Service 1d0348
Packit Service 1d0348
	r = 0;
Packit Service 1d0348
	switch (tag_type) {
Packit Service 1d0348
	case ACL_EXTENDED_ALLOW:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_ALLOW)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACL_EXTENDED_DENY:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_DENY)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	default:
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	}
Packit Service 1d0348
	q = acl_get_qualifier(aclent);
Packit Service 1d0348
	if (q == NULL)
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	r = mbr_uuid_to_id((const unsigned char *)q, &ugid, &idtype);
Packit Service 1d0348
	acl_free(q);
Packit Service 1d0348
	if (r != 0)
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	switch (idtype) {
Packit Service 1d0348
		case ID_TYPE_UID:
Packit Service 1d0348
			if (myacl->tag != ARCHIVE_ENTRY_ACL_USER)
Packit Service 1d0348
				return (0);
Packit Service 1d0348
			if ((uid_t)myacl->qual != ugid)
Packit Service 1d0348
				return (0);
Packit Service 1d0348
			break;
Packit Service 1d0348
		case ID_TYPE_GID:
Packit Service 1d0348
			if (myacl->tag != ARCHIVE_ENTRY_ACL_GROUP)
Packit Service 1d0348
				return (0);
Packit Service 1d0348
			if ((gid_t)myacl->qual != ugid)
Packit Service 1d0348
				return (0);
Packit Service 1d0348
			break;
Packit Service 1d0348
		default:
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	}
Packit Service 1d0348
	return (1);
Packit Service 1d0348
}
Packit Service 1d0348
#else /* ARCHIVE_ACL_FREEBSD_NFS4 */
Packit Service 1d0348
static int
Packit Service 1d0348
acl_match(acl_entry_t aclent, struct myacl_t *myacl)
Packit Service 1d0348
{
Packit Service 1d0348
	gid_t g, *gp;
Packit Service 1d0348
	uid_t u, *up;
Packit Service 1d0348
	acl_entry_type_t entry_type;
Packit Service 1d0348
	acl_tag_t tag_type;
Packit Service 1d0348
	acl_permset_t opaque_ps;
Packit Service 1d0348
	acl_flagset_t opaque_fs;
Packit Service 1d0348
	int perms;
Packit Service 1d0348
Packit Service 1d0348
	acl_get_tag_type(aclent, &tag_type);
Packit Service 1d0348
	acl_get_entry_type_np(aclent, &entry_type);
Packit Service 1d0348
Packit Service 1d0348
	/* translate the silly opaque permset to a bitmap */
Packit Service 1d0348
	acl_get_permset(aclent, &opaque_ps);
Packit Service 1d0348
	acl_get_flagset_np(aclent, &opaque_fs);
Packit Service 1d0348
	perms = acl_permset_to_bitmap(opaque_ps) | acl_flagset_to_bitmap(opaque_fs);
Packit Service 1d0348
	if (perms != myacl->permset)
Packit Service 1d0348
		return (0);
Packit Service 1d0348
Packit Service 1d0348
	switch (entry_type) {
Packit Service 1d0348
	case ACL_ENTRY_TYPE_ALLOW:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_ALLOW)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACL_ENTRY_TYPE_DENY:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_DENY)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACL_ENTRY_TYPE_AUDIT:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_AUDIT)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	case ACL_ENTRY_TYPE_ALARM:
Packit Service 1d0348
		if (myacl->type != ARCHIVE_ENTRY_ACL_TYPE_ALARM)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
	default:
Packit Service 1d0348
		return (0);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	switch (tag_type) {
Packit Service 1d0348
	case ACL_USER_OBJ:
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_USER_OBJ) return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACL_USER:
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_USER)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		up = acl_get_qualifier(aclent);
Packit Service 1d0348
		u = *up;
Packit Service 1d0348
		acl_free(up);
Packit Service 1d0348
		if ((uid_t)myacl->qual != u)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACL_GROUP_OBJ:
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_GROUP_OBJ) return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACL_GROUP:
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_GROUP)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		gp = acl_get_qualifier(aclent);
Packit Service 1d0348
		g = *gp;
Packit Service 1d0348
		acl_free(gp);
Packit Service 1d0348
		if ((gid_t)myacl->qual != g)
Packit Service 1d0348
			return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACL_MASK:
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_MASK) return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	case ACL_EVERYONE:
Packit Service 1d0348
		if (myacl->tag != ARCHIVE_ENTRY_ACL_EVERYONE) return (0);
Packit Service 1d0348
		break;
Packit Service 1d0348
	}
Packit Service 1d0348
	return (1);
Packit Service 1d0348
}
Packit Service 1d0348
#endif	/* various ARCHIVE_ACL_NFS4 implementations */
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
compare_acls(
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
    void *aclp,
Packit Service 1d0348
    int aclcnt,
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
    struct richacl *richacl,
Packit Service 1d0348
#else
Packit Service 1d0348
    acl_t acl,
Packit Service 1d0348
#endif
Packit Service 1d0348
    struct myacl_t *myacls, const char *filename, int start, int end)
Packit Service 1d0348
{
Packit Service 1d0348
	int *marker;
Packit Service 1d0348
	int matched;
Packit Service 1d0348
	int i, n;
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
	int e;
Packit Service 1d0348
	ace_t *acl_entry;
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
	int e;
Packit Service 1d0348
	struct richace *acl_entry;
Packit Service 1d0348
	int aclcnt;
Packit Service 1d0348
#else
Packit Service 1d0348
	int entry_id = ACL_FIRST_ENTRY;
Packit Service 1d0348
	acl_entry_t acl_entry;
Packit Service 1d0348
#if ARCHIVE_ACL_DARWIN
Packit Service 1d0348
	const int acl_get_entry_ret = 0;
Packit Service 1d0348
#else
Packit Service 1d0348
	const int acl_get_entry_ret = 1;
Packit Service 1d0348
#endif
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
	if (aclp == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
	if (richacl == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
	aclcnt = richacl->a_count;
Packit Service 1d0348
#else
Packit Service 1d0348
	if (acl == NULL)
Packit Service 1d0348
		return;
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	n = end - start;
Packit Service 1d0348
	marker = malloc(sizeof(marker[0]) * (n + 1));
Packit Service 1d0348
	for (i = 0; i < n; i++)
Packit Service 1d0348
		marker[i] = i + start;
Packit Service 1d0348
#if !ARCHIVE_ACL_DARWIN
Packit Service 1d0348
	/* Always include the first ACE. */
Packit Service 1d0348
	if (start > 0) {
Packit Service 1d0348
	  marker[n] = 0;
Packit Service 1d0348
	  ++n;
Packit Service 1d0348
	}
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Iterate over acls in system acl object, try to match each
Packit Service 1d0348
	 * one with an item in the myacls array.
Packit Service 1d0348
	 */
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4 || ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
	for (e = 0; e < aclcnt; e++)
Packit Service 1d0348
#else
Packit Service 1d0348
	while (acl_get_entry_ret == acl_get_entry(acl, entry_id, &acl_entry))
Packit Service 1d0348
#endif
Packit Service 1d0348
	{
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
		acl_entry = &((ace_t *)aclp)[e];
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
		acl_entry = &(richacl->a_entries[e]);
Packit Service 1d0348
#else
Packit Service 1d0348
		/* After the first time... */
Packit Service 1d0348
		entry_id = ACL_NEXT_ENTRY;
Packit Service 1d0348
#endif
Packit Service 1d0348
		/* Search for a matching entry (tag and qualifier) */
Packit Service 1d0348
		for (i = 0, matched = 0; i < n && !matched; i++) {
Packit Service 1d0348
			if (acl_match(acl_entry, &myacls[marker[i]])) {
Packit Service 1d0348
				/* We found a match; remove it. */
Packit Service 1d0348
				marker[i] = marker[n - 1];
Packit Service 1d0348
				n--;
Packit Service 1d0348
				matched = 1;
Packit Service 1d0348
			}
Packit Service 1d0348
		}
Packit Service 1d0348
Packit Service 1d0348
		failure("ACL entry on file %s that shouldn't be there",
Packit Service 1d0348
		    filename);
Packit Service 1d0348
		assert(matched == 1);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Dump entries in the myacls array that weren't in the system acl. */
Packit Service 1d0348
	for (i = 0; i < n; ++i) {
Packit Service 1d0348
		failure(" ACL entry %d missing from %s: "
Packit Service 1d0348
		    "type=%#010x,permset=%#010x,tag=%d,qual=%d,name=``%s''\n",
Packit Service 1d0348
		    marker[i], filename,
Packit Service 1d0348
		    myacls[marker[i]].type, myacls[marker[i]].permset,
Packit Service 1d0348
		    myacls[marker[i]].tag, myacls[marker[i]].qual,
Packit Service 1d0348
		    myacls[marker[i]].name);
Packit Service 1d0348
		assert(0); /* Record this as a failure. */
Packit Service 1d0348
	}
Packit Service 1d0348
	free(marker);
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
static void
Packit Service 1d0348
compare_entry_acls(struct archive_entry *ae, struct myacl_t *myacls, const char *filename, int start, int end)
Packit Service 1d0348
{
Packit Service 1d0348
	int *marker;
Packit Service 1d0348
	int matched;
Packit Service 1d0348
	int i, n;
Packit Service 1d0348
	int type, permset, tag, qual;
Packit Service 1d0348
	const char *name;
Packit Service 1d0348
Packit Service 1d0348
	/* Count ACL entries in myacls array and allocate an indirect array. */
Packit Service 1d0348
	n = end - start;
Packit Service 1d0348
	marker = malloc(sizeof(marker[0]) * (n + 1));
Packit Service 1d0348
	for (i = 0; i < n; i++)
Packit Service 1d0348
		marker[i] = i + start;
Packit Service 1d0348
	/* Always include the first ACE. */
Packit Service 1d0348
	if (start > 0) {
Packit Service 1d0348
	  marker[n] = 0;
Packit Service 1d0348
	  ++n;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/*
Packit Service 1d0348
	 * Iterate over acls in entry, try to match each
Packit Service 1d0348
	 * one with an item in the myacls array.
Packit Service 1d0348
	 */
Packit Service 1d0348
	assertEqualInt(n, archive_entry_acl_reset(ae,
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
Packit Service 1d0348
	while (ARCHIVE_OK == archive_entry_acl_next(ae,
Packit Service 1d0348
	    ARCHIVE_ENTRY_ACL_TYPE_NFS4, &type, &permset, &tag, &qual, &name)) {
Packit Service 1d0348
Packit Service 1d0348
		/* Search for a matching entry (tag and qualifier) */
Packit Service 1d0348
		for (i = 0, matched = 0; i < n && !matched; i++) {
Packit Service 1d0348
			if (tag == myacls[marker[i]].tag
Packit Service 1d0348
			    && qual == myacls[marker[i]].qual
Packit Service 1d0348
			    && permset == myacls[marker[i]].permset
Packit Service 1d0348
			    && type == myacls[marker[i]].type) {
Packit Service 1d0348
				/* We found a match; remove it. */
Packit Service 1d0348
				marker[i] = marker[n - 1];
Packit Service 1d0348
				n--;
Packit Service 1d0348
				matched = 1;
Packit Service 1d0348
			}
Packit Service 1d0348
		}
Packit Service 1d0348
Packit Service 1d0348
		failure("ACL entry on file that shouldn't be there: "
Packit Service 1d0348
			"type=%#010x,permset=%#010x,tag=%d,qual=%d",
Packit Service 1d0348
			type,permset,tag,qual);
Packit Service 1d0348
		assert(matched == 1);
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Dump entries in the myacls array that weren't in the system acl. */
Packit Service 1d0348
	for (i = 0; i < n; ++i) {
Packit Service 1d0348
		failure(" ACL entry %d missing from %s: "
Packit Service 1d0348
		    "type=%#010x,permset=%#010x,tag=%d,qual=%d,name=``%s''\n",
Packit Service 1d0348
		    marker[i], filename,
Packit Service 1d0348
		    myacls[marker[i]].type, myacls[marker[i]].permset,
Packit Service 1d0348
		    myacls[marker[i]].tag, myacls[marker[i]].qual,
Packit Service 1d0348
		    myacls[marker[i]].name);
Packit Service 1d0348
		assert(0); /* Record this as a failure. */
Packit Service 1d0348
	}
Packit Service 1d0348
	free(marker);
Packit Service 1d0348
}
Packit Service 1d0348
#endif	/* ARCHIVE_ACL_NFS4 */
Packit Service 1d0348
Packit Service 1d0348
/*
Packit Service 1d0348
 * Verify ACL restore-to-disk.  This test is Platform-specific.
Packit Service 1d0348
 */
Packit Service 1d0348
Packit Service 1d0348
DEFINE_TEST(test_acl_platform_nfs4)
Packit Service 1d0348
{
Packit Service 1d0348
#if !ARCHIVE_ACL_NFS4
Packit Service 1d0348
	skipping("NFS4 ACLs are not supported on this platform");
Packit Service 1d0348
#else /* ARCHIVE_ACL_NFS4 */
Packit Service 1d0348
	char buff[64];
Packit Service 1d0348
	int i;
Packit Service 1d0348
	struct stat st;
Packit Service 1d0348
	struct archive *a;
Packit Service 1d0348
	struct archive_entry *ae;
Packit Service 1d0348
#if ARCHIVE_ACL_DARWIN /* On MacOS we skip trivial ACLs in some tests */
Packit Service 1d0348
	const int regcnt = acls_reg_cnt - 4;
Packit Service 1d0348
	const int dircnt = acls_dir_cnt - 4;
Packit Service 1d0348
#else
Packit Service 1d0348
	const int regcnt = acls_reg_cnt;
Packit Service 1d0348
	const int dircnt = acls_dir_cnt;
Packit Service 1d0348
#endif
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
	void *aclp;
Packit Service 1d0348
	int aclcnt;
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
	struct richacl *richacl;
Packit Service 1d0348
#else	/* !ARCHIVE_ACL_SUNOS_NFS4 */
Packit Service 1d0348
	acl_t acl;
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	assertMakeFile("pretest", 0644, "a");
Packit Service 1d0348
Packit Service 1d0348
	if (setTestAcl("pretest") != ARCHIVE_TEST_ACL_TYPE_NFS4) {
Packit Service 1d0348
		skipping("NFS4 ACLs are not writable on this filesystem");
Packit Service 1d0348
		return;
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Create a write-to-disk object. */
Packit Service 1d0348
	assert(NULL != (a = archive_write_disk_new()));
Packit Service 1d0348
	archive_write_disk_set_options(a,
Packit Service 1d0348
	    ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_ACL);
Packit Service 1d0348
Packit Service 1d0348
	/* Populate an archive entry with some metadata, including ACL info */
Packit Service 1d0348
	ae = archive_entry_new();
Packit Service 1d0348
	assert(ae != NULL);
Packit Service 1d0348
	archive_entry_set_pathname(ae, "testall");
Packit Service 1d0348
	archive_entry_set_filetype(ae, AE_IFREG);
Packit Service 1d0348
	archive_entry_set_perm(ae, 0654);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 123456, 7890);
Packit Service 1d0348
	archive_entry_set_size(ae, 0);
Packit Service 1d0348
	set_acls(ae, acls_reg, 0, acls_reg_cnt);
Packit Service 1d0348
Packit Service 1d0348
	/* Write the entry to disk, including ACLs. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	/* Likewise for a dir. */
Packit Service 1d0348
	archive_entry_set_pathname(ae, "dirall");
Packit Service 1d0348
	archive_entry_set_filetype(ae, AE_IFDIR);
Packit Service 1d0348
	archive_entry_set_perm(ae, 0654);
Packit Service 1d0348
	archive_entry_set_mtime(ae, 123456, 7890);
Packit Service 1d0348
	set_acls(ae, acls_dir, 0, acls_dir_cnt);
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
Packit Service 1d0348
	for (i = 0; i < acls_dir_cnt; ++i) {
Packit Service 1d0348
	  sprintf(buff, "dir%d", i);
Packit Service 1d0348
	  archive_entry_set_pathname(ae, buff);
Packit Service 1d0348
	  archive_entry_set_filetype(ae, AE_IFDIR);
Packit Service 1d0348
	  archive_entry_set_perm(ae, 0654);
Packit Service 1d0348
	  archive_entry_set_mtime(ae, 123456 + i, 7891 + i);
Packit Service 1d0348
	  set_acls(ae, acls_dir, i, i + 1);
Packit Service 1d0348
	  assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
Packit Service 1d0348
	/* Close the archive. */
Packit Service 1d0348
	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
Packit Service 1d0348
Packit Service 1d0348
	/* Verify the data on disk. */
Packit Service 1d0348
	assertEqualInt(0, stat("testall", &st);;
Packit Service 1d0348
	assertEqualInt(st.st_mtime, 123456);
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
	aclp = sunacl_get(ACE_GETACL, &aclcnt, 0, "testall");
Packit Service 1d0348
	failure("acl(\"%s\"): errno = %d (%s)", "testall", errno,
Packit Service 1d0348
	    strerror(errno));
Packit Service 1d0348
	assert(aclp != NULL);
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
	richacl = richacl_get_file("testall");
Packit Service 1d0348
	failure("richacl_get_file(\"%s\"): errno = %d (%s)", "testall", errno,
Packit Service 1d0348
	    strerror(errno));
Packit Service 1d0348
	assert(richacl != NULL);
Packit Service 1d0348
#else
Packit Service 1d0348
#if ARCHIVE_ACL_DARWIN
Packit Service 1d0348
	acl = acl_get_file("testall", ACL_TYPE_EXTENDED);
Packit Service 1d0348
#else
Packit Service 1d0348
	acl = acl_get_file("testall", ACL_TYPE_NFS4);
Packit Service 1d0348
#endif
Packit Service 1d0348
	failure("acl_get_file(\"%s\"): errno = %d (%s)", "testall", errno,
Packit Service 1d0348
	    strerror(errno));
Packit Service 1d0348
	assert(acl != (acl_t)NULL);
Packit Service 1d0348
#endif
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
	compare_acls(aclp, aclcnt, acls_reg, "testall", 0, regcnt);
Packit Service 1d0348
	free(aclp);
Packit Service 1d0348
	aclp = NULL;
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
	compare_acls(richacl, acls_reg, "testall", 0, regcnt);
Packit Service 1d0348
	richacl_free(richacl);
Packit Service 1d0348
#else
Packit Service 1d0348
	compare_acls(acl, acls_reg, "testall", 0, regcnt);
Packit Service 1d0348
	acl_free(acl);
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
Packit Service 1d0348
	/* Verify single-permission dirs on disk. */
Packit Service 1d0348
	for (i = 0; i < dircnt; ++i) {
Packit Service 1d0348
		sprintf(buff, "dir%d", i);
Packit Service 1d0348
		assertEqualInt(0, stat(buff, &st);;
Packit Service 1d0348
		assertEqualInt(st.st_mtime, 123456 + i);
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
		aclp = sunacl_get(ACE_GETACL, &aclcnt, 0, buff);
Packit Service 1d0348
		failure("acl(\"%s\"): errno = %d (%s)", buff, errno,
Packit Service 1d0348
		    strerror(errno));
Packit Service 1d0348
		assert(aclp != NULL);
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
		richacl = richacl_get_file(buff);
Packit Service 1d0348
		/* First and last two dir do not return a richacl */
Packit Service 1d0348
		if ((i == 0 || i >= dircnt - 2) && richacl == NULL &&
Packit Service 1d0348
		    errno == ENODATA)
Packit Service 1d0348
			continue;
Packit Service 1d0348
		failure("richacl_get_file(\"%s\"): errno = %d (%s)", buff,
Packit Service 1d0348
		    errno, strerror(errno));
Packit Service 1d0348
		assert(richacl != NULL);
Packit Service 1d0348
#else
Packit Service 1d0348
#if ARCHIVE_ACL_DARWIN
Packit Service 1d0348
		acl = acl_get_file(buff, ACL_TYPE_EXTENDED);
Packit Service 1d0348
#else
Packit Service 1d0348
		acl = acl_get_file(buff, ACL_TYPE_NFS4);
Packit Service 1d0348
#endif
Packit Service 1d0348
		failure("acl_get_file(\"%s\"): errno = %d (%s)", buff, errno,
Packit Service 1d0348
		    strerror(errno));
Packit Service 1d0348
		assert(acl != (acl_t)NULL);
Packit Service 1d0348
#endif
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
		compare_acls(aclp, aclcnt, acls_dir, buff, i, i + 1);
Packit Service 1d0348
		free(aclp);
Packit Service 1d0348
		aclp = NULL;
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
		compare_acls(richacl, acls_dir, buff, i, i + 1);
Packit Service 1d0348
		richacl_free(richacl);
Packit Service 1d0348
#else
Packit Service 1d0348
		compare_acls(acl, acls_dir, buff, i, i + 1);
Packit Service 1d0348
		acl_free(acl);
Packit Service 1d0348
#endif
Packit Service 1d0348
	}
Packit Service 1d0348
Packit Service 1d0348
	/* Verify "dirall" on disk. */
Packit Service 1d0348
	assertEqualInt(0, stat("dirall", &st);;
Packit Service 1d0348
	assertEqualInt(st.st_mtime, 123456);
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
	aclp = sunacl_get(ACE_GETACL, &aclcnt, 0, "dirall");
Packit Service 1d0348
	failure("acl(\"%s\"): errno = %d (%s)", "dirall", errno,
Packit Service 1d0348
	    strerror(errno));
Packit Service 1d0348
	assert(aclp != NULL);
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
	richacl = richacl_get_file("dirall");
Packit Service 1d0348
	failure("richacl_get_file(\"%s\"): errno = %d (%s)", "dirall",
Packit Service 1d0348
	    errno, strerror(errno));
Packit Service 1d0348
	assert(richacl != NULL);
Packit Service 1d0348
#else
Packit Service 1d0348
#if ARCHIVE_ACL_DARWIN
Packit Service 1d0348
	acl = acl_get_file("dirall", ACL_TYPE_EXTENDED);
Packit Service 1d0348
#else
Packit Service 1d0348
	acl = acl_get_file("dirall", ACL_TYPE_NFS4);
Packit Service 1d0348
#endif
Packit Service 1d0348
	failure("acl_get_file(\"%s\"): errno = %d (%s)", "dirall", errno,
Packit Service 1d0348
	    strerror(errno));
Packit Service 1d0348
	assert(acl != (acl_t)NULL);
Packit Service 1d0348
#endif
Packit Service 1d0348
#if ARCHIVE_ACL_SUNOS_NFS4
Packit Service 1d0348
	compare_acls(aclp, aclcnt, acls_dir, "dirall", 0, dircnt);
Packit Service 1d0348
	free(aclp);
Packit Service 1d0348
	aclp = NULL;
Packit Service 1d0348
#elif ARCHIVE_ACL_LIBRICHACL
Packit Service 1d0348
	compare_acls(richacl, acls_dir, "dirall", 0, dircnt);
Packit Service 1d0348
	richacl_free(richacl);
Packit Service 1d0348
#else
Packit Service 1d0348
	compare_acls(acl, acls_dir, "dirall", 0, dircnt);
Packit Service 1d0348
	acl_free(acl);
Packit Service 1d0348
#endif
Packit Service 1d0348
Packit Service 1d0348
	/* Read and compare ACL via archive_read_disk */
Packit Service 1d0348
	a = archive_read_disk_new();
Packit Service 1d0348
	assert(a != NULL);
Packit Service 1d0348
	ae = archive_entry_new();
Packit Service 1d0348
	assert(ae != NULL);
Packit Service 1d0348
	archive_entry_set_pathname(ae, "testall");
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK,
Packit Service 1d0348
		       archive_read_disk_entry_from_file(a, ae, -1, NULL));
Packit Service 1d0348
	compare_entry_acls(ae, acls_reg, "testall", 0, acls_reg_cnt);
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
Packit Service 1d0348
	/* Read and compare ACL via archive_read_disk */
Packit Service 1d0348
	a = archive_read_disk_new();
Packit Service 1d0348
	assert(a != NULL);
Packit Service 1d0348
	ae = archive_entry_new();
Packit Service 1d0348
	assert(ae != NULL);
Packit Service 1d0348
	archive_entry_set_pathname(ae, "dirall");
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK,
Packit Service 1d0348
	archive_read_disk_entry_from_file(a, ae, -1, NULL));
Packit Service 1d0348
	compare_entry_acls(ae, acls_dir, "dirall", 0, acls_dir_cnt);
Packit Service 1d0348
	archive_entry_free(ae);
Packit Service 1d0348
	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
Packit Service 1d0348
#endif /* ARCHIVE_ACL_NFS4 */
Packit Service 1d0348
}