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