1*543adbedSBen Gras /*-
2*543adbedSBen Gras  * Copyright (c) 2003-2007 Tim Kientzle
3*543adbedSBen Gras  * All rights reserved.
4*543adbedSBen Gras  *
5*543adbedSBen Gras  * Redistribution and use in source and binary forms, with or without
6*543adbedSBen Gras  * modification, are permitted provided that the following conditions
7*543adbedSBen Gras  * are met:
8*543adbedSBen Gras  * 1. Redistributions of source code must retain the above copyright
9*543adbedSBen Gras  *    notice, this list of conditions and the following disclaimer.
10*543adbedSBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
11*543adbedSBen Gras  *    notice, this list of conditions and the following disclaimer in the
12*543adbedSBen Gras  *    documentation and/or other materials provided with the distribution.
13*543adbedSBen Gras  *
14*543adbedSBen Gras  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
15*543adbedSBen Gras  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16*543adbedSBen Gras  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17*543adbedSBen Gras  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
18*543adbedSBen Gras  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19*543adbedSBen Gras  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20*543adbedSBen Gras  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21*543adbedSBen Gras  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22*543adbedSBen Gras  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23*543adbedSBen Gras  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24*543adbedSBen Gras  */
25*543adbedSBen Gras #include "test.h"
26*543adbedSBen Gras __FBSDID("$FreeBSD: head/lib/libarchive/test/test_entry.c 201247 2009-12-30 05:59:21Z kientzle $");
27*543adbedSBen Gras 
28*543adbedSBen Gras #include <locale.h>
29*543adbedSBen Gras 
30*543adbedSBen Gras #ifndef HAVE_WCSCPY
wcscpy(wchar_t * s1,const wchar_t * s2)31*543adbedSBen Gras static wchar_t * wcscpy(wchar_t *s1, const wchar_t *s2)
32*543adbedSBen Gras {
33*543adbedSBen Gras 	wchar_t *dest = s1;
34*543adbedSBen Gras 	while ((*s1 = *s2) != L'\0')
35*543adbedSBen Gras 		++s1, ++s2;
36*543adbedSBen Gras 	return dest;
37*543adbedSBen Gras }
38*543adbedSBen Gras #endif
39*543adbedSBen Gras 
40*543adbedSBen Gras /*
41*543adbedSBen Gras  * Most of these tests are system-independent, though a few depend on
42*543adbedSBen Gras  * features of the local system.  Such tests are conditionalized on
43*543adbedSBen Gras  * the platform name.  On unsupported platforms, only the
44*543adbedSBen Gras  * system-independent features will be tested.
45*543adbedSBen Gras  *
46*543adbedSBen Gras  * No, I don't want to use config.h in the test files because I want
47*543adbedSBen Gras  * the tests to also serve as a check on the correctness of config.h.
48*543adbedSBen Gras  * A mis-configured library build should cause tests to fail.
49*543adbedSBen Gras  */
50*543adbedSBen Gras 
DEFINE_TEST(test_entry)51*543adbedSBen Gras DEFINE_TEST(test_entry)
52*543adbedSBen Gras {
53*543adbedSBen Gras 	char buff[128];
54*543adbedSBen Gras 	wchar_t wbuff[128];
55*543adbedSBen Gras 	struct stat st;
56*543adbedSBen Gras 	struct archive_entry *e, *e2;
57*543adbedSBen Gras 	const struct stat *pst;
58*543adbedSBen Gras 	unsigned long set, clear; /* For fflag testing. */
59*543adbedSBen Gras 	int type, permset, tag, qual; /* For ACL testing. */
60*543adbedSBen Gras 	const char *name; /* For ACL testing. */
61*543adbedSBen Gras 	const char *xname; /* For xattr tests. */
62*543adbedSBen Gras 	const void *xval; /* For xattr tests. */
63*543adbedSBen Gras 	size_t xsize; /* For xattr tests. */
64*543adbedSBen Gras 	wchar_t wc;
65*543adbedSBen Gras 	long l;
66*543adbedSBen Gras 
67*543adbedSBen Gras 	assert((e = archive_entry_new()) != NULL);
68*543adbedSBen Gras 
69*543adbedSBen Gras 	/*
70*543adbedSBen Gras 	 * Verify that the AE_IF* defines match S_IF* defines
71*543adbedSBen Gras 	 * on this platform. See comments in archive_entry.h.
72*543adbedSBen Gras 	 */
73*543adbedSBen Gras #ifdef S_IFREG
74*543adbedSBen Gras 	assertEqualInt(S_IFREG, AE_IFREG);
75*543adbedSBen Gras #endif
76*543adbedSBen Gras #ifdef S_IFLNK
77*543adbedSBen Gras 	assertEqualInt(S_IFLNK, AE_IFLNK);
78*543adbedSBen Gras #endif
79*543adbedSBen Gras #ifdef S_IFSOCK
80*543adbedSBen Gras 	assertEqualInt(S_IFSOCK, AE_IFSOCK);
81*543adbedSBen Gras #endif
82*543adbedSBen Gras #ifdef S_IFCHR
83*543adbedSBen Gras 	assertEqualInt(S_IFCHR, AE_IFCHR);
84*543adbedSBen Gras #endif
85*543adbedSBen Gras /* Work around MinGW, which defines S_IFBLK wrong. */
86*543adbedSBen Gras /* sourceforge.net/tracker/?func=detail&atid=102435&aid=1942809&group_id=2435 */
87*543adbedSBen Gras #if defined(S_IFBLK) && !defined(_WIN32)
88*543adbedSBen Gras 	assertEqualInt(S_IFBLK, AE_IFBLK);
89*543adbedSBen Gras #endif
90*543adbedSBen Gras #ifdef S_IFDIR
91*543adbedSBen Gras 	assertEqualInt(S_IFDIR, AE_IFDIR);
92*543adbedSBen Gras #endif
93*543adbedSBen Gras #ifdef S_IFIFO
94*543adbedSBen Gras 	assertEqualInt(S_IFIFO, AE_IFIFO);
95*543adbedSBen Gras #endif
96*543adbedSBen Gras 
97*543adbedSBen Gras 	/*
98*543adbedSBen Gras 	 * Basic set/read tests for all fields.
99*543adbedSBen Gras 	 * We should be able to set any field and read
100*543adbedSBen Gras 	 * back the same value.
101*543adbedSBen Gras 	 *
102*543adbedSBen Gras 	 * For methods that "copy" a string, we should be able
103*543adbedSBen Gras 	 * to overwrite the original passed-in string without
104*543adbedSBen Gras 	 * changing the value in the entry.
105*543adbedSBen Gras 	 *
106*543adbedSBen Gras 	 * The following tests are ordered alphabetically by the
107*543adbedSBen Gras 	 * name of the field.
108*543adbedSBen Gras 	 */
109*543adbedSBen Gras 
110*543adbedSBen Gras 	/* atime */
111*543adbedSBen Gras 	archive_entry_set_atime(e, 13579, 24680);
112*543adbedSBen Gras 	assertEqualInt(archive_entry_atime(e), 13579);
113*543adbedSBen Gras 	assertEqualInt(archive_entry_atime_nsec(e), 24680);
114*543adbedSBen Gras 	archive_entry_unset_atime(e);
115*543adbedSBen Gras 	assertEqualInt(archive_entry_atime(e), 0);
116*543adbedSBen Gras 	assertEqualInt(archive_entry_atime_nsec(e), 0);
117*543adbedSBen Gras 	assert(!archive_entry_atime_is_set(e));
118*543adbedSBen Gras 
119*543adbedSBen Gras 	/* birthtime */
120*543adbedSBen Gras 	archive_entry_set_birthtime(e, 17579, 24990);
121*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime(e), 17579);
122*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime_nsec(e), 24990);
123*543adbedSBen Gras 	archive_entry_unset_birthtime(e);
124*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime(e), 0);
125*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime_nsec(e), 0);
126*543adbedSBen Gras 	assert(!archive_entry_birthtime_is_set(e));
127*543adbedSBen Gras 
128*543adbedSBen Gras 	/* ctime */
129*543adbedSBen Gras 	archive_entry_set_ctime(e, 13580, 24681);
130*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime(e), 13580);
131*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime_nsec(e), 24681);
132*543adbedSBen Gras 	archive_entry_unset_ctime(e);
133*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime(e), 0);
134*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime_nsec(e), 0);
135*543adbedSBen Gras 	assert(!archive_entry_ctime_is_set(e));
136*543adbedSBen Gras 
137*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
138*543adbedSBen Gras 	/* dev */
139*543adbedSBen Gras 	archive_entry_set_dev(e, 235);
140*543adbedSBen Gras 	assertEqualInt(archive_entry_dev(e), 235);
141*543adbedSBen Gras #else
142*543adbedSBen Gras 	skipping("archive_entry_dev()");
143*543adbedSBen Gras #endif
144*543adbedSBen Gras 	/* devmajor/devminor are tested specially below. */
145*543adbedSBen Gras 
146*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
147*543adbedSBen Gras 	/* filetype */
148*543adbedSBen Gras 	archive_entry_set_filetype(e, AE_IFREG);
149*543adbedSBen Gras 	assertEqualInt(archive_entry_filetype(e), AE_IFREG);
150*543adbedSBen Gras #else
151*543adbedSBen Gras 	skipping("archive_entry_filetype()");
152*543adbedSBen Gras #endif
153*543adbedSBen Gras 
154*543adbedSBen Gras 	/* fflags are tested specially below */
155*543adbedSBen Gras 
156*543adbedSBen Gras 	/* gid */
157*543adbedSBen Gras 	archive_entry_set_gid(e, 204);
158*543adbedSBen Gras 	assertEqualInt(archive_entry_gid(e), 204);
159*543adbedSBen Gras 
160*543adbedSBen Gras 	/* gname */
161*543adbedSBen Gras 	archive_entry_set_gname(e, "group");
162*543adbedSBen Gras 	assertEqualString(archive_entry_gname(e), "group");
163*543adbedSBen Gras 	wcscpy(wbuff, L"wgroup");
164*543adbedSBen Gras 	archive_entry_copy_gname_w(e, wbuff);
165*543adbedSBen Gras 	assertEqualWString(archive_entry_gname_w(e), L"wgroup");
166*543adbedSBen Gras 	memset(wbuff, 0, sizeof(wbuff));
167*543adbedSBen Gras 	assertEqualWString(archive_entry_gname_w(e), L"wgroup");
168*543adbedSBen Gras 
169*543adbedSBen Gras 	/* hardlink */
170*543adbedSBen Gras 	archive_entry_set_hardlink(e, "hardlinkname");
171*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), "hardlinkname");
172*543adbedSBen Gras 	strcpy(buff, "hardlinkname2");
173*543adbedSBen Gras 	archive_entry_copy_hardlink(e, buff);
174*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), "hardlinkname2");
175*543adbedSBen Gras 	memset(buff, 0, sizeof(buff));
176*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), "hardlinkname2");
177*543adbedSBen Gras 	archive_entry_copy_hardlink(e, NULL);
178*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), NULL);
179*543adbedSBen Gras 	assertEqualWString(archive_entry_hardlink_w(e), NULL);
180*543adbedSBen Gras 	wcscpy(wbuff, L"whardlink");
181*543adbedSBen Gras 	archive_entry_copy_hardlink_w(e, wbuff);
182*543adbedSBen Gras 	assertEqualWString(archive_entry_hardlink_w(e), L"whardlink");
183*543adbedSBen Gras 	memset(wbuff, 0, sizeof(wbuff));
184*543adbedSBen Gras 	assertEqualWString(archive_entry_hardlink_w(e), L"whardlink");
185*543adbedSBen Gras 	archive_entry_copy_hardlink_w(e, NULL);
186*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), NULL);
187*543adbedSBen Gras 	assertEqualWString(archive_entry_hardlink_w(e), NULL);
188*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
189*543adbedSBen Gras 	/* ino */
190*543adbedSBen Gras 	archive_entry_set_ino(e, 8593);
191*543adbedSBen Gras 	assertEqualInt(archive_entry_ino(e), 8593);
192*543adbedSBen Gras #else
193*543adbedSBen Gras 	skipping("archive_entry_ino()");
194*543adbedSBen Gras #endif
195*543adbedSBen Gras 
196*543adbedSBen Gras 	/* link */
197*543adbedSBen Gras 	archive_entry_set_hardlink(e, "hardlinkname");
198*543adbedSBen Gras 	archive_entry_set_symlink(e, NULL);
199*543adbedSBen Gras 	archive_entry_set_link(e, "link");
200*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), "link");
201*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), NULL);
202*543adbedSBen Gras 	archive_entry_copy_link(e, "link2");
203*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), "link2");
204*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), NULL);
205*543adbedSBen Gras 	archive_entry_copy_link_w(e, L"link3");
206*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), "link3");
207*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), NULL);
208*543adbedSBen Gras 	archive_entry_set_hardlink(e, NULL);
209*543adbedSBen Gras 	archive_entry_set_symlink(e, "symlink");
210*543adbedSBen Gras 	archive_entry_set_link(e, "link");
211*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), NULL);
212*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), "link");
213*543adbedSBen Gras 	archive_entry_copy_link(e, "link2");
214*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), NULL);
215*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), "link2");
216*543adbedSBen Gras 	archive_entry_copy_link_w(e, L"link3");
217*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), NULL);
218*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), "link3");
219*543adbedSBen Gras 	/* Arbitrarily override symlink if both hardlink and symlink set. */
220*543adbedSBen Gras 	archive_entry_set_hardlink(e, "hardlink");
221*543adbedSBen Gras 	archive_entry_set_symlink(e, "symlink");
222*543adbedSBen Gras 	archive_entry_set_link(e, "link");
223*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), "hardlink");
224*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), "link");
225*543adbedSBen Gras 
226*543adbedSBen Gras 	/* mode */
227*543adbedSBen Gras 	archive_entry_set_mode(e, 0123456);
228*543adbedSBen Gras 	assertEqualInt(archive_entry_mode(e), 0123456);
229*543adbedSBen Gras 
230*543adbedSBen Gras 	/* mtime */
231*543adbedSBen Gras 	archive_entry_set_mtime(e, 13581, 24682);
232*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime(e), 13581);
233*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime_nsec(e), 24682);
234*543adbedSBen Gras 	archive_entry_unset_mtime(e);
235*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime(e), 0);
236*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime_nsec(e), 0);
237*543adbedSBen Gras 	assert(!archive_entry_mtime_is_set(e));
238*543adbedSBen Gras 
239*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
240*543adbedSBen Gras 	/* nlink */
241*543adbedSBen Gras 	archive_entry_set_nlink(e, 736);
242*543adbedSBen Gras 	assertEqualInt(archive_entry_nlink(e), 736);
243*543adbedSBen Gras #else
244*543adbedSBen Gras 	skipping("archive_entry_nlink()");
245*543adbedSBen Gras #endif
246*543adbedSBen Gras 
247*543adbedSBen Gras 	/* pathname */
248*543adbedSBen Gras 	archive_entry_set_pathname(e, "path");
249*543adbedSBen Gras 	assertEqualString(archive_entry_pathname(e), "path");
250*543adbedSBen Gras 	archive_entry_set_pathname(e, "path");
251*543adbedSBen Gras 	assertEqualString(archive_entry_pathname(e), "path");
252*543adbedSBen Gras 	strcpy(buff, "path2");
253*543adbedSBen Gras 	archive_entry_copy_pathname(e, buff);
254*543adbedSBen Gras 	assertEqualString(archive_entry_pathname(e), "path2");
255*543adbedSBen Gras 	memset(buff, 0, sizeof(buff));
256*543adbedSBen Gras 	assertEqualString(archive_entry_pathname(e), "path2");
257*543adbedSBen Gras 	wcscpy(wbuff, L"wpath");
258*543adbedSBen Gras 	archive_entry_copy_pathname_w(e, wbuff);
259*543adbedSBen Gras 	assertEqualWString(archive_entry_pathname_w(e), L"wpath");
260*543adbedSBen Gras 	memset(wbuff, 0, sizeof(wbuff));
261*543adbedSBen Gras 	assertEqualWString(archive_entry_pathname_w(e), L"wpath");
262*543adbedSBen Gras 
263*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
264*543adbedSBen Gras 	/* rdev */
265*543adbedSBen Gras 	archive_entry_set_rdev(e, 532);
266*543adbedSBen Gras 	assertEqualInt(archive_entry_rdev(e), 532);
267*543adbedSBen Gras #else
268*543adbedSBen Gras 	skipping("archive_entry_rdev()");
269*543adbedSBen Gras #endif
270*543adbedSBen Gras 	/* rdevmajor/rdevminor are tested specially below. */
271*543adbedSBen Gras 
272*543adbedSBen Gras 	/* size */
273*543adbedSBen Gras 	archive_entry_set_size(e, 987654321);
274*543adbedSBen Gras 	assertEqualInt(archive_entry_size(e), 987654321);
275*543adbedSBen Gras 	archive_entry_unset_size(e);
276*543adbedSBen Gras 	assertEqualInt(archive_entry_size(e), 0);
277*543adbedSBen Gras 	assert(!archive_entry_size_is_set(e));
278*543adbedSBen Gras 
279*543adbedSBen Gras 	/* sourcepath */
280*543adbedSBen Gras 	archive_entry_copy_sourcepath(e, "path1");
281*543adbedSBen Gras 	assertEqualString(archive_entry_sourcepath(e), "path1");
282*543adbedSBen Gras 
283*543adbedSBen Gras 	/* symlink */
284*543adbedSBen Gras 	archive_entry_set_symlink(e, "symlinkname");
285*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), "symlinkname");
286*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
287*543adbedSBen Gras 	strcpy(buff, "symlinkname2");
288*543adbedSBen Gras 	archive_entry_copy_symlink(e, buff);
289*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), "symlinkname2");
290*543adbedSBen Gras 	memset(buff, 0, sizeof(buff));
291*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), "symlinkname2");
292*543adbedSBen Gras #endif
293*543adbedSBen Gras 	archive_entry_copy_symlink_w(e, NULL);
294*543adbedSBen Gras 	assertEqualWString(archive_entry_symlink_w(e), NULL);
295*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), NULL);
296*543adbedSBen Gras 	archive_entry_copy_symlink_w(e, L"wsymlink");
297*543adbedSBen Gras 	assertEqualWString(archive_entry_symlink_w(e), L"wsymlink");
298*543adbedSBen Gras 	archive_entry_copy_symlink(e, NULL);
299*543adbedSBen Gras 	assertEqualWString(archive_entry_symlink_w(e), NULL);
300*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), NULL);
301*543adbedSBen Gras 
302*543adbedSBen Gras 	/* uid */
303*543adbedSBen Gras 	archive_entry_set_uid(e, 83);
304*543adbedSBen Gras 	assertEqualInt(archive_entry_uid(e), 83);
305*543adbedSBen Gras 
306*543adbedSBen Gras 	/* uname */
307*543adbedSBen Gras 	archive_entry_set_uname(e, "user");
308*543adbedSBen Gras 	assertEqualString(archive_entry_uname(e), "user");
309*543adbedSBen Gras 	wcscpy(wbuff, L"wuser");
310*543adbedSBen Gras 	archive_entry_copy_gname_w(e, wbuff);
311*543adbedSBen Gras 	assertEqualWString(archive_entry_gname_w(e), L"wuser");
312*543adbedSBen Gras 	memset(wbuff, 0, sizeof(wbuff));
313*543adbedSBen Gras 	assertEqualWString(archive_entry_gname_w(e), L"wuser");
314*543adbedSBen Gras 
315*543adbedSBen Gras 	/* Test fflags interface. */
316*543adbedSBen Gras 	archive_entry_set_fflags(e, 0x55, 0xAA);
317*543adbedSBen Gras 	archive_entry_fflags(e, &set, &clear);
318*543adbedSBen Gras 	failure("Testing set/get of fflags data.");
319*543adbedSBen Gras 	assertEqualInt(set, 0x55);
320*543adbedSBen Gras 	failure("Testing set/get of fflags data.");
321*543adbedSBen Gras 	assertEqualInt(clear, 0xAA);
322*543adbedSBen Gras #ifdef __FreeBSD__
323*543adbedSBen Gras 	/* Converting fflags bitmap to string is currently system-dependent. */
324*543adbedSBen Gras 	/* TODO: Make this system-independent. */
325*543adbedSBen Gras 	assertEqualString(archive_entry_fflags_text(e),
326*543adbedSBen Gras 	    "uappnd,nouchg,nodump,noopaque,uunlnk");
327*543adbedSBen Gras 	/* Test archive_entry_copy_fflags_text_w() */
328*543adbedSBen Gras 	archive_entry_copy_fflags_text_w(e, L" ,nouappnd, nouchg, dump,uunlnk");
329*543adbedSBen Gras 	archive_entry_fflags(e, &set, &clear);
330*543adbedSBen Gras 	assertEqualInt(16, set);
331*543adbedSBen Gras 	assertEqualInt(7, clear);
332*543adbedSBen Gras 	/* Test archive_entry_copy_fflags_text() */
333*543adbedSBen Gras 	archive_entry_copy_fflags_text(e, " ,nouappnd, nouchg, dump,uunlnk");
334*543adbedSBen Gras 	archive_entry_fflags(e, &set, &clear);
335*543adbedSBen Gras 	assertEqualInt(16, set);
336*543adbedSBen Gras 	assertEqualInt(7, clear);
337*543adbedSBen Gras #endif
338*543adbedSBen Gras 
339*543adbedSBen Gras 	/* See test_acl_basic.c for tests of ACL set/get consistency. */
340*543adbedSBen Gras 
341*543adbedSBen Gras 	/* Test xattrs set/get consistency. */
342*543adbedSBen Gras 	archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue1", 12);
343*543adbedSBen Gras 	assertEqualInt(1, archive_entry_xattr_reset(e));
344*543adbedSBen Gras 	assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize));
345*543adbedSBen Gras 	assertEqualString(xname, "xattr1");
346*543adbedSBen Gras 	assertEqualString(xval, "xattrvalue1");
347*543adbedSBen Gras 	assertEqualInt((int)xsize, 12);
348*543adbedSBen Gras 	assertEqualInt(1, archive_entry_xattr_count(e));
349*543adbedSBen Gras 	assertEqualInt(ARCHIVE_WARN,
350*543adbedSBen Gras 	    archive_entry_xattr_next(e, &xname, &xval, &xsize));
351*543adbedSBen Gras 	assertEqualString(xname, NULL);
352*543adbedSBen Gras 	assertEqualString(xval, NULL);
353*543adbedSBen Gras 	assertEqualInt((int)xsize, 0);
354*543adbedSBen Gras 	archive_entry_xattr_clear(e);
355*543adbedSBen Gras 	assertEqualInt(0, archive_entry_xattr_reset(e));
356*543adbedSBen Gras 	assertEqualInt(ARCHIVE_WARN,
357*543adbedSBen Gras 	    archive_entry_xattr_next(e, &xname, &xval, &xsize));
358*543adbedSBen Gras 	assertEqualString(xname, NULL);
359*543adbedSBen Gras 	assertEqualString(xval, NULL);
360*543adbedSBen Gras 	assertEqualInt((int)xsize, 0);
361*543adbedSBen Gras 	archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue1", 12);
362*543adbedSBen Gras 	assertEqualInt(1, archive_entry_xattr_reset(e));
363*543adbedSBen Gras 	archive_entry_xattr_add_entry(e, "xattr2", "xattrvalue2", 12);
364*543adbedSBen Gras 	assertEqualInt(2, archive_entry_xattr_reset(e));
365*543adbedSBen Gras 	assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize));
366*543adbedSBen Gras 	assertEqualInt(0, archive_entry_xattr_next(e, &xname, &xval, &xsize));
367*543adbedSBen Gras 	assertEqualInt(ARCHIVE_WARN,
368*543adbedSBen Gras 	    archive_entry_xattr_next(e, &xname, &xval, &xsize));
369*543adbedSBen Gras 	assertEqualString(xname, NULL);
370*543adbedSBen Gras 	assertEqualString(xval, NULL);
371*543adbedSBen Gras 	assertEqualInt((int)xsize, 0);
372*543adbedSBen Gras 
373*543adbedSBen Gras 
374*543adbedSBen Gras 	/*
375*543adbedSBen Gras 	 * Test clone() implementation.
376*543adbedSBen Gras 	 */
377*543adbedSBen Gras 
378*543adbedSBen Gras 	/* Set values in 'e' */
379*543adbedSBen Gras 	archive_entry_clear(e);
380*543adbedSBen Gras 	archive_entry_set_atime(e, 13579, 24680);
381*543adbedSBen Gras 	archive_entry_set_birthtime(e, 13779, 24990);
382*543adbedSBen Gras 	archive_entry_set_ctime(e, 13580, 24681);
383*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
384*543adbedSBen Gras 	archive_entry_set_dev(e, 235);
385*543adbedSBen Gras #endif
386*543adbedSBen Gras 	archive_entry_set_fflags(e, 0x55, 0xAA);
387*543adbedSBen Gras 	archive_entry_set_gid(e, 204);
388*543adbedSBen Gras 	archive_entry_set_gname(e, "group");
389*543adbedSBen Gras 	archive_entry_set_hardlink(e, "hardlinkname");
390*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
391*543adbedSBen Gras 	archive_entry_set_ino(e, 8593);
392*543adbedSBen Gras #endif
393*543adbedSBen Gras 	archive_entry_set_mode(e, 0123456);
394*543adbedSBen Gras 	archive_entry_set_mtime(e, 13581, 24682);
395*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
396*543adbedSBen Gras 	archive_entry_set_nlink(e, 736);
397*543adbedSBen Gras #endif
398*543adbedSBen Gras 	archive_entry_set_pathname(e, "path");
399*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
400*543adbedSBen Gras 	archive_entry_set_rdev(e, 532);
401*543adbedSBen Gras #endif
402*543adbedSBen Gras 	archive_entry_set_size(e, 987654321);
403*543adbedSBen Gras 	archive_entry_copy_sourcepath(e, "source");
404*543adbedSBen Gras 	archive_entry_set_symlink(e, "symlinkname");
405*543adbedSBen Gras 	archive_entry_set_uid(e, 83);
406*543adbedSBen Gras 	archive_entry_set_uname(e, "user");
407*543adbedSBen Gras 	/* Add an ACL entry. */
408*543adbedSBen Gras 	archive_entry_acl_add_entry(e, ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
409*543adbedSBen Gras 	    ARCHIVE_ENTRY_ACL_READ, ARCHIVE_ENTRY_ACL_USER, 77, "user77");
410*543adbedSBen Gras 	/* Add an extended attribute. */
411*543adbedSBen Gras 	archive_entry_xattr_add_entry(e, "xattr1", "xattrvalue", 11);
412*543adbedSBen Gras 
413*543adbedSBen Gras 	/* Make a clone. */
414*543adbedSBen Gras 	e2 = archive_entry_clone(e);
415*543adbedSBen Gras 
416*543adbedSBen Gras 	/* Clone should have same contents. */
417*543adbedSBen Gras 	assertEqualInt(archive_entry_atime(e2), 13579);
418*543adbedSBen Gras 	assertEqualInt(archive_entry_atime_nsec(e2), 24680);
419*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime(e2), 13779);
420*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime_nsec(e2), 24990);
421*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime(e2), 13580);
422*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime_nsec(e2), 24681);
423*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
424*543adbedSBen Gras 	assertEqualInt(archive_entry_dev(e2), 235);
425*543adbedSBen Gras #endif
426*543adbedSBen Gras 	archive_entry_fflags(e, &set, &clear);
427*543adbedSBen Gras 	assertEqualInt(clear, 0xAA);
428*543adbedSBen Gras 	assertEqualInt(set, 0x55);
429*543adbedSBen Gras 	assertEqualInt(archive_entry_gid(e2), 204);
430*543adbedSBen Gras 	assertEqualString(archive_entry_gname(e2), "group");
431*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e2), "hardlinkname");
432*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
433*543adbedSBen Gras 	assertEqualInt(archive_entry_ino(e2), 8593);
434*543adbedSBen Gras #endif
435*543adbedSBen Gras 	assertEqualInt(archive_entry_mode(e2), 0123456);
436*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime(e2), 13581);
437*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime_nsec(e2), 24682);
438*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
439*543adbedSBen Gras 	assertEqualInt(archive_entry_nlink(e2), 736);
440*543adbedSBen Gras #endif
441*543adbedSBen Gras 	assertEqualString(archive_entry_pathname(e2), "path");
442*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
443*543adbedSBen Gras 	assertEqualInt(archive_entry_rdev(e2), 532);
444*543adbedSBen Gras #endif
445*543adbedSBen Gras 	assertEqualInt(archive_entry_size(e2), 987654321);
446*543adbedSBen Gras 	assertEqualString(archive_entry_sourcepath(e2), "source");
447*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e2), "symlinkname");
448*543adbedSBen Gras 	assertEqualInt(archive_entry_uid(e2), 83);
449*543adbedSBen Gras 	assertEqualString(archive_entry_uname(e2), "user");
450*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER < 1009000
451*543adbedSBen Gras 	skipping("ACL preserved by archive_entry_clone()");
452*543adbedSBen Gras #else
453*543adbedSBen Gras 	/* Verify ACL was copied. */
454*543adbedSBen Gras 	assertEqualInt(4, archive_entry_acl_reset(e2,
455*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
456*543adbedSBen Gras 	/* First three are standard permission bits. */
457*543adbedSBen Gras 	assertEqualInt(0, archive_entry_acl_next(e2,
458*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
459*543adbedSBen Gras 			   &type, &permset, &tag, &qual, &name));
460*543adbedSBen Gras 	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
461*543adbedSBen Gras 	assertEqualInt(permset, 4);
462*543adbedSBen Gras 	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER_OBJ);
463*543adbedSBen Gras 	assertEqualInt(qual, -1);
464*543adbedSBen Gras 	assertEqualString(name, NULL);
465*543adbedSBen Gras 	assertEqualInt(0, archive_entry_acl_next(e2,
466*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
467*543adbedSBen Gras 			   &type, &permset, &tag, &qual, &name));
468*543adbedSBen Gras 	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
469*543adbedSBen Gras 	assertEqualInt(permset, 5);
470*543adbedSBen Gras 	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_GROUP_OBJ);
471*543adbedSBen Gras 	assertEqualInt(qual, -1);
472*543adbedSBen Gras 	assertEqualString(name, NULL);
473*543adbedSBen Gras 	assertEqualInt(0, archive_entry_acl_next(e2,
474*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
475*543adbedSBen Gras 			   &type, &permset, &tag, &qual, &name));
476*543adbedSBen Gras 	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
477*543adbedSBen Gras 	assertEqualInt(permset, 6);
478*543adbedSBen Gras 	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_OTHER);
479*543adbedSBen Gras 	assertEqualInt(qual, -1);
480*543adbedSBen Gras 	assertEqualString(name, NULL);
481*543adbedSBen Gras 	/* Fourth is custom one. */
482*543adbedSBen Gras 	assertEqualInt(0, archive_entry_acl_next(e2,
483*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
484*543adbedSBen Gras 			   &type, &permset, &tag, &qual, &name));
485*543adbedSBen Gras 	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
486*543adbedSBen Gras 	assertEqualInt(permset, ARCHIVE_ENTRY_ACL_READ);
487*543adbedSBen Gras 	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER);
488*543adbedSBen Gras 	assertEqualInt(qual, 77);
489*543adbedSBen Gras 	assertEqualString(name, "user77");
490*543adbedSBen Gras #endif
491*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER < 1009000
492*543adbedSBen Gras 	skipping("xattr data preserved by archive_entry_clone");
493*543adbedSBen Gras #else
494*543adbedSBen Gras 	/* Verify xattr was copied. */
495*543adbedSBen Gras 	assertEqualInt(1, archive_entry_xattr_reset(e2));
496*543adbedSBen Gras 	assertEqualInt(0, archive_entry_xattr_next(e2, &xname, &xval, &xsize));
497*543adbedSBen Gras 	assertEqualString(xname, "xattr1");
498*543adbedSBen Gras 	assertEqualString(xval, "xattrvalue");
499*543adbedSBen Gras 	assertEqualInt((int)xsize, 11);
500*543adbedSBen Gras 	assertEqualInt(ARCHIVE_WARN,
501*543adbedSBen Gras 	    archive_entry_xattr_next(e2, &xname, &xval, &xsize));
502*543adbedSBen Gras 	assertEqualString(xname, NULL);
503*543adbedSBen Gras 	assertEqualString(xval, NULL);
504*543adbedSBen Gras 	assertEqualInt((int)xsize, 0);
505*543adbedSBen Gras #endif
506*543adbedSBen Gras 
507*543adbedSBen Gras 	/* Change the original */
508*543adbedSBen Gras 	archive_entry_set_atime(e, 13580, 24690);
509*543adbedSBen Gras 	archive_entry_set_birthtime(e, 13980, 24999);
510*543adbedSBen Gras 	archive_entry_set_ctime(e, 13590, 24691);
511*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
512*543adbedSBen Gras 	archive_entry_set_dev(e, 245);
513*543adbedSBen Gras #endif
514*543adbedSBen Gras 	archive_entry_set_fflags(e, 0x85, 0xDA);
515*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
516*543adbedSBen Gras 	archive_entry_set_filetype(e, AE_IFLNK);
517*543adbedSBen Gras #endif
518*543adbedSBen Gras 	archive_entry_set_gid(e, 214);
519*543adbedSBen Gras 	archive_entry_set_gname(e, "grouper");
520*543adbedSBen Gras 	archive_entry_set_hardlink(e, "hardlinkpath");
521*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
522*543adbedSBen Gras 	archive_entry_set_ino(e, 8763);
523*543adbedSBen Gras #endif
524*543adbedSBen Gras 	archive_entry_set_mode(e, 0123654);
525*543adbedSBen Gras 	archive_entry_set_mtime(e, 18351, 28642);
526*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
527*543adbedSBen Gras 	archive_entry_set_nlink(e, 73);
528*543adbedSBen Gras #endif
529*543adbedSBen Gras 	archive_entry_set_pathname(e, "pathest");
530*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
531*543adbedSBen Gras 	archive_entry_set_rdev(e, 132);
532*543adbedSBen Gras #endif
533*543adbedSBen Gras 	archive_entry_set_size(e, 987456321);
534*543adbedSBen Gras 	archive_entry_copy_sourcepath(e, "source2");
535*543adbedSBen Gras 	archive_entry_set_symlink(e, "symlinkpath");
536*543adbedSBen Gras 	archive_entry_set_uid(e, 93);
537*543adbedSBen Gras 	archive_entry_set_uname(e, "username");
538*543adbedSBen Gras 	archive_entry_acl_clear(e);
539*543adbedSBen Gras 	archive_entry_xattr_clear(e);
540*543adbedSBen Gras 
541*543adbedSBen Gras 	/* Clone should still have same contents. */
542*543adbedSBen Gras 	assertEqualInt(archive_entry_atime(e2), 13579);
543*543adbedSBen Gras 	assertEqualInt(archive_entry_atime_nsec(e2), 24680);
544*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime(e2), 13779);
545*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime_nsec(e2), 24990);
546*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime(e2), 13580);
547*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime_nsec(e2), 24681);
548*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
549*543adbedSBen Gras 	assertEqualInt(archive_entry_dev(e2), 235);
550*543adbedSBen Gras #endif
551*543adbedSBen Gras 	archive_entry_fflags(e2, &set, &clear);
552*543adbedSBen Gras 	assertEqualInt(clear, 0xAA);
553*543adbedSBen Gras 	assertEqualInt(set, 0x55);
554*543adbedSBen Gras 	assertEqualInt(archive_entry_gid(e2), 204);
555*543adbedSBen Gras 	assertEqualString(archive_entry_gname(e2), "group");
556*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e2), "hardlinkname");
557*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
558*543adbedSBen Gras 	assertEqualInt(archive_entry_ino(e2), 8593);
559*543adbedSBen Gras #endif
560*543adbedSBen Gras 	assertEqualInt(archive_entry_mode(e2), 0123456);
561*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime(e2), 13581);
562*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime_nsec(e2), 24682);
563*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
564*543adbedSBen Gras 	assertEqualInt(archive_entry_nlink(e2), 736);
565*543adbedSBen Gras #endif
566*543adbedSBen Gras 	assertEqualString(archive_entry_pathname(e2), "path");
567*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
568*543adbedSBen Gras 	assertEqualInt(archive_entry_rdev(e2), 532);
569*543adbedSBen Gras #endif
570*543adbedSBen Gras 	assertEqualInt(archive_entry_size(e2), 987654321);
571*543adbedSBen Gras 	assertEqualString(archive_entry_sourcepath(e2), "source");
572*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e2), "symlinkname");
573*543adbedSBen Gras 	assertEqualInt(archive_entry_uid(e2), 83);
574*543adbedSBen Gras 	assertEqualString(archive_entry_uname(e2), "user");
575*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER < 1009000
576*543adbedSBen Gras 	skipping("ACL held by clone of archive_entry");
577*543adbedSBen Gras #else
578*543adbedSBen Gras 	/* Verify ACL was unchanged. */
579*543adbedSBen Gras 	assertEqualInt(4, archive_entry_acl_reset(e2,
580*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS));
581*543adbedSBen Gras 	/* First three are standard permission bits. */
582*543adbedSBen Gras 	assertEqualInt(0, archive_entry_acl_next(e2,
583*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
584*543adbedSBen Gras 			   &type, &permset, &tag, &qual, &name));
585*543adbedSBen Gras 	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
586*543adbedSBen Gras 	assertEqualInt(permset, 4);
587*543adbedSBen Gras 	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER_OBJ);
588*543adbedSBen Gras 	assertEqualInt(qual, -1);
589*543adbedSBen Gras 	assertEqualString(name, NULL);
590*543adbedSBen Gras 	assertEqualInt(0, archive_entry_acl_next(e2,
591*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
592*543adbedSBen Gras 			   &type, &permset, &tag, &qual, &name));
593*543adbedSBen Gras 	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
594*543adbedSBen Gras 	assertEqualInt(permset, 5);
595*543adbedSBen Gras 	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_GROUP_OBJ);
596*543adbedSBen Gras 	assertEqualInt(qual, -1);
597*543adbedSBen Gras 	assertEqualString(name, NULL);
598*543adbedSBen Gras 	assertEqualInt(0, archive_entry_acl_next(e2,
599*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
600*543adbedSBen Gras 			   &type, &permset, &tag, &qual, &name));
601*543adbedSBen Gras 	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
602*543adbedSBen Gras 	assertEqualInt(permset, 6);
603*543adbedSBen Gras 	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_OTHER);
604*543adbedSBen Gras 	assertEqualInt(qual, -1);
605*543adbedSBen Gras 	assertEqualString(name, NULL);
606*543adbedSBen Gras 	/* Fourth is custom one. */
607*543adbedSBen Gras 	assertEqualInt(0, archive_entry_acl_next(e2,
608*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
609*543adbedSBen Gras 			   &type, &permset, &tag, &qual, &name));
610*543adbedSBen Gras 	assertEqualInt(type, ARCHIVE_ENTRY_ACL_TYPE_ACCESS);
611*543adbedSBen Gras 	assertEqualInt(permset, ARCHIVE_ENTRY_ACL_READ);
612*543adbedSBen Gras 	assertEqualInt(tag, ARCHIVE_ENTRY_ACL_USER);
613*543adbedSBen Gras 	assertEqualInt(qual, 77);
614*543adbedSBen Gras 	assertEqualString(name, "user77");
615*543adbedSBen Gras 	assertEqualInt(1, archive_entry_acl_next(e2,
616*543adbedSBen Gras 			   ARCHIVE_ENTRY_ACL_TYPE_ACCESS,
617*543adbedSBen Gras 			   &type, &permset, &tag, &qual, &name));
618*543adbedSBen Gras 	assertEqualInt(type, 0);
619*543adbedSBen Gras 	assertEqualInt(permset, 0);
620*543adbedSBen Gras 	assertEqualInt(tag, 0);
621*543adbedSBen Gras 	assertEqualInt(qual, -1);
622*543adbedSBen Gras 	assertEqualString(name, NULL);
623*543adbedSBen Gras #endif
624*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER < 1009000
625*543adbedSBen Gras 	skipping("xattr preserved in archive_entry copy");
626*543adbedSBen Gras #else
627*543adbedSBen Gras 	/* Verify xattr was unchanged. */
628*543adbedSBen Gras 	assertEqualInt(1, archive_entry_xattr_reset(e2));
629*543adbedSBen Gras #endif
630*543adbedSBen Gras 
631*543adbedSBen Gras 	/* Release clone. */
632*543adbedSBen Gras 	archive_entry_free(e2);
633*543adbedSBen Gras 
634*543adbedSBen Gras 	/*
635*543adbedSBen Gras 	 * Test clear() implementation.
636*543adbedSBen Gras 	 */
637*543adbedSBen Gras 	archive_entry_clear(e);
638*543adbedSBen Gras 	assertEqualInt(archive_entry_atime(e), 0);
639*543adbedSBen Gras 	assertEqualInt(archive_entry_atime_nsec(e), 0);
640*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime(e), 0);
641*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime_nsec(e), 0);
642*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime(e), 0);
643*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime_nsec(e), 0);
644*543adbedSBen Gras 	assertEqualInt(archive_entry_dev(e), 0);
645*543adbedSBen Gras 	archive_entry_fflags(e, &set, &clear);
646*543adbedSBen Gras 	assertEqualInt(clear, 0);
647*543adbedSBen Gras 	assertEqualInt(set, 0);
648*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
649*543adbedSBen Gras 	assertEqualInt(archive_entry_filetype(e), 0);
650*543adbedSBen Gras #endif
651*543adbedSBen Gras 	assertEqualInt(archive_entry_gid(e), 0);
652*543adbedSBen Gras 	assertEqualString(archive_entry_gname(e), NULL);
653*543adbedSBen Gras 	assertEqualString(archive_entry_hardlink(e), NULL);
654*543adbedSBen Gras 	assertEqualInt(archive_entry_ino(e), 0);
655*543adbedSBen Gras 	assertEqualInt(archive_entry_mode(e), 0);
656*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime(e), 0);
657*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime_nsec(e), 0);
658*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
659*543adbedSBen Gras 	assertEqualInt(archive_entry_nlink(e), 0);
660*543adbedSBen Gras #endif
661*543adbedSBen Gras 	assertEqualString(archive_entry_pathname(e), NULL);
662*543adbedSBen Gras 	assertEqualInt(archive_entry_rdev(e), 0);
663*543adbedSBen Gras 	assertEqualInt(archive_entry_size(e), 0);
664*543adbedSBen Gras 	assertEqualString(archive_entry_symlink(e), NULL);
665*543adbedSBen Gras 	assertEqualInt(archive_entry_uid(e), 0);
666*543adbedSBen Gras 	assertEqualString(archive_entry_uname(e), NULL);
667*543adbedSBen Gras 	/* ACLs should be cleared. */
668*543adbedSBen Gras 	assertEqualInt(archive_entry_acl_count(e, ARCHIVE_ENTRY_ACL_TYPE_ACCESS), 0);
669*543adbedSBen Gras 	assertEqualInt(archive_entry_acl_count(e, ARCHIVE_ENTRY_ACL_TYPE_DEFAULT), 0);
670*543adbedSBen Gras 	/* Extended attributes should be cleared. */
671*543adbedSBen Gras 	assertEqualInt(archive_entry_xattr_count(e), 0);
672*543adbedSBen Gras 
673*543adbedSBen Gras 	/*
674*543adbedSBen Gras 	 * Test archive_entry_copy_stat().
675*543adbedSBen Gras 	 */
676*543adbedSBen Gras 	memset(&st, 0, sizeof(st));
677*543adbedSBen Gras 	/* Set all of the standard 'struct stat' fields. */
678*543adbedSBen Gras 	st.st_atime = 456789;
679*543adbedSBen Gras 	st.st_ctime = 345678;
680*543adbedSBen Gras 	st.st_dev = 123;
681*543adbedSBen Gras 	st.st_gid = 34;
682*543adbedSBen Gras 	st.st_ino = 234;
683*543adbedSBen Gras 	st.st_mode = 077777;
684*543adbedSBen Gras 	st.st_mtime = 234567;
685*543adbedSBen Gras 	st.st_nlink = 345;
686*543adbedSBen Gras 	st.st_size = 123456789;
687*543adbedSBen Gras 	st.st_uid = 23;
688*543adbedSBen Gras #ifdef __FreeBSD__
689*543adbedSBen Gras 	/* On FreeBSD, high-res timestamp data should come through. */
690*543adbedSBen Gras 	st.st_atimespec.tv_nsec = 6543210;
691*543adbedSBen Gras 	st.st_ctimespec.tv_nsec = 5432109;
692*543adbedSBen Gras 	st.st_mtimespec.tv_nsec = 3210987;
693*543adbedSBen Gras 	st.st_birthtimespec.tv_nsec = 7459386;
694*543adbedSBen Gras #endif
695*543adbedSBen Gras 	/* Copy them into the entry. */
696*543adbedSBen Gras 	archive_entry_copy_stat(e, &st);
697*543adbedSBen Gras 	/* Read each one back separately and compare. */
698*543adbedSBen Gras 	assertEqualInt(archive_entry_atime(e), 456789);
699*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime(e), 345678);
700*543adbedSBen Gras 	assertEqualInt(archive_entry_dev(e), 123);
701*543adbedSBen Gras 	assertEqualInt(archive_entry_gid(e), 34);
702*543adbedSBen Gras 	assertEqualInt(archive_entry_ino(e), 234);
703*543adbedSBen Gras 	assertEqualInt(archive_entry_mode(e), 077777);
704*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime(e), 234567);
705*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
706*543adbedSBen Gras 	assertEqualInt(archive_entry_nlink(e), 345);
707*543adbedSBen Gras #endif
708*543adbedSBen Gras 	assertEqualInt(archive_entry_size(e), 123456789);
709*543adbedSBen Gras 	assertEqualInt(archive_entry_uid(e), 23);
710*543adbedSBen Gras #if __FreeBSD__
711*543adbedSBen Gras 	/* On FreeBSD, high-res timestamp data should come through. */
712*543adbedSBen Gras 	assertEqualInt(archive_entry_atime_nsec(e), 6543210);
713*543adbedSBen Gras 	assertEqualInt(archive_entry_ctime_nsec(e), 5432109);
714*543adbedSBen Gras 	assertEqualInt(archive_entry_mtime_nsec(e), 3210987);
715*543adbedSBen Gras 	assertEqualInt(archive_entry_birthtime_nsec(e), 7459386);
716*543adbedSBen Gras #endif
717*543adbedSBen Gras 
718*543adbedSBen Gras 	/*
719*543adbedSBen Gras 	 * Test archive_entry_stat().
720*543adbedSBen Gras 	 */
721*543adbedSBen Gras 	/* First, clear out any existing stat data. */
722*543adbedSBen Gras 	memset(&st, 0, sizeof(st));
723*543adbedSBen Gras 	archive_entry_copy_stat(e, &st);
724*543adbedSBen Gras 	/* Set a bunch of fields individually. */
725*543adbedSBen Gras 	archive_entry_set_atime(e, 456789, 321);
726*543adbedSBen Gras 	archive_entry_set_ctime(e, 345678, 432);
727*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
728*543adbedSBen Gras 	archive_entry_set_dev(e, 123);
729*543adbedSBen Gras #endif
730*543adbedSBen Gras 	archive_entry_set_gid(e, 34);
731*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
732*543adbedSBen Gras 	archive_entry_set_ino(e, 234);
733*543adbedSBen Gras #endif
734*543adbedSBen Gras 	archive_entry_set_mode(e, 012345);
735*543adbedSBen Gras 	archive_entry_set_mode(e, 012345);
736*543adbedSBen Gras 	archive_entry_set_mtime(e, 234567, 543);
737*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
738*543adbedSBen Gras 	archive_entry_set_nlink(e, 345);
739*543adbedSBen Gras #endif
740*543adbedSBen Gras 	archive_entry_set_size(e, 123456789);
741*543adbedSBen Gras 	archive_entry_set_uid(e, 23);
742*543adbedSBen Gras 	/* Retrieve a stat structure. */
743*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
744*543adbedSBen Gras 	/* Check that the values match. */
745*543adbedSBen Gras 	assertEqualInt(pst->st_atime, 456789);
746*543adbedSBen Gras 	assertEqualInt(pst->st_ctime, 345678);
747*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
748*543adbedSBen Gras 	assertEqualInt(pst->st_dev, 123);
749*543adbedSBen Gras #endif
750*543adbedSBen Gras 	assertEqualInt(pst->st_gid, 34);
751*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
752*543adbedSBen Gras 	assertEqualInt(pst->st_ino, 234);
753*543adbedSBen Gras #endif
754*543adbedSBen Gras 	assertEqualInt(pst->st_mode, 012345);
755*543adbedSBen Gras 	assertEqualInt(pst->st_mtime, 234567);
756*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
757*543adbedSBen Gras 	assertEqualInt(pst->st_nlink, 345);
758*543adbedSBen Gras #endif
759*543adbedSBen Gras 	assertEqualInt(pst->st_size, 123456789);
760*543adbedSBen Gras 	assertEqualInt(pst->st_uid, 23);
761*543adbedSBen Gras #ifdef __FreeBSD__
762*543adbedSBen Gras 	/* On FreeBSD, high-res timestamp data should come through. */
763*543adbedSBen Gras 	assertEqualInt(pst->st_atimespec.tv_nsec, 321);
764*543adbedSBen Gras 	assertEqualInt(pst->st_ctimespec.tv_nsec, 432);
765*543adbedSBen Gras 	assertEqualInt(pst->st_mtimespec.tv_nsec, 543);
766*543adbedSBen Gras #endif
767*543adbedSBen Gras 
768*543adbedSBen Gras 	/* Changing any one value should update struct stat. */
769*543adbedSBen Gras 	archive_entry_set_atime(e, 456788, 0);
770*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
771*543adbedSBen Gras 	assertEqualInt(pst->st_atime, 456788);
772*543adbedSBen Gras 	archive_entry_set_ctime(e, 345677, 431);
773*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
774*543adbedSBen Gras 	assertEqualInt(pst->st_ctime, 345677);
775*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
776*543adbedSBen Gras 	archive_entry_set_dev(e, 122);
777*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
778*543adbedSBen Gras 	assertEqualInt(pst->st_dev, 122);
779*543adbedSBen Gras #endif
780*543adbedSBen Gras 	archive_entry_set_gid(e, 33);
781*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
782*543adbedSBen Gras 	assertEqualInt(pst->st_gid, 33);
783*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
784*543adbedSBen Gras 	archive_entry_set_ino(e, 233);
785*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
786*543adbedSBen Gras 	assertEqualInt(pst->st_ino, 233);
787*543adbedSBen Gras #endif
788*543adbedSBen Gras 	archive_entry_set_mode(e, 012344);
789*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
790*543adbedSBen Gras 	assertEqualInt(pst->st_mode, 012344);
791*543adbedSBen Gras 	archive_entry_set_mtime(e, 234566, 542);
792*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
793*543adbedSBen Gras 	assertEqualInt(pst->st_mtime, 234566);
794*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
795*543adbedSBen Gras 	archive_entry_set_nlink(e, 344);
796*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
797*543adbedSBen Gras 	assertEqualInt(pst->st_nlink, 344);
798*543adbedSBen Gras #endif
799*543adbedSBen Gras 	archive_entry_set_size(e, 123456788);
800*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
801*543adbedSBen Gras 	assertEqualInt(pst->st_size, 123456788);
802*543adbedSBen Gras 	archive_entry_set_uid(e, 22);
803*543adbedSBen Gras 	assert((pst = archive_entry_stat(e)) != NULL);
804*543adbedSBen Gras 	assertEqualInt(pst->st_uid, 22);
805*543adbedSBen Gras 	/* We don't need to check high-res fields here. */
806*543adbedSBen Gras 
807*543adbedSBen Gras 	/*
808*543adbedSBen Gras 	 * Test dev/major/minor interfaces.  Setting 'dev' or 'rdev'
809*543adbedSBen Gras 	 * should change the corresponding major/minor values, and
810*543adbedSBen Gras 	 * vice versa.
811*543adbedSBen Gras 	 *
812*543adbedSBen Gras 	 * The test here is system-specific because it assumes that
813*543adbedSBen Gras 	 * makedev(), major(), and minor() are defined in sys/stat.h.
814*543adbedSBen Gras 	 * I'm not too worried about it, though, because the code is
815*543adbedSBen Gras 	 * simple.  If it works on FreeBSD, it's unlikely to be broken
816*543adbedSBen Gras 	 * anywhere else.  Note: The functionality is present on every
817*543adbedSBen Gras 	 * platform even if these tests only run some places;
818*543adbedSBen Gras 	 * libarchive's more extensive configuration logic should find
819*543adbedSBen Gras 	 * the necessary definitions on every platform.
820*543adbedSBen Gras 	 */
821*543adbedSBen Gras #if __FreeBSD__
822*543adbedSBen Gras #if ARCHIVE_VERSION_NUMBER >= 1009000
823*543adbedSBen Gras 	archive_entry_set_dev(e, 0x12345678);
824*543adbedSBen Gras 	assertEqualInt(archive_entry_devmajor(e), major(0x12345678));
825*543adbedSBen Gras 	assertEqualInt(archive_entry_devminor(e), minor(0x12345678));
826*543adbedSBen Gras 	assertEqualInt(archive_entry_dev(e), 0x12345678);
827*543adbedSBen Gras 	archive_entry_set_devmajor(e, 0xfe);
828*543adbedSBen Gras 	archive_entry_set_devminor(e, 0xdcba98);
829*543adbedSBen Gras 	assertEqualInt(archive_entry_devmajor(e), 0xfe);
830*543adbedSBen Gras 	assertEqualInt(archive_entry_devminor(e), 0xdcba98);
831*543adbedSBen Gras 	assertEqualInt(archive_entry_dev(e), makedev(0xfe, 0xdcba98));
832*543adbedSBen Gras 	archive_entry_set_rdev(e, 0x12345678);
833*543adbedSBen Gras 	assertEqualInt(archive_entry_rdevmajor(e), major(0x12345678));
834*543adbedSBen Gras 	assertEqualInt(archive_entry_rdevminor(e), minor(0x12345678));
835*543adbedSBen Gras 	assertEqualInt(archive_entry_rdev(e), 0x12345678);
836*543adbedSBen Gras 	archive_entry_set_rdevmajor(e, 0xfe);
837*543adbedSBen Gras 	archive_entry_set_rdevminor(e, 0xdcba98);
838*543adbedSBen Gras 	assertEqualInt(archive_entry_rdevmajor(e), 0xfe);
839*543adbedSBen Gras 	assertEqualInt(archive_entry_rdevminor(e), 0xdcba98);
840*543adbedSBen Gras 	assertEqualInt(archive_entry_rdev(e), makedev(0xfe, 0xdcba98));
841*543adbedSBen Gras #endif
842*543adbedSBen Gras #endif
843*543adbedSBen Gras 
844*543adbedSBen Gras 	/*
845*543adbedSBen Gras 	 * Exercise the character-conversion logic, if we can.
846*543adbedSBen Gras 	 */
847*543adbedSBen Gras 	if (NULL == LOCALE_UTF8 || NULL == setlocale(LC_ALL, LOCALE_UTF8)) {
848*543adbedSBen Gras 		skipping("Can't exercise charset-conversion logic without"
849*543adbedSBen Gras 			" a suitable locale.");
850*543adbedSBen Gras 	} else {
851*543adbedSBen Gras 		/* A filename that cannot be converted to wide characters. */
852*543adbedSBen Gras 		archive_entry_copy_pathname(e, "abc\314\214mno\374xyz");
853*543adbedSBen Gras 		failure("Converting invalid chars to Unicode should fail.");
854*543adbedSBen Gras 		assert(NULL == archive_entry_pathname_w(e));
855*543adbedSBen Gras 		//failure("Converting invalid chars to UTF-8 should fail.");
856*543adbedSBen Gras 		//assert(NULL == archive_entry_pathname_utf8(e));
857*543adbedSBen Gras 
858*543adbedSBen Gras 		/* A group name that cannot be converted. */
859*543adbedSBen Gras 		archive_entry_copy_gname(e, "abc\314\214mno\374xyz");
860*543adbedSBen Gras 		failure("Converting invalid chars to Unicode should fail.");
861*543adbedSBen Gras 		assert(NULL == archive_entry_gname_w(e));
862*543adbedSBen Gras 
863*543adbedSBen Gras 		/* A user name that cannot be converted. */
864*543adbedSBen Gras 		archive_entry_copy_uname(e, "abc\314\214mno\374xyz");
865*543adbedSBen Gras 		failure("Converting invalid chars to Unicode should fail.");
866*543adbedSBen Gras 		assert(NULL == archive_entry_uname_w(e));
867*543adbedSBen Gras 
868*543adbedSBen Gras 		/* A hardlink target that cannot be converted. */
869*543adbedSBen Gras 		archive_entry_copy_hardlink(e, "abc\314\214mno\374xyz");
870*543adbedSBen Gras 		failure("Converting invalid chars to Unicode should fail.");
871*543adbedSBen Gras 		assert(NULL == archive_entry_hardlink_w(e));
872*543adbedSBen Gras 
873*543adbedSBen Gras 		/* A symlink target that cannot be converted. */
874*543adbedSBen Gras 		archive_entry_copy_symlink(e, "abc\314\214mno\374xyz");
875*543adbedSBen Gras 		failure("Converting invalid chars to Unicode should fail.");
876*543adbedSBen Gras 		assert(NULL == archive_entry_symlink_w(e));
877*543adbedSBen Gras 	}
878*543adbedSBen Gras 
879*543adbedSBen Gras #if HAVE_WCSCPY
880*543adbedSBen Gras 	l = 0x12345678L;
881*543adbedSBen Gras 	wc = (wchar_t)l; /* Wide character too big for UTF-8. */
882*543adbedSBen Gras 	if (NULL == setlocale(LC_ALL, "C") || (long)wc != l) {
883*543adbedSBen Gras 		skipping("Testing charset conversion failure requires 32-bit wchar_t and support for \"C\" locale.");
884*543adbedSBen Gras 	} else {
885*543adbedSBen Gras 		/*
886*543adbedSBen Gras 		 * Build the string L"xxx\U12345678yyy\u5678zzz" without
887*543adbedSBen Gras 		 * using C99 \u#### syntax, which isn't uniformly
888*543adbedSBen Gras 		 * supported.  (GCC 3.4.6, for instance, defaults to
889*543adbedSBen Gras 		 * "c89 plus GNU extensions.")
890*543adbedSBen Gras 		 */
891*543adbedSBen Gras 		wcscpy(wbuff, L"xxxAyyyBzzz");
892*543adbedSBen Gras 		wbuff[3] = (wchar_t)0x12345678;
893*543adbedSBen Gras 		wbuff[7] = (wchar_t)0x5678;
894*543adbedSBen Gras 		/* A wide filename that cannot be converted to narrow. */
895*543adbedSBen Gras 		archive_entry_copy_pathname_w(e, wbuff);
896*543adbedSBen Gras 		failure("Converting wide characters from Unicode should fail.");
897*543adbedSBen Gras 		assertEqualString(NULL, archive_entry_pathname(e));
898*543adbedSBen Gras 	}
899*543adbedSBen Gras #endif
900*543adbedSBen Gras 
901*543adbedSBen Gras 	/* Release the experimental entry. */
902*543adbedSBen Gras 	archive_entry_free(e);
903*543adbedSBen Gras }
904