1caf54c4fSMartin Matuska /*-
2caf54c4fSMartin Matuska  * Copyright (c) 2003-2007 Tim Kientzle
3e9ed7ea4SMartin Matuska  * Copyright (c) 2016 Martin Matuska
4caf54c4fSMartin Matuska  * All rights reserved.
5caf54c4fSMartin Matuska  *
6caf54c4fSMartin Matuska  * Redistribution and use in source and binary forms, with or without
7caf54c4fSMartin Matuska  * modification, are permitted provided that the following conditions
8caf54c4fSMartin Matuska  * are met:
9caf54c4fSMartin Matuska  * 1. Redistributions of source code must retain the above copyright
10caf54c4fSMartin Matuska  *    notice, this list of conditions and the following disclaimer.
11caf54c4fSMartin Matuska  * 2. Redistributions in binary form must reproduce the above copyright
12caf54c4fSMartin Matuska  *    notice, this list of conditions and the following disclaimer in the
13caf54c4fSMartin Matuska  *    documentation and/or other materials provided with the distribution.
14caf54c4fSMartin Matuska  *
15caf54c4fSMartin Matuska  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16caf54c4fSMartin Matuska  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17caf54c4fSMartin Matuska  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18caf54c4fSMartin Matuska  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19caf54c4fSMartin Matuska  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20caf54c4fSMartin Matuska  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21caf54c4fSMartin Matuska  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22caf54c4fSMartin Matuska  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23caf54c4fSMartin Matuska  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24caf54c4fSMartin Matuska  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25caf54c4fSMartin Matuska  */
26caf54c4fSMartin Matuska #include "test.h"
27caf54c4fSMartin Matuska 
28caf54c4fSMartin Matuska /*
29caf54c4fSMartin Matuska  * Exercise the system-independent portion of the ACL support.
30e9ed7ea4SMartin Matuska  * Check that pax archive can save and restore POSIX.1e ACL data.
31caf54c4fSMartin Matuska  *
32caf54c4fSMartin Matuska  * This should work on all systems, regardless of whether local
33caf54c4fSMartin Matuska  * filesystems support ACLs or not.
34caf54c4fSMartin Matuska  */
35caf54c4fSMartin Matuska 
36caf54c4fSMartin Matuska static unsigned char buff[16384];
37caf54c4fSMartin Matuska 
38e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls0[] = {
39caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE,
40caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
41caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
42caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
43caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE,
44caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_OTHER, 0, "" },
45caf54c4fSMartin Matuska };
46caf54c4fSMartin Matuska 
47e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls1[] = {
48caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE,
49caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
50caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
51caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
52caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
53caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
54caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE,
55caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
56caf54c4fSMartin Matuska };
57caf54c4fSMartin Matuska 
58e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls2[] = {
59caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_EXECUTE | ARCHIVE_ENTRY_ACL_READ,
60caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
61caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
62caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
63caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0,
64caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER, 78, "user78" },
65caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_READ,
66caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
67caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0007,
68caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
69caf54c4fSMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, ARCHIVE_ENTRY_ACL_WRITE | ARCHIVE_ENTRY_ACL_EXECUTE,
70caf54c4fSMartin Matuska 	  ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
71caf54c4fSMartin Matuska };
72caf54c4fSMartin Matuska 
73e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls3[] = {
74e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
75e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
76e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
77e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_EXECUTE |
78e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
79e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
80e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
81e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
82e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
83e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
84e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_ACL |
85e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_OWNER |
86e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
87e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
88e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
89e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
90e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
91e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
92e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
93e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
94e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
95e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
96e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
97e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
98e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
99e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
100e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
101e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
102e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
103e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
104e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
105e9ed7ea4SMartin Matuska };
106caf54c4fSMartin Matuska 
107e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls4[] = {
108e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
109e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
110e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
111e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
112e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
113e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
114e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
115e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
116e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
117e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_ACL |
118e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_OWNER |
119e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
120e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
121e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
122e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
123e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
124e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
125e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
126e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE |
127e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_ENTRY_INHERITED,
128e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
129e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_DENY,
130e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
131e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
132e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_EXECUTE,
133e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER, 78, "user78" },
134e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
135e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
136e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
137e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
138e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
139e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
140e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
141e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
142e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
143e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_DENY,
144e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
145e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
146e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
147e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
148e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_ACL |
149e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_OWNER,
150e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
151e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
152e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
153e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
154e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
155e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
156e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
157e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
158e9ed7ea4SMartin Matuska };
159caf54c4fSMartin Matuska 
160e9ed7ea4SMartin Matuska static struct archive_test_acl_t acls5[] = {
161e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
162e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
163e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
164e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_EXECUTE |
165e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
166e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
167e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
168e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
169e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
170e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
171e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_ACL |
172e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_OWNER |
173e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
174e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
175e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
176e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
177e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
178e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
179e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
180e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
181e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
182e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_OWNER |
183e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
184e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
185e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_AUDIT,
186e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
187e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
188e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_ENTRY_SUCCESSFUL_ACCESS,
189e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
190e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
191e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
192e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
193e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
194e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
195e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
196e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
197e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
198e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
199e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALARM,
200e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
201e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
202e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
203e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
204e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_ENTRY_FAILED_ACCESS,
205e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
206e9ed7ea4SMartin Matuska 	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
207e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_DATA |
208e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
209e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
210e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_READ_ACL |
211e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
212e9ed7ea4SMartin Matuska 	  ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
213e9ed7ea4SMartin Matuska };
214caf54c4fSMartin Matuska 
DEFINE_TEST(test_acl_pax_posix1e)215e9ed7ea4SMartin Matuska DEFINE_TEST(test_acl_pax_posix1e)
216caf54c4fSMartin Matuska {
217caf54c4fSMartin Matuska 	struct archive *a;
218caf54c4fSMartin Matuska 	struct archive_entry *ae;
219caf54c4fSMartin Matuska 	size_t used;
220caf54c4fSMartin Matuska 	FILE *f;
2216c95142eSMartin Matuska 	void *reference;
2226c95142eSMartin Matuska 	size_t reference_size;
223caf54c4fSMartin Matuska 
224caf54c4fSMartin Matuska 	/* Write an archive to memory. */
225caf54c4fSMartin Matuska 	assert(NULL != (a = archive_write_new()));
226caf54c4fSMartin Matuska 	assertA(0 == archive_write_set_format_pax(a));
227acc60b03SMartin Matuska 	assertA(0 == archive_write_add_filter_none(a));
228caf54c4fSMartin Matuska 	assertA(0 == archive_write_set_bytes_per_block(a, 1));
229caf54c4fSMartin Matuska 	assertA(0 == archive_write_set_bytes_in_last_block(a, 1));
230caf54c4fSMartin Matuska 	assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used));
231caf54c4fSMartin Matuska 
232caf54c4fSMartin Matuska 	/* Write a series of files to the archive with different ACL info. */
233caf54c4fSMartin Matuska 
234caf54c4fSMartin Matuska 	/* Create a simple archive_entry. */
235caf54c4fSMartin Matuska 	assert((ae = archive_entry_new()) != NULL);
236caf54c4fSMartin Matuska 	archive_entry_set_pathname(ae, "file");
237caf54c4fSMartin Matuska         archive_entry_set_mode(ae, S_IFREG | 0777);
238caf54c4fSMartin Matuska 
239caf54c4fSMartin Matuska 	/* Basic owner/owning group should just update mode bits. */
24064287048SMartin Matuska 	assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
241caf54c4fSMartin Matuska 	assertA(0 == archive_write_header(a, ae));
242caf54c4fSMartin Matuska 
243caf54c4fSMartin Matuska 	/* With any extended ACL entry, we should read back a full set. */
24464287048SMartin Matuska 	assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
245caf54c4fSMartin Matuska 	assertA(0 == archive_write_header(a, ae));
246caf54c4fSMartin Matuska 
247caf54c4fSMartin Matuska 	/* A more extensive set of ACLs. */
24864287048SMartin Matuska 	assertEntrySetAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]));
249caf54c4fSMartin Matuska 	assertA(0 == archive_write_header(a, ae));
250caf54c4fSMartin Matuska 
251caf54c4fSMartin Matuska 	/*
252caf54c4fSMartin Matuska 	 * Check that clearing ACLs gets rid of them all by repeating
253caf54c4fSMartin Matuska 	 * the first test.
254caf54c4fSMartin Matuska 	 */
25564287048SMartin Matuska 	assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
256caf54c4fSMartin Matuska 	assertA(0 == archive_write_header(a, ae));
257caf54c4fSMartin Matuska 	archive_entry_free(ae);
258caf54c4fSMartin Matuska 
259caf54c4fSMartin Matuska 	/* Close out the archive. */
2606c95142eSMartin Matuska 	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
2616c95142eSMartin Matuska 	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
262caf54c4fSMartin Matuska 
263caf54c4fSMartin Matuska 	/* Write out the data we generated to a file for manual inspection. */
264caf54c4fSMartin Matuska 	assert(NULL != (f = fopen("testout", "wb")));
265caf54c4fSMartin Matuska 	assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f));
266caf54c4fSMartin Matuska 	fclose(f);
267caf54c4fSMartin Matuska 
268caf54c4fSMartin Matuska 	/* Write out the reference data to a file for manual inspection. */
269e9ed7ea4SMartin Matuska 	extract_reference_file("test_acl_pax_posix1e.tar");
270e9ed7ea4SMartin Matuska 	reference = slurpfile(&reference_size, "test_acl_pax_posix1e.tar");
271caf54c4fSMartin Matuska 
272caf54c4fSMartin Matuska 	/* Assert that the generated data matches the built-in reference data.*/
273e9ed7ea4SMartin Matuska 	failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_posix1e.tar' reference file.");
2746c95142eSMartin Matuska 	assertEqualMem(buff, reference, reference_size);
275e9ed7ea4SMartin Matuska 	failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_posix1e.tar' reference file.");
2766c95142eSMartin Matuska 	assertEqualInt((int)used, reference_size);
2776c95142eSMartin Matuska 	free(reference);
278caf54c4fSMartin Matuska 
279caf54c4fSMartin Matuska 	/* Read back each entry and check that the ACL data is right. */
280caf54c4fSMartin Matuska 	assert(NULL != (a = archive_read_new()));
281caf54c4fSMartin Matuska 	assertA(0 == archive_read_support_format_all(a));
2826c95142eSMartin Matuska 	assertA(0 == archive_read_support_filter_all(a));
283caf54c4fSMartin Matuska 	assertA(0 == archive_read_open_memory(a, buff, used));
284caf54c4fSMartin Matuska 
285caf54c4fSMartin Matuska 	/* First item has no ACLs */
286caf54c4fSMartin Matuska 	assertA(0 == archive_read_next_header(a, &ae));
287caf54c4fSMartin Matuska 	failure("Basic ACLs shouldn't be stored as extended ACLs");
288caf54c4fSMartin Matuska 	assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
289caf54c4fSMartin Matuska 	failure("Basic ACLs should set mode to 0142, not %04o",
290caf54c4fSMartin Matuska 	    archive_entry_mode(ae)&0777);
291caf54c4fSMartin Matuska 	assert((archive_entry_mode(ae) & 0777) == 0142);
292caf54c4fSMartin Matuska 
293caf54c4fSMartin Matuska 	/* Second item has a few ACLs */
294caf54c4fSMartin Matuska 	assertA(0 == archive_read_next_header(a, &ae));
295caf54c4fSMartin Matuska 	failure("One extended ACL should flag all ACLs to be returned.");
296caf54c4fSMartin Matuska 	assert(4 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
29764287048SMartin Matuska 	assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
298e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0142);
299caf54c4fSMartin Matuska 	failure("Basic ACLs should set mode to 0142, not %04o",
300caf54c4fSMartin Matuska 	    archive_entry_mode(ae)&0777);
301caf54c4fSMartin Matuska 	assert((archive_entry_mode(ae) & 0777) == 0142);
302caf54c4fSMartin Matuska 
303caf54c4fSMartin Matuska 	/* Third item has pretty extensive ACLs */
304caf54c4fSMartin Matuska 	assertA(0 == archive_read_next_header(a, &ae));
305e9ed7ea4SMartin Matuska 	assertEqualInt(6, archive_entry_acl_reset(ae,
306e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
30764287048SMartin Matuska 	assertEntryCompareAcls(ae, acls2, sizeof(acls2)/sizeof(acls2[0]),
308e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0543);
309caf54c4fSMartin Matuska 	failure("Basic ACLs should set mode to 0543, not %04o",
310caf54c4fSMartin Matuska 	    archive_entry_mode(ae)&0777);
311caf54c4fSMartin Matuska 	assert((archive_entry_mode(ae) & 0777) == 0543);
312caf54c4fSMartin Matuska 
313caf54c4fSMartin Matuska 	/* Fourth item has no ACLs */
314caf54c4fSMartin Matuska 	assertA(0 == archive_read_next_header(a, &ae));
315caf54c4fSMartin Matuska 	failure("Basic ACLs shouldn't be stored as extended ACLs");
316caf54c4fSMartin Matuska 	assert(0 == archive_entry_acl_reset(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
317caf54c4fSMartin Matuska 	failure("Basic ACLs should set mode to 0142, not %04o",
318caf54c4fSMartin Matuska 	    archive_entry_mode(ae)&0777);
319caf54c4fSMartin Matuska 	assert((archive_entry_mode(ae) & 0777) == 0142);
320caf54c4fSMartin Matuska 
321caf54c4fSMartin Matuska 	/* Close the archive. */
3226c95142eSMartin Matuska 	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
3236c95142eSMartin Matuska 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
324caf54c4fSMartin Matuska }
325e9ed7ea4SMartin Matuska 
DEFINE_TEST(test_acl_pax_nfs4)326e9ed7ea4SMartin Matuska DEFINE_TEST(test_acl_pax_nfs4)
327e9ed7ea4SMartin Matuska {
328e9ed7ea4SMartin Matuska 	struct archive *a;
329e9ed7ea4SMartin Matuska 	struct archive_entry *ae;
330e9ed7ea4SMartin Matuska 	size_t used;
331e9ed7ea4SMartin Matuska 	FILE *f;
332e9ed7ea4SMartin Matuska 	void *reference;
333e9ed7ea4SMartin Matuska 	size_t reference_size;
334e9ed7ea4SMartin Matuska 
335e9ed7ea4SMartin Matuska 	/* Write an archive to memory. */
336e9ed7ea4SMartin Matuska 	assert(NULL != (a = archive_write_new()));
337e9ed7ea4SMartin Matuska 	assertA(0 == archive_write_set_format_pax(a));
338e9ed7ea4SMartin Matuska 	assertA(0 == archive_write_add_filter_none(a));
339e9ed7ea4SMartin Matuska 	assertA(0 == archive_write_set_bytes_per_block(a, 1));
340e9ed7ea4SMartin Matuska 	assertA(0 == archive_write_set_bytes_in_last_block(a, 1));
341e9ed7ea4SMartin Matuska 	assertA(0 == archive_write_open_memory(a, buff, sizeof(buff), &used));
342e9ed7ea4SMartin Matuska 
343e9ed7ea4SMartin Matuska 	/* Write a series of files to the archive with different ACL info. */
344e9ed7ea4SMartin Matuska 
345e9ed7ea4SMartin Matuska 	/* Create a simple archive_entry. */
346e9ed7ea4SMartin Matuska 	assert((ae = archive_entry_new()) != NULL);
347e9ed7ea4SMartin Matuska 	archive_entry_set_pathname(ae, "file");
348e9ed7ea4SMartin Matuska         archive_entry_set_mode(ae, S_IFREG | 0777);
349e9ed7ea4SMartin Matuska 
350e9ed7ea4SMartin Matuska 	/* NFS4 ACLs mirroring 0754 file mode */
35164287048SMartin Matuska 	assertEntrySetAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]));
352e9ed7ea4SMartin Matuska 	assertA(0 == archive_write_header(a, ae));
353e9ed7ea4SMartin Matuska 
354e9ed7ea4SMartin Matuska 	/* A more extensive set of NFS4 ACLs. */
35564287048SMartin Matuska 	assertEntrySetAcls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]));
356e9ed7ea4SMartin Matuska 	assertA(0 == archive_write_header(a, ae));
357e9ed7ea4SMartin Matuska 
358e9ed7ea4SMartin Matuska 	/* Set with special (audit, alarm) NFS4 ACLs. */
35964287048SMartin Matuska 	assertEntrySetAcls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]));
360e9ed7ea4SMartin Matuska 	assertA(0 == archive_write_header(a, ae));
361e9ed7ea4SMartin Matuska 
362e9ed7ea4SMartin Matuska 	archive_entry_free(ae);
363e9ed7ea4SMartin Matuska 
364e9ed7ea4SMartin Matuska 	/* Close out the archive. */
365e9ed7ea4SMartin Matuska 	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
366e9ed7ea4SMartin Matuska 	assertEqualInt(ARCHIVE_OK, archive_write_free(a));
367e9ed7ea4SMartin Matuska 
368e9ed7ea4SMartin Matuska 	/* Write out the data we generated to a file for manual inspection. */
369e9ed7ea4SMartin Matuska 	assert(NULL != (f = fopen("testout", "wb")));
370e9ed7ea4SMartin Matuska 	assertEqualInt(used, (size_t)fwrite(buff, 1, (unsigned int)used, f));
371e9ed7ea4SMartin Matuska 	fclose(f);
372e9ed7ea4SMartin Matuska 
373e9ed7ea4SMartin Matuska 	/* Write out the reference data to a file for manual inspection. */
374e9ed7ea4SMartin Matuska 	extract_reference_file("test_acl_pax_nfs4.tar");
375e9ed7ea4SMartin Matuska 	reference = slurpfile(&reference_size, "test_acl_pax_nfs4.tar");
376e9ed7ea4SMartin Matuska 
377e9ed7ea4SMartin Matuska 	/* Assert that the generated data matches the built-in reference data.*/
378e9ed7ea4SMartin Matuska 	failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_nfs4.tar' reference file.");
379e9ed7ea4SMartin Matuska 	assertEqualMem(buff, reference, reference_size);
380e9ed7ea4SMartin Matuska 	failure("Generated pax archive does not match reference; compare 'testout' to 'test_acl_pax_nfs4.tar' reference file.");
381e9ed7ea4SMartin Matuska 	assertEqualInt((int)used, reference_size);
382e9ed7ea4SMartin Matuska 	free(reference);
383e9ed7ea4SMartin Matuska 
384e9ed7ea4SMartin Matuska 	/* Read back each entry and check that the ACL data is right. */
385e9ed7ea4SMartin Matuska 	assert(NULL != (a = archive_read_new()));
386e9ed7ea4SMartin Matuska 	assertA(0 == archive_read_support_format_all(a));
387e9ed7ea4SMartin Matuska 	assertA(0 == archive_read_support_filter_all(a));
388e9ed7ea4SMartin Matuska 	assertA(0 == archive_read_open_memory(a, buff, used));
389e9ed7ea4SMartin Matuska 
390e9ed7ea4SMartin Matuska 	/* First item has NFS4 ACLs mirroring file mode */
391e9ed7ea4SMartin Matuska 	assertA(0 == archive_read_next_header(a, &ae));
392e9ed7ea4SMartin Matuska 	assertEqualInt(3, archive_entry_acl_reset(ae,
393e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_TYPE_ALLOW));
39464287048SMartin Matuska 	assertEntryCompareAcls(ae, acls3, sizeof(acls3)/sizeof(acls3[0]),
395e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_TYPE_ALLOW, 0);
396e9ed7ea4SMartin Matuska 
397e9ed7ea4SMartin Matuska 	/* Second item has has more fine-grained NFS4 ACLs */
398e9ed7ea4SMartin Matuska 	assertA(0 == archive_read_next_header(a, &ae));
399e9ed7ea4SMartin Matuska 	assertEqualInt(6, archive_entry_acl_reset(ae,
400e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
40164287048SMartin Matuska 	assertEntryCompareAcls(ae, acls4, sizeof(acls4)/sizeof(acls4[0]),
402e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
403e9ed7ea4SMartin Matuska 
404e9ed7ea4SMartin Matuska 	/* Third item has has audit and alarm NFS4 ACLs */
405e9ed7ea4SMartin Matuska 	assertA(0 == archive_read_next_header(a, &ae));
406e9ed7ea4SMartin Matuska 	assertEqualInt(6, archive_entry_acl_reset(ae,
407e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
40864287048SMartin Matuska 	assertEntryCompareAcls(ae, acls5, sizeof(acls5)/sizeof(acls5[0]),
409e9ed7ea4SMartin Matuska 	    ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
410e9ed7ea4SMartin Matuska 
411e9ed7ea4SMartin Matuska 	/* Close the archive. */
412e9ed7ea4SMartin Matuska 	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
413e9ed7ea4SMartin Matuska 	assertEqualInt(ARCHIVE_OK, archive_read_free(a));
414e9ed7ea4SMartin Matuska }
415