]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libarchive/libarchive/test/test_write_format_iso9660.c
MFC r299529,r299540,r299576,r299896:
[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 < 10; i++) {
121                 dir[4] = '0' + 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         /*
138          * "dir0/dir1/file1" has 8 bytes of data.
139          */
140         assert((ae = archive_entry_new()) != NULL);
141         archive_entry_set_atime(ae, 2, 20);
142         archive_entry_set_birthtime(ae, 3, 30);
143         archive_entry_set_ctime(ae, 4, 40);
144         archive_entry_set_mtime(ae, 5, 50);
145         archive_entry_copy_pathname(ae, "dir0/dir1/file1");
146         archive_entry_set_mode(ae, AE_IFREG | 0755);
147         archive_entry_set_size(ae, 8);
148         archive_entry_set_nlink(ae, 1);
149         assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
150         archive_entry_free(ae);
151         assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
152
153         /*
154          * "dir0/dir1/file2" has 8 bytes of data.
155          */
156         assert((ae = archive_entry_new()) != NULL);
157         archive_entry_set_atime(ae, 2, 20);
158         archive_entry_set_birthtime(ae, 3, 30);
159         archive_entry_set_ctime(ae, 4, 40);
160         archive_entry_set_mtime(ae, 5, 50);
161         archive_entry_copy_pathname(ae, "dir0/dir1/file2");
162         archive_entry_set_mode(ae, AE_IFREG | 0755);
163         archive_entry_set_size(ae, 8);
164         archive_entry_set_nlink(ae, 1);
165         assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae));
166         archive_entry_free(ae);
167         assertEqualIntA(a, 8, archive_write_data(a, "12345678", 9));
168
169         /*
170          * Add a wrong path "dir0/dir1/file2/wrong"
171          */
172         assert((ae = archive_entry_new()) != NULL);
173         archive_entry_set_atime(ae, 2, 20);
174         archive_entry_set_birthtime(ae, 3, 30);
175         archive_entry_set_ctime(ae, 4, 40);
176         archive_entry_set_mtime(ae, 5, 50);
177         archive_entry_copy_pathname(ae, "dir0/dir1/file2/wrong");
178         archive_entry_set_mode(ae, AE_IFREG | 0755);
179         archive_entry_set_size(ae, 8);
180         archive_entry_set_nlink(ae, 1);
181         assertEqualIntA(a, ARCHIVE_FAILED, archive_write_header(a, ae));
182         archive_entry_free(ae);
183
184         /* Close out the archive. */
185         assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a));
186         assertEqualIntA(a, ARCHIVE_OK, archive_write_free(a));
187
188         /*
189          * -----------------------------------------------------------
190          * Now, read the data back(read Rockridge extensions).
191          * -----------------------------------------------------------
192          */
193         assert((a = archive_read_new()) != NULL);
194         assertEqualIntA(a, 0, archive_read_support_format_all(a));
195         assertEqualIntA(a, 0, archive_read_support_filter_all(a));
196         assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
197
198         /*
199          * Read Root Directory
200          */
201         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
202         assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
203         assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
204         assertEqualString(".", archive_entry_pathname(ae));
205         assert((S_IFDIR | 0555) == archive_entry_mode(ae));
206         assertEqualInt(2048, archive_entry_size(ae));
207
208         /*
209          * Read "dir0"
210          */
211         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
212         assertEqualInt(2, archive_entry_atime(ae));
213         assertEqualInt(3, archive_entry_birthtime(ae));
214         assertEqualInt(4, archive_entry_ctime(ae));
215         assertEqualInt(5, archive_entry_mtime(ae));
216         assertEqualString("dir0", 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/dir1"
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/dir1", 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/dir2"
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/dir2", 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/dir3"
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/dir3",
253             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/dir4"
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/dir4",
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/dir5"
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/dir5",
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/dir6"
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/dir6",
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/dir7"
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/dir7",
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/dir8"
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/dir8",
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/dir9"
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/dir9",
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 "hardlnk"
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("hardlnk", archive_entry_pathname(ae));
344         assert((AE_IFREG | 0555) == archive_entry_mode(ae));
345         assertEqualInt(2, archive_entry_nlink(ae));
346         assertEqualInt(8, archive_entry_size(ae));
347         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
348         assertEqualMem(buff2, "12345678", 8);
349
350         /*
351          * Read "file"
352          */
353         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
354         assertEqualInt(2, archive_entry_atime(ae));
355         assertEqualInt(3, archive_entry_birthtime(ae));
356         assertEqualInt(4, archive_entry_ctime(ae));
357         assertEqualInt(5, archive_entry_mtime(ae));
358         assertEqualString("file", archive_entry_pathname(ae));
359         assertEqualString("hardlnk", archive_entry_hardlink(ae));
360         assert((AE_IFREG | 0555) == archive_entry_mode(ae));
361         assertEqualInt(2, archive_entry_nlink(ae));
362         assertEqualInt(0, archive_entry_size(ae));
363
364         /*
365          * Read longname
366          */
367         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
368         assert(archive_entry_atime_is_set(ae));
369         assertEqualInt(2, archive_entry_atime(ae));
370         /* Birthtime > mtime above, so it doesn't get stored at all. */
371         assert(!archive_entry_birthtime_is_set(ae));
372         assertEqualInt(0, archive_entry_birthtime(ae));
373         assert(archive_entry_ctime_is_set(ae));
374         assertEqualInt(4, archive_entry_ctime(ae));
375         assert(archive_entry_mtime_is_set(ae));
376         assertEqualInt(5, archive_entry_mtime(ae));
377         assertEqualString(longname, archive_entry_pathname(ae));
378 #if !defined(_WIN32) && !defined(__CYGWIN__)
379         assert((AE_IFREG | 0444) == archive_entry_mode(ae));
380 #else
381         /* On Windows and CYGWIN, always set all exec bit ON by default. */ 
382         assert((AE_IFREG | 0555) == archive_entry_mode(ae));
383 #endif
384         assertEqualInt(8, archive_entry_size(ae));
385         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
386         assertEqualMem(buff2, "12345678", 8);
387
388         /*
389          * Read "dir0/dir1/file1"
390          */
391         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
392         assertEqualInt(2, archive_entry_atime(ae));
393         assertEqualInt(3, archive_entry_birthtime(ae));
394         assertEqualInt(4, archive_entry_ctime(ae));
395         assertEqualInt(5, archive_entry_mtime(ae));
396         assertEqualString("dir0/dir1/file1", archive_entry_pathname(ae));
397         assert((AE_IFREG | 0555) == archive_entry_mode(ae));
398         assertEqualInt(1, archive_entry_nlink(ae));
399         assertEqualInt(8, archive_entry_size(ae));
400         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
401         assertEqualMem(buff2, "12345678", 8);
402
403         /*
404          * Read "dir0/dir1/file2"
405          */
406         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
407         assertEqualInt(2, archive_entry_atime(ae));
408         assertEqualInt(3, archive_entry_birthtime(ae));
409         assertEqualInt(4, archive_entry_ctime(ae));
410         assertEqualInt(5, archive_entry_mtime(ae));
411         assertEqualString("dir0/dir1/file2", archive_entry_pathname(ae));
412         assert((AE_IFREG | 0555) == archive_entry_mode(ae));
413         assertEqualInt(1, archive_entry_nlink(ae));
414         assertEqualInt(8, archive_entry_size(ae));
415         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
416         assertEqualMem(buff2, "12345678", 8);
417
418         /*
419          * Read "symlnk"
420          */
421         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
422         assert(archive_entry_atime_is_set(ae));
423         assertEqualInt(2, archive_entry_atime(ae));
424         assert(!archive_entry_birthtime_is_set(ae));
425         assertEqualInt(0, archive_entry_birthtime(ae));
426         assert(archive_entry_ctime_is_set(ae));
427         assertEqualInt(4, archive_entry_ctime(ae));
428         assert(archive_entry_mtime_is_set(ae));
429         assertEqualInt(5, archive_entry_mtime(ae));
430         assertEqualString("symlnk", archive_entry_pathname(ae));
431         assert((AE_IFLNK | 0555) == archive_entry_mode(ae));
432         assertEqualString(longname, archive_entry_symlink(ae));
433
434         /*
435          * Verify the end of the archive.
436          */
437         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
438         assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
439         assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
440
441         /*
442          * -----------------------------------------------------------
443          * Now, read the data back without Rockridge option
444          * (read Joliet extensions).
445          * -----------------------------------------------------------
446          */
447         assert((a = archive_read_new()) != NULL);
448         assertEqualIntA(a, 0, archive_read_support_format_all(a));
449         assertEqualIntA(a, 0, archive_read_support_filter_all(a));
450         /* Disable Rockridge extensions support. */
451         assertEqualInt(ARCHIVE_OK,
452             archive_read_set_option(a, NULL, "rockridge", NULL));
453         assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
454
455         /*
456          * Read Root Directory
457          */
458         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
459         assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
460         assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
461         assertEqualString(".", archive_entry_pathname(ae));
462         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
463         assertEqualInt(2048, archive_entry_size(ae));
464
465         /*
466          * Read "dir0"
467          */
468         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
469         assertEqualInt(5, archive_entry_atime(ae));
470         assertEqualInt(5, archive_entry_ctime(ae));
471         assertEqualInt(5, archive_entry_mtime(ae));
472         assertEqualString("dir0", archive_entry_pathname(ae));
473         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
474         assertEqualInt(2048, archive_entry_size(ae));
475
476         /*
477          * Read "dir0/dir1"
478          */
479         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
480         assertEqualInt(5, archive_entry_atime(ae));
481         assertEqualInt(5, archive_entry_ctime(ae));
482         assertEqualInt(5, archive_entry_mtime(ae));
483         assertEqualString("dir0/dir1", archive_entry_pathname(ae));
484         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
485         assertEqualInt(2048, archive_entry_size(ae));
486
487         /*
488          * Read "dir0/dir1/dir2"
489          */
490         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
491         assertEqualInt(5, archive_entry_atime(ae));
492         assertEqualInt(5, archive_entry_ctime(ae));
493         assertEqualInt(5, archive_entry_mtime(ae));
494         assertEqualString("dir0/dir1/dir2", archive_entry_pathname(ae));
495         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
496         assertEqualInt(2048, archive_entry_size(ae));
497
498         /*
499          * Read "dir0/dir1/dir2/dir3"
500          */
501         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
502         assertEqualInt(5, archive_entry_atime(ae));
503         assertEqualInt(5, archive_entry_ctime(ae));
504         assertEqualInt(5, archive_entry_mtime(ae));
505         assertEqualString("dir0/dir1/dir2/dir3",
506             archive_entry_pathname(ae));
507         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
508         assertEqualInt(2048, archive_entry_size(ae));
509
510         /*
511          * Read "dir0/dir1/dir2/dir3/dir4"
512          */
513         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
514         assertEqualInt(5, archive_entry_atime(ae));
515         assertEqualInt(5, archive_entry_ctime(ae));
516         assertEqualInt(5, archive_entry_mtime(ae));
517         assertEqualString("dir0/dir1/dir2/dir3/dir4",
518             archive_entry_pathname(ae));
519         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
520         assertEqualInt(2048, archive_entry_size(ae));
521
522         /*
523          * Read "dir0/dir1/dir2/dir3/dir4/dir5"
524          */
525         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
526         assertEqualInt(5, archive_entry_atime(ae));
527         assertEqualInt(5, archive_entry_ctime(ae));
528         assertEqualInt(5, archive_entry_mtime(ae));
529         assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5",
530             archive_entry_pathname(ae));
531         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
532         assertEqualInt(2048, archive_entry_size(ae));
533
534         /*
535          * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
536          */
537         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
538         assertEqualInt(5, archive_entry_atime(ae));
539         assertEqualInt(5, archive_entry_ctime(ae));
540         assertEqualInt(5, archive_entry_mtime(ae));
541         assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6",
542             archive_entry_pathname(ae));
543         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
544         assertEqualInt(2048, archive_entry_size(ae));
545
546         /*
547          * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7"
548          */
549         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
550         assertEqualInt(5, archive_entry_atime(ae));
551         assertEqualInt(5, archive_entry_ctime(ae));
552         assertEqualInt(5, archive_entry_mtime(ae));
553         assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7",
554             archive_entry_pathname(ae));
555         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
556         assertEqualInt(2048, archive_entry_size(ae));
557
558         /*
559          * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8"
560          */
561         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
562         assertEqualInt(5, archive_entry_atime(ae));
563         assertEqualInt(5, archive_entry_ctime(ae));
564         assertEqualInt(5, archive_entry_mtime(ae));
565         assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8",
566             archive_entry_pathname(ae));
567         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
568         assertEqualInt(2048, archive_entry_size(ae));
569
570         /*
571          * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9"
572          */
573         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
574         assertEqualInt(5, archive_entry_atime(ae));
575         assertEqualInt(5, archive_entry_ctime(ae));
576         assertEqualInt(5, archive_entry_mtime(ae));
577         assertEqualString("dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7/dir8/dir9",
578             archive_entry_pathname(ae));
579         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
580         assertEqualInt(2048, archive_entry_size(ae));
581
582         /*
583          * Read "hardlnk"
584          */
585         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
586         assertEqualInt(5, archive_entry_atime(ae));
587         assertEqualInt(5, archive_entry_ctime(ae));
588         assertEqualInt(5, archive_entry_mtime(ae));
589         assertEqualString("hardlnk", archive_entry_pathname(ae));
590         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
591         assertEqualInt(2, archive_entry_nlink(ae));
592         assertEqualInt(8, archive_entry_size(ae));
593         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
594         assertEqualMem(buff2, "12345678", 8);
595
596         /*
597          * Read "file"
598          */
599         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
600         assertEqualInt(5, archive_entry_atime(ae));
601         assertEqualInt(5, archive_entry_ctime(ae));
602         assertEqualInt(5, archive_entry_mtime(ae));
603         assertEqualString("file", archive_entry_pathname(ae));
604         assertEqualString("hardlnk", archive_entry_hardlink(ae));
605         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
606         assertEqualInt(0, archive_entry_size(ae));
607         assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
608
609         /*
610          * Read longname
611          */
612         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
613         assert(archive_entry_atime_is_set(ae));
614         assertEqualInt(5, archive_entry_atime(ae));
615         assert(archive_entry_ctime_is_set(ae));
616         assertEqualInt(5, archive_entry_ctime(ae));
617         assert(archive_entry_mtime_is_set(ae));
618         assertEqualInt(5, archive_entry_mtime(ae));
619         /* Trim lngname to 64 characters. */
620         longname[64] = '\0';
621         assertEqualString(longname, archive_entry_pathname(ae));
622         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
623         assertEqualInt(8, archive_entry_size(ae));
624         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
625         assertEqualMem(buff2, "12345678", 8);
626
627         /*
628          * Read "dir0/dir1/file1"
629          */
630         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
631         assertEqualInt(5, archive_entry_atime(ae));
632         assertEqualInt(5, archive_entry_ctime(ae));
633         assertEqualInt(5, archive_entry_mtime(ae));
634         assertEqualString("dir0/dir1/file1", archive_entry_pathname(ae));
635         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
636         assertEqualInt(1, archive_entry_nlink(ae));
637         assertEqualInt(8, archive_entry_size(ae));
638         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
639         assertEqualMem(buff2, "12345678", 8);
640
641         /*
642          * Read "dir0/dir1/file2"
643          */
644         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
645         assertEqualInt(5, archive_entry_atime(ae));
646         assertEqualInt(5, archive_entry_ctime(ae));
647         assertEqualInt(5, archive_entry_mtime(ae));
648         assertEqualString("dir0/dir1/file2", archive_entry_pathname(ae));
649         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
650         assertEqualInt(1, archive_entry_nlink(ae));
651         assertEqualInt(8, archive_entry_size(ae));
652         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
653         assertEqualMem(buff2, "12345678", 8);
654
655         /*
656          * Read "symlnk"
657          */
658         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
659         assert(archive_entry_atime_is_set(ae));
660         assertEqualInt(5, archive_entry_atime(ae));
661         assert(!archive_entry_birthtime_is_set(ae));
662         assertEqualInt(0, archive_entry_birthtime(ae));
663         assert(archive_entry_ctime_is_set(ae));
664         assertEqualInt(5, archive_entry_ctime(ae));
665         assert(archive_entry_mtime_is_set(ae));
666         assertEqualInt(5, archive_entry_mtime(ae));
667         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
668         assertEqualInt(0, archive_entry_size(ae));
669
670         /*
671          * Verify the end of the archive.
672          */
673         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
674         assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
675         assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
676
677         /*
678          * -----------------------------------------------------------
679          * Now, read the data back without Rockridge and Joliet option
680          * (read ISO9660).
681          * This mode appears rr_moved directory.
682          * -----------------------------------------------------------
683          */
684         assert((a = archive_read_new()) != NULL);
685         assertEqualIntA(a, 0, archive_read_support_format_all(a));
686         assertEqualIntA(a, 0, archive_read_support_filter_all(a));
687         /* Disable Rockridge and Joliet extensions support. */
688         assertEqualInt(ARCHIVE_OK,
689             archive_read_set_option(a, NULL, "rockridge", NULL));
690         assertEqualInt(ARCHIVE_OK,
691             archive_read_set_option(a, NULL, "joliet", NULL));
692         assertEqualIntA(a, 0, archive_read_open_memory(a, buff, used));
693
694         /*
695          * Read Root Directory
696          */
697         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
698         assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
699         assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
700         assertEqualString(".", archive_entry_pathname(ae));
701         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
702         assertEqualInt(2048, archive_entry_size(ae));
703
704         /*
705          * Read "rr_moved"
706          */
707         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
708         assertEqualInt(archive_entry_atime(ae), archive_entry_ctime(ae));
709         assertEqualInt(archive_entry_atime(ae), archive_entry_mtime(ae));
710         assertEqualString("RR_MOVED", archive_entry_pathname(ae));
711         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
712         assertEqualInt(2048, archive_entry_size(ae));
713
714         /*
715          * Read "rr_moved/dir7"
716          */
717         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
718         assertEqualInt(5, archive_entry_atime(ae));
719         assertEqualInt(5, archive_entry_ctime(ae));
720         assertEqualInt(5, archive_entry_mtime(ae));
721         assertEqualString("RR_MOVED/DIR7", archive_entry_pathname(ae));
722         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
723         assertEqualInt(2048, archive_entry_size(ae));
724
725         /*
726          * Read "rr_moved/dir7/dir8"
727          */
728         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
729         assertEqualInt(5, archive_entry_atime(ae));
730         assertEqualInt(5, archive_entry_ctime(ae));
731         assertEqualInt(5, archive_entry_mtime(ae));
732         assertEqualString("RR_MOVED/DIR7/DIR8", archive_entry_pathname(ae));
733         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
734         assertEqualInt(2048, archive_entry_size(ae));
735
736         /*
737          * Read "rr_moved/dir7/dir8/dir9"
738          */
739         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
740         assertEqualInt(5, archive_entry_atime(ae));
741         assertEqualInt(5, archive_entry_ctime(ae));
742         assertEqualInt(5, archive_entry_mtime(ae));
743         assertEqualString("RR_MOVED/DIR7/DIR8/DIR9",
744             archive_entry_pathname(ae));
745         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
746         assertEqualInt(2048, archive_entry_size(ae));
747
748         /*
749          * Read "dir0"
750          */
751         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
752         assertEqualInt(5, archive_entry_atime(ae));
753         assertEqualInt(5, archive_entry_ctime(ae));
754         assertEqualInt(5, archive_entry_mtime(ae));
755         assertEqualString("DIR0", archive_entry_pathname(ae));
756         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
757         assertEqualInt(2048, archive_entry_size(ae));
758
759         /*
760          * Read "dir0/dir1"
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", archive_entry_pathname(ae));
767         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
768         assertEqualInt(2048, archive_entry_size(ae));
769
770         /*
771          * Read "dir0/dir1/dir2"
772          */
773         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
774         assertEqualInt(5, archive_entry_atime(ae));
775         assertEqualInt(5, archive_entry_ctime(ae));
776         assertEqualInt(5, archive_entry_mtime(ae));
777         assertEqualString("DIR0/DIR1/DIR2", archive_entry_pathname(ae));
778         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
779         assertEqualInt(2048, archive_entry_size(ae));
780
781         /*
782          * Read "dir0/dir1/dir2/dir3"
783          */
784         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
785         assertEqualInt(5, archive_entry_atime(ae));
786         assertEqualInt(5, archive_entry_ctime(ae));
787         assertEqualInt(5, archive_entry_mtime(ae));
788         assertEqualString("DIR0/DIR1/DIR2/DIR3",
789             archive_entry_pathname(ae));
790         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
791         assertEqualInt(2048, archive_entry_size(ae));
792
793         /*
794          * Read "dir0/dir1/dir2/dir3/dir4"
795          */
796         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
797         assertEqualInt(5, archive_entry_atime(ae));
798         assertEqualInt(5, archive_entry_ctime(ae));
799         assertEqualInt(5, archive_entry_mtime(ae));
800         assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4",
801             archive_entry_pathname(ae));
802         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
803         assertEqualInt(2048, archive_entry_size(ae));
804
805         /*
806          * Read "dir0/dir1/dir2/dir3/dir4/dir5"
807          */
808         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
809         assertEqualInt(5, archive_entry_atime(ae));
810         assertEqualInt(5, archive_entry_ctime(ae));
811         assertEqualInt(5, archive_entry_mtime(ae));
812         assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5",
813             archive_entry_pathname(ae));
814         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
815         assertEqualInt(2048, archive_entry_size(ae));
816
817         /*
818          * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6"
819          */
820         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
821         assertEqualInt(5, archive_entry_atime(ae));
822         assertEqualInt(5, archive_entry_ctime(ae));
823         assertEqualInt(5, archive_entry_mtime(ae));
824         assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5/DIR6",
825             archive_entry_pathname(ae));
826         assert((S_IFDIR | 0700) == archive_entry_mode(ae));
827         assertEqualInt(2048, archive_entry_size(ae));
828
829         /*
830          * Read "file"
831          */
832         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
833         assertEqualInt(5, archive_entry_atime(ae));
834         assertEqualInt(0, archive_entry_birthtime(ae));
835         assertEqualInt(5, archive_entry_ctime(ae));
836         assertEqualInt(5, archive_entry_mtime(ae));
837         assertEqualString("FILE", archive_entry_pathname(ae));
838         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
839         assertEqualInt(2, archive_entry_nlink(ae));
840         assertEqualInt(8, archive_entry_size(ae));
841         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
842         assertEqualMem(buff2, "12345678", 8);
843
844         /*
845          * Read "hardlink"
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("HARDLNK", archive_entry_pathname(ae));
852         assertEqualString("FILE", archive_entry_hardlink(ae));
853         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
854         assertEqualInt(0, archive_entry_size(ae));
855         assertEqualIntA(a, 0, archive_read_data(a, buff2, 10));
856
857         /*
858          * Read longname
859          */
860         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
861         assert(archive_entry_atime_is_set(ae));
862         assertEqualInt(5, archive_entry_atime(ae));
863         assert(archive_entry_ctime_is_set(ae));
864         assertEqualInt(5, archive_entry_ctime(ae));
865         assert(archive_entry_mtime_is_set(ae));
866         assertEqualInt(5, archive_entry_mtime(ae));
867         assertEqualString("LONGNAME", archive_entry_pathname(ae));
868         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
869         assertEqualInt(8, archive_entry_size(ae));
870         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
871         assertEqualMem(buff2, "12345678", 8);
872
873         /*
874          * Read "dir0/dir1/file1"
875          */
876         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
877         assertEqualInt(5, archive_entry_atime(ae));
878         assertEqualInt(5, archive_entry_ctime(ae));
879         assertEqualInt(5, archive_entry_mtime(ae));
880         assertEqualString("DIR0/DIR1/FILE1", archive_entry_pathname(ae));
881         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
882         assertEqualInt(1, archive_entry_nlink(ae));
883         assertEqualInt(8, archive_entry_size(ae));
884         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
885         assertEqualMem(buff2, "12345678", 8);
886
887         /*
888          * Read "dir0/dir1/file2"
889          */
890         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
891         assertEqualInt(5, archive_entry_atime(ae));
892         assertEqualInt(5, archive_entry_ctime(ae));
893         assertEqualInt(5, archive_entry_mtime(ae));
894         assertEqualString("DIR0/DIR1/FILE2", archive_entry_pathname(ae));
895         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
896         assertEqualInt(1, archive_entry_nlink(ae));
897         assertEqualInt(8, archive_entry_size(ae));
898         assertEqualIntA(a, 8, archive_read_data(a, buff2, 10));
899         assertEqualMem(buff2, "12345678", 8);
900
901         /*
902          * Read "dir0/dir1/dir2/dir3/dir4/dir5/dir6/dir7" as file
903          */
904         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
905         assertEqualInt(5, archive_entry_atime(ae));
906         assertEqualInt(5, archive_entry_ctime(ae));
907         assertEqualInt(5, archive_entry_mtime(ae));
908         assertEqualString("DIR0/DIR1/DIR2/DIR3/DIR4/DIR5/DIR6/DIR7",
909             archive_entry_pathname(ae));
910         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
911         assertEqualInt(0, archive_entry_size(ae));
912
913         /*
914          * Read "symlnk"
915          */
916         assertEqualIntA(a, 0, archive_read_next_header(a, &ae));
917         assert(archive_entry_atime_is_set(ae));
918         assertEqualInt(5, archive_entry_atime(ae));
919         assert(!archive_entry_birthtime_is_set(ae));
920         assertEqualInt(0, archive_entry_birthtime(ae));
921         assert(archive_entry_ctime_is_set(ae));
922         assertEqualInt(5, archive_entry_ctime(ae));
923         assert(archive_entry_mtime_is_set(ae));
924         assertEqualInt(5, archive_entry_mtime(ae));
925         assertEqualString("SYMLNK", archive_entry_pathname(ae));
926         assert((AE_IFREG | 0400) == archive_entry_mode(ae));
927         assertEqualInt(0, archive_entry_size(ae));
928
929         /*
930          * Verify the end of the archive.
931          */
932         assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
933         assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
934         assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a));
935
936         free(buff);
937 }