1231200Smm/*-
2231200Smm * Copyright (c) 2003-2008 Tim Kientzle
3231200Smm * Copyright (c) 2009,2010 Michihiro NAKAJIMA
4231200Smm * All rights reserved.
5231200Smm *
6231200Smm * Redistribution and use in source and binary forms, with or without
7231200Smm * modification, are permitted provided that the following conditions
8231200Smm * are met:
9231200Smm * 1. Redistributions of source code must retain the above copyright
10231200Smm *    notice, this list of conditions and the following disclaimer.
11231200Smm * 2. Redistributions in binary form must reproduce the above copyright
12231200Smm *    notice, this list of conditions and the following disclaimer in the
13231200Smm *    documentation and/or other materials provided with the distribution.
14231200Smm *
15231200Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16231200Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17231200Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18231200Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19231200Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20231200Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21231200Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22231200Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23231200Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24231200Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25231200Smm */
26231200Smm#include "test.h"
27231200Smm__FBSDID("$FreeBSD$");
28231200Smm
29231200Smmchar buff2[64];
30231200SmmDEFINE_TEST(test_write_format_iso9660)
31231200Smm{
32231200Smm	size_t buffsize = 1000000;
33231200Smm	char *buff;
34231200Smm	struct archive_entry *ae;
35231200Smm	struct archive *a;
36231200Smm	char dirname[1024];
37231200Smm	char dir[6];
38231200Smm	char longname[] =
39231200Smm	    "longname00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
40231200Smm	    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
41231200Smm	    "cccccccccccccccccccccccccccccccccccccccccccccccccc"
42231200Smm	    "dddddddddddddddddddddddddddddddddddddddddddddddddd";
43231200Smm
44231200Smm	size_t used;
45231200Smm	int i;
46231200Smm
47231200Smm	buff = malloc(buffsize); /* million bytes of work area */
48231200Smm	assert(buff != NULL);
49231200Smm
50231200Smm	/* Create a new archive in memory. */
51231200Smm	assert((a = archive_write_new()) != NULL);
52231200Smm	assertA(0 == archive_write_set_format_iso9660(a));
53248616Smm	assertA(0 == archive_write_add_filter_none(a));
54231200Smm	assertA(0 == archive_write_open_memory(a, buff, buffsize, &used));
55231200Smm
56231200Smm	/*
57231200Smm	 * "file" has a bunch of attributes and 8 bytes of data.
58231200Smm	 */
59231200Smm	assert((ae = archive_entry_new()) != NULL);
60231200Smm	archive_entry_set_atime(ae, 2, 20);
61231200Smm	archive_entry_set_birthtime(ae, 3, 30);
62231200Smm	archive_entry_set_ctime(ae, 4, 40);
63231200Smm	archive_entry_set_mtime(ae, 5, 50);
64231200Smm	archive_entry_copy_pathname(ae, "file");
65231200Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
66231200Smm	archive_entry_set_size(ae, 8);
67231200Smm	archive_entry_set_nlink(ae, 2);
68231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
69231200Smm	archive_entry_free(ae);
70231200Smm	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
71231200Smm
72231200Smm	/*
73231200Smm	 * "hardlnk" has linked to "file".
74231200Smm	 */
75231200Smm	assert((ae = archive_entry_new()) != NULL);
76231200Smm	archive_entry_set_atime(ae, 2, 20);
77231200Smm	archive_entry_set_birthtime(ae, 3, 30);
78231200Smm	archive_entry_set_ctime(ae, 4, 40);
79231200Smm	archive_entry_set_mtime(ae, 5, 50);
80231200Smm	archive_entry_copy_pathname(ae, "hardlnk");
81231200Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
82231200Smm	archive_entry_set_hardlink(ae, "file");
83231200Smm	archive_entry_set_nlink(ae, 2);
84231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
85231200Smm	archive_entry_free(ae);
86231200Smm
87231200Smm	/*
88231200Smm	 * longname is similar but has birthtime later than mtime.
89231200Smm	 */
90231200Smm	assert((ae = archive_entry_new()) != NULL);
91231200Smm	archive_entry_set_atime(ae, 2, 20);
92231200Smm	archive_entry_set_birthtime(ae, 8, 80);
93231200Smm	archive_entry_set_ctime(ae, 4, 40);
94231200Smm	archive_entry_set_mtime(ae, 5, 50);
95231200Smm	archive_entry_copy_pathname(ae, longname);
96231200Smm	archive_entry_set_mode(ae, AE_IFREG | 0666);
97231200Smm	archive_entry_set_size(ae, 8);
98231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
99231200Smm	archive_entry_free(ae);
100231200Smm	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
101231200Smm
102231200Smm	/*
103231200Smm	 * "symlnk has symbolic linked to longname.
104231200Smm	 */
105231200Smm	assert((ae = archive_entry_new()) != NULL);
106231200Smm	archive_entry_set_atime(ae, 2, 20);
107231200Smm	archive_entry_set_ctime(ae, 4, 40);
108231200Smm	archive_entry_set_mtime(ae, 5, 50);
109231200Smm	archive_entry_copy_pathname(ae, "symlnk");
110231200Smm	archive_entry_set_mode(ae, AE_IFLNK | 0555);
111231200Smm	archive_entry_set_symlink(ae, longname);
112231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
113231200Smm	archive_entry_free(ae);
114231200Smm
115231200Smm	/*
116231200Smm	 * "dir*" has a bunch of attributes.
117231200Smm	 */
118231200Smm	dirname[0] = '\0';
119231200Smm	strcpy(dir, "/dir0");
120231200Smm	for (i = 0; i < 10; i++) {
121231200Smm		dir[4] = '0' + i;
122231200Smm		if (i == 0)
123231200Smm			strcat(dirname, dir+1);
124231200Smm		else
125231200Smm			strcat(dirname, dir);
126231200Smm		assert((ae = archive_entry_new()) != NULL);
127231200Smm		archive_entry_set_atime(ae, 2, 20);
128231200Smm		archive_entry_set_birthtime(ae, 3, 30);
129231200Smm		archive_entry_set_ctime(ae, 4, 40);
130231200Smm		archive_entry_set_mtime(ae, 5, 50);
131231200Smm		archive_entry_copy_pathname(ae, dirname);
132231200Smm		archive_entry_set_mode(ae, S_IFDIR | 0755);
133231200Smm		assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
134231200Smm		archive_entry_free(ae);
135231200Smm	}
136231200Smm
137231200Smm	/*
138231200Smm	 * "dir0/dir1/file1" has 8 bytes of data.
139231200Smm	 */
140231200Smm	assert((ae = archive_entry_new()) != NULL);
141231200Smm	archive_entry_set_atime(ae, 2, 20);
142231200Smm	archive_entry_set_birthtime(ae, 3, 30);
143231200Smm	archive_entry_set_ctime(ae, 4, 40);
144231200Smm	archive_entry_set_mtime(ae, 5, 50);
145231200Smm	archive_entry_copy_pathname(ae, "dir0/dir1/file1");
146231200Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
147231200Smm	archive_entry_set_size(ae, 8);
148231200Smm	archive_entry_set_nlink(ae, 1);
149231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
150231200Smm	archive_entry_free(ae);
151231200Smm	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
152231200Smm
153231200Smm	/*
154231200Smm	 * "dir0/dir1/file2" has 8 bytes of data.
155231200Smm	 */
156231200Smm	assert((ae = archive_entry_new()) != NULL);
157231200Smm	archive_entry_set_atime(ae, 2, 20);
158231200Smm	archive_entry_set_birthtime(ae, 3, 30);
159231200Smm	archive_entry_set_ctime(ae, 4, 40);
160231200Smm	archive_entry_set_mtime(ae, 5, 50);
161231200Smm	archive_entry_copy_pathname(ae, "dir0/dir1/file2");
162231200Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
163231200Smm	archive_entry_set_size(ae, 8);
164231200Smm	archive_entry_set_nlink(ae, 1);
165231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
166231200Smm	archive_entry_free(ae);
167231200Smm	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
168231200Smm
169231200Smm	/*
170231200Smm	 * Add a wrong path "dir0/dir1/file2/wrong"
171231200Smm	 */
172231200Smm	assert((ae = archive_entry_new()) != NULL);
173231200Smm	archive_entry_set_atime(ae, 2, 20);
174231200Smm	archive_entry_set_birthtime(ae, 3, 30);
175231200Smm	archive_entry_set_ctime(ae, 4, 40);
176231200Smm	archive_entry_set_mtime(ae, 5, 50);
177231200Smm	archive_entry_copy_pathname(ae, "dir0/dir1/file2/wrong");
178231200Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
179231200Smm	archive_entry_set_size(ae, 8);
180231200Smm	archive_entry_set_nlink(ae, 1);
181231200Smm	assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae));
182231200Smm	archive_entry_free(ae);
183231200Smm
184231200Smm	/* Close out the archive. */
185231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
186231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a));
187231200Smm
188231200Smm	/*
189231200Smm	 * -----------------------------------------------------------
190231200Smm	 * Now, read the data back(read Rockridge extensions).
191231200Smm	 * -----------------------------------------------------------
192231200Smm	 */
193231200Smm	assert((a = archive_read_new()) != NULL);
194231200Smm	assertEqualIntA(a, 0, archive_read_support_format_all(a));
195231200Smm	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
196231200Smm	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
197231200Smm
198231200Smm	/*
199231200Smm	 * Read Root Directory
200231200Smm	 */
201231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
202231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
203231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
204231200Smm	assertEqualString(".", archive_entry_pathname(ae));
205231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
206231200Smm	assertEqualInt(2048, archive_entry_size(ae));
207231200Smm
208231200Smm	/*
209231200Smm	 * Read "dir0"
210231200Smm	 */
211231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
212231200Smm	assertEqualInt(2, archive_entry_atime(ae));
213231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
214231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
215231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
216231200Smm	assertEqualString("dir0", archive_entry_pathname(ae));
217231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
218231200Smm	assertEqualInt(2048, archive_entry_size(ae));
219231200Smm
220231200Smm	/*
221231200Smm	 * Read "dir0/dir1"
222231200Smm	 */
223231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
224231200Smm	assertEqualInt(2, archive_entry_atime(ae));
225231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
226231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
227231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
228231200Smm	assertEqualString("dir0/dir1", archive_entry_pathname(ae));
229231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
230231200Smm	assertEqualInt(2048, archive_entry_size(ae));
231231200Smm
232231200Smm	/*
233231200Smm	 * Read "dir0/dir1/dir2"
234231200Smm	 */
235231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
236231200Smm	assertEqualInt(2, archive_entry_atime(ae));
237231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
238231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
239231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
240231200Smm	assertEqualString("dir0/dir1/dir2", archive_entry_pathname(ae));
241231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
242231200Smm	assertEqualInt(2048, archive_entry_size(ae));
243231200Smm
244231200Smm	/*
245231200Smm	 * Read "dir0/dir1/dir2/dir3"
246231200Smm	 */
247231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
248231200Smm	assertEqualInt(2, archive_entry_atime(ae));
249231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
250231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
251231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
252231200Smm	assertEqualString("dir0/dir1/dir2/dir3",
253231200Smm	    archive_entry_pathname(ae));
254231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
255231200Smm	assertEqualInt(2048, archive_entry_size(ae));
256231200Smm
257231200Smm	/*
258231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4"
259231200Smm	 */
260231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
261231200Smm	assertEqualInt(2, archive_entry_atime(ae));
262231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
263231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
264231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
265231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4",
266231200Smm	    archive_entry_pathname(ae));
267231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
268231200Smm	assertEqualInt(2048, archive_entry_size(ae));
269231200Smm
270231200Smm	/*
271231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5"
272231200Smm	 */
273231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
274231200Smm	assertEqualInt(2, archive_entry_atime(ae));
275231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
276231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
277231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
278231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5",
279231200Smm	    archive_entry_pathname(ae));
280231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
281231200Smm	assertEqualInt(2048, archive_entry_size(ae));
282231200Smm
283231200Smm	/*
284231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
285231200Smm	 */
286231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
287231200Smm	assertEqualInt(2, archive_entry_atime(ae));
288231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
289231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
290231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
291231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6",
292231200Smm	    archive_entry_pathname(ae));
293231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
294231200Smm	assertEqualInt(2048, archive_entry_size(ae));
295231200Smm
296231200Smm	/*
297231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7"
298231200Smm	 */
299231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
300231200Smm	assertEqualInt(2, archive_entry_atime(ae));
301231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
302231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
303231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
304231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7",
305231200Smm	    archive_entry_pathname(ae));
306231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
307231200Smm	assertEqualInt(2048, archive_entry_size(ae));
308231200Smm
309231200Smm	/*
310231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8"
311231200Smm	 */
312231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
313231200Smm	assertEqualInt(2, archive_entry_atime(ae));
314231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
315231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
316231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
317231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8",
318231200Smm	    archive_entry_pathname(ae));
319231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
320231200Smm	assertEqualInt(2048, archive_entry_size(ae));
321231200Smm
322231200Smm	/*
323231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9"
324231200Smm	 */
325231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
326231200Smm	assertEqualInt(2, archive_entry_atime(ae));
327231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
328231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
329231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
330231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9",
331231200Smm	    archive_entry_pathname(ae));
332231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
333231200Smm	assertEqualInt(2048, archive_entry_size(ae));
334231200Smm
335231200Smm	/*
336231200Smm	 * Read "hardlnk"
337231200Smm	 */
338231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
339231200Smm	assertEqualInt(2, archive_entry_atime(ae));
340231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
341231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
342231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
343231200Smm	assertEqualString("hardlnk", archive_entry_pathname(ae));
344231200Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
345231200Smm	assertEqualInt(2, archive_entry_nlink(ae));
346231200Smm	assertEqualInt(8, archive_entry_size(ae));
347231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
348231200Smm	assertEqualMem(buff2, "12345678", 8);
349231200Smm
350231200Smm	/*
351231200Smm	 * Read "file"
352231200Smm	 */
353231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
354231200Smm	assertEqualInt(2, archive_entry_atime(ae));
355231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
356231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
357231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
358231200Smm	assertEqualString("file", archive_entry_pathname(ae));
359231200Smm	assertEqualString("hardlnk", archive_entry_hardlink(ae));
360231200Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
361231200Smm	assertEqualInt(2, archive_entry_nlink(ae));
362231200Smm	assertEqualInt(0, archive_entry_size(ae));
363231200Smm
364231200Smm	/*
365231200Smm	 * Read longname
366231200Smm	 */
367231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
368231200Smm	assert(archive_entry_atime_is_set(ae));
369231200Smm	assertEqualInt(2, archive_entry_atime(ae));
370231200Smm	/* Birthtime > mtime above, so it doesn't get stored at all. */
371231200Smm	assert(!archive_entry_birthtime_is_set(ae));
372231200Smm	assertEqualInt(0, archive_entry_birthtime(ae));
373231200Smm	assert(archive_entry_ctime_is_set(ae));
374231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
375231200Smm	assert(archive_entry_mtime_is_set(ae));
376231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
377231200Smm	assertEqualString(longname, archive_entry_pathname(ae));
378231200Smm#if !defined(_WIN32) && !defined(__CYGWIN__)
379231200Smm	assert((AE_IFREG | 0444) == archive_entry_mode(ae));
380231200Smm#else
381231200Smm	/* On Windows and CYGWIN, always set all exec bit ON by default. */
382231200Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
383231200Smm#endif
384231200Smm	assertEqualInt(8, archive_entry_size(ae));
385231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
386231200Smm	assertEqualMem(buff2, "12345678", 8);
387231200Smm
388231200Smm	/*
389231200Smm	 * Read "dir0/dir1/file1"
390231200Smm	 */
391231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
392231200Smm	assertEqualInt(2, archive_entry_atime(ae));
393231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
394231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
395231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
396231200Smm	assertEqualString("dir0/dir1/file1", archive_entry_pathname(ae));
397231200Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
398231200Smm	assertEqualInt(1, archive_entry_nlink(ae));
399231200Smm	assertEqualInt(8, archive_entry_size(ae));
400231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
401231200Smm	assertEqualMem(buff2, "12345678", 8);
402231200Smm
403231200Smm	/*
404231200Smm	 * Read "dir0/dir1/file2"
405231200Smm	 */
406231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
407231200Smm	assertEqualInt(2, archive_entry_atime(ae));
408231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
409231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
410231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
411231200Smm	assertEqualString("dir0/dir1/file2", archive_entry_pathname(ae));
412231200Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
413231200Smm	assertEqualInt(1, archive_entry_nlink(ae));
414231200Smm	assertEqualInt(8, archive_entry_size(ae));
415231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
416231200Smm	assertEqualMem(buff2, "12345678", 8);
417231200Smm
418231200Smm	/*
419231200Smm	 * Read "symlnk"
420231200Smm	 */
421231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
422231200Smm	assert(archive_entry_atime_is_set(ae));
423231200Smm	assertEqualInt(2, archive_entry_atime(ae));
424231200Smm	assert(!archive_entry_birthtime_is_set(ae));
425231200Smm	assertEqualInt(0, archive_entry_birthtime(ae));
426231200Smm	assert(archive_entry_ctime_is_set(ae));
427231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
428231200Smm	assert(archive_entry_mtime_is_set(ae));
429231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
430231200Smm	assertEqualString("symlnk", archive_entry_pathname(ae));
431231200Smm	assert((AE_IFLNK | 0555) == archive_entry_mode(ae));
432231200Smm	assertEqualString(longname, archive_entry_symlink(ae));
433231200Smm
434231200Smm	/*
435231200Smm	 * Verify the end of the archive.
436231200Smm	 */
437231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
438231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
439231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
440231200Smm
441231200Smm	/*
442231200Smm	 * -----------------------------------------------------------
443231200Smm	 * Now, read the data back without Rockridge option
444231200Smm	 * (read Joliet extensions).
445231200Smm	 * -----------------------------------------------------------
446231200Smm	 */
447231200Smm	assert((a = archive_read_new()) != NULL);
448231200Smm	assertEqualIntA(a, 0, archive_read_support_format_all(a));
449231200Smm	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
450231200Smm	/* Disable Rockridge extensions support. */
451231200Smm        assertEqualInt(ARCHIVE_OK,
452231200Smm            archive_read_set_option(a, NULL, "rockridge", NULL));
453231200Smm	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
454231200Smm
455231200Smm	/*
456231200Smm	 * Read Root Directory
457231200Smm	 */
458231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
459231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
460231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
461231200Smm	assertEqualString(".", archive_entry_pathname(ae));
462231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
463231200Smm	assertEqualInt(2048, archive_entry_size(ae));
464231200Smm
465231200Smm	/*
466231200Smm	 * Read "dir0"
467231200Smm	 */
468231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
469231200Smm	assertEqualInt(5, archive_entry_atime(ae));
470231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
471231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
472231200Smm	assertEqualString("dir0", archive_entry_pathname(ae));
473231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
474231200Smm	assertEqualInt(2048, archive_entry_size(ae));
475231200Smm
476231200Smm	/*
477231200Smm	 * Read "dir0/dir1"
478231200Smm	 */
479231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
480231200Smm	assertEqualInt(5, archive_entry_atime(ae));
481231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
482231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
483231200Smm	assertEqualString("dir0/dir1", archive_entry_pathname(ae));
484231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
485231200Smm	assertEqualInt(2048, archive_entry_size(ae));
486231200Smm
487231200Smm	/*
488231200Smm	 * Read "dir0/dir1/dir2"
489231200Smm	 */
490231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
491231200Smm	assertEqualInt(5, archive_entry_atime(ae));
492231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
493231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
494231200Smm	assertEqualString("dir0/dir1/dir2", archive_entry_pathname(ae));
495231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
496231200Smm	assertEqualInt(2048, archive_entry_size(ae));
497231200Smm
498231200Smm	/*
499231200Smm	 * Read "dir0/dir1/dir2/dir3"
500231200Smm	 */
501231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
502231200Smm	assertEqualInt(5, archive_entry_atime(ae));
503231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
504231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
505231200Smm	assertEqualString("dir0/dir1/dir2/dir3",
506231200Smm	    archive_entry_pathname(ae));
507231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
508231200Smm	assertEqualInt(2048, archive_entry_size(ae));
509231200Smm
510231200Smm	/*
511231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4"
512231200Smm	 */
513231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
514231200Smm	assertEqualInt(5, archive_entry_atime(ae));
515231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
516231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
517231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4",
518231200Smm	    archive_entry_pathname(ae));
519231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
520231200Smm	assertEqualInt(2048, archive_entry_size(ae));
521231200Smm
522231200Smm	/*
523231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5"
524231200Smm	 */
525231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
526231200Smm	assertEqualInt(5, archive_entry_atime(ae));
527231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
528231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
529231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5",
530231200Smm	    archive_entry_pathname(ae));
531231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
532231200Smm	assertEqualInt(2048, archive_entry_size(ae));
533231200Smm
534231200Smm	/*
535231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
536231200Smm	 */
537231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
538231200Smm	assertEqualInt(5, archive_entry_atime(ae));
539231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
540231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
541231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6",
542231200Smm	    archive_entry_pathname(ae));
543231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
544231200Smm	assertEqualInt(2048, archive_entry_size(ae));
545231200Smm
546231200Smm	/*
547231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7"
548231200Smm	 */
549231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
550231200Smm	assertEqualInt(5, archive_entry_atime(ae));
551231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
552231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
553231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7",
554231200Smm	    archive_entry_pathname(ae));
555231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
556231200Smm	assertEqualInt(2048, archive_entry_size(ae));
557231200Smm
558231200Smm	/*
559231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8"
560231200Smm	 */
561231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
562231200Smm	assertEqualInt(5, archive_entry_atime(ae));
563231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
564231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
565231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8",
566231200Smm	    archive_entry_pathname(ae));
567231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
568231200Smm	assertEqualInt(2048, archive_entry_size(ae));
569231200Smm
570231200Smm	/*
571231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9"
572231200Smm	 */
573231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
574231200Smm	assertEqualInt(5, archive_entry_atime(ae));
575231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
576231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
577231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9",
578231200Smm	    archive_entry_pathname(ae));
579231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
580231200Smm	assertEqualInt(2048, archive_entry_size(ae));
581231200Smm
582231200Smm	/*
583231200Smm	 * Read "hardlnk"
584231200Smm	 */
585231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
586231200Smm	assertEqualInt(5, archive_entry_atime(ae));
587231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
588231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
589231200Smm	assertEqualString("hardlnk", archive_entry_pathname(ae));
590231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
591231200Smm	assertEqualInt(2, archive_entry_nlink(ae));
592231200Smm	assertEqualInt(8, archive_entry_size(ae));
593231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
594231200Smm	assertEqualMem(buff2, "12345678", 8);
595231200Smm
596231200Smm	/*
597231200Smm	 * Read "file"
598231200Smm	 */
599231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
600231200Smm	assertEqualInt(5, archive_entry_atime(ae));
601231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
602231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
603231200Smm	assertEqualString("file", archive_entry_pathname(ae));
604231200Smm	assertEqualString("hardlnk", archive_entry_hardlink(ae));
605231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
606231200Smm	assertEqualInt(0, archive_entry_size(ae));
607231200Smm	assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
608231200Smm
609231200Smm	/*
610231200Smm	 * Read longname
611231200Smm	 */
612231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
613231200Smm	assert(archive_entry_atime_is_set(ae));
614231200Smm	assertEqualInt(5, archive_entry_atime(ae));
615231200Smm	assert(archive_entry_ctime_is_set(ae));
616231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
617231200Smm	assert(archive_entry_mtime_is_set(ae));
618231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
619231200Smm	/* Trim lngname to 64 characters. */
620231200Smm	longname[64] = '\0';
621231200Smm	assertEqualString(longname, archive_entry_pathname(ae));
622231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
623231200Smm	assertEqualInt(8, archive_entry_size(ae));
624231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
625231200Smm	assertEqualMem(buff2, "12345678", 8);
626231200Smm
627231200Smm	/*
628231200Smm	 * Read "dir0/dir1/file1"
629231200Smm	 */
630231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
631231200Smm	assertEqualInt(5, archive_entry_atime(ae));
632231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
633231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
634231200Smm	assertEqualString("dir0/dir1/file1", archive_entry_pathname(ae));
635231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
636231200Smm	assertEqualInt(1, archive_entry_nlink(ae));
637231200Smm	assertEqualInt(8, archive_entry_size(ae));
638231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
639231200Smm	assertEqualMem(buff2, "12345678", 8);
640231200Smm
641231200Smm	/*
642231200Smm	 * Read "dir0/dir1/file2"
643231200Smm	 */
644231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
645231200Smm	assertEqualInt(5, archive_entry_atime(ae));
646231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
647231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
648231200Smm	assertEqualString("dir0/dir1/file2", archive_entry_pathname(ae));
649231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
650231200Smm	assertEqualInt(1, archive_entry_nlink(ae));
651231200Smm	assertEqualInt(8, archive_entry_size(ae));
652231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
653231200Smm	assertEqualMem(buff2, "12345678", 8);
654231200Smm
655231200Smm	/*
656231200Smm	 * Read "symlnk"
657231200Smm	 */
658231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
659231200Smm	assert(archive_entry_atime_is_set(ae));
660231200Smm	assertEqualInt(5, archive_entry_atime(ae));
661231200Smm	assert(!archive_entry_birthtime_is_set(ae));
662231200Smm	assertEqualInt(0, archive_entry_birthtime(ae));
663231200Smm	assert(archive_entry_ctime_is_set(ae));
664231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
665231200Smm	assert(archive_entry_mtime_is_set(ae));
666231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
667231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
668231200Smm	assertEqualInt(0, archive_entry_size(ae));
669231200Smm
670231200Smm	/*
671231200Smm	 * Verify the end of the archive.
672231200Smm	 */
673231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
674231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
675231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
676231200Smm
677231200Smm	/*
678231200Smm	 * -----------------------------------------------------------
679231200Smm	 * Now, read the data back without Rockridge and Joliet option
680231200Smm	 * (read ISO9660).
681231200Smm	 * This mode appears rr_moved directory.
682231200Smm	 * -----------------------------------------------------------
683231200Smm	 */
684231200Smm	assert((a = archive_read_new()) != NULL);
685231200Smm	assertEqualIntA(a, 0, archive_read_support_format_all(a));
686231200Smm	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
687231200Smm	/* Disable Rockridge and Joliet extensions support. */
688231200Smm        assertEqualInt(ARCHIVE_OK,
689231200Smm            archive_read_set_option(a, NULL, "rockridge", NULL));
690231200Smm        assertEqualInt(ARCHIVE_OK,
691231200Smm            archive_read_set_option(a, NULL, "joliet", NULL));
692231200Smm	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
693231200Smm
694231200Smm	/*
695231200Smm	 * Read Root Directory
696231200Smm	 */
697231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
698231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
699231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
700231200Smm	assertEqualString(".", archive_entry_pathname(ae));
701231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
702231200Smm	assertEqualInt(2048, archive_entry_size(ae));
703231200Smm
704231200Smm	/*
705231200Smm	 * Read "rr_moved"
706231200Smm	 */
707231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
708231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
709231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
710231200Smm	assertEqualString("RR_MOVED", archive_entry_pathname(ae));
711231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
712231200Smm	assertEqualInt(2048, archive_entry_size(ae));
713231200Smm
714231200Smm	/*
715231200Smm	 * Read "rr_moved/dir7"
716231200Smm	 */
717231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
718231200Smm	assertEqualInt(5, archive_entry_atime(ae));
719231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
720231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
721231200Smm	assertEqualString("RR_MOVED/DIR7", archive_entry_pathname(ae));
722231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
723231200Smm	assertEqualInt(2048, archive_entry_size(ae));
724231200Smm
725231200Smm	/*
726231200Smm	 * Read "rr_moved/dir7/dir8"
727231200Smm	 */
728231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
729231200Smm	assertEqualInt(5, archive_entry_atime(ae));
730231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
731231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
732231200Smm	assertEqualString("RR_MOVED/DIR7/DIR8", archive_entry_pathname(ae));
733231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
734231200Smm	assertEqualInt(2048, archive_entry_size(ae));
735231200Smm
736231200Smm	/*
737231200Smm	 * Read "rr_moved/dir7/dir8/dir9"
738231200Smm	 */
739231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
740231200Smm	assertEqualInt(5, archive_entry_atime(ae));
741231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
742231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
743231200Smm	assertEqualString("RR_MOVED/DIR7/DIR8/DIR9",
744231200Smm	    archive_entry_pathname(ae));
745231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
746231200Smm	assertEqualInt(2048, archive_entry_size(ae));
747231200Smm
748231200Smm	/*
749231200Smm	 * Read "dir0"
750231200Smm	 */
751231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
752231200Smm	assertEqualInt(5, archive_entry_atime(ae));
753231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
754231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
755231200Smm	assertEqualString("DIR0", archive_entry_pathname(ae));
756231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
757231200Smm	assertEqualInt(2048, archive_entry_size(ae));
758231200Smm
759231200Smm	/*
760231200Smm	 * Read "dir0/dir1"
761231200Smm	 */
762231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
763231200Smm	assertEqualInt(5, archive_entry_atime(ae));
764231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
765231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
766231200Smm	assertEqualString("DIR0/DIR1", archive_entry_pathname(ae));
767231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
768231200Smm	assertEqualInt(2048, archive_entry_size(ae));
769231200Smm
770231200Smm	/*
771231200Smm	 * Read "dir0/dir1/dir2"
772231200Smm	 */
773231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
774231200Smm	assertEqualInt(5, archive_entry_atime(ae));
775231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
776231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
777231200Smm	assertEqualString("DIR0/DIR1/DIR2", archive_entry_pathname(ae));
778231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
779231200Smm	assertEqualInt(2048, archive_entry_size(ae));
780231200Smm
781231200Smm	/*
782231200Smm	 * Read "dir0/dir1/dir2/dir3"
783231200Smm	 */
784231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
785231200Smm	assertEqualInt(5, archive_entry_atime(ae));
786231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
787231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
788231200Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3",
789231200Smm	    archive_entry_pathname(ae));
790231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
791231200Smm	assertEqualInt(2048, archive_entry_size(ae));
792231200Smm
793231200Smm	/*
794231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4"
795231200Smm	 */
796231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
797231200Smm	assertEqualInt(5, archive_entry_atime(ae));
798231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
799231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
800231200Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4",
801231200Smm	    archive_entry_pathname(ae));
802231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
803231200Smm	assertEqualInt(2048, archive_entry_size(ae));
804231200Smm
805231200Smm	/*
806231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5"
807231200Smm	 */
808231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
809231200Smm	assertEqualInt(5, archive_entry_atime(ae));
810231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
811231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
812231200Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5",
813231200Smm	    archive_entry_pathname(ae));
814231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
815231200Smm	assertEqualInt(2048, archive_entry_size(ae));
816231200Smm
817231200Smm	/*
818231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
819231200Smm	 */
820231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
821231200Smm	assertEqualInt(5, archive_entry_atime(ae));
822231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
823231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
824231200Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5/DIR6",
825231200Smm	    archive_entry_pathname(ae));
826231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
827231200Smm	assertEqualInt(2048, archive_entry_size(ae));
828231200Smm
829231200Smm	/*
830231200Smm	 * Read "file"
831231200Smm	 */
832231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
833231200Smm	assertEqualInt(5, archive_entry_atime(ae));
834231200Smm	assertEqualInt(0, archive_entry_birthtime(ae));
835231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
836231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
837231200Smm	assertEqualString("FILE", archive_entry_pathname(ae));
838231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
839231200Smm	assertEqualInt(2, archive_entry_nlink(ae));
840231200Smm	assertEqualInt(8, archive_entry_size(ae));
841231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
842231200Smm	assertEqualMem(buff2, "12345678", 8);
843231200Smm
844231200Smm	/*
845231200Smm	 * Read "hardlink"
846231200Smm	 */
847231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
848231200Smm	assertEqualInt(5, archive_entry_atime(ae));
849231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
850231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
851231200Smm	assertEqualString("HARDLNK", archive_entry_pathname(ae));
852231200Smm	assertEqualString("FILE", archive_entry_hardlink(ae));
853231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
854231200Smm	assertEqualInt(0, archive_entry_size(ae));
855231200Smm	assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
856231200Smm
857231200Smm	/*
858231200Smm	 * Read longname
859231200Smm	 */
860231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
861231200Smm	assert(archive_entry_atime_is_set(ae));
862231200Smm	assertEqualInt(5, archive_entry_atime(ae));
863231200Smm	assert(archive_entry_ctime_is_set(ae));
864231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
865231200Smm	assert(archive_entry_mtime_is_set(ae));
866231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
867231200Smm	assertEqualString("LONGNAME", archive_entry_pathname(ae));
868231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
869231200Smm	assertEqualInt(8, archive_entry_size(ae));
870231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
871231200Smm	assertEqualMem(buff2, "12345678", 8);
872231200Smm
873231200Smm	/*
874231200Smm	 * Read "dir0/dir1/file1"
875231200Smm	 */
876231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
877231200Smm	assertEqualInt(5, archive_entry_atime(ae));
878231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
879231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
880231200Smm	assertEqualString("DIR0/DIR1/FILE1", archive_entry_pathname(ae));
881231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
882231200Smm	assertEqualInt(1, archive_entry_nlink(ae));
883231200Smm	assertEqualInt(8, archive_entry_size(ae));
884231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
885231200Smm	assertEqualMem(buff2, "12345678", 8);
886231200Smm
887231200Smm	/*
888231200Smm	 * Read "dir0/dir1/file2"
889231200Smm	 */
890231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
891231200Smm	assertEqualInt(5, archive_entry_atime(ae));
892231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
893231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
894231200Smm	assertEqualString("DIR0/DIR1/FILE2", archive_entry_pathname(ae));
895231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
896231200Smm	assertEqualInt(1, archive_entry_nlink(ae));
897231200Smm	assertEqualInt(8, archive_entry_size(ae));
898231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
899231200Smm	assertEqualMem(buff2, "12345678", 8);
900231200Smm
901231200Smm	/*
902231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7" as file
903231200Smm	 */
904231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
905231200Smm	assertEqualInt(5, archive_entry_atime(ae));
906231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
907231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
908231200Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5/DIR6/DIR7",
909231200Smm	    archive_entry_pathname(ae));
910231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
911231200Smm	assertEqualInt(0, archive_entry_size(ae));
912231200Smm
913231200Smm	/*
914231200Smm	 * Read "symlnk"
915231200Smm	 */
916231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
917231200Smm	assert(archive_entry_atime_is_set(ae));
918231200Smm	assertEqualInt(5, archive_entry_atime(ae));
919231200Smm	assert(!archive_entry_birthtime_is_set(ae));
920231200Smm	assertEqualInt(0, archive_entry_birthtime(ae));
921231200Smm	assert(archive_entry_ctime_is_set(ae));
922231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
923231200Smm	assert(archive_entry_mtime_is_set(ae));
924231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
925231200Smm	assertEqualString("SYMLNK", archive_entry_pathname(ae));
926231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
927231200Smm	assertEqualInt(0, archive_entry_size(ae));
928231200Smm
929231200Smm	/*
930231200Smm	 * Verify the end of the archive.
931231200Smm	 */
932231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
933231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
934231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
935231200Smm
936231200Smm	free(buff);
937231200Smm}
938