]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libarchive/libarchive/test/test_write_format_iso9660.c
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / libarchive / libarchive / test / test_write_format_iso9660.c
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 }