test_acl_text.c revision 313926
1/*-
2 * Copyright (c) 2016 Martin Matuska
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25#include "test.h"
26__FBSDID("$FreeBSD: stable/11/contrib/libarchive/libarchive/test/test_acl_text.c 313926 2017-02-18 21:58:56Z mm $");
27
28/*
29 * Test converting ACLs to text, both wide and non-wide
30 *
31 * This should work on all systems, regardless of whether local
32 * filesystems support ACLs or not.
33 */
34
35static struct archive_test_acl_t acls0[] = {
36	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
37	    ARCHIVE_ENTRY_ACL_EXECUTE |
38	    ARCHIVE_ENTRY_ACL_READ |
39	    ARCHIVE_ENTRY_ACL_WRITE,
40	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
41	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
42	    ARCHIVE_ENTRY_ACL_EXECUTE |
43	    ARCHIVE_ENTRY_ACL_READ,
44	  ARCHIVE_ENTRY_ACL_USER, 100, "user100" },
45	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0,
46	  ARCHIVE_ENTRY_ACL_USER, 1000, "user1000" },
47	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
48	    ARCHIVE_ENTRY_ACL_EXECUTE |
49	    ARCHIVE_ENTRY_ACL_READ,
50	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
51	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
52	    ARCHIVE_ENTRY_ACL_EXECUTE |
53	    ARCHIVE_ENTRY_ACL_READ |
54	    ARCHIVE_ENTRY_ACL_WRITE,
55	  ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
56	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
57	    ARCHIVE_ENTRY_ACL_READ |
58	    ARCHIVE_ENTRY_ACL_EXECUTE,
59	  ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
60	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
61	    ARCHIVE_ENTRY_ACL_EXECUTE |
62	    ARCHIVE_ENTRY_ACL_READ,
63	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
64	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
65	    ARCHIVE_ENTRY_ACL_EXECUTE |
66	    ARCHIVE_ENTRY_ACL_READ,
67	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
68	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0,
69	  ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
70	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
71	    ARCHIVE_ENTRY_ACL_EXECUTE |
72	    ARCHIVE_ENTRY_ACL_READ,
73	  ARCHIVE_ENTRY_ACL_USER, 101, "user101"},
74	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
75	    ARCHIVE_ENTRY_ACL_EXECUTE,
76	  ARCHIVE_ENTRY_ACL_GROUP, 79, "group79" },
77};
78
79static struct archive_test_acl_t acls1[] = {
80	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
81	    ARCHIVE_ENTRY_ACL_READ_DATA |
82	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
83	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
84	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
85	    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	"user:user77:rwpaRco::allow:77\n"
227	"user:user101:wpdD:fdin:deny:101\n"
228	"group:group78:raRc:I:allow:78\n"
229	"owner@:rwxpaARWcCo::allow\n"
230	"group@:rwpaRc::allow\n"
231	"everyone@:raRcs::allow"
232};
233
234static wchar_t *
235convert_s_to_ws(const char *s)
236{
237	size_t len;
238	wchar_t *ws = NULL;
239
240	if (s != NULL) {
241		len = strlen(s) + 1;
242		ws = malloc(len * sizeof(wchar_t));
243		assert(mbstowcs(ws, s, len) != (size_t)-1);
244	}
245
246	return (ws);
247}
248
249static void
250compare_acl_text(struct archive_entry *ae, int flags, const char *s)
251{
252	char *text;
253	wchar_t *wtext;
254	wchar_t *ws;
255	ssize_t slen;
256
257	ws = convert_s_to_ws(s);
258
259	text = archive_entry_acl_to_text(ae, &slen, flags);
260	assertEqualString(text, s);
261	if (text != NULL)
262		assertEqualInt(strlen(text), slen);
263	wtext = archive_entry_acl_to_text_w(ae, &slen, flags);
264	assertEqualWString(wtext, ws);
265	if (wtext != NULL) {
266		assertEqualInt(wcslen(wtext), slen);
267	}
268	free(text);
269	free(wtext);
270	free(ws);
271}
272
273DEFINE_TEST(test_acl_from_text)
274{
275	struct archive_entry *ae;
276	wchar_t *ws = NULL;
277
278	/* Create an empty archive_entry. */
279	assert((ae = archive_entry_new()) != NULL);
280
281	/* 1a. Read POSIX.1e access ACLs from text */
282	assertEqualInt(ARCHIVE_OK,
283	    archive_entry_acl_from_text(ae, acltext[5],
284	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
285	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
286	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755);
287	assertEqualInt(6, archive_entry_acl_reset(ae,
288	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
289
290	/* 1b. Now read POSIX.1e default ACLs and append them */
291	assertEqualInt(ARCHIVE_OK,
292	    archive_entry_acl_from_text(ae, acltext[7],
293	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
294	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
295	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
296	assertEqualInt(11, archive_entry_acl_reset(ae,
297	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
298	archive_entry_acl_clear(ae);
299
300	/* 1a and 1b with wide strings */
301	ws = convert_s_to_ws(acltext[5]);
302
303	assertEqualInt(ARCHIVE_OK,
304	    archive_entry_acl_from_text_w(ae, ws,
305	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
306	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
307	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755);
308	assertEqualInt(6, archive_entry_acl_reset(ae,
309	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
310
311	free(ws);
312	ws = convert_s_to_ws(acltext[7]);
313
314	assertEqualInt(ARCHIVE_OK,
315	    archive_entry_acl_from_text_w(ae, ws,
316	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
317	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
318	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
319	assertEqualInt(11, archive_entry_acl_reset(ae,
320	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
321	archive_entry_acl_clear(ae);
322
323	/* 2. Read POSIX.1e default ACLs from text */
324	assertEqualInt(ARCHIVE_OK,
325	    archive_entry_acl_from_text(ae, acltext[7],
326	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
327	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
328	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0);
329	assertEqualInt(5, archive_entry_acl_reset(ae,
330	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
331	archive_entry_acl_clear(ae);
332
333	/* ws is still acltext[7] */
334	assertEqualInt(ARCHIVE_OK,
335	    archive_entry_acl_from_text_w(ae, ws,
336	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
337	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
338	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0);
339	assertEqualInt(5, archive_entry_acl_reset(ae,
340	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
341	archive_entry_acl_clear(ae);
342
343	/* 3. Read POSIX.1e access and default ACLs from text */
344	assertEqualInt(ARCHIVE_OK,
345	    archive_entry_acl_from_text(ae, acltext[1],
346	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
347	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
348	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
349	assertEqualInt(11, archive_entry_acl_reset(ae,
350	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
351	archive_entry_acl_clear(ae);
352
353	free(ws);
354	ws = convert_s_to_ws(acltext[1]);
355	assertEqualInt(ARCHIVE_OK,
356	    archive_entry_acl_from_text_w(ae, ws,
357	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
358	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
359	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
360	assertEqualInt(11, archive_entry_acl_reset(ae,
361	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
362	archive_entry_acl_clear(ae);
363
364	/* 4. Read POSIX.1e access and default ACLs from text (short form) */
365	assertEqualInt(ARCHIVE_OK,
366	    archive_entry_acl_from_text(ae, acltext[2],
367	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
368	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
369	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
370	assertEqualInt(11, archive_entry_acl_reset(ae,
371	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
372	archive_entry_acl_clear(ae);
373
374	free(ws);
375	ws = convert_s_to_ws(acltext[2]);
376	assertEqualInt(ARCHIVE_OK,
377	    archive_entry_acl_from_text_w(ae, ws,
378	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
379	archive_test_compare_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
380	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
381	assertEqualInt(11, archive_entry_acl_reset(ae,
382	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
383	archive_entry_acl_clear(ae);
384
385	/* 5. Read NFSv4 ACLs from text */
386	assertEqualInt(ARCHIVE_OK,
387	    archive_entry_acl_from_text(ae, acltext[10],
388	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
389	archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
390	    ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
391	assertEqualInt(6, archive_entry_acl_reset(ae,
392	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
393	archive_entry_acl_clear(ae);
394
395	free(ws);
396	ws = convert_s_to_ws(acltext[10]);
397
398	assertEqualInt(ARCHIVE_OK,
399	    archive_entry_acl_from_text_w(ae, ws,
400	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
401	archive_test_compare_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
402	    ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
403	assertEqualInt(6, archive_entry_acl_reset(ae,
404	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
405	archive_entry_acl_clear(ae);
406
407	free(ws);
408	archive_entry_free(ae);
409}
410
411DEFINE_TEST(test_acl_to_text)
412{
413	struct archive_entry *ae;
414
415	/* Create an empty archive_entry. */
416	assert((ae = archive_entry_new()) != NULL);
417
418	/* Write POSIX.1e ACLs  */
419	archive_test_set_acls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
420
421	/* No flags should give output like getfacl(1) on linux */
422	compare_acl_text(ae, 0, acltext[0]);
423
424	/* This should give the same output as previous test */
425	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
426	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, acltext[0]);
427
428	/* This should give the same output as previous two tests */
429	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
430	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT |
431	    ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT, acltext[0]);
432
433	/* POSIX.1e access and default ACLs with appended ID */
434	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[1]);
435
436	/* POSIX.1e access acls only, like getfacl(1) on FreeBSD */
437	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS, acltext[3]);
438
439	/* POSIX.1e access acls separated with comma */
440	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
441	    ARCHIVE_ENTRY_ACL_STYLE_SEPARATOR_COMMA,
442	    acltext[4]);
443
444	/* POSIX.1e access acls with appended user or group ID */
445	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
446	    ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[5]);
447
448	/* POSIX.1e default acls */
449	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, acltext[6]);
450
451	/* POSIX.1e default acls with appended user or group ID */
452	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT |
453	    ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[7]);
454
455	/* POSIX.1e default acls prefixed with default: */
456	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT |
457	    ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT, acltext[8]);
458
459	/* Write NFSv4 ACLs */
460	archive_test_set_acls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
461
462	/* NFSv4 ACLs like getfacl(1) on FreeBSD */
463	compare_acl_text(ae, 0, acltext[9]);
464
465	/* NFSv4 ACLs like "getfacl -i" on FreeBSD */
466	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[10]);
467
468	/* NFSv4 ACLs like "getfacl -i" on FreeBSD with stripped minus chars */
469	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID |
470	    ARCHIVE_ENTRY_ACL_STYLE_COMPACT, acltext[11]);
471
472	archive_entry_free(ae);
473}
474