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 29char buff2[64]; 30DEFINE_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} 938