1 /*-
2  * Copyright (c) 2003-2008 Tim Kientzle
3  * Copyright (c) 2009,2010 Michihiro NAKAJIMA
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 #include "test.h"
27 __FBSDID("$FreeBSD$");
28 
29 static char buff2[64];
30 DEFINE_TEST(test_write_format_iso9660)
31 {
32 	size_t buffsize = 1000000;
33 	char *buff;
34 	struct archive_entry *ae;
35 	struct archive *a;
36 	char dirname[1024];
37 	char dir[6];
38 	char longname[] =
39 	    "longname00aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
40 	    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
41 	    "cccccccccccccccccccccccccccccccccccccccccccccccccc"
42 	    "dddddddddddddddddddddddddddddddddddddddddddddddddd";
43 
44 	size_t used;
45 	int i;
46 
47 	buff = malloc(buffsize); /* million bytes of work area */
48 	assert(buff != NULL);
49 
50 	/* Create a new archive in memory. */
51 	assert((a = archive_write_new()) != NULL);
52 	assertA(0 == archive_write_set_format_iso9660(a));
53 	assertA(0 == archive_write_add_filter_none(a));
54 	assertA(0 == archive_write_open_memory(a, buff, buffsize, &used));
55 
56 	/*
57 	 * "file" has a bunch of attributes and 8 bytes of data.
58 	 */
59 	assert((ae = archive_entry_new()) != NULL);
60 	archive_entry_set_atime(ae, 2, 20);
61 	archive_entry_set_birthtime(ae, 3, 30);
62 	archive_entry_set_ctime(ae, 4, 40);
63 	archive_entry_set_mtime(ae, 5, 50);
64 	archive_entry_copy_pathname(ae, "file");
65 	archive_entry_set_mode(ae, AE_IFREG | 0755);
66 	archive_entry_set_size(ae, 8);
67 	archive_entry_set_nlink(ae, 2);
68 	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
69 	archive_entry_free(ae);
70 	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
71 
72 	/*
73 	 * "hardlnk" has linked to "file".
74 	 */
75 	assert((ae = archive_entry_new()) != NULL);
76 	archive_entry_set_atime(ae, 2, 20);
77 	archive_entry_set_birthtime(ae, 3, 30);
78 	archive_entry_set_ctime(ae, 4, 40);
79 	archive_entry_set_mtime(ae, 5, 50);
80 	archive_entry_copy_pathname(ae, "hardlnk");
81 	archive_entry_set_mode(ae, AE_IFREG | 0755);
82 	archive_entry_set_hardlink(ae, "file");
83 	archive_entry_set_nlink(ae, 2);
84 	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
85 	archive_entry_free(ae);
86 
87 	/*
88 	 * longname is similar but has birthtime later than mtime.
89 	 */
90 	assert((ae = archive_entry_new()) != NULL);
91 	archive_entry_set_atime(ae, 2, 20);
92 	archive_entry_set_birthtime(ae, 8, 80);
93 	archive_entry_set_ctime(ae, 4, 40);
94 	archive_entry_set_mtime(ae, 5, 50);
95 	archive_entry_copy_pathname(ae, longname);
96 	archive_entry_set_mode(ae, AE_IFREG | 0666);
97 	archive_entry_set_size(ae, 8);
98 	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
99 	archive_entry_free(ae);
100 	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
101 
102 	/*
103 	 * "symlnk has symbolic linked to longname.
104 	 */
105 	assert((ae = archive_entry_new()) != NULL);
106 	archive_entry_set_atime(ae, 2, 20);
107 	archive_entry_set_ctime(ae, 4, 40);
108 	archive_entry_set_mtime(ae, 5, 50);
109 	archive_entry_copy_pathname(ae, "symlnk");
110 	archive_entry_set_mode(ae, AE_IFLNK | 0555);
111 	archive_entry_set_symlink(ae, longname);
112 	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
113 	archive_entry_free(ae);
114 
115 	/*
116 	 * "dir*" has a bunch of attributes.
117 	 */
118 	dirname[0] = '\0';
119 	strcpy(dir, "/dir0");
120 	for (i = 0; i < 13; i++) {
121 		dir[4] = "0123456789ABCDEF"[i];
122 		if (i == 0)
123 			strcat(dirname, dir+1);
124 		else
125 			strcat(dirname, dir);
126 		assert((ae = archive_entry_new()) != NULL);
127 		archive_entry_set_atime(ae, 2, 20);
128 		archive_entry_set_birthtime(ae, 3, 30);
129 		archive_entry_set_ctime(ae, 4, 40);
130 		archive_entry_set_mtime(ae, 5, 50);
131 		archive_entry_copy_pathname(ae, dirname);
132 		archive_entry_set_mode(ae, S_IFDIR | 0755);
133 		assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
134 		archive_entry_free(ae);
135 	}
136 
137 	strcat(dirname, "/file");
138 	assert((ae = archive_entry_new()) != NULL);
139 	archive_entry_set_atime(ae, 2, 20);
140 	archive_entry_set_birthtime(ae, 3, 30);
141 	archive_entry_set_ctime(ae, 4, 40);
142 	archive_entry_set_mtime(ae, 5, 50);
143 	archive_entry_copy_pathname(ae, dirname);
144 	archive_entry_set_mode(ae, S_IFREG | 0755);
145 	archive_entry_set_size(ae, 8);
146 	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
147 	archive_entry_free(ae);
148 	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
149 
150 	/*
151 	 * "dir0/dir1/file1" has 8 bytes of data.
152 	 */
153 	assert((ae = archive_entry_new()) != NULL);
154 	archive_entry_set_atime(ae, 2, 20);
155 	archive_entry_set_birthtime(ae, 3, 30);
156 	archive_entry_set_ctime(ae, 4, 40);
157 	archive_entry_set_mtime(ae, 5, 50);
158 	archive_entry_copy_pathname(ae, "dir0/dir1/file1");
159 	archive_entry_set_mode(ae, AE_IFREG | 0755);
160 	archive_entry_set_size(ae, 8);
161 	archive_entry_set_nlink(ae, 1);
162 	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
163 	archive_entry_free(ae);
164 	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
165 
166 	/*
167 	 * "dir0/dir1/file2" has 8 bytes of data.
168 	 */
169 	assert((ae = archive_entry_new()) != NULL);
170 	archive_entry_set_atime(ae, 2, 20);
171 	archive_entry_set_birthtime(ae, 3, 30);
172 	archive_entry_set_ctime(ae, 4, 40);
173 	archive_entry_set_mtime(ae, 5, 50);
174 	archive_entry_copy_pathname(ae, "dir0/dir1/file2");
175 	archive_entry_set_mode(ae, AE_IFREG | 0755);
176 	archive_entry_set_size(ae, 8);
177 	archive_entry_set_nlink(ae, 1);
178 	assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
179 	archive_entry_free(ae);
180 	assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
181 
182 	/*
183 	 * Add a wrong path "dir0/dir1/file2/wrong"
184 	 */
185 	assert((ae = archive_entry_new()) != NULL);
186 	archive_entry_set_atime(ae, 2, 20);
187 	archive_entry_set_birthtime(ae, 3, 30);
188 	archive_entry_set_ctime(ae, 4, 40);
189 	archive_entry_set_mtime(ae, 5, 50);
190 	archive_entry_copy_pathname(ae, "dir0/dir1/file2/wrong");
191 	archive_entry_set_mode(ae, AE_IFREG | 0755);
192 	archive_entry_set_size(ae, 8);
193 	archive_entry_set_nlink(ae, 1);
194 	assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae));
195 	archive_entry_free(ae);
196 
197 	/* Close out the archive. */
198 	assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
199 	assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a));
200 
201 	/*
202 	 * -----------------------------------------------------------
203 	 * Now, read the data back(read Rockridge extensions).
204 	 * -----------------------------------------------------------
205 	 */
206 	assert((a = archive_read_new()) != NULL);
207 	assertEqualIntA(a, 0, archive_read_support_format_all(a));
208 	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
209 	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
210 
211 	/*
212 	 * Read Root Directory
213 	 */
214 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
215 	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
216 	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
217 	assertEqualString(".", archive_entry_pathname(ae));
218 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
219 	assertEqualInt(2048, archive_entry_size(ae));
220 
221 	/*
222 	 * Read "dir0"
223 	 */
224 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
225 	assertEqualInt(2, archive_entry_atime(ae));
226 	assertEqualInt(3, archive_entry_birthtime(ae));
227 	assertEqualInt(4, archive_entry_ctime(ae));
228 	assertEqualInt(5, archive_entry_mtime(ae));
229 	assertEqualString("dir0", archive_entry_pathname(ae));
230 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
231 	assertEqualInt(2048, archive_entry_size(ae));
232 
233 	/*
234 	 * Read "dir0/dir1"
235 	 */
236 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
237 	assertEqualInt(2, archive_entry_atime(ae));
238 	assertEqualInt(3, archive_entry_birthtime(ae));
239 	assertEqualInt(4, archive_entry_ctime(ae));
240 	assertEqualInt(5, archive_entry_mtime(ae));
241 	assertEqualString("dir0/dir1", archive_entry_pathname(ae));
242 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
243 	assertEqualInt(2048, archive_entry_size(ae));
244 
245 	/*
246 	 * Read "dir0/dir1/dir2"
247 	 */
248 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
249 	assertEqualInt(2, archive_entry_atime(ae));
250 	assertEqualInt(3, archive_entry_birthtime(ae));
251 	assertEqualInt(4, archive_entry_ctime(ae));
252 	assertEqualInt(5, archive_entry_mtime(ae));
253 	assertEqualString("dir0/dir1/dir2", archive_entry_pathname(ae));
254 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
255 	assertEqualInt(2048, archive_entry_size(ae));
256 
257 	/*
258 	 * Read "dir0/dir1/dir2/dir3"
259 	 */
260 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
261 	assertEqualInt(2, archive_entry_atime(ae));
262 	assertEqualInt(3, archive_entry_birthtime(ae));
263 	assertEqualInt(4, archive_entry_ctime(ae));
264 	assertEqualInt(5, archive_entry_mtime(ae));
265 	assertEqualString("dir0/dir1/dir2/dir3",
266 	    archive_entry_pathname(ae));
267 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
268 	assertEqualInt(2048, archive_entry_size(ae));
269 
270 	/*
271 	 * Read "dir0/dir1/dir2/dir3/dir4"
272 	 */
273 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
274 	assertEqualInt(2, archive_entry_atime(ae));
275 	assertEqualInt(3, archive_entry_birthtime(ae));
276 	assertEqualInt(4, archive_entry_ctime(ae));
277 	assertEqualInt(5, archive_entry_mtime(ae));
278 	assertEqualString("dir0/dir1/dir2/dir3/dir4",
279 	    archive_entry_pathname(ae));
280 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
281 	assertEqualInt(2048, archive_entry_size(ae));
282 
283 	/*
284 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5"
285 	 */
286 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
287 	assertEqualInt(2, archive_entry_atime(ae));
288 	assertEqualInt(3, archive_entry_birthtime(ae));
289 	assertEqualInt(4, archive_entry_ctime(ae));
290 	assertEqualInt(5, archive_entry_mtime(ae));
291 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5",
292 	    archive_entry_pathname(ae));
293 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
294 	assertEqualInt(2048, archive_entry_size(ae));
295 
296 	/*
297 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
298 	 */
299 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
300 	assertEqualInt(2, archive_entry_atime(ae));
301 	assertEqualInt(3, archive_entry_birthtime(ae));
302 	assertEqualInt(4, archive_entry_ctime(ae));
303 	assertEqualInt(5, archive_entry_mtime(ae));
304 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6",
305 	    archive_entry_pathname(ae));
306 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
307 	assertEqualInt(2048, archive_entry_size(ae));
308 
309 	/*
310 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7"
311 	 */
312 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
313 	assertEqualInt(2, archive_entry_atime(ae));
314 	assertEqualInt(3, archive_entry_birthtime(ae));
315 	assertEqualInt(4, archive_entry_ctime(ae));
316 	assertEqualInt(5, archive_entry_mtime(ae));
317 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7",
318 	    archive_entry_pathname(ae));
319 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
320 	assertEqualInt(2048, archive_entry_size(ae));
321 
322 	/*
323 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8"
324 	 */
325 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
326 	assertEqualInt(2, archive_entry_atime(ae));
327 	assertEqualInt(3, archive_entry_birthtime(ae));
328 	assertEqualInt(4, archive_entry_ctime(ae));
329 	assertEqualInt(5, archive_entry_mtime(ae));
330 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8",
331 	    archive_entry_pathname(ae));
332 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
333 	assertEqualInt(2048, archive_entry_size(ae));
334 
335 	/*
336 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9"
337 	 */
338 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
339 	assertEqualInt(2, archive_entry_atime(ae));
340 	assertEqualInt(3, archive_entry_birthtime(ae));
341 	assertEqualInt(4, archive_entry_ctime(ae));
342 	assertEqualInt(5, archive_entry_mtime(ae));
343 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9",
344 	    archive_entry_pathname(ae));
345 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
346 	assertEqualInt(2048, archive_entry_size(ae));
347 
348 	/*
349 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA"
350 	 */
351 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
352 	assertEqualInt(2, archive_entry_atime(ae));
353 	assertEqualInt(3, archive_entry_birthtime(ae));
354 	assertEqualInt(4, archive_entry_ctime(ae));
355 	assertEqualInt(5, archive_entry_mtime(ae));
356 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA",
357 	    archive_entry_pathname(ae));
358 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
359 	assertEqualInt(2048, archive_entry_size(ae));
360 
361 	/*
362 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB"
363 	 */
364 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
365 	assertEqualInt(2, archive_entry_atime(ae));
366 	assertEqualInt(3, archive_entry_birthtime(ae));
367 	assertEqualInt(4, archive_entry_ctime(ae));
368 	assertEqualInt(5, archive_entry_mtime(ae));
369 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB",
370 	    archive_entry_pathname(ae));
371 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
372 	assertEqualInt(2048, archive_entry_size(ae));
373 
374 	/*
375 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC"
376 	 */
377 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
378 	assertEqualInt(2, archive_entry_atime(ae));
379 	assertEqualInt(3, archive_entry_birthtime(ae));
380 	assertEqualInt(4, archive_entry_ctime(ae));
381 	assertEqualInt(5, archive_entry_mtime(ae));
382 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC",
383 	    archive_entry_pathname(ae));
384 	assert((S_IFDIR | 0555) == archive_entry_mode(ae));
385 	assertEqualInt(2048, archive_entry_size(ae));
386 
387 	/*
388 	 * Read "hardlnk"
389 	 */
390 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
391 	assertEqualInt(2, archive_entry_atime(ae));
392 	assertEqualInt(3, archive_entry_birthtime(ae));
393 	assertEqualInt(4, archive_entry_ctime(ae));
394 	assertEqualInt(5, archive_entry_mtime(ae));
395 	assertEqualString("hardlnk", archive_entry_pathname(ae));
396 	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
397 	assertEqualInt(2, archive_entry_nlink(ae));
398 	assertEqualInt(8, archive_entry_size(ae));
399 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
400 	assertEqualMem(buff2, "12345678", 8);
401 
402 	/*
403 	 * Read "file"
404 	 */
405 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
406 	assertEqualInt(2, archive_entry_atime(ae));
407 	assertEqualInt(3, archive_entry_birthtime(ae));
408 	assertEqualInt(4, archive_entry_ctime(ae));
409 	assertEqualInt(5, archive_entry_mtime(ae));
410 	assertEqualString("file", archive_entry_pathname(ae));
411 	assertEqualString("hardlnk", archive_entry_hardlink(ae));
412 	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
413 	assertEqualInt(2, archive_entry_nlink(ae));
414 	assertEqualInt(0, archive_entry_size(ae));
415 
416 	/*
417 	 * Read longname
418 	 */
419 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
420 	assert(archive_entry_atime_is_set(ae));
421 	assertEqualInt(2, archive_entry_atime(ae));
422 	/* Birthtime > mtime above, so it doesn't get stored at all. */
423 	assert(!archive_entry_birthtime_is_set(ae));
424 	assertEqualInt(0, archive_entry_birthtime(ae));
425 	assert(archive_entry_ctime_is_set(ae));
426 	assertEqualInt(4, archive_entry_ctime(ae));
427 	assert(archive_entry_mtime_is_set(ae));
428 	assertEqualInt(5, archive_entry_mtime(ae));
429 	assertEqualString(longname, archive_entry_pathname(ae));
430 #if !defined(_WIN32) && !defined(__CYGWIN__)
431 	assert((AE_IFREG | 0444) == archive_entry_mode(ae));
432 #else
433 	/* On Windows and CYGWIN, always set all exec bit ON by default. */
434 	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
435 #endif
436 	assertEqualInt(8, archive_entry_size(ae));
437 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
438 	assertEqualMem(buff2, "12345678", 8);
439 
440 	/*
441 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file"
442 	 */
443 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
444 	assertEqualInt(2, archive_entry_atime(ae));
445 	assertEqualInt(3, archive_entry_birthtime(ae));
446 	assertEqualInt(4, archive_entry_ctime(ae));
447 	assertEqualInt(5, archive_entry_mtime(ae));
448 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file", archive_entry_pathname(ae));
449 	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
450 	assertEqualInt(1, archive_entry_nlink(ae));
451 	assertEqualInt(8, archive_entry_size(ae));
452 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
453 	assertEqualMem(buff2, "12345678", 8);
454 
455 	/*
456 	 * Read "dir0/dir1/file1"
457 	 */
458 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
459 	assertEqualInt(2, archive_entry_atime(ae));
460 	assertEqualInt(3, archive_entry_birthtime(ae));
461 	assertEqualInt(4, archive_entry_ctime(ae));
462 	assertEqualInt(5, archive_entry_mtime(ae));
463 	assertEqualString("dir0/dir1/file1", archive_entry_pathname(ae));
464 	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
465 	assertEqualInt(1, archive_entry_nlink(ae));
466 	assertEqualInt(8, archive_entry_size(ae));
467 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
468 	assertEqualMem(buff2, "12345678", 8);
469 
470 	/*
471 	 * Read "dir0/dir1/file2"
472 	 */
473 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
474 	assertEqualInt(2, archive_entry_atime(ae));
475 	assertEqualInt(3, archive_entry_birthtime(ae));
476 	assertEqualInt(4, archive_entry_ctime(ae));
477 	assertEqualInt(5, archive_entry_mtime(ae));
478 	assertEqualString("dir0/dir1/file2", archive_entry_pathname(ae));
479 	assert((AE_IFREG | 0555) == archive_entry_mode(ae));
480 	assertEqualInt(1, archive_entry_nlink(ae));
481 	assertEqualInt(8, archive_entry_size(ae));
482 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
483 	assertEqualMem(buff2, "12345678", 8);
484 
485 	/*
486 	 * Read "symlnk"
487 	 */
488 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
489 	assert(archive_entry_atime_is_set(ae));
490 	assertEqualInt(2, archive_entry_atime(ae));
491 	assert(!archive_entry_birthtime_is_set(ae));
492 	assertEqualInt(0, archive_entry_birthtime(ae));
493 	assert(archive_entry_ctime_is_set(ae));
494 	assertEqualInt(4, archive_entry_ctime(ae));
495 	assert(archive_entry_mtime_is_set(ae));
496 	assertEqualInt(5, archive_entry_mtime(ae));
497 	assertEqualString("symlnk", archive_entry_pathname(ae));
498 	assert((AE_IFLNK | 0555) == archive_entry_mode(ae));
499 	assertEqualString(longname, archive_entry_symlink(ae));
500 
501 	/*
502 	 * Verify the end of the archive.
503 	 */
504 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
505 	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
506 	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
507 
508 	/*
509 	 * -----------------------------------------------------------
510 	 * Now, read the data back without Rockridge option
511 	 * (read Joliet extensions).
512 	 * -----------------------------------------------------------
513 	 */
514 	assert((a = archive_read_new()) != NULL);
515 	assertEqualIntA(a, 0, archive_read_support_format_all(a));
516 	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
517 	/* Disable Rockridge extensions support. */
518         assertEqualInt(ARCHIVE_OK,
519             archive_read_set_option(a, NULL, "rockridge", NULL));
520 	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
521 
522 	/*
523 	 * Read Root Directory
524 	 */
525 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
526 	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
527 	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
528 	assertEqualString(".", archive_entry_pathname(ae));
529 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
530 	assertEqualInt(2048, archive_entry_size(ae));
531 
532 	/*
533 	 * Read "dir0"
534 	 */
535 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
536 	assertEqualInt(5, archive_entry_atime(ae));
537 	assertEqualInt(5, archive_entry_ctime(ae));
538 	assertEqualInt(5, archive_entry_mtime(ae));
539 	assertEqualString("dir0", archive_entry_pathname(ae));
540 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
541 	assertEqualInt(2048, archive_entry_size(ae));
542 
543 	/*
544 	 * Read "dir0/dir1"
545 	 */
546 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
547 	assertEqualInt(5, archive_entry_atime(ae));
548 	assertEqualInt(5, archive_entry_ctime(ae));
549 	assertEqualInt(5, archive_entry_mtime(ae));
550 	assertEqualString("dir0/dir1", archive_entry_pathname(ae));
551 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
552 	assertEqualInt(2048, archive_entry_size(ae));
553 
554 	/*
555 	 * Read "dir0/dir1/dir2"
556 	 */
557 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
558 	assertEqualInt(5, archive_entry_atime(ae));
559 	assertEqualInt(5, archive_entry_ctime(ae));
560 	assertEqualInt(5, archive_entry_mtime(ae));
561 	assertEqualString("dir0/dir1/dir2", archive_entry_pathname(ae));
562 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
563 	assertEqualInt(2048, archive_entry_size(ae));
564 
565 	/*
566 	 * Read "dir0/dir1/dir2/dir3"
567 	 */
568 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
569 	assertEqualInt(5, archive_entry_atime(ae));
570 	assertEqualInt(5, archive_entry_ctime(ae));
571 	assertEqualInt(5, archive_entry_mtime(ae));
572 	assertEqualString("dir0/dir1/dir2/dir3",
573 	    archive_entry_pathname(ae));
574 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
575 	assertEqualInt(2048, archive_entry_size(ae));
576 
577 	/*
578 	 * Read "dir0/dir1/dir2/dir3/dir4"
579 	 */
580 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
581 	assertEqualInt(5, archive_entry_atime(ae));
582 	assertEqualInt(5, archive_entry_ctime(ae));
583 	assertEqualInt(5, archive_entry_mtime(ae));
584 	assertEqualString("dir0/dir1/dir2/dir3/dir4",
585 	    archive_entry_pathname(ae));
586 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
587 	assertEqualInt(2048, archive_entry_size(ae));
588 
589 	/*
590 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5"
591 	 */
592 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
593 	assertEqualInt(5, archive_entry_atime(ae));
594 	assertEqualInt(5, archive_entry_ctime(ae));
595 	assertEqualInt(5, archive_entry_mtime(ae));
596 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5",
597 	    archive_entry_pathname(ae));
598 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
599 	assertEqualInt(2048, archive_entry_size(ae));
600 
601 	/*
602 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
603 	 */
604 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
605 	assertEqualInt(5, archive_entry_atime(ae));
606 	assertEqualInt(5, archive_entry_ctime(ae));
607 	assertEqualInt(5, archive_entry_mtime(ae));
608 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6",
609 	    archive_entry_pathname(ae));
610 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
611 	assertEqualInt(2048, archive_entry_size(ae));
612 
613 	/*
614 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7"
615 	 */
616 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
617 	assertEqualInt(5, archive_entry_atime(ae));
618 	assertEqualInt(5, archive_entry_ctime(ae));
619 	assertEqualInt(5, archive_entry_mtime(ae));
620 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7",
621 	    archive_entry_pathname(ae));
622 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
623 	assertEqualInt(2048, archive_entry_size(ae));
624 
625 	/*
626 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8"
627 	 */
628 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
629 	assertEqualInt(5, archive_entry_atime(ae));
630 	assertEqualInt(5, archive_entry_ctime(ae));
631 	assertEqualInt(5, archive_entry_mtime(ae));
632 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8",
633 	    archive_entry_pathname(ae));
634 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
635 	assertEqualInt(2048, archive_entry_size(ae));
636 
637 	/*
638 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9"
639 	 */
640 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
641 	assertEqualInt(5, archive_entry_atime(ae));
642 	assertEqualInt(5, archive_entry_ctime(ae));
643 	assertEqualInt(5, archive_entry_mtime(ae));
644 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9",
645 	    archive_entry_pathname(ae));
646 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
647 	assertEqualInt(2048, archive_entry_size(ae));
648 
649 	/*
650 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA"
651 	 */
652 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
653 	assertEqualInt(5, archive_entry_atime(ae));
654 	assertEqualInt(5, archive_entry_ctime(ae));
655 	assertEqualInt(5, archive_entry_mtime(ae));
656 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA",
657 	    archive_entry_pathname(ae));
658 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
659 	assertEqualInt(2048, archive_entry_size(ae));
660 
661 	/*
662 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB"
663 	 */
664 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
665 	assertEqualInt(5, archive_entry_atime(ae));
666 	assertEqualInt(5, archive_entry_ctime(ae));
667 	assertEqualInt(5, archive_entry_mtime(ae));
668 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB",
669 	    archive_entry_pathname(ae));
670 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
671 	assertEqualInt(2048, archive_entry_size(ae));
672 
673 	/*
674 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC"
675 	 */
676 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
677 	assertEqualInt(5, archive_entry_atime(ae));
678 	assertEqualInt(5, archive_entry_ctime(ae));
679 	assertEqualInt(5, archive_entry_mtime(ae));
680 	assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC",
681 	    archive_entry_pathname(ae));
682 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
683 	assertEqualInt(2048, archive_entry_size(ae));
684 
685 	/*
686 	 * Read "file"
687 	 */
688 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
689 	assertEqualInt(5, archive_entry_atime(ae));
690 	assertEqualInt(5, archive_entry_ctime(ae));
691 	assertEqualInt(5, archive_entry_mtime(ae));
692 	assertEqualString("file", archive_entry_pathname(ae));
693 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
694 	assertEqualInt(8, archive_entry_size(ae));
695 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
696 	assertEqualMem(buff2, "12345678", 8);
697 
698 	/*
699 	 * Read "hardlnk"
700 	 */
701 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
702 	assertEqualInt(5, archive_entry_atime(ae));
703 	assertEqualInt(5, archive_entry_ctime(ae));
704 	assertEqualInt(5, archive_entry_mtime(ae));
705 	assertEqualString("hardlnk", archive_entry_pathname(ae));
706 	assertEqualString("file", archive_entry_hardlink(ae));
707 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
708 	assertEqualInt(2, archive_entry_nlink(ae));
709 	assertEqualInt(0, archive_entry_size(ae));
710 	assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
711 
712 	/*
713 	 * Read longname
714 	 */
715 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
716 	assert(archive_entry_atime_is_set(ae));
717 	assertEqualInt(5, archive_entry_atime(ae));
718 	assert(archive_entry_ctime_is_set(ae));
719 	assertEqualInt(5, archive_entry_ctime(ae));
720 	assert(archive_entry_mtime_is_set(ae));
721 	assertEqualInt(5, archive_entry_mtime(ae));
722 	/* Trim longname to 64 characters. */
723 	longname[64] = '\0';
724 	assertEqualString(longname, archive_entry_pathname(ae));
725 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
726 	assertEqualInt(8, archive_entry_size(ae));
727 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
728 	assertEqualMem(buff2, "12345678", 8);
729 
730 	/*
731 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file"
732 	 */
733 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
734 	assertEqualInt(5, archive_entry_atime(ae));
735 	assertEqualInt(5, archive_entry_ctime(ae));
736 	assertEqualInt(5, archive_entry_mtime(ae));
737 	assertEqualString(
738 		"dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9/dirA/dirB/dirC/file",
739 		archive_entry_pathname(ae));
740 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
741 	assertEqualInt(1, archive_entry_nlink(ae));
742 	assertEqualInt(8, archive_entry_size(ae));
743 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
744 	assertEqualMem(buff2, "12345678", 8);
745 
746 	/*
747 	 * Read "dir0/dir1/file1"
748 	 */
749 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
750 	assertEqualInt(5, archive_entry_atime(ae));
751 	assertEqualInt(5, archive_entry_ctime(ae));
752 	assertEqualInt(5, archive_entry_mtime(ae));
753 	assertEqualString("dir0/dir1/file1", archive_entry_pathname(ae));
754 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
755 	assertEqualInt(1, archive_entry_nlink(ae));
756 	assertEqualInt(8, archive_entry_size(ae));
757 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
758 	assertEqualMem(buff2, "12345678", 8);
759 
760 	/*
761 	 * Read "dir0/dir1/file2"
762 	 */
763 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
764 	assertEqualInt(5, archive_entry_atime(ae));
765 	assertEqualInt(5, archive_entry_ctime(ae));
766 	assertEqualInt(5, archive_entry_mtime(ae));
767 	assertEqualString("dir0/dir1/file2", archive_entry_pathname(ae));
768 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
769 	assertEqualInt(1, archive_entry_nlink(ae));
770 	assertEqualInt(8, archive_entry_size(ae));
771 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
772 	assertEqualMem(buff2, "12345678", 8);
773 
774 	/*
775 	 * Read "symlnk"
776 	 */
777 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
778 	assert(archive_entry_atime_is_set(ae));
779 	assertEqualInt(5, archive_entry_atime(ae));
780 	assert(!archive_entry_birthtime_is_set(ae));
781 	assertEqualInt(0, archive_entry_birthtime(ae));
782 	assert(archive_entry_ctime_is_set(ae));
783 	assertEqualInt(5, archive_entry_ctime(ae));
784 	assert(archive_entry_mtime_is_set(ae));
785 	assertEqualInt(5, archive_entry_mtime(ae));
786 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
787 	assertEqualInt(0, archive_entry_size(ae));
788 
789 	/*
790 	 * Verify the end of the archive.
791 	 */
792 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
793 	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
794 	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
795 
796 	/*
797 	 * -----------------------------------------------------------
798 	 * Now, read the data back without Rockridge and Joliet option
799 	 * (read ISO9660).
800 	 * This mode appears rr_moved directory.
801 	 * -----------------------------------------------------------
802 	 */
803 	assert((a = archive_read_new()) != NULL);
804 	assertEqualIntA(a, 0, archive_read_support_format_all(a));
805 	assertEqualIntA(a, 0, archive_read_support_filter_all(a));
806 	/* Disable Rockridge and Joliet extensions support. */
807         assertEqualInt(ARCHIVE_OK,
808             archive_read_set_option(a, NULL, "rockridge", NULL));
809         assertEqualInt(ARCHIVE_OK,
810             archive_read_set_option(a, NULL, "joliet", NULL));
811 	assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
812 
813 	/*
814 	 * Read Root Directory
815 	 */
816 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
817 	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
818 	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
819 	assertEqualString(".", archive_entry_pathname(ae));
820 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
821 	assertEqualInt(2048, archive_entry_size(ae));
822 
823 	/*
824 	 * Read "rr_moved"
825 	 */
826 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
827 	assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
828 	assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
829 	assertEqualString("RR_MOVED", archive_entry_pathname(ae));
830 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
831 	assertEqualInt(2048, archive_entry_size(ae));
832 
833 	/*
834 	 * Read "rr_moved/dir7"
835 	 */
836 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
837 	assertEqualInt(5, archive_entry_atime(ae));
838 	assertEqualInt(5, archive_entry_ctime(ae));
839 	assertEqualInt(5, archive_entry_mtime(ae));
840 	assertEqualString("RR_MOVED/DIR7", archive_entry_pathname(ae));
841 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
842 	assertEqualInt(2048, archive_entry_size(ae));
843 
844 	/*
845 	 * Read "rr_moved/dir7/dir8"
846 	 */
847 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
848 	assertEqualInt(5, archive_entry_atime(ae));
849 	assertEqualInt(5, archive_entry_ctime(ae));
850 	assertEqualInt(5, archive_entry_mtime(ae));
851 	assertEqualString("RR_MOVED/DIR7/DIR8", archive_entry_pathname(ae));
852 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
853 	assertEqualInt(2048, archive_entry_size(ae));
854 
855 	/*
856 	 * Read "rr_moved/dir7/dir8/dir9"
857 	 */
858 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
859 	assertEqualInt(5, archive_entry_atime(ae));
860 	assertEqualInt(5, archive_entry_ctime(ae));
861 	assertEqualInt(5, archive_entry_mtime(ae));
862 	assertEqualString("RR_MOVED/DIR7/DIR8/DIR9",
863 	    archive_entry_pathname(ae));
864 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
865 	assertEqualInt(2048, archive_entry_size(ae));
866 
867 	/*
868 	 * Read "rr_moved/dir7/dir8/dir9/dira"
869 	 */
870 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
871 	assertEqualInt(5, archive_entry_atime(ae));
872 	assertEqualInt(5, archive_entry_ctime(ae));
873 	assertEqualInt(5, archive_entry_mtime(ae));
874 	assertEqualString("RR_MOVED/DIR7/DIR8/DIR9/DIRA",
875 	    archive_entry_pathname(ae));
876 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
877 	assertEqualInt(2048, archive_entry_size(ae));
878 
879 	/*
880 	 * Read "rr_moved/dir7/dir8/dir9/dira/dirB"
881 	 */
882 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
883 	assertEqualInt(5, archive_entry_atime(ae));
884 	assertEqualInt(5, archive_entry_ctime(ae));
885 	assertEqualInt(5, archive_entry_mtime(ae));
886 	assertEqualString("RR_MOVED/DIR7/DIR8/DIR9/DIRA/DIRB",
887 	    archive_entry_pathname(ae));
888 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
889 	assertEqualInt(2048, archive_entry_size(ae));
890 
891 	/*
892 	 * Read "rr_moved/dir7/dir8/dir9/dirA/dirB/dirC"
893 	 */
894 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
895 	assertEqualInt(5, archive_entry_atime(ae));
896 	assertEqualInt(5, archive_entry_ctime(ae));
897 	assertEqualInt(5, archive_entry_mtime(ae));
898 	assertEqualString("RR_MOVED/DIR7/DIR8/DIR9/DIRA/DIRB/DIRC",
899 	    archive_entry_pathname(ae));
900 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
901 	assertEqualInt(2048, archive_entry_size(ae));
902 
903 	/*
904 	 * Read "dir0"
905 	 */
906 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
907 	assertEqualInt(5, archive_entry_atime(ae));
908 	assertEqualInt(5, archive_entry_ctime(ae));
909 	assertEqualInt(5, archive_entry_mtime(ae));
910 	assertEqualString("DIR0", archive_entry_pathname(ae));
911 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
912 	assertEqualInt(2048, archive_entry_size(ae));
913 
914 	/*
915 	 * Read "dir0/dir1"
916 	 */
917 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
918 	assertEqualInt(5, archive_entry_atime(ae));
919 	assertEqualInt(5, archive_entry_ctime(ae));
920 	assertEqualInt(5, archive_entry_mtime(ae));
921 	assertEqualString("DIR0/DIR1", archive_entry_pathname(ae));
922 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
923 	assertEqualInt(2048, archive_entry_size(ae));
924 
925 	/*
926 	 * Read "dir0/dir1/dir2"
927 	 */
928 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
929 	assertEqualInt(5, archive_entry_atime(ae));
930 	assertEqualInt(5, archive_entry_ctime(ae));
931 	assertEqualInt(5, archive_entry_mtime(ae));
932 	assertEqualString("DIR0/DIR1/DIR2", archive_entry_pathname(ae));
933 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
934 	assertEqualInt(2048, archive_entry_size(ae));
935 
936 	/*
937 	 * Read "dir0/dir1/dir2/dir3"
938 	 */
939 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
940 	assertEqualInt(5, archive_entry_atime(ae));
941 	assertEqualInt(5, archive_entry_ctime(ae));
942 	assertEqualInt(5, archive_entry_mtime(ae));
943 	assertEqualString("DIR0/DIR1/DIR2/DIR3",
944 	    archive_entry_pathname(ae));
945 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
946 	assertEqualInt(2048, archive_entry_size(ae));
947 
948 	/*
949 	 * Read "dir0/dir1/dir2/dir3/dir4"
950 	 */
951 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
952 	assertEqualInt(5, archive_entry_atime(ae));
953 	assertEqualInt(5, archive_entry_ctime(ae));
954 	assertEqualInt(5, archive_entry_mtime(ae));
955 	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4",
956 	    archive_entry_pathname(ae));
957 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
958 	assertEqualInt(2048, archive_entry_size(ae));
959 
960 	/*
961 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5"
962 	 */
963 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
964 	assertEqualInt(5, archive_entry_atime(ae));
965 	assertEqualInt(5, archive_entry_ctime(ae));
966 	assertEqualInt(5, archive_entry_mtime(ae));
967 	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5",
968 	    archive_entry_pathname(ae));
969 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
970 	assertEqualInt(2048, archive_entry_size(ae));
971 
972 	/*
973 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
974 	 */
975 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
976 	assertEqualInt(5, archive_entry_atime(ae));
977 	assertEqualInt(5, archive_entry_ctime(ae));
978 	assertEqualInt(5, archive_entry_mtime(ae));
979 	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5/DIR6",
980 	    archive_entry_pathname(ae));
981 	assert((S_IFDIR | 0700) == archive_entry_mode(ae));
982 	assertEqualInt(2048, archive_entry_size(ae));
983 
984 	/*
985 	 * Read "hardlink"
986 	 */
987 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
988 	assertEqualInt(5, archive_entry_atime(ae));
989 	assertEqualInt(5, archive_entry_ctime(ae));
990 	assertEqualInt(5, archive_entry_mtime(ae));
991 	assertEqualString("HARDLNK", archive_entry_pathname(ae));
992 	assertEqualString(NULL, archive_entry_hardlink(ae));
993 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
994 	assertEqualInt(8, archive_entry_size(ae));
995 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
996 	assertEqualMem(buff2, "12345678", 8);
997 
998 	/*
999 	 * Read "file"
1000 	 */
1001 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1002 	assertEqualInt(5, archive_entry_atime(ae));
1003 	assertEqualInt(0, archive_entry_birthtime(ae));
1004 	assertEqualInt(5, archive_entry_ctime(ae));
1005 	assertEqualInt(5, archive_entry_mtime(ae));
1006 	assertEqualString("FILE", archive_entry_pathname(ae));
1007 	assertEqualString("HARDLNK", archive_entry_hardlink(ae));
1008 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1009 	assertEqualInt(2, archive_entry_nlink(ae));
1010 	assertEqualInt(0, archive_entry_size(ae));
1011 	assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
1012 
1013 
1014 	/*
1015 	 * Read longname
1016 	 */
1017 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1018 	assert(archive_entry_atime_is_set(ae));
1019 	assertEqualInt(5, archive_entry_atime(ae));
1020 	assert(archive_entry_ctime_is_set(ae));
1021 	assertEqualInt(5, archive_entry_ctime(ae));
1022 	assert(archive_entry_mtime_is_set(ae));
1023 	assertEqualInt(5, archive_entry_mtime(ae));
1024 	assertEqualString("LONGNAME", archive_entry_pathname(ae));
1025 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1026 	assertEqualInt(8, archive_entry_size(ae));
1027 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
1028 	assertEqualMem(buff2, "12345678", 8);
1029 
1030 	/*
1031 	 * Read "rr_moved/dir7/dir8/dir9/dirA/dirB/dirC/file"
1032 	 */
1033 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1034 	assertEqualInt(5, archive_entry_atime(ae));
1035 	assertEqualInt(5, archive_entry_ctime(ae));
1036 	assertEqualInt(5, archive_entry_mtime(ae));
1037 	assertEqualString(
1038 		"RR_MOVED/DIR7/DIR8/DIR9/DIRA/DIRB/DIRC/FILE",
1039 		archive_entry_pathname(ae));
1040 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1041 	assertEqualInt(1, archive_entry_nlink(ae));
1042 	assertEqualInt(8, archive_entry_size(ae));
1043 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
1044 	assertEqualMem(buff2, "12345678", 8);
1045 
1046 	/*
1047 	 * Read "dir0/dir1/file1"
1048 	 */
1049 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1050 	assertEqualInt(5, archive_entry_atime(ae));
1051 	assertEqualInt(5, archive_entry_ctime(ae));
1052 	assertEqualInt(5, archive_entry_mtime(ae));
1053 	assertEqualString("DIR0/DIR1/FILE1", archive_entry_pathname(ae));
1054 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1055 	assertEqualInt(1, archive_entry_nlink(ae));
1056 	assertEqualInt(8, archive_entry_size(ae));
1057 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
1058 	assertEqualMem(buff2, "12345678", 8);
1059 
1060 	/*
1061 	 * Read "dir0/dir1/file2"
1062 	 */
1063 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1064 	assertEqualInt(5, archive_entry_atime(ae));
1065 	assertEqualInt(5, archive_entry_ctime(ae));
1066 	assertEqualInt(5, archive_entry_mtime(ae));
1067 	assertEqualString("DIR0/DIR1/FILE2", archive_entry_pathname(ae));
1068 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1069 	assertEqualInt(1, archive_entry_nlink(ae));
1070 	assertEqualInt(8, archive_entry_size(ae));
1071 	assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
1072 	assertEqualMem(buff2, "12345678", 8);
1073 
1074 	/*
1075 	 * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7" as file
1076 	 */
1077 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1078 	assertEqualInt(5, archive_entry_atime(ae));
1079 	assertEqualInt(5, archive_entry_ctime(ae));
1080 	assertEqualInt(5, archive_entry_mtime(ae));
1081 	assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5/DIR6/DIR7",
1082 	    archive_entry_pathname(ae));
1083 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1084 	assertEqualInt(0, archive_entry_size(ae));
1085 
1086 	/*
1087 	 * Read "symlnk"
1088 	 */
1089 	assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
1090 	assert(archive_entry_atime_is_set(ae));
1091 	assertEqualInt(5, archive_entry_atime(ae));
1092 	assert(!archive_entry_birthtime_is_set(ae));
1093 	assertEqualInt(0, archive_entry_birthtime(ae));
1094 	assert(archive_entry_ctime_is_set(ae));
1095 	assertEqualInt(5, archive_entry_ctime(ae));
1096 	assert(archive_entry_mtime_is_set(ae));
1097 	assertEqualInt(5, archive_entry_mtime(ae));
1098 	assertEqualString("SYMLNK", archive_entry_pathname(ae));
1099 	assert((AE_IFREG | 0400) == archive_entry_mode(ae));
1100 	assertEqualInt(0, archive_entry_size(ae));
1101 
1102 	/*
1103 	 * Verify the end of the archive.
1104 	 */
1105 	assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
1106 	assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
1107 	assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
1108 
1109 	free(buff);
1110 }
1111