1228753Smm/*-
2228753Smm * Copyright (c) 2003-2008 Tim Kientzle
3228753Smm * Copyright (c) 2009,2010 Michihiro NAKAJIMA
4228753Smm * All rights reserved.
5228753Smm *
6228753Smm * Redistribution and use in source and binary forms, with or without
7228753Smm * modification, are permitted provided that the following conditions
8228753Smm * are met:
9228753Smm * 1. Redistributions of source code must retain the above copyright
10228753Smm *    notice, this list of conditions and the following disclaimer.
11228753Smm * 2. Redistributions in binary form must reproduce the above copyright
12228753Smm *    notice, this list of conditions and the following disclaimer in the
13228753Smm *    documentation and/or other materials provided with the distribution.
14228753Smm *
15228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25228753Smm */
26228753Smm#include "test.h"
27248590Smm__FBSDID("$FreeBSD$");
28238825Smm
29238825Smmstatic char buff2[64];
30238825SmmDEFINE_TEST(test_write_format_iso9660)
31231200Smm{
32231200Smm	size_t buffsize = 1000000;
33231200Smm	char *buff;
34228753Smm	struct archive_entry *ae;
35231200Smm	struct archive *a;
36231200Smm	char dirname[1024];
37231200Smm	char dir[6];
38238825Smm	char longname[] =
39238825Smm	    "longname00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
40238825Smm	    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
41238825Smm	    "cccccccccccccccccccccccccccccccccccccccccccccccccc"
42238825Smm	    "dddddddddddddddddddddddddddddddddddddddddddddddddd";
43238825Smm
44238825Smm	size_t used;
45238825Smm	int i;
46238825Smm
47238825Smm	buff = malloc(buffsize); /* million bytes of work area */
48314565Smm	assert(buff != NULL);
49314565Smm
50314565Smm	/* Create a new archive in memory. */
51231200Smm	assert((a = archive_write_new()) != NULL);
52228753Smm	assertA(0 == archive_write_set_format_iso9660(a));
53231200Smm	assertA(0 == archive_write_add_filter_none(a));
54231200Smm	assertA(0 == archive_write_open_memory(a, buff, buffsize, &used));
55231200Smm
56228753Smm	/*
57228753Smm	 * "file" has a bunch of attributes and 8 bytes of data.
58228753Smm	 */
59316338Smm	assert((ae = archive_entry_new()) != NULL);
60316338Smm	archive_entry_set_atime(ae, 2, 20);
61314571Smm	archive_entry_set_birthtime(ae, 3, 30);
62314571Smm	archive_entry_set_ctime(ae, 4, 40);
63314571Smm	archive_entry_set_mtime(ae, 5, 50);
64314571Smm	archive_entry_copy_pathname(ae, "file");
65314571Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
66314571Smm	archive_entry_set_size(ae, 8);
67314571Smm	archive_entry_set_nlink(ae, 2);
68314571Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
69314571Smm	archive_entry_free(ae);
70316338Smm	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
71316338Smm
72316338Smm	/*
73316338Smm	 * "hardlnk" has linked to "file".
74316338Smm	 */
75316338Smm	assert((ae = archive_entry_new()) != NULL);
76316338Smm	archive_entry_set_atime(ae, 2, 20);
77316338Smm	archive_entry_set_birthtime(ae, 3, 30);
78316338Smm	archive_entry_set_ctime(ae, 4, 40);
79316338Smm	archive_entry_set_mtime(ae, 5, 50);
80316338Smm	archive_entry_copy_pathname(ae, "hardlnk");
81316338Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
82316338Smm	archive_entry_set_hardlink(ae, "file");
83316338Smm	archive_entry_set_nlink(ae, 2);
84316338Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
85314571Smm	archive_entry_free(ae);
86314571Smm
87314571Smm	/*
88228753Smm	 * longname is similar but has birthtime later than mtime.
89228753Smm	 */
90228753Smm	assert((ae = archive_entry_new()) != NULL);
91228753Smm	archive_entry_set_atime(ae, 2, 20);
92228753Smm	archive_entry_set_birthtime(ae, 8, 80);
93228753Smm	archive_entry_set_ctime(ae, 4, 40);
94228753Smm	archive_entry_set_mtime(ae, 5, 50);
95228753Smm	archive_entry_copy_pathname(ae, longname);
96228753Smm	archive_entry_set_mode(ae, AE_IFREG | 0666);
97228753Smm	archive_entry_set_size(ae, 8);
98228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
99228753Smm	archive_entry_free(ae);
100228753Smm	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
101228753Smm
102228753Smm	/*
103228753Smm	 * "symlnk has symbolic linked to longname.
104228753Smm	 */
105228753Smm	assert((ae = archive_entry_new()) != NULL);
106228753Smm	archive_entry_set_atime(ae, 2, 20);
107228753Smm	archive_entry_set_ctime(ae, 4, 40);
108228753Smm	archive_entry_set_mtime(ae, 5, 50);
109248590Smm	archive_entry_copy_pathname(ae, "symlnk");
110228753Smm	archive_entry_set_mode(ae, AE_IFLNK | 0555);
111228753Smm	archive_entry_set_symlink(ae, longname);
112228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
113228753Smm	archive_entry_free(ae);
114228753Smm
115228753Smm	/*
116228753Smm	 * "dir*" has a bunch of attributes.
117228753Smm	 */
118228753Smm	dirname[0] = '\0';
119228753Smm	strcpy(dir, "/dir0");
120228753Smm	for (i = 0; i < 13; i++) {
121228753Smm		dir[4] = "0123456789ABCDEF"[i];
122231200Smm		if (i == 0)
123228753Smm			strcat(dirname, dir+1);
124228753Smm		else
125228753Smm			strcat(dirname, dir);
126228753Smm		assert((ae = archive_entry_new()) != NULL);
127228753Smm		archive_entry_set_atime(ae, 2, 20);
128228753Smm		archive_entry_set_birthtime(ae, 3, 30);
129228753Smm		archive_entry_set_ctime(ae, 4, 40);
130228753Smm		archive_entry_set_mtime(ae, 5, 50);
131228753Smm		archive_entry_copy_pathname(ae, dirname);
132228753Smm		archive_entry_set_mode(ae, S_IFDIR | 0755);
133228753Smm		assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
134228753Smm		archive_entry_free(ae);
135228753Smm	}
136228753Smm
137228753Smm	strcat(dirname, "/file");
138228753Smm	assert((ae = archive_entry_new()) != NULL);
139228753Smm	archive_entry_set_atime(ae, 2, 20);
140228753Smm	archive_entry_set_birthtime(ae, 3, 30);
141228753Smm	archive_entry_set_ctime(ae, 4, 40);
142228753Smm	archive_entry_set_mtime(ae, 5, 50);
143228753Smm	archive_entry_copy_pathname(ae, dirname);
144228753Smm	archive_entry_set_mode(ae, S_IFREG | 0755);
145228753Smm	archive_entry_set_size(ae, 8);
146228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
147307214Smm	archive_entry_free(ae);
148307214Smm	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
149307214Smm
150307214Smm	/*
151307214Smm	 * "dir0/dir1/file1" has 8 bytes of data.
152307214Smm	 */
153307214Smm	assert((ae = archive_entry_new()) != NULL);
154299425Smm	archive_entry_set_atime(ae, 2, 20);
155299425Smm	archive_entry_set_birthtime(ae, 3, 30);
156299425Smm	archive_entry_set_ctime(ae, 4, 40);
157299425Smm	archive_entry_set_mtime(ae, 5, 50);
158299425Smm	archive_entry_copy_pathname(ae, "dir0/dir1/file1");
159299425Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
160299425Smm	archive_entry_set_size(ae, 8);
161299425Smm	archive_entry_set_nlink(ae, 1);
162299425Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
163299425Smm	archive_entry_free(ae);
164228753Smm	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
165238825Smm
166238825Smm	/*
167238825Smm	 * "dir0/dir1/file2" has 8 bytes of data.
168238825Smm	 */
169238825Smm	assert((ae = archive_entry_new()) != NULL);
170238825Smm	archive_entry_set_atime(ae, 2, 20);
171238825Smm	archive_entry_set_birthtime(ae, 3, 30);
172238825Smm	archive_entry_set_ctime(ae, 4, 40);
173228753Smm	archive_entry_set_mtime(ae, 5, 50);
174228753Smm	archive_entry_copy_pathname(ae, "dir0/dir1/file2");
175228753Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
176228753Smm	archive_entry_set_size(ae, 8);
177228753Smm	archive_entry_set_nlink(ae, 1);
178228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
179228753Smm	archive_entry_free(ae);
180228753Smm	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
181228753Smm
182228753Smm	/*
183228753Smm	 * Add a wrong path "dir0/dir1/file2/wrong"
184228753Smm	 */
185228753Smm	assert((ae = archive_entry_new()) != NULL);
186228753Smm	archive_entry_set_atime(ae, 2, 20);
187228753Smm	archive_entry_set_birthtime(ae, 3, 30);
188228753Smm	archive_entry_set_ctime(ae, 4, 40);
189228753Smm	archive_entry_set_mtime(ae, 5, 50);
190228753Smm	archive_entry_copy_pathname(ae, "dir0/dir1/file2/wrong");
191228753Smm	archive_entry_set_mode(ae, AE_IFREG | 0755);
192228753Smm	archive_entry_set_size(ae, 8);
193228753Smm	archive_entry_set_nlink(ae, 1);
194228753Smm	assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae));
195228753Smm	archive_entry_free(ae);
196228753Smm
197228753Smm	/* Close out the archive. */
198228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
199228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a));
200228753Smm
201228753Smm	/*
202228753Smm	 * -----------------------------------------------------------
203228753Smm	 * Now, read the data back(read Rockridge extensions).
204228753Smm	 * -----------------------------------------------------------
205228753Smm	 */
206228753Smm	assert((a = archive_read_new()) != NULL);
207228753Smm	assertEqualIntA(a, 0, archive_read_support_format_all(a));
208228753Smm	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
209228753Smm	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
210228753Smm
211238825Smm	/*
212228753Smm	 * Read Root Directory
213228753Smm	 */
214228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
215228753Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
216228753Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
217228753Smm	assertEqualString(".", archive_entry_pathname(ae));
218228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
219231200Smm	assertEqualInt(2048, archive_entry_size(ae));
220228753Smm
221228753Smm	/*
222228753Smm	 * Read "dir0"
223228753Smm	 */
224228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
225228753Smm	assertEqualInt(2, archive_entry_atime(ae));
226228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
227228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
228299425Smm	assertEqualInt(5, archive_entry_mtime(ae));
229228753Smm	assertEqualString("dir0", archive_entry_pathname(ae));
230228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
231228753Smm	assertEqualInt(2048, archive_entry_size(ae));
232228753Smm
233228753Smm	/*
234228753Smm	 * Read "dir0/dir1"
235313071Smm	 */
236313071Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
237313071Smm	assertEqualInt(2, archive_entry_atime(ae));
238313071Smm	assertEqualInt(3, archive_entry_birthtime(ae));
239313071Smm	assertEqualInt(4, archive_entry_ctime(ae));
240313071Smm	assertEqualInt(5, archive_entry_mtime(ae));
241228753Smm	assertEqualString("dir0/dir1", archive_entry_pathname(ae));
242228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
243228753Smm	assertEqualInt(2048, archive_entry_size(ae));
244228753Smm
245228753Smm	/*
246228753Smm	 * Read "dir0/dir1/dir2"
247228753Smm	 */
248228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
249228753Smm	assertEqualInt(2, archive_entry_atime(ae));
250228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
251228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
252228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
253228753Smm	assertEqualString("dir0/dir1/dir2", archive_entry_pathname(ae));
254231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
255231200Smm	assertEqualInt(2048, archive_entry_size(ae));
256228753Smm
257228753Smm	/*
258228753Smm	 * Read "dir0/dir1/dir2/dir3"
259228753Smm	 */
260228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
261228753Smm	assertEqualInt(2, archive_entry_atime(ae));
262228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
263228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
264228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
265228753Smm	assertEqualString("dir0/dir1/dir2/dir3",
266228753Smm	    archive_entry_pathname(ae));
267228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
268228753Smm	assertEqualInt(2048, archive_entry_size(ae));
269228753Smm
270228753Smm	/*
271228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4"
272228753Smm	 */
273228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
274228753Smm	assertEqualInt(2, archive_entry_atime(ae));
275228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
276228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
277228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
278228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4",
279228753Smm	    archive_entry_pathname(ae));
280228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
281228753Smm	assertEqualInt(2048, archive_entry_size(ae));
282228753Smm
283228753Smm	/*
284228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5"
285228753Smm	 */
286228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
287228753Smm	assertEqualInt(2, archive_entry_atime(ae));
288228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
289228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
290228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
291228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5",
292228753Smm	    archive_entry_pathname(ae));
293228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
294228753Smm	assertEqualInt(2048, archive_entry_size(ae));
295228753Smm
296228753Smm	/*
297228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
298228753Smm	 */
299228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
300228753Smm	assertEqualInt(2, archive_entry_atime(ae));
301228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
302228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
303228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
304228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6",
305228753Smm	    archive_entry_pathname(ae));
306228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
307228753Smm	assertEqualInt(2048, archive_entry_size(ae));
308228753Smm
309228753Smm	/*
310228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7"
311228753Smm	 */
312228753Smm	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",
318231200Smm	    archive_entry_pathname(ae));
319231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
320231200Smm	assertEqualInt(2048, archive_entry_size(ae));
321228753Smm
322228753Smm	/*
323228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8"
324228753Smm	 */
325228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
326228753Smm	assertEqualInt(2, archive_entry_atime(ae));
327228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
328228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
329228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
330228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8",
331228753Smm	    archive_entry_pathname(ae));
332231200Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
333228753Smm	assertEqualInt(2048, archive_entry_size(ae));
334231200Smm
335231200Smm	/*
336231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9"
337228753Smm	 */
338231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
339231200Smm	assertEqualInt(2, archive_entry_atime(ae));
340228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
341228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
342228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
343228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9",
344228753Smm	    archive_entry_pathname(ae));
345228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
346228753Smm	assertEqualInt(2048, archive_entry_size(ae));
347228753Smm
348228753Smm	/*
349228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA"
350228753Smm	 */
351228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
352228753Smm	assertEqualInt(2, archive_entry_atime(ae));
353228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
354228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
355228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
356228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA",
357228753Smm	    archive_entry_pathname(ae));
358228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
359228753Smm	assertEqualInt(2048, archive_entry_size(ae));
360228753Smm
361228753Smm	/*
362228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB"
363228753Smm	 */
364228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
365228753Smm	assertEqualInt(2, archive_entry_atime(ae));
366231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
367228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
368228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
369228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB",
370228753Smm	    archive_entry_pathname(ae));
371228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
372228753Smm	assertEqualInt(2048, archive_entry_size(ae));
373228753Smm
374228753Smm	/*
375228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC"
376231200Smm	 */
377228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
378228753Smm	assertEqualInt(2, archive_entry_atime(ae));
379228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
380228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
381228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
382228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC",
383228753Smm	    archive_entry_pathname(ae));
384228753Smm	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
385228753Smm	assertEqualInt(2048, archive_entry_size(ae));
386228753Smm
387228753Smm	/*
388228753Smm	 * Read "hardlnk"
389228753Smm	 */
390228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
391228753Smm	assertEqualInt(2, archive_entry_atime(ae));
392228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
393228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
394228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
395228753Smm	assertEqualString("hardlnk", archive_entry_pathname(ae));
396228753Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
397228753Smm	assertEqualInt(2, archive_entry_nlink(ae));
398228753Smm	assertEqualInt(8, archive_entry_size(ae));
399228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
400228753Smm	assertEqualMem(buff2, "12345678", 8);
401228753Smm
402228753Smm	/*
403228753Smm	 * Read "file"
404228753Smm	 */
405228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
406228753Smm	assertEqualInt(2, archive_entry_atime(ae));
407228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
408228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
409228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
410228753Smm	assertEqualString("file", archive_entry_pathname(ae));
411228753Smm	assertEqualString("hardlnk", archive_entry_hardlink(ae));
412228753Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
413228753Smm	assertEqualInt(2, archive_entry_nlink(ae));
414228753Smm	assertEqualInt(0, archive_entry_size(ae));
415228753Smm
416228753Smm	/*
417228753Smm	 * Read longname
418228753Smm	 */
419228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
420228753Smm	assert(archive_entry_atime_is_set(ae));
421231200Smm	assertEqualInt(2, archive_entry_atime(ae));
422231200Smm	/* Birthtime > mtime above, so it doesn't get stored at all. */
423228753Smm	assert(!archive_entry_birthtime_is_set(ae));
424231200Smm	assertEqualInt(0, archive_entry_birthtime(ae));
425228753Smm	assert(archive_entry_ctime_is_set(ae));
426228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
427228753Smm	assert(archive_entry_mtime_is_set(ae));
428228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
429228753Smm	assertEqualString(longname, archive_entry_pathname(ae));
430228753Smm#if !defined(_WIN32) && !defined(__CYGWIN__)
431228753Smm	assert((AE_IFREG | 0444) == archive_entry_mode(ae));
432228753Smm#else
433228753Smm	/* On Windows and CYGWIN, always set all exec bit ON by default. */
434228753Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
435228753Smm#endif
436228753Smm	assertEqualInt(8, archive_entry_size(ae));
437228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
438228753Smm	assertEqualMem(buff2, "12345678", 8);
439228753Smm
440228753Smm	/*
441228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file"
442228753Smm	 */
443228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
444231200Smm	assertEqualInt(2, archive_entry_atime(ae));
445231200Smm	assertEqualInt(3, archive_entry_birthtime(ae));
446231200Smm	assertEqualInt(4, archive_entry_ctime(ae));
447228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
448231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file", archive_entry_pathname(ae));
449228753Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
450228753Smm	assertEqualInt(1, archive_entry_nlink(ae));
451228753Smm	assertEqualInt(8, archive_entry_size(ae));
452231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
453228753Smm	assertEqualMem(buff2, "12345678", 8);
454228753Smm
455228753Smm	/*
456228753Smm	 * Read "dir0/dir1/file1"
457228753Smm	 */
458228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
459228753Smm	assertEqualInt(2, archive_entry_atime(ae));
460228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
461228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
462228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
463228753Smm	assertEqualString("dir0/dir1/file1", archive_entry_pathname(ae));
464228753Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
465228753Smm	assertEqualInt(1, archive_entry_nlink(ae));
466228753Smm	assertEqualInt(8, archive_entry_size(ae));
467228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
468228753Smm	assertEqualMem(buff2, "12345678", 8);
469228753Smm
470228753Smm	/*
471228753Smm	 * Read "dir0/dir1/file2"
472228753Smm	 */
473228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
474228753Smm	assertEqualInt(2, archive_entry_atime(ae));
475228753Smm	assertEqualInt(3, archive_entry_birthtime(ae));
476228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
477228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
478228753Smm	assertEqualString("dir0/dir1/file2", archive_entry_pathname(ae));
479228753Smm	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
480228753Smm	assertEqualInt(1, archive_entry_nlink(ae));
481228753Smm	assertEqualInt(8, archive_entry_size(ae));
482228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
483228753Smm	assertEqualMem(buff2, "12345678", 8);
484228753Smm
485228753Smm	/*
486228753Smm	 * Read "symlnk"
487228753Smm	 */
488228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
489228753Smm	assert(archive_entry_atime_is_set(ae));
490228753Smm	assertEqualInt(2, archive_entry_atime(ae));
491228753Smm	assert(!archive_entry_birthtime_is_set(ae));
492228753Smm	assertEqualInt(0, archive_entry_birthtime(ae));
493228753Smm	assert(archive_entry_ctime_is_set(ae));
494228753Smm	assertEqualInt(4, archive_entry_ctime(ae));
495228753Smm	assert(archive_entry_mtime_is_set(ae));
496228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
497228753Smm	assertEqualString("symlnk", archive_entry_pathname(ae));
498228753Smm	assert((AE_IFLNK | 0555) == archive_entry_mode(ae));
499228753Smm	assertEqualString(longname, archive_entry_symlink(ae));
500228753Smm
501228753Smm	/*
502228753Smm	 * Verify the end of the archive.
503231200Smm	 */
504231200Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
505231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
506231200Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
507231200Smm
508228753Smm	/*
509231200Smm	 * -----------------------------------------------------------
510231200Smm	 * Now, read the data back without Rockridge option
511231200Smm	 * (read Joliet extensions).
512231200Smm	 * -----------------------------------------------------------
513231200Smm	 */
514231200Smm	assert((a = archive_read_new()) != NULL);
515231200Smm	assertEqualIntA(a, 0, archive_read_support_format_all(a));
516231200Smm	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
517231200Smm	/* Disable Rockridge extensions support. */
518231200Smm        assertEqualInt(ARCHIVE_OK,
519231200Smm            archive_read_set_option(a, NULL, "rockridge", NULL));
520231200Smm	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
521231200Smm
522231200Smm	/*
523231200Smm	 * Read Root Directory
524231200Smm	 */
525231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
526231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
527231200Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
528231200Smm	assertEqualString(".", archive_entry_pathname(ae));
529231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
530231200Smm	assertEqualInt(2048, archive_entry_size(ae));
531231200Smm
532231200Smm	/*
533231200Smm	 * Read "dir0"
534231200Smm	 */
535231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
536231200Smm	assertEqualInt(5, archive_entry_atime(ae));
537231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
538231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
539231200Smm	assertEqualString("dir0", archive_entry_pathname(ae));
540231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
541231200Smm	assertEqualInt(2048, archive_entry_size(ae));
542231200Smm
543231200Smm	/*
544309587Smm	 * Read "dir0/dir1"
545231200Smm	 */
546231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
547231200Smm	assertEqualInt(5, archive_entry_atime(ae));
548231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
549231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
550231200Smm	assertEqualString("dir0/dir1", archive_entry_pathname(ae));
551231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
552231200Smm	assertEqualInt(2048, archive_entry_size(ae));
553231200Smm
554231200Smm	/*
555231200Smm	 * Read "dir0/dir1/dir2"
556231200Smm	 */
557231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
558231200Smm	assertEqualInt(5, archive_entry_atime(ae));
559231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
560231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
561231200Smm	assertEqualString("dir0/dir1/dir2", archive_entry_pathname(ae));
562231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
563231200Smm	assertEqualInt(2048, archive_entry_size(ae));
564231200Smm
565231200Smm	/*
566231200Smm	 * Read "dir0/dir1/dir2/dir3"
567231200Smm	 */
568231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
569231200Smm	assertEqualInt(5, archive_entry_atime(ae));
570231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
571231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
572231200Smm	assertEqualString("dir0/dir1/dir2/dir3",
573231200Smm	    archive_entry_pathname(ae));
574231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
575231200Smm	assertEqualInt(2048, archive_entry_size(ae));
576231200Smm
577231200Smm	/*
578231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4"
579231200Smm	 */
580231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
581231200Smm	assertEqualInt(5, archive_entry_atime(ae));
582231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
583309587Smm	assertEqualInt(5, archive_entry_mtime(ae));
584231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4",
585231200Smm	    archive_entry_pathname(ae));
586231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
587231200Smm	assertEqualInt(2048, archive_entry_size(ae));
588231200Smm
589231200Smm	/*
590231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5"
591231200Smm	 */
592231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
593231200Smm	assertEqualInt(5, archive_entry_atime(ae));
594228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
595228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
596231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5",
597228753Smm	    archive_entry_pathname(ae));
598231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
599228753Smm	assertEqualInt(2048, archive_entry_size(ae));
600228753Smm
601228753Smm	/*
602228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
603228753Smm	 */
604228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
605299425Smm	assertEqualInt(5, archive_entry_atime(ae));
606299425Smm	assertEqualInt(5, archive_entry_ctime(ae));
607299425Smm	assertEqualInt(5, archive_entry_mtime(ae));
608299425Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6",
609228753Smm	    archive_entry_pathname(ae));
610228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
611228753Smm	assertEqualInt(2048, archive_entry_size(ae));
612228753Smm
613228753Smm	/*
614228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7"
615228753Smm	 */
616228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
617231200Smm	assertEqualInt(5, archive_entry_atime(ae));
618231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
619231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
620231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7",
621231200Smm	    archive_entry_pathname(ae));
622231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
623231200Smm	assertEqualInt(2048, archive_entry_size(ae));
624231200Smm
625231200Smm	/*
626231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8"
627231200Smm	 */
628231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
629231200Smm	assertEqualInt(5, archive_entry_atime(ae));
630231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
631231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
632231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8",
633231200Smm	    archive_entry_pathname(ae));
634231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
635231200Smm	assertEqualInt(2048, archive_entry_size(ae));
636231200Smm
637231200Smm	/*
638231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9"
639231200Smm	 */
640231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
641231200Smm	assertEqualInt(5, archive_entry_atime(ae));
642231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
643231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
644231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9",
645231200Smm	    archive_entry_pathname(ae));
646231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
647231200Smm	assertEqualInt(2048, archive_entry_size(ae));
648228753Smm
649228753Smm	/*
650228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA"
651228753Smm	 */
652228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
653228753Smm	assertEqualInt(5, archive_entry_atime(ae));
654228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
655231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
656228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA",
657231200Smm	    archive_entry_pathname(ae));
658231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
659228753Smm	assertEqualInt(2048, archive_entry_size(ae));
660228753Smm
661228753Smm	/*
662228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB"
663248590Smm	 */
664248590Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
665231200Smm	assertEqualInt(5, archive_entry_atime(ae));
666231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
667231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
668231200Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB",
669228753Smm	    archive_entry_pathname(ae));
670228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
671228753Smm	assertEqualInt(2048, archive_entry_size(ae));
672228753Smm
673228753Smm	/*
674228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC"
675228753Smm	 */
676228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
677228753Smm	assertEqualInt(5, archive_entry_atime(ae));
678228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
679228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
680228753Smm	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC",
681228753Smm	    archive_entry_pathname(ae));
682228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
683228753Smm	assertEqualInt(2048, archive_entry_size(ae));
684228753Smm
685228753Smm	/*
686228753Smm	 * Read "file"
687228753Smm	 */
688228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
689228753Smm	assertEqualInt(5, archive_entry_atime(ae));
690228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
691228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
692228753Smm	assertEqualString("file", archive_entry_pathname(ae));
693228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
694228753Smm	assertEqualInt(8, archive_entry_size(ae));
695228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
696228753Smm	assertEqualMem(buff2, "12345678", 8);
697228753Smm
698228753Smm	/*
699228753Smm	 * Read "hardlnk"
700228753Smm	 */
701228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
702228753Smm	assertEqualInt(5, archive_entry_atime(ae));
703228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
704228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
705228753Smm	assertEqualString("hardlnk", archive_entry_pathname(ae));
706228753Smm	assertEqualString("file", archive_entry_hardlink(ae));
707228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
708228753Smm	assertEqualInt(2, archive_entry_nlink(ae));
709228753Smm	assertEqualInt(0, archive_entry_size(ae));
710228753Smm	assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
711228753Smm
712228753Smm	/*
713228753Smm	 * Read longname
714228753Smm	 */
715228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
716228753Smm	assert(archive_entry_atime_is_set(ae));
717228753Smm	assertEqualInt(5, archive_entry_atime(ae));
718228753Smm	assert(archive_entry_ctime_is_set(ae));
719228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
720231200Smm	assert(archive_entry_mtime_is_set(ae));
721228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
722231200Smm	/* Trim longname to 64 characters. */
723231200Smm	longname[64] = '\0';
724228753Smm	assertEqualString(longname, archive_entry_pathname(ae));
725228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
726228753Smm	assertEqualInt(8, archive_entry_size(ae));
727228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
728228753Smm	assertEqualMem(buff2, "12345678", 8);
729228753Smm
730228753Smm	/*
731228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file"
732228753Smm	 */
733228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
734228753Smm	assertEqualInt(5, archive_entry_atime(ae));
735228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
736228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
737228753Smm	assertEqualString(
738228753Smm		"dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file",
739228753Smm		archive_entry_pathname(ae));
740228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
741228753Smm	assertEqualInt(1, archive_entry_nlink(ae));
742228753Smm	assertEqualInt(8, archive_entry_size(ae));
743228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
744228753Smm	assertEqualMem(buff2, "12345678", 8);
745228753Smm
746228753Smm	/*
747228753Smm	 * Read "dir0/dir1/file1"
748228753Smm	 */
749228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
750228753Smm	assertEqualInt(5, archive_entry_atime(ae));
751228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
752228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
753228753Smm	assertEqualString("dir0/dir1/file1", archive_entry_pathname(ae));
754228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
755228753Smm	assertEqualInt(1, archive_entry_nlink(ae));
756228753Smm	assertEqualInt(8, archive_entry_size(ae));
757228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
758228753Smm	assertEqualMem(buff2, "12345678", 8);
759228753Smm
760228753Smm	/*
761228753Smm	 * Read "dir0/dir1/file2"
762228753Smm	 */
763228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
764228753Smm	assertEqualInt(5, archive_entry_atime(ae));
765228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
766228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
767228753Smm	assertEqualString("dir0/dir1/file2", archive_entry_pathname(ae));
768228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
769228753Smm	assertEqualInt(1, archive_entry_nlink(ae));
770228753Smm	assertEqualInt(8, archive_entry_size(ae));
771228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
772228753Smm	assertEqualMem(buff2, "12345678", 8);
773228753Smm
774228753Smm	/*
775228753Smm	 * Read "symlnk"
776228753Smm	 */
777228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
778228753Smm	assert(archive_entry_atime_is_set(ae));
779228753Smm	assertEqualInt(5, archive_entry_atime(ae));
780228753Smm	assert(!archive_entry_birthtime_is_set(ae));
781228753Smm	assertEqualInt(0, archive_entry_birthtime(ae));
782228753Smm	assert(archive_entry_ctime_is_set(ae));
783228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
784228753Smm	assert(archive_entry_mtime_is_set(ae));
785228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
786228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
787248590Smm	assertEqualInt(0, archive_entry_size(ae));
788248590Smm
789228753Smm	/*
790228753Smm	 * Verify the end of the archive.
791228753Smm	 */
792228753Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
793228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
794228753Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
795228753Smm
796228753Smm	/*
797228753Smm	 * -----------------------------------------------------------
798228753Smm	 * Now, read the data back without Rockridge and Joliet option
799228753Smm	 * (read ISO9660).
800228753Smm	 * This mode appears rr_moved directory.
801228753Smm	 * -----------------------------------------------------------
802228753Smm	 */
803231200Smm	assert((a = archive_read_new()) != NULL);
804228753Smm	assertEqualIntA(a, 0, archive_read_support_format_all(a));
805231200Smm	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
806228753Smm	/* Disable Rockridge and Joliet extensions support. */
807228753Smm        assertEqualInt(ARCHIVE_OK,
808228753Smm            archive_read_set_option(a, NULL, "rockridge", NULL));
809228753Smm        assertEqualInt(ARCHIVE_OK,
810228753Smm            archive_read_set_option(a, NULL, "joliet", NULL));
811299425Smm	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
812299425Smm
813299425Smm	/*
814299425Smm	 * Read Root Directory
815299425Smm	 */
816299425Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
817299425Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
818299425Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
819299425Smm	assertEqualString(".", archive_entry_pathname(ae));
820299425Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
821299425Smm	assertEqualInt(2048, archive_entry_size(ae));
822299425Smm
823299425Smm	/*
824299425Smm	 * Read "rr_moved"
825299425Smm	 */
826299425Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
827299425Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
828299425Smm	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
829299425Smm	assertEqualString("RR_MOVED", archive_entry_pathname(ae));
830299425Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
831299425Smm	assertEqualInt(2048, archive_entry_size(ae));
832299425Smm
833299425Smm	/*
834299425Smm	 * Read "rr_moved/dir7"
835299425Smm	 */
836299425Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
837299425Smm	assertEqualInt(5, archive_entry_atime(ae));
838299425Smm	assertEqualInt(5, archive_entry_ctime(ae));
839228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
840228753Smm	assertEqualString("RR_MOVED/DIR7", archive_entry_pathname(ae));
841231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
842228753Smm	assertEqualInt(2048, archive_entry_size(ae));
843228753Smm
844228753Smm	/*
845228753Smm	 * Read "rr_moved/dir7/dir8"
846228753Smm	 */
847228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
848231200Smm	assertEqualInt(5, archive_entry_atime(ae));
849228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
850228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
851231200Smm	assertEqualString("RR_MOVED/DIR7/DIR8", archive_entry_pathname(ae));
852228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
853228753Smm	assertEqualInt(2048, archive_entry_size(ae));
854228753Smm
855228753Smm	/*
856228753Smm	 * Read "rr_moved/dir7/dir8/dir9"
857228753Smm	 */
858231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
859228753Smm	assertEqualInt(5, archive_entry_atime(ae));
860228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
861228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
862228753Smm	assertEqualString("RR_MOVED/DIR7/DIR8/DIR9",
863228753Smm	    archive_entry_pathname(ae));
864228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
865228753Smm	assertEqualInt(2048, archive_entry_size(ae));
866228753Smm
867228753Smm	/*
868228753Smm	 * Read "rr_moved/dir7/dir8/dir9/dira"
869228753Smm	 */
870228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
871228753Smm	assertEqualInt(5, archive_entry_atime(ae));
872228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
873228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
874228753Smm	assertEqualString("RR_MOVED/DIR7/DIR8/DIR9/DIRA",
875228753Smm	    archive_entry_pathname(ae));
876228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
877231200Smm	assertEqualInt(2048, archive_entry_size(ae));
878228753Smm
879228753Smm	/*
880228753Smm	 * Read "rr_moved/dir7/dir8/dir9/dira/dirB"
881231200Smm	 */
882228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
883228753Smm	assertEqualInt(5, archive_entry_atime(ae));
884231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
885228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
886228753Smm	assertEqualString("RR_MOVED/DIR7/DIR8/DIR9/DIRA/DIRB",
887228753Smm	    archive_entry_pathname(ae));
888228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
889231200Smm	assertEqualInt(2048, archive_entry_size(ae));
890228753Smm
891228753Smm	/*
892228753Smm	 * Read "rr_moved/dir7/dir8/dir9/dirA/dirB/dirC"
893228753Smm	 */
894228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
895228753Smm	assertEqualInt(5, archive_entry_atime(ae));
896228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
897228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
898228753Smm	assertEqualString("RR_MOVED/DIR7/DIR8/DIR9/DIRA/DIRB/DIRC",
899231200Smm	    archive_entry_pathname(ae));
900228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
901228753Smm	assertEqualInt(2048, archive_entry_size(ae));
902228753Smm
903228753Smm	/*
904228753Smm	 * Read "dir0"
905228753Smm	 */
906231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
907228753Smm	assertEqualInt(5, archive_entry_atime(ae));
908228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
909228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
910248590Smm	assertEqualString("DIR0", archive_entry_pathname(ae));
911248590Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
912248590Smm	assertEqualInt(2048, archive_entry_size(ae));
913248590Smm
914248590Smm	/*
915228753Smm	 * Read "dir0/dir1"
916248590Smm	 */
917248590Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
918228753Smm	assertEqualInt(5, archive_entry_atime(ae));
919228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
920228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
921228753Smm	assertEqualString("DIR0/DIR1", archive_entry_pathname(ae));
922228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
923228753Smm	assertEqualInt(2048, archive_entry_size(ae));
924228753Smm
925228753Smm	/*
926228753Smm	 * Read "dir0/dir1/dir2"
927228753Smm	 */
928228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
929228753Smm	assertEqualInt(5, archive_entry_atime(ae));
930231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
931228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
932228753Smm	assertEqualString("DIR0/DIR1/DIR2", archive_entry_pathname(ae));
933231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
934228753Smm	assertEqualInt(2048, archive_entry_size(ae));
935228753Smm
936228753Smm	/*
937228753Smm	 * Read "dir0/dir1/dir2/dir3"
938228753Smm	 */
939231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
940228753Smm	assertEqualInt(5, archive_entry_atime(ae));
941231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
942228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
943228753Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3",
944228753Smm	    archive_entry_pathname(ae));
945228753Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
946228753Smm	assertEqualInt(2048, archive_entry_size(ae));
947228753Smm
948228753Smm	/*
949228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4"
950231200Smm	 */
951231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
952228753Smm	assertEqualInt(5, archive_entry_atime(ae));
953228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
954228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
955228753Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4",
956228753Smm	    archive_entry_pathname(ae));
957231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
958228753Smm	assertEqualInt(2048, archive_entry_size(ae));
959231200Smm
960228753Smm	/*
961228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5"
962228753Smm	 */
963228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
964228753Smm	assertEqualInt(5, archive_entry_atime(ae));
965228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
966228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
967228753Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5",
968231200Smm	    archive_entry_pathname(ae));
969231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
970228753Smm	assertEqualInt(2048, archive_entry_size(ae));
971228753Smm
972228753Smm	/*
973228753Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
974228753Smm	 */
975231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
976228753Smm	assertEqualInt(5, archive_entry_atime(ae));
977228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
978228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
979228753Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5/DIR6",
980228753Smm	    archive_entry_pathname(ae));
981231200Smm	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
982228753Smm	assertEqualInt(2048, archive_entry_size(ae));
983228753Smm
984228753Smm	/*
985231200Smm	 * Read "hardlink"
986228753Smm	 */
987231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
988228753Smm	assertEqualInt(5, archive_entry_atime(ae));
989228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
990228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
991248590Smm	assertEqualString("HARDLNK", archive_entry_pathname(ae));
992228753Smm	assertEqualString(NULL, archive_entry_hardlink(ae));
993228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
994228753Smm	assertEqualInt(8, archive_entry_size(ae));
995228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
996228753Smm	assertEqualMem(buff2, "12345678", 8);
997231200Smm
998228753Smm	/*
999228753Smm	 * Read "file"
1000228753Smm	 */
1001228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1002228753Smm	assertEqualInt(5, archive_entry_atime(ae));
1003231200Smm	assertEqualInt(0, archive_entry_birthtime(ae));
1004228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
1005231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
1006228753Smm	assertEqualString("FILE", archive_entry_pathname(ae));
1007228753Smm	assertEqualString("HARDLNK", archive_entry_hardlink(ae));
1008228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1009228753Smm	assertEqualInt(2, archive_entry_nlink(ae));
1010228753Smm	assertEqualInt(0, archive_entry_size(ae));
1011228753Smm	assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
1012231200Smm
1013228753Smm
1014228753Smm	/*
1015228753Smm	 * Read longname
1016228753Smm	 */
1017228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1018228753Smm	assert(archive_entry_atime_is_set(ae));
1019231200Smm	assertEqualInt(5, archive_entry_atime(ae));
1020228753Smm	assert(archive_entry_ctime_is_set(ae));
1021231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
1022231200Smm	assert(archive_entry_mtime_is_set(ae));
1023231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
1024231200Smm	assertEqualString("LONGNAME", archive_entry_pathname(ae));
1025231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1026231200Smm	assertEqualInt(8, archive_entry_size(ae));
1027248590Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
1028228753Smm	assertEqualMem(buff2, "12345678", 8);
1029248590Smm
1030228753Smm	/*
1031228753Smm	 * Read "rr_moved/dir7/dir8/dir9/dirA/dirB/dirC/file"
1032228753Smm	 */
1033228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1034228753Smm	assertEqualInt(5, archive_entry_atime(ae));
1035228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
1036228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
1037228753Smm	assertEqualString(
1038228753Smm		"RR_MOVED/DIR7/DIR8/DIR9/DIRA/DIRB/DIRC/FILE",
1039228753Smm		archive_entry_pathname(ae));
1040228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1041228753Smm	assertEqualInt(1, archive_entry_nlink(ae));
1042228753Smm	assertEqualInt(8, archive_entry_size(ae));
1043228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
1044228753Smm	assertEqualMem(buff2, "12345678", 8);
1045228753Smm
1046228753Smm	/*
1047228753Smm	 * Read "dir0/dir1/file1"
1048228753Smm	 */
1049228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1050228753Smm	assertEqualInt(5, archive_entry_atime(ae));
1051228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
1052228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
1053228753Smm	assertEqualString("DIR0/DIR1/FILE1", archive_entry_pathname(ae));
1054231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1055228753Smm	assertEqualInt(1, archive_entry_nlink(ae));
1056231200Smm	assertEqualInt(8, archive_entry_size(ae));
1057228753Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
1058231200Smm	assertEqualMem(buff2, "12345678", 8);
1059231200Smm
1060231200Smm	/*
1061228753Smm	 * Read "dir0/dir1/file2"
1062228753Smm	 */
1063228753Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1064231200Smm	assertEqualInt(5, archive_entry_atime(ae));
1065228753Smm	assertEqualInt(5, archive_entry_ctime(ae));
1066228753Smm	assertEqualInt(5, archive_entry_mtime(ae));
1067228753Smm	assertEqualString("DIR0/DIR1/FILE2", archive_entry_pathname(ae));
1068228753Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1069231200Smm	assertEqualInt(1, archive_entry_nlink(ae));
1070231200Smm	assertEqualInt(8, archive_entry_size(ae));
1071231200Smm	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
1072231200Smm	assertEqualMem(buff2, "12345678", 8);
1073231200Smm
1074231200Smm	/*
1075231200Smm	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7" as file
1076231200Smm	 */
1077231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1078231200Smm	assertEqualInt(5, archive_entry_atime(ae));
1079231200Smm	assertEqualInt(5, archive_entry_ctime(ae));
1080248590Smm	assertEqualInt(5, archive_entry_mtime(ae));
1081248590Smm	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5/DIR6/DIR7",
1082231200Smm	    archive_entry_pathname(ae));
1083231200Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1084231200Smm	assertEqualInt(0, archive_entry_size(ae));
1085231200Smm
1086231200Smm	/*
1087231200Smm	 * Read "symlnk"
1088231200Smm	 */
1089231200Smm	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1090231200Smm	assert(archive_entry_atime_is_set(ae));
1091231200Smm	assertEqualInt(5, archive_entry_atime(ae));
1092231200Smm	assert(!archive_entry_birthtime_is_set(ae));
1093231200Smm	assertEqualInt(0, archive_entry_birthtime(ae));
1094248590Smm	assert(archive_entry_ctime_is_set(ae));
1095248590Smm	assertEqualInt(5, archive_entry_ctime(ae));
1096231200Smm	assert(archive_entry_mtime_is_set(ae));
1097231200Smm	assertEqualInt(5, archive_entry_mtime(ae));
1098231200Smm	assertEqualString("SYMLNK", archive_entry_pathname(ae));
1099248590Smm	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1100248590Smm	assertEqualInt(0, archive_entry_size(ae));
1101248590Smm
1102248590Smm	/*
1103248590Smm	 * Verify the end of the archive.
1104299425Smm	 */
1105318483Smm	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
1106248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1107248590Smm	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
1108248590Smm
1109248590Smm	free(buff);
1110248590Smm}
1111231200Smm