test_acl_text.c revision 313571
11539Srgrimes/*-
21539Srgrimes * Copyright (c) 2016 Martin Matuska
31539Srgrimes * All rights reserved.
41539Srgrimes *
51539Srgrimes * Redistribution and use in source and binary forms, with or without
61539Srgrimes * modification, are permitted provided that the following conditions
71539Srgrimes * are met:
81539Srgrimes * 1. Redistributions of source code must retain the above copyright
91539Srgrimes *    notice, this list of conditions and the following disclaimer.
101539Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
111539Srgrimes *    notice, this list of conditions and the following disclaimer in the
121539Srgrimes *    documentation and/or other materials provided with the distribution.
131539Srgrimes *
141539Srgrimes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
151539Srgrimes * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
161539Srgrimes * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
171539Srgrimes * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
181539Srgrimes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
191539Srgrimes * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
201539Srgrimes * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
211539Srgrimes * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
221539Srgrimes * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
231539Srgrimes * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
241539Srgrimes */
251539Srgrimes#include "test.h"
261539Srgrimes__FBSDID("$FreeBSD: stable/10/contrib/libarchive/libarchive/test/test_acl_text.c 313571 2017-02-11 00:56:18Z mm $");
271539Srgrimes
281539Srgrimes/*
291539Srgrimes * Test converting ACLs to text, both wide and non-wide
301539Srgrimes *
311539Srgrimes * This should work on all systems, regardless of whether local
321539Srgrimes * filesystems support ACLs or not.
331539Srgrimes */
3469793Sobrien
351539Srgrimesstatic struct archive_test_acl_t acls0[] = {
361539Srgrimes	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
371539Srgrimes	    ARCHIVE_ENTRY_ACL_EXECUTE |
381539Srgrimes	    ARCHIVE_ENTRY_ACL_READ |
391539Srgrimes	    ARCHIVE_ENTRY_ACL_WRITE,
403041Swollman	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
413041Swollman	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
421539Srgrimes	    ARCHIVE_ENTRY_ACL_EXECUTE |
431539Srgrimes	    ARCHIVE_ENTRY_ACL_READ,
441539Srgrimes	  ARCHIVE_ENTRY_ACL_USER, 100, "user100" },
451539Srgrimes	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0,
461570Srgrimes	  ARCHIVE_ENTRY_ACL_USER, 1000, "user1000" },
471539Srgrimes	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
4887136Srwatson	    ARCHIVE_ENTRY_ACL_EXECUTE |
491539Srgrimes	    ARCHIVE_ENTRY_ACL_READ,
5087135Srwatson	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
5187135Srwatson	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
521539Srgrimes	    ARCHIVE_ENTRY_ACL_EXECUTE |
531539Srgrimes	    ARCHIVE_ENTRY_ACL_READ |
5473986Sobrien	    ARCHIVE_ENTRY_ACL_WRITE,
551539Srgrimes	  ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
561539Srgrimes	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
5769793Sobrien	    ARCHIVE_ENTRY_ACL_READ |
581539Srgrimes	    ARCHIVE_ENTRY_ACL_EXECUTE,
593189Spst	  ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
601539Srgrimes	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
611539Srgrimes	    ARCHIVE_ENTRY_ACL_EXECUTE |
621539Srgrimes	    ARCHIVE_ENTRY_ACL_READ,
631539Srgrimes	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
6442515Sasami	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
651539Srgrimes	    ARCHIVE_ENTRY_ACL_EXECUTE |
661539Srgrimes	    ARCHIVE_ENTRY_ACL_READ,
671539Srgrimes	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
683041Swollman	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0,
691539Srgrimes	  ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
701539Srgrimes	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
711539Srgrimes	    ARCHIVE_ENTRY_ACL_EXECUTE |
721539Srgrimes	    ARCHIVE_ENTRY_ACL_READ,
731539Srgrimes	  ARCHIVE_ENTRY_ACL_USER, 101, "user101"},
741539Srgrimes	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
751539Srgrimes	    ARCHIVE_ENTRY_ACL_EXECUTE,
761539Srgrimes	  ARCHIVE_ENTRY_ACL_GROUP, 79, "group79" },
776083Swpaul};
7810975Sache
791539Srgrimesstatic struct archive_test_acl_t acls1[] = {
803041Swollman	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
813041Swollman	    ARCHIVE_ENTRY_ACL_READ_DATA |
8293032Simp	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
833041Swollman	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
843041Swollman	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
851539Srgrimes	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
86	    ARCHIVE_ENTRY_ACL_READ_ACL |
87	    ARCHIVE_ENTRY_ACL_WRITE_OWNER,
88	  ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
89	{ ARCHIVE_ENTRY_ACL_TYPE_DENY,
90	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
91	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
92	    ARCHIVE_ENTRY_ACL_DELETE_CHILD |
93	    ARCHIVE_ENTRY_ACL_DELETE |
94	    ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT |
95	    ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT |
96	    ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY |
97	    ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT,
98	  ARCHIVE_ENTRY_ACL_USER, 101, "user101" },
99	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
100	    ARCHIVE_ENTRY_ACL_READ_DATA |
101	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
102	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
103	    ARCHIVE_ENTRY_ACL_READ_ACL |
104	    ARCHIVE_ENTRY_ACL_ENTRY_INHERITED,
105	  ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
106	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
107	    ARCHIVE_ENTRY_ACL_READ_DATA |
108	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
109	    ARCHIVE_ENTRY_ACL_EXECUTE |
110	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
111	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
112	    ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
113	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
114	    ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
115	    ARCHIVE_ENTRY_ACL_READ_ACL |
116	    ARCHIVE_ENTRY_ACL_WRITE_ACL |
117	    ARCHIVE_ENTRY_ACL_WRITE_OWNER,
118	  ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
119	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
120	    ARCHIVE_ENTRY_ACL_READ_DATA |
121	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
122	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
123	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
124	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
125	    ARCHIVE_ENTRY_ACL_READ_ACL,
126	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
127	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
128	    ARCHIVE_ENTRY_ACL_READ_DATA |
129	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
130	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
131	    ARCHIVE_ENTRY_ACL_READ_ACL |
132	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
133	  ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
134};
135
136const char* acltext[] = {
137	"user::rwx\n"
138	"group::r-x\n"
139	"other::r-x\n"
140	"user:user100:r-x\n"
141	"user:user1000:---\n"
142	"group:group78:rwx\n"
143	"default:user::r-x\n"
144	"default:group::r-x\n"
145	"default:other::---\n"
146	"default:user:user101:r-x\n"
147	"default:group:group79:--x",
148
149	"user::rwx\n"
150	"group::r-x\n"
151	"other::r-x\n"
152	"user:user100:r-x:100\n"
153	"user:user1000:---:1000\n"
154	"group:group78:rwx:78\n"
155	"default:user::r-x\n"
156	"default:group::r-x\n"
157	"default:other::---\n"
158	"default:user:user101:r-x:101\n"
159	"default:group:group79:--x:79",
160
161	"u::rwx\n"
162	"g::r-x\n"
163	"o::r-x\n"
164	"u:user100:r-x:100\n"
165	"u:user1000:---:1000\n"
166	"g:group78:rwx:78\n"
167	"d:user::r-x\n"
168	"d:group::r-x\n"
169	"d:other::---\n"
170	"d:user:user101:r-x:101\n"
171	"d:group:group79:--x:79",
172
173	"user::rwx\n"
174	"group::r-x\n"
175	"other::r-x\n"
176	"user:user100:r-x\n"
177	"user:user1000:---\n"
178	"group:group78:rwx",
179
180	"user::rwx,"
181	"group::r-x,"
182	"other::r-x,"
183	"user:user100:r-x,"
184	"user:user1000:---,"
185	"group:group78:rwx",
186
187	"user::rwx\n"
188	"group::r-x\n"
189	"other::r-x\n"
190	"user:user100:r-x:100\n"
191	"user:user1000:---:1000\n"
192	"group:group78:rwx:78",
193
194	"user::r-x\n"
195	"group::r-x\n"
196	"other::---\n"
197	"user:user101:r-x\n"
198	"group:group79:--x",
199
200	"user::r-x\n"
201	"group::r-x\n"
202	"other::---\n"
203	"user:user101:r-x:101\n"
204	"group:group79:--x:79",
205
206	"default:user::r-x\n"
207	"default:group::r-x\n"
208	"default:other::---\n"
209	"default:user:user101:r-x\n"
210	"default:group:group79:--x",
211
212	"user:user77:rw-p--a-R-c-o-:-------:allow\n"
213	"user:user101:-w-pdD--------:fdin---:deny\n"
214	"group:group78:r-----a-R-c---:------I:allow\n"
215	"owner@:rwxp--aARWcCo-:-------:allow\n"
216	"group@:rw-p--a-R-c---:-------:allow\n"
217	"everyone@:r-----a-R-c--s:-------:allow",
218
219	"user:user77:rw-p--a-R-c-o-:-------:allow:77\n"
220	"user:user101:-w-pdD--------:fdin---:deny:101\n"
221	"group:group78:r-----a-R-c---:------I:allow:78\n"
222	"owner@:rwxp--aARWcCo-:-------:allow\n"
223	"group@:rw-p--a-R-c---:-------:allow\n"
224	"everyone@:r-----a-R-c--s:-------:allow"
225};
226
227static wchar_t *
228convert_s_to_ws(const char *s)
229{
230	size_t len;
231	wchar_t *ws = NULL;
232
233	if (s != NULL) {
234		len = strlen(s) + 1;
235		ws = malloc(len * sizeof(wchar_t));
236		assert(mbstowcs(ws, s, len) != (size_t)-1);
237	}
238
239	return (ws);
240}
241
242static void
243compare_acl_text(struct archive_entry *ae, int flags, const char *s)
244{
245	char *text;
246	wchar_t *wtext;
247	wchar_t *ws;
248	ssize_t slen;
249
250	ws = convert_s_to_ws(s);
251
252	text = archive_entry_acl_to_text(ae, &slen, flags);
253	assertEqualString(text, s);
254	if (text != NULL)
255		assertEqualInt(strlen(text), slen);
256	wtext = archive_entry_acl_to_text_w(ae, &slen, flags);
257	assertEqualWString(wtext, ws);
258	if (wtext != NULL) {
259		assertEqualInt(wcslen(wtext), slen);
260	}
261	free(text);
262	free(wtext);
263	free(ws);
264}
265
266DEFINE_TEST(test_acl_from_text)
267{
268	struct archive_entry *ae;
269	wchar_t *ws = NULL;
270
271	/* Create an empty archive_entry. */
272	assert((ae = archive_entry_new()) != NULL);
273
274	/* 1a. Read POSIX.1e access ACLs from text */
275	assertEqualInt(ARCHIVE_OK,
276	    archive_entry_acl_from_text(ae, acltext[5],
277	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
278	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
279	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755);
280	assertEqualInt(6, archive_entry_acl_reset(ae,
281	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
282
283	/* 1b. Now read POSIX.1e default ACLs and append them */
284	assertEqualInt(ARCHIVE_OK,
285	    archive_entry_acl_from_text(ae, acltext[7],
286	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
287	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
288	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
289	assertEqualInt(11, archive_entry_acl_reset(ae,
290	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
291	archive_entry_acl_clear(ae);
292
293	/* 1a and 1b with wide strings */
294	ws = convert_s_to_ws(acltext[5]);
295
296	assertEqualInt(ARCHIVE_OK,
297	    archive_entry_acl_from_text_w(ae, ws,
298	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
299	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
300	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755);
301	assertEqualInt(6, archive_entry_acl_reset(ae,
302	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
303
304	free(ws);
305	ws = convert_s_to_ws(acltext[7]);
306
307	assertEqualInt(ARCHIVE_OK,
308	    archive_entry_acl_from_text_w(ae, ws,
309	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
310	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
311	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
312	assertEqualInt(11, archive_entry_acl_reset(ae,
313	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
314	archive_entry_acl_clear(ae);
315
316	/* 2. Read POSIX.1e default ACLs from text */
317	assertEqualInt(ARCHIVE_OK,
318	    archive_entry_acl_from_text(ae, acltext[7],
319	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
320	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
321	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0);
322	assertEqualInt(5, archive_entry_acl_reset(ae,
323	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
324	archive_entry_acl_clear(ae);
325
326	/* ws is still acltext[7] */
327	assertEqualInt(ARCHIVE_OK,
328	    archive_entry_acl_from_text_w(ae, ws,
329	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
330	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
331	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0);
332	assertEqualInt(5, archive_entry_acl_reset(ae,
333	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
334	archive_entry_acl_clear(ae);
335
336	/* 3. Read POSIX.1e access and default ACLs from text */
337	assertEqualInt(ARCHIVE_OK,
338	    archive_entry_acl_from_text(ae, acltext[1],
339	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
340	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
341	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
342	assertEqualInt(11, archive_entry_acl_reset(ae,
343	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
344	archive_entry_acl_clear(ae);
345
346	free(ws);
347	ws = convert_s_to_ws(acltext[1]);
348	assertEqualInt(ARCHIVE_OK,
349	    archive_entry_acl_from_text_w(ae, ws,
350	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
351	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
352	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
353	assertEqualInt(11, archive_entry_acl_reset(ae,
354	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
355	archive_entry_acl_clear(ae);
356
357	/* 4. Read POSIX.1e access and default ACLs from text (short form) */
358	assertEqualInt(ARCHIVE_OK,
359	    archive_entry_acl_from_text(ae, acltext[2],
360	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
361	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
362	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
363	assertEqualInt(11, archive_entry_acl_reset(ae,
364	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
365	archive_entry_acl_clear(ae);
366
367	free(ws);
368	ws = convert_s_to_ws(acltext[2]);
369	assertEqualInt(ARCHIVE_OK,
370	    archive_entry_acl_from_text_w(ae, ws,
371	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
372	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
373	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
374	assertEqualInt(11, archive_entry_acl_reset(ae,
375	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
376	archive_entry_acl_clear(ae);
377
378	/* 5. Read NFSv4 ACLs from text */
379	assertEqualInt(ARCHIVE_OK,
380	    archive_entry_acl_from_text(ae, acltext[10],
381	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
382	archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
383	    ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
384	assertEqualInt(6, archive_entry_acl_reset(ae,
385	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
386	archive_entry_acl_clear(ae);
387
388	free(ws);
389	ws = convert_s_to_ws(acltext[10]);
390
391	assertEqualInt(ARCHIVE_OK,
392	    archive_entry_acl_from_text_w(ae, ws,
393	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
394	archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
395	    ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
396	assertEqualInt(6, archive_entry_acl_reset(ae,
397	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
398	archive_entry_acl_clear(ae);
399
400	free(ws);
401	archive_entry_free(ae);
402}
403
404DEFINE_TEST(test_acl_to_text)
405{
406	struct archive_entry *ae;
407
408	/* Create an empty archive_entry. */
409	assert((ae = archive_entry_new()) != NULL);
410
411	/* Write POSIX.1e ACLs  */
412	archive_test_set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
413
414	/* No flags should give output like getfacl(1) on linux */
415	compare_acl_text(ae, 0, acltext[0]);
416
417	/* This should give the same output as previous test */
418	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
419	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, acltext[0]);
420
421	/* This should give the same output as previous two tests */
422	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
423	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT |
424	    ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT, acltext[0]);
425
426	/* POSIX.1e access and default ACLs with appended ID */
427	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[1]);
428
429	/* POSIX.1e access acls only, like getfacl(1) on FreeBSD */
430	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS, acltext[3]);
431
432	/* POSIX.1e access acls separated with comma */
433	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
434	    ARCHIVE_ENTRY_ACL_STYLE_SEPARATOR_COMMA,
435	    acltext[4]);
436
437	/* POSIX.1e access acls with appended user or group ID */
438	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
439	    ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[5]);
440
441	/* POSIX.1e default acls */
442	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, acltext[6]);
443
444	/* POSIX.1e default acls with appended user or group ID */
445	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT |
446	    ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[7]);
447
448	/* POSIX.1e default acls prefixed with default: */
449	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT |
450	    ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT, acltext[8]);
451
452	/* Write NFSv4 ACLs */
453	archive_test_set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
454
455	/* NFSv4 ACLs like getfacl(1) on FreeBSD */
456	compare_acl_text(ae, 0, acltext[9]);
457
458	/* NFSv4 ACLs like "getfacl -i" on FreeBSD */
459	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[10]);
460
461	archive_entry_free(ae);
462}
463