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