1310796Smm/*-
2310796Smm * Copyright (c) 2016 Martin Matuska
3310796Smm * All rights reserved.
4310796Smm *
5310796Smm * Redistribution and use in source and binary forms, with or without
6310796Smm * modification, are permitted provided that the following conditions
7310796Smm * are met:
8310796Smm * 1. Redistributions of source code must retain the above copyright
9310796Smm *    notice, this list of conditions and the following disclaimer.
10310796Smm * 2. Redistributions in binary form must reproduce the above copyright
11310796Smm *    notice, this list of conditions and the following disclaimer in the
12310796Smm *    documentation and/or other materials provided with the distribution.
13310796Smm *
14310796Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15310796Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16310796Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17310796Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18310796Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19310796Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20310796Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21310796Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22310796Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23310796Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24310796Smm */
25310796Smm#include "test.h"
26310796Smm__FBSDID("$FreeBSD: stable/10/contrib/libarchive/libarchive/test/test_acl_text.c 315433 2017-03-16 23:08:18Z mm $");
27310796Smm
28310796Smm/*
29310796Smm * Test converting ACLs to text, both wide and non-wide
30310796Smm *
31310796Smm * This should work on all systems, regardless of whether local
32310796Smm * filesystems support ACLs or not.
33310796Smm */
34310796Smm
35310796Smmstatic struct archive_test_acl_t acls0[] = {
36310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
37310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE |
38310796Smm	    ARCHIVE_ENTRY_ACL_READ |
39310796Smm	    ARCHIVE_ENTRY_ACL_WRITE,
40310796Smm	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
41310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
42310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE |
43310796Smm	    ARCHIVE_ENTRY_ACL_READ,
44310796Smm	  ARCHIVE_ENTRY_ACL_USER, 100, "user100" },
45310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0,
46310796Smm	  ARCHIVE_ENTRY_ACL_USER, 1000, "user1000" },
47310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
48310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE |
49310796Smm	    ARCHIVE_ENTRY_ACL_READ,
50310796Smm	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
51310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
52310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE |
53310796Smm	    ARCHIVE_ENTRY_ACL_READ |
54310796Smm	    ARCHIVE_ENTRY_ACL_WRITE,
55310796Smm	  ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
56310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
57310796Smm	    ARCHIVE_ENTRY_ACL_READ |
58310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE,
59310796Smm	  ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
60310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
61310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE |
62310796Smm	    ARCHIVE_ENTRY_ACL_READ,
63310796Smm	  ARCHIVE_ENTRY_ACL_USER_OBJ, -1, "" },
64310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
65310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE |
66310796Smm	    ARCHIVE_ENTRY_ACL_READ,
67310796Smm	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, -1, "" },
68310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0,
69310796Smm	  ARCHIVE_ENTRY_ACL_OTHER, -1, "" },
70310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
71310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE |
72310796Smm	    ARCHIVE_ENTRY_ACL_READ,
73310796Smm	  ARCHIVE_ENTRY_ACL_USER, 101, "user101"},
74310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_DEFAULT,
75310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE,
76310796Smm	  ARCHIVE_ENTRY_ACL_GROUP, 79, "group79" },
77310796Smm};
78310796Smm
79310796Smmstatic struct archive_test_acl_t acls1[] = {
80310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
81310796Smm	    ARCHIVE_ENTRY_ACL_READ_DATA |
82310796Smm	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
83310796Smm	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
84310796Smm	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
85310796Smm	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
86310796Smm	    ARCHIVE_ENTRY_ACL_READ_ACL |
87310796Smm	    ARCHIVE_ENTRY_ACL_WRITE_OWNER,
88310796Smm	  ARCHIVE_ENTRY_ACL_USER, 77, "user77" },
89310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_DENY,
90310796Smm	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
91310796Smm	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
92310796Smm	    ARCHIVE_ENTRY_ACL_DELETE_CHILD |
93310796Smm	    ARCHIVE_ENTRY_ACL_DELETE |
94310796Smm	    ARCHIVE_ENTRY_ACL_ENTRY_FILE_INHERIT |
95310796Smm	    ARCHIVE_ENTRY_ACL_ENTRY_DIRECTORY_INHERIT |
96310796Smm	    ARCHIVE_ENTRY_ACL_ENTRY_INHERIT_ONLY |
97310796Smm	    ARCHIVE_ENTRY_ACL_ENTRY_NO_PROPAGATE_INHERIT,
98310796Smm	  ARCHIVE_ENTRY_ACL_USER, 101, "user101" },
99310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
100310796Smm	    ARCHIVE_ENTRY_ACL_READ_DATA |
101310796Smm	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
102310796Smm	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
103310796Smm	    ARCHIVE_ENTRY_ACL_READ_ACL |
104310796Smm	    ARCHIVE_ENTRY_ACL_ENTRY_INHERITED,
105310796Smm	  ARCHIVE_ENTRY_ACL_GROUP, 78, "group78" },
106310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
107310796Smm	    ARCHIVE_ENTRY_ACL_READ_DATA |
108310796Smm	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
109310796Smm	    ARCHIVE_ENTRY_ACL_EXECUTE |
110310796Smm	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
111310796Smm	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
112310796Smm	    ARCHIVE_ENTRY_ACL_WRITE_ATTRIBUTES |
113310796Smm	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
114310796Smm	    ARCHIVE_ENTRY_ACL_WRITE_NAMED_ATTRS |
115310796Smm	    ARCHIVE_ENTRY_ACL_READ_ACL |
116310796Smm	    ARCHIVE_ENTRY_ACL_WRITE_ACL |
117310796Smm	    ARCHIVE_ENTRY_ACL_WRITE_OWNER,
118310796Smm	  ARCHIVE_ENTRY_ACL_USER_OBJ, 0, "" },
119310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
120310796Smm	    ARCHIVE_ENTRY_ACL_READ_DATA |
121310796Smm	    ARCHIVE_ENTRY_ACL_WRITE_DATA |
122310796Smm	    ARCHIVE_ENTRY_ACL_APPEND_DATA |
123310796Smm	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
124310796Smm	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
125310796Smm	    ARCHIVE_ENTRY_ACL_READ_ACL,
126310796Smm	  ARCHIVE_ENTRY_ACL_GROUP_OBJ, 0, "" },
127310796Smm	{ ARCHIVE_ENTRY_ACL_TYPE_ALLOW,
128310796Smm	    ARCHIVE_ENTRY_ACL_READ_DATA |
129310796Smm	    ARCHIVE_ENTRY_ACL_READ_ATTRIBUTES |
130310796Smm	    ARCHIVE_ENTRY_ACL_READ_NAMED_ATTRS |
131310796Smm	    ARCHIVE_ENTRY_ACL_READ_ACL |
132310796Smm	    ARCHIVE_ENTRY_ACL_SYNCHRONIZE,
133310796Smm	  ARCHIVE_ENTRY_ACL_EVERYONE, 0, "" },
134310796Smm};
135310796Smm
136310796Smmconst char* acltext[] = {
137310796Smm	"user::rwx\n"
138310796Smm	"group::r-x\n"
139310796Smm	"other::r-x\n"
140310796Smm	"user:user100:r-x\n"
141310796Smm	"user:user1000:---\n"
142310796Smm	"group:group78:rwx\n"
143310796Smm	"default:user::r-x\n"
144310796Smm	"default:group::r-x\n"
145310796Smm	"default:other::---\n"
146310796Smm	"default:user:user101:r-x\n"
147310796Smm	"default:group:group79:--x",
148310796Smm
149310796Smm	"user::rwx\n"
150310796Smm	"group::r-x\n"
151310796Smm	"other::r-x\n"
152310796Smm	"user:user100:r-x:100\n"
153310796Smm	"user:user1000:---:1000\n"
154310796Smm	"group:group78:rwx:78\n"
155310796Smm	"default:user::r-x\n"
156310796Smm	"default:group::r-x\n"
157310796Smm	"default:other::---\n"
158310796Smm	"default:user:user101:r-x:101\n"
159310796Smm	"default:group:group79:--x:79",
160310796Smm
161310796Smm	"u::rwx\n"
162310796Smm	"g::r-x\n"
163310796Smm	"o::r-x\n"
164310796Smm	"u:user100:r-x:100\n"
165310796Smm	"u:user1000:---:1000\n"
166310796Smm	"g:group78:rwx:78\n"
167310796Smm	"d:user::r-x\n"
168310796Smm	"d:group::r-x\n"
169310796Smm	"d:other::---\n"
170310796Smm	"d:user:user101:r-x:101\n"
171310796Smm	"d:group:group79:--x:79",
172310796Smm
173310796Smm	"user::rwx\n"
174310796Smm	"group::r-x\n"
175310796Smm	"other::r-x\n"
176310796Smm	"user:user100:r-x\n"
177310796Smm	"user:user1000:---\n"
178310796Smm	"group:group78:rwx",
179310796Smm
180310796Smm	"user::rwx,"
181310796Smm	"group::r-x,"
182310796Smm	"other::r-x,"
183310796Smm	"user:user100:r-x,"
184310796Smm	"user:user1000:---,"
185310796Smm	"group:group78:rwx",
186310796Smm
187310796Smm	"user::rwx\n"
188310796Smm	"group::r-x\n"
189310796Smm	"other::r-x\n"
190310796Smm	"user:user100:r-x:100\n"
191310796Smm	"user:user1000:---:1000\n"
192310796Smm	"group:group78:rwx:78",
193310796Smm
194310796Smm	"user::r-x\n"
195310796Smm	"group::r-x\n"
196310796Smm	"other::---\n"
197310796Smm	"user:user101:r-x\n"
198310796Smm	"group:group79:--x",
199310796Smm
200310796Smm	"user::r-x\n"
201310796Smm	"group::r-x\n"
202310796Smm	"other::---\n"
203310796Smm	"user:user101:r-x:101\n"
204310796Smm	"group:group79:--x:79",
205310796Smm
206310796Smm	"default:user::r-x\n"
207310796Smm	"default:group::r-x\n"
208310796Smm	"default:other::---\n"
209310796Smm	"default:user:user101:r-x\n"
210310796Smm	"default:group:group79:--x",
211310796Smm
212310796Smm	"user:user77:rw-p--a-R-c-o-:-------:allow\n"
213310796Smm	"user:user101:-w-pdD--------:fdin---:deny\n"
214310796Smm	"group:group78:r-----a-R-c---:------I:allow\n"
215310796Smm	"owner@:rwxp--aARWcCo-:-------:allow\n"
216310796Smm	"group@:rw-p--a-R-c---:-------:allow\n"
217310796Smm	"everyone@:r-----a-R-c--s:-------:allow",
218310796Smm
219310796Smm	"user:user77:rw-p--a-R-c-o-:-------:allow:77\n"
220310796Smm	"user:user101:-w-pdD--------:fdin---:deny:101\n"
221310796Smm	"group:group78:r-----a-R-c---:------I:allow:78\n"
222310796Smm	"owner@:rwxp--aARWcCo-:-------:allow\n"
223310796Smm	"group@:rw-p--a-R-c---:-------:allow\n"
224313927Smm	"everyone@:r-----a-R-c--s:-------:allow",
225313927Smm
226313927Smm	"user:user77:rwpaRco::allow:77\n"
227313927Smm	"user:user101:wpdD:fdin:deny:101\n"
228313927Smm	"group:group78:raRc:I:allow:78\n"
229313927Smm	"owner@:rwxpaARWcCo::allow\n"
230313927Smm	"group@:rwpaRc::allow\n"
231313927Smm	"everyone@:raRcs::allow"
232310796Smm};
233310796Smm
234310796Smmstatic wchar_t *
235310796Smmconvert_s_to_ws(const char *s)
236310796Smm{
237310796Smm	size_t len;
238310796Smm	wchar_t *ws = NULL;
239310796Smm
240310796Smm	if (s != NULL) {
241310796Smm		len = strlen(s) + 1;
242310796Smm		ws = malloc(len * sizeof(wchar_t));
243310796Smm		assert(mbstowcs(ws, s, len) != (size_t)-1);
244310796Smm	}
245310796Smm
246310796Smm	return (ws);
247310796Smm}
248310796Smm
249310796Smmstatic void
250310796Smmcompare_acl_text(struct archive_entry *ae, int flags, const char *s)
251310796Smm{
252313571Smm	char *text;
253313571Smm	wchar_t *wtext;
254310796Smm	wchar_t *ws;
255310796Smm	ssize_t slen;
256310796Smm
257310796Smm	ws = convert_s_to_ws(s);
258310796Smm
259310796Smm	text = archive_entry_acl_to_text(ae, &slen, flags);
260310796Smm	assertEqualString(text, s);
261310796Smm	if (text != NULL)
262310796Smm		assertEqualInt(strlen(text), slen);
263310796Smm	wtext = archive_entry_acl_to_text_w(ae, &slen, flags);
264310796Smm	assertEqualWString(wtext, ws);
265310796Smm	if (wtext != NULL) {
266310796Smm		assertEqualInt(wcslen(wtext), slen);
267310796Smm	}
268313571Smm	free(text);
269313571Smm	free(wtext);
270313571Smm	free(ws);
271310796Smm}
272310796Smm
273310796SmmDEFINE_TEST(test_acl_from_text)
274310796Smm{
275310796Smm	struct archive_entry *ae;
276310796Smm	wchar_t *ws = NULL;
277310796Smm
278310796Smm	/* Create an empty archive_entry. */
279310796Smm	assert((ae = archive_entry_new()) != NULL);
280310796Smm
281310796Smm	/* 1a. Read POSIX.1e access ACLs from text */
282310796Smm	assertEqualInt(ARCHIVE_OK,
283310796Smm	    archive_entry_acl_from_text(ae, acltext[5],
284310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
285315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
286310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755);
287310796Smm	assertEqualInt(6, archive_entry_acl_reset(ae,
288310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
289310796Smm
290310796Smm	/* 1b. Now read POSIX.1e default ACLs and append them */
291310796Smm	assertEqualInt(ARCHIVE_OK,
292310796Smm	    archive_entry_acl_from_text(ae, acltext[7],
293310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
294315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
295310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
296310796Smm	assertEqualInt(11, archive_entry_acl_reset(ae,
297310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
298310796Smm	archive_entry_acl_clear(ae);
299310796Smm
300310796Smm	/* 1a and 1b with wide strings */
301310796Smm	ws = convert_s_to_ws(acltext[5]);
302310796Smm
303310796Smm	assertEqualInt(ARCHIVE_OK,
304310796Smm	    archive_entry_acl_from_text_w(ae, ws,
305310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
306315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
307310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS, 0755);
308310796Smm	assertEqualInt(6, archive_entry_acl_reset(ae,
309310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
310310796Smm
311310796Smm	free(ws);
312310796Smm	ws = convert_s_to_ws(acltext[7]);
313310796Smm
314310796Smm	assertEqualInt(ARCHIVE_OK,
315310796Smm	    archive_entry_acl_from_text_w(ae, ws,
316310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
317315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
318310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
319310796Smm	assertEqualInt(11, archive_entry_acl_reset(ae,
320310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
321310796Smm	archive_entry_acl_clear(ae);
322310796Smm
323310796Smm	/* 2. Read POSIX.1e default ACLs from text */
324310796Smm	assertEqualInt(ARCHIVE_OK,
325310796Smm	    archive_entry_acl_from_text(ae, acltext[7],
326310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
327315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
328310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0);
329310796Smm	assertEqualInt(5, archive_entry_acl_reset(ae,
330310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
331310796Smm	archive_entry_acl_clear(ae);
332310796Smm
333310796Smm	/* ws is still acltext[7] */
334310796Smm	assertEqualInt(ARCHIVE_OK,
335310796Smm	    archive_entry_acl_from_text_w(ae, ws,
336310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
337315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
338310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, 0);
339310796Smm	assertEqualInt(5, archive_entry_acl_reset(ae,
340310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT));
341310796Smm	archive_entry_acl_clear(ae);
342310796Smm
343310796Smm	/* 3. Read POSIX.1e access and default ACLs from text */
344310796Smm	assertEqualInt(ARCHIVE_OK,
345310796Smm	    archive_entry_acl_from_text(ae, acltext[1],
346310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
347315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
348310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
349310796Smm	assertEqualInt(11, archive_entry_acl_reset(ae,
350310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
351310796Smm	archive_entry_acl_clear(ae);
352310796Smm
353310796Smm	free(ws);
354310796Smm	ws = convert_s_to_ws(acltext[1]);
355310796Smm	assertEqualInt(ARCHIVE_OK,
356310796Smm	    archive_entry_acl_from_text_w(ae, ws,
357310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
358315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
359310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
360310796Smm	assertEqualInt(11, archive_entry_acl_reset(ae,
361310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
362310796Smm	archive_entry_acl_clear(ae);
363310796Smm
364310796Smm	/* 4. Read POSIX.1e access and default ACLs from text (short form) */
365310796Smm	assertEqualInt(ARCHIVE_OK,
366310796Smm	    archive_entry_acl_from_text(ae, acltext[2],
367310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
368315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
369310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
370310796Smm	assertEqualInt(11, archive_entry_acl_reset(ae,
371310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
372310796Smm	archive_entry_acl_clear(ae);
373310796Smm
374310796Smm	free(ws);
375310796Smm	ws = convert_s_to_ws(acltext[2]);
376310796Smm	assertEqualInt(ARCHIVE_OK,
377310796Smm	    archive_entry_acl_from_text_w(ae, ws,
378310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
379315433Smm	assertEntryCompareAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]),
380310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E, 0755);
381310796Smm	assertEqualInt(11, archive_entry_acl_reset(ae,
382310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_POSIX1E));
383310796Smm	archive_entry_acl_clear(ae);
384310796Smm
385310796Smm	/* 5. Read NFSv4 ACLs from text */
386310796Smm	assertEqualInt(ARCHIVE_OK,
387310796Smm	    archive_entry_acl_from_text(ae, acltext[10],
388310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
389315433Smm	assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
390310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
391310796Smm	assertEqualInt(6, archive_entry_acl_reset(ae,
392310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
393310796Smm	archive_entry_acl_clear(ae);
394310796Smm
395310796Smm	free(ws);
396310796Smm	ws = convert_s_to_ws(acltext[10]);
397310796Smm
398310796Smm	assertEqualInt(ARCHIVE_OK,
399310796Smm	    archive_entry_acl_from_text_w(ae, ws,
400310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
401315433Smm	assertEntryCompareAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]),
402310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_NFS4, 0);
403310796Smm	assertEqualInt(6, archive_entry_acl_reset(ae,
404310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_NFS4));
405310796Smm	archive_entry_acl_clear(ae);
406313571Smm
407313571Smm	free(ws);
408313571Smm	archive_entry_free(ae);
409310796Smm}
410310796Smm
411310796SmmDEFINE_TEST(test_acl_to_text)
412310796Smm{
413310796Smm	struct archive_entry *ae;
414310796Smm
415310796Smm	/* Create an empty archive_entry. */
416310796Smm	assert((ae = archive_entry_new()) != NULL);
417310796Smm
418310796Smm	/* Write POSIX.1e ACLs  */
419315433Smm	assertEntrySetAcls(ae, acls0, sizeof(acls0)/sizeof(acls0[0]));
420310796Smm
421310796Smm	/* No flags should give output like getfacl(1) on linux */
422310796Smm	compare_acl_text(ae, 0, acltext[0]);
423310796Smm
424310796Smm	/* This should give the same output as previous test */
425310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
426310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, acltext[0]);
427310796Smm
428310796Smm	/* This should give the same output as previous two tests */
429310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
430310796Smm	    ARCHIVE_ENTRY_ACL_TYPE_DEFAULT |
431310796Smm	    ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT, acltext[0]);
432310796Smm
433310796Smm	/* POSIX.1e access and default ACLs with appended ID */
434310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[1]);
435310796Smm
436310796Smm	/* POSIX.1e access acls only, like getfacl(1) on FreeBSD */
437310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS, acltext[3]);
438310796Smm
439310796Smm	/* POSIX.1e access acls separated with comma */
440310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
441310796Smm	    ARCHIVE_ENTRY_ACL_STYLE_SEPARATOR_COMMA,
442310796Smm	    acltext[4]);
443310796Smm
444310796Smm	/* POSIX.1e access acls with appended user or group ID */
445310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_ACCESS |
446310796Smm	    ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[5]);
447310796Smm
448310796Smm	/* POSIX.1e default acls */
449310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT, acltext[6]);
450310796Smm
451310796Smm	/* POSIX.1e default acls with appended user or group ID */
452310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT |
453310796Smm	    ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[7]);
454310796Smm
455310796Smm	/* POSIX.1e default acls prefixed with default: */
456310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT |
457310796Smm	    ARCHIVE_ENTRY_ACL_STYLE_MARK_DEFAULT, acltext[8]);
458310796Smm
459310796Smm	/* Write NFSv4 ACLs */
460315433Smm	assertEntrySetAcls(ae, acls1, sizeof(acls1)/sizeof(acls1[0]));
461310796Smm
462310796Smm	/* NFSv4 ACLs like getfacl(1) on FreeBSD */
463310796Smm	compare_acl_text(ae, 0, acltext[9]);
464310796Smm
465310796Smm	/* NFSv4 ACLs like "getfacl -i" on FreeBSD */
466310796Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID, acltext[10]);
467313571Smm
468313927Smm	/* NFSv4 ACLs like "getfacl -i" on FreeBSD with stripped minus chars */
469313927Smm	compare_acl_text(ae, ARCHIVE_ENTRY_ACL_STYLE_EXTRA_ID |
470313927Smm	    ARCHIVE_ENTRY_ACL_STYLE_COMPACT, acltext[11]);
471313927Smm
472313571Smm	archive_entry_free(ae);
473310796Smm}
474