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