1/*- 2 * Copyright (c) 2003-2007 Tim Kientzle 3 * Copyright (c) 2011-2012 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 28static void 29test_read_format_mtree1(void) 30{ 31 const char reffile[] = "test_read_format_mtree.mtree"; 32 char buff[16]; 33 struct archive_entry *ae; 34 struct archive *a; 35 FILE *f; 36 /* Compute max 64-bit signed twos-complement value 37 * without relying on overflow. This assumes that long long 38 * is at least 64 bits. */ 39 static const long long max_int64 = ((((long long)1) << 62) - 1) + (((long long)1) << 62); 40 time_t min_time; 41 volatile time_t t; 42 43 extract_reference_file(reffile); 44 45 /* 46 * An access error occurred on some platform when mtree 47 * format handling open a directory. It is for through 48 * the routine which open a directory that we create 49 * "dir" and "dir2" directories. 50 */ 51 assertMakeDir("dir", 0775); 52 assertMakeDir("dir2", 0775); 53 54 assert((a = archive_read_new()) != NULL); 55 assertEqualIntA(a, ARCHIVE_OK, 56 archive_read_support_filter_all(a)); 57 assertEqualIntA(a, ARCHIVE_OK, 58 archive_read_support_format_all(a)); 59 assertEqualIntA(a, ARCHIVE_OK, 60 archive_read_set_options(a, "mtree:checkfs")); 61 assertEqualIntA(a, ARCHIVE_OK, 62 archive_read_open_filename(a, reffile, 11)); 63 64 /* 65 * Read "file", whose data is available on disk. 66 */ 67 f = fopen("file", "wb"); 68 assert(f != NULL); 69 assertEqualInt(3, fwrite("hi\n", 1, 3, f)); 70 fclose(f); 71 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 72 assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 73 assertEqualString(archive_entry_pathname(ae), "file"); 74 assertEqualInt(archive_entry_uid(ae), 18); 75 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 76 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); 77 assertEqualInt(archive_entry_size(ae), 3); 78 assertEqualInt(3, archive_read_data(a, buff, 3)); 79 assertEqualMem(buff, "hi\n", 3); 80 assertEqualInt(archive_entry_is_encrypted(ae), 0); 81 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 82 83 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 84 assertEqualString(archive_entry_pathname(ae), "dir"); 85 assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 86 assertEqualInt(archive_entry_is_encrypted(ae), 0); 87 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 88 89 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 90 assertEqualString(archive_entry_pathname(ae), "dir/file with space"); 91 assertEqualInt(archive_entry_is_encrypted(ae), 0); 92 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 93 94 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 95 assertEqualString(archive_entry_pathname(ae), "file with space"); 96 assertEqualInt(archive_entry_is_encrypted(ae), 0); 97 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 98 99 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 100 assertEqualString(archive_entry_pathname(ae), "dir2"); 101 assertEqualInt(archive_entry_is_encrypted(ae), 0); 102 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 103 104 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 105 assertEqualString(archive_entry_pathname(ae), "dir2/dir3a"); 106 assertEqualInt(archive_entry_is_encrypted(ae), 0); 107 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 108 109 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 110 assertEqualString(archive_entry_pathname(ae), "dir2/dir3a/indir3a"); 111 assertEqualInt(archive_entry_is_encrypted(ae), 0); 112 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 113 114 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 115 assertEqualString(archive_entry_pathname(ae), "dir2/fullindir2"); 116 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 117 assertEqualInt(archive_entry_is_encrypted(ae), 0); 118 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 119 120 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 121 assertEqualString(archive_entry_pathname(ae), "dir2/indir2"); 122 assertEqualInt(archive_entry_is_encrypted(ae), 0); 123 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 124 125 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 126 assertEqualString(archive_entry_pathname(ae), "dir2/dir3b"); 127 assertEqualInt(archive_entry_is_encrypted(ae), 0); 128 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 129 130 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 131 assertEqualString(archive_entry_pathname(ae), "dir2/dir3b/indir3b"); 132 assertEqualInt(archive_entry_is_encrypted(ae), 0); 133 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 134 135 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 136 assertEqualString(archive_entry_pathname(ae), "dir2/dir3b/filename\\with_esc\b\t\fapes"); 137 assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 138 assertEqualInt(archive_entry_is_encrypted(ae), 0); 139 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 140 141 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 142 assertEqualString(archive_entry_pathname(ae), "notindir"); 143 assertEqualInt(archive_entry_is_encrypted(ae), 0); 144 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 145 146 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 147 assertEqualString(archive_entry_pathname(ae), "dir2/emptyfile"); 148 assertEqualInt(archive_entry_size(ae), 0); 149 assertEqualInt(archive_entry_is_encrypted(ae), 0); 150 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 151 152 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 153 assertEqualString(archive_entry_pathname(ae), "dir2/smallfile"); 154 assertEqualInt(archive_entry_size(ae), 1); 155 assertEqualInt(archive_entry_is_encrypted(ae), 0); 156 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 157 158 /* TODO: Mtree reader should probably return ARCHIVE_WARN for this. */ 159 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 160 assertEqualString(archive_entry_pathname(ae), "dir2/toosmallfile"); 161 assertEqualInt(archive_entry_size(ae), -1); 162 assertEqualInt(archive_entry_is_encrypted(ae), 0); 163 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 164 165 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 166 assertEqualString(archive_entry_pathname(ae), "dir2/bigfile"); 167 assertEqualInt(archive_entry_size(ae), max_int64); 168 assertEqualInt(archive_entry_is_encrypted(ae), 0); 169 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 170 171 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 172 assertEqualString(archive_entry_pathname(ae), "dir2/toobigfile"); 173 /* Size in mtree is max_int64 + 1; should return max_int64. */ 174 assertEqualInt(archive_entry_size(ae), max_int64); 175 assertEqualInt(archive_entry_is_encrypted(ae), 0); 176 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 177 178 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 179 assertEqualString(archive_entry_pathname(ae), "dir2/veryoldfile"); 180 /* The value in the file is MIN_INT64_T, but time_t may be narrower. */ 181 /* Verify min_time is the smallest possible time_t. */ 182 min_time = archive_entry_mtime(ae); 183 assert(min_time <= 0); 184 /* Simply asserting min_time - 1 > 0 breaks with some compiler optimizations. */ 185 t = (time_t)((uintmax_t)min_time - 1); 186 assert(t > 0); 187 assertEqualInt(archive_entry_is_encrypted(ae), 0); 188 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 189 190 /* toooldfile is 1 sec older, which should overflow and get returned 191 * with the same value. */ 192 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 193 assertEqualString(archive_entry_pathname(ae), "dir2/toooldfile"); 194 assertEqualInt(archive_entry_mtime(ae), min_time); 195 assertEqualInt(archive_entry_is_encrypted(ae), 0); 196 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 197 198 /* md5digest */ 199 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 200 assertEqualString(archive_entry_pathname(ae), "dir2/md5file"); 201 assertEqualMem(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_MD5), 202 "\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\x09\x98\xec\xf8\x42\x7e", 203 16); 204 205 /* rmd160digest */ 206 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 207 assertEqualString(archive_entry_pathname(ae), "dir2/rmd160file"); 208 assertEqualMem(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_RMD160), 209 "\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55\xbf\xef\x95\x60\x18\x90" 210 "\xaf\xd8\x07\x09", 20); 211 212 /* sha1digest */ 213 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 214 assertEqualString(archive_entry_pathname(ae), "dir2/sha1file"); 215 assertEqualMem(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_SHA1), 216 "\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55\xbf\xef\x95\x60\x18\x90" 217 "\xaf\xd8\x07\x09", 20); 218 219 /* sha256digest */ 220 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 221 assertEqualString(archive_entry_pathname(ae), "dir2/sha256file"); 222 assertEqualMem(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_SHA256), 223 "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24" 224 "\x27\xae\x41\xe4\x64\x9b\x93\x4c\xa4\x95\x99\x1b\x78\x52\xb8\x55", 225 32); 226 227 /* sha384digest */ 228 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 229 assertEqualString(archive_entry_pathname(ae), "dir2/sha384file"); 230 assertEqualMem(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_SHA384), 231 "\x38\xb0\x60\xa7\x51\xac\x96\x38\x4c\xd9\x32\x7e\xb1\xb1\xe3\x6a" 232 "\x21\xfd\xb7\x11\x14\xbe\x07\x43\x4c\x0c\xc7\xbf\x63\xf6\xe1\xda" 233 "\x27\x4e\xde\xbf\xe7\x6f\x65\xfb\xd5\x1a\xd2\xf1\x48\x98\xb9\x5b", 234 48); 235 236 /* sha512digest */ 237 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 238 assertEqualString(archive_entry_pathname(ae), "dir2/sha512file"); 239 assertEqualMem(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_SHA512), 240 "\xcf\x83\xe1\x35\x7e\xef\xb8\xbd\xf1\x54\x28\x50\xd6\x6d\x80\x07" 241 "\xd6\x20\xe4\x05\x0b\x57\x15\xdc\x83\xf4\xa9\x21\xd3\x6c\xe9\xce" 242 "\x47\xd0\xd1\x3c\x5d\x85\xf2\xb0\xff\x83\x18\xd2\x87\x7e\xec\x2f" 243 "\x63\xb9\x31\xbd\x47\x41\x7a\x81\xa5\x38\x32\x7a\xf9\x27\xda\x3e", 244 64); 245 246 /* md5 digest is too short */ 247 assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); 248 assertEqualString(archive_entry_pathname(ae), "dir2/md5tooshort"); 249 assertMemoryFilledWith(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_MD5), 250 16, 0x00); 251 252 /* md5 digest is too long */ 253 assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); 254 assertEqualString(archive_entry_pathname(ae), "dir2/md5toolong"); 255 assertMemoryFilledWith(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_MD5), 256 16, 0x00); 257 258 /* md5 digest is uppercase hex */ 259 assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); 260 assertEqualString(archive_entry_pathname(ae), "dir2/md5caphex"); 261 assertMemoryFilledWith(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_MD5), 262 16, 0x00); 263 264 /* md5 digest is not hex */ 265 assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); 266 assertEqualString(archive_entry_pathname(ae), "dir2/md5nothex"); 267 assertMemoryFilledWith(archive_entry_digest(ae, ARCHIVE_ENTRY_DIGEST_MD5), 268 16, 0x00); 269 270 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 271 assertEqualInt(30, archive_file_count(a)); 272 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 273 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 274} 275 276static void 277test_read_format_mtree2(void) 278{ 279 static char archive[] = 280 "#mtree\n" 281 "d type=dir content=.\n"; 282 struct archive_entry *ae; 283 struct archive *a; 284 285 assert((a = archive_read_new()) != NULL); 286 assertEqualIntA(a, ARCHIVE_OK, 287 archive_read_support_filter_all(a)); 288 assertEqualIntA(a, ARCHIVE_OK, 289 archive_read_support_format_all(a)); 290 assertEqualIntA(a, ARCHIVE_OK, 291 archive_read_set_options(a, "mtree:checkfs")); 292 assertEqualIntA(a, ARCHIVE_OK, 293 archive_read_open_memory(a, archive, sizeof(archive))); 294 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 295 assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 296 assertEqualString(archive_entry_pathname(ae), "d"); 297 assertEqualInt(archive_entry_filetype(ae), AE_IFDIR); 298 assertEqualInt(archive_entry_is_encrypted(ae), 0); 299 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 300 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 301 assertEqualInt(1, archive_file_count(a)); 302 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 303 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 304} 305 306/* 307 * Reported to libarchive.googlecode.com as Issue 121. 308 */ 309static void 310test_read_format_mtree3(void) 311{ 312 static char archive[] = 313 "#mtree\n" 314 "a type=file contents=file\n" 315 "b type=link link=a\n" 316 "c type=file contents=file\n"; 317 struct archive_entry *ae; 318 struct archive *a; 319 320 assertMakeDir("mtree3", 0777); 321 assertChdir("mtree3"); 322 assertMakeFile("file", 0644, "file contents"); 323 324 assert((a = archive_read_new()) != NULL); 325 assertEqualIntA(a, ARCHIVE_OK, 326 archive_read_support_filter_all(a)); 327 assertEqualIntA(a, ARCHIVE_OK, 328 archive_read_support_format_all(a)); 329 assertEqualIntA(a, ARCHIVE_OK, 330 archive_read_set_options(a, "mtree:checkfs")); 331 assertEqualIntA(a, ARCHIVE_OK, 332 archive_read_open_memory(a, archive, sizeof(archive))); 333 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 334 assertEqualString(archive_entry_pathname(ae), "a"); 335 assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 336 assertEqualInt(archive_entry_is_encrypted(ae), 0); 337 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 338 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 339 assertEqualString(archive_entry_pathname(ae), "b"); 340 assertEqualInt(archive_entry_filetype(ae), AE_IFLNK); 341 assertEqualInt(archive_entry_is_encrypted(ae), 0); 342 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 343 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 344 assertEqualString(archive_entry_pathname(ae), "c"); 345 assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 346 assertEqualInt(archive_entry_is_encrypted(ae), 0); 347 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 348 349 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 350 assertEqualInt(3, archive_file_count(a)); 351 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 352 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 353 354 assertChdir(".."); 355} 356 357DEFINE_TEST(test_read_format_mtree) 358{ 359 test_read_format_mtree1(); 360 test_read_format_mtree2(); 361 test_read_format_mtree3(); 362} 363 364DEFINE_TEST(test_read_format_mtree_filenames_only) 365{ 366 static char archive[] = 367 "/set type=file mode=0644\n" 368 "./a\n" 369 "./b\n" 370 "./c\n" 371 "./d\n" 372 "./e\n" 373 "./f mode=0444\n"; 374 struct archive_entry *ae; 375 struct archive *a; 376 377 assertMakeFile("file", 0644, "file contents"); 378 379 assert((a = archive_read_new()) != NULL); 380 assertEqualIntA(a, ARCHIVE_OK, 381 archive_read_support_filter_all(a)); 382 assertEqualIntA(a, ARCHIVE_OK, 383 archive_read_support_format_all(a)); 384 assertEqualIntA(a, ARCHIVE_OK, 385 archive_read_set_options(a, "mtree:checkfs")); 386 assertEqualIntA(a, ARCHIVE_OK, 387 archive_read_open_memory(a, archive, sizeof(archive))); 388 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 389 assertEqualString(archive_entry_pathname(ae), "./a"); 390 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 391 assertEqualInt(archive_entry_is_encrypted(ae), 0); 392 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 393 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 394 assertEqualString(archive_entry_pathname(ae), "./b"); 395 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 396 assertEqualInt(archive_entry_is_encrypted(ae), 0); 397 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 398 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 399 assertEqualString(archive_entry_pathname(ae), "./c"); 400 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 401 assertEqualInt(archive_entry_is_encrypted(ae), 0); 402 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 403 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 404 assertEqualString(archive_entry_pathname(ae), "./d"); 405 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 406 assertEqualInt(archive_entry_is_encrypted(ae), 0); 407 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 408 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 409 assertEqualString(archive_entry_pathname(ae), "./e"); 410 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 411 assertEqualInt(archive_entry_is_encrypted(ae), 0); 412 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 413 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 414 assertEqualString(archive_entry_pathname(ae), "./f"); 415 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0444); 416 assertEqualInt(archive_entry_is_encrypted(ae), 0); 417 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 418 419 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 420 assertEqualInt(6, archive_file_count(a)); 421 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 422 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 423} 424 425DEFINE_TEST(test_read_format_mtree_nochange) 426{ 427 static char archive[] = 428 "#mtree\n" 429 "./a type=file mode=0644 time=123\n" 430 "./b type=file mode=0644 time=234\n" 431 "./c type=file mode=0644 time=345\n"; 432 static char archive2[] = 433 "#mtree\n" 434 "./a type=file mode=0644 time=123 nochange\n" 435 "./b type=file mode=0644 time=234\n" 436 "./c type=file mode=0644 time=345 nochange\n"; 437 struct archive_entry *ae; 438 struct archive *a; 439 440 assertMakeFile("a", 0640, "12345"); 441 assertMakeFile("b", 0664, "123456"); 442 assertMakeFile("c", 0755, "1234567"); 443 444 /* 445 * Test 1. Read a mtree archive without `nochange' keyword. 446 */ 447 assert((a = archive_read_new()) != NULL); 448 assertEqualIntA(a, ARCHIVE_OK, 449 archive_read_support_filter_all(a)); 450 assertEqualIntA(a, ARCHIVE_OK, 451 archive_read_support_format_all(a)); 452 assertEqualIntA(a, ARCHIVE_OK, 453 archive_read_set_options(a, "mtree:checkfs")); 454 assertEqualIntA(a, ARCHIVE_OK, 455 archive_read_open_memory(a, archive, sizeof(archive))); 456 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 457 assertEqualString(archive_entry_pathname(ae), "./a"); 458 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 459 assertEqualInt(archive_entry_mtime(ae), 123); 460 assertEqualInt(archive_entry_size(ae), 5); 461 assertEqualInt(archive_entry_is_encrypted(ae), 0); 462 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 463 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 464 assertEqualString(archive_entry_pathname(ae), "./b"); 465 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 466 assertEqualInt(archive_entry_mtime(ae), 234); 467 assertEqualInt(archive_entry_size(ae), 6); 468 assertEqualInt(archive_entry_is_encrypted(ae), 0); 469 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 470 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 471 assertEqualString(archive_entry_pathname(ae), "./c"); 472 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 473 assertEqualInt(archive_entry_mtime(ae), 345); 474 assertEqualInt(archive_entry_size(ae), 7); 475 assertEqualInt(archive_entry_is_encrypted(ae), 0); 476 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 477 478 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 479 assertEqualInt(3, archive_file_count(a)); 480 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 481 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 482 483 /* 484 * Test 2. Read a mtree archive with `nochange' keyword. 485 */ 486 assert((a = archive_read_new()) != NULL); 487 assertEqualIntA(a, ARCHIVE_OK, 488 archive_read_support_filter_all(a)); 489 assertEqualIntA(a, ARCHIVE_OK, 490 archive_read_support_format_all(a)); 491 assertEqualIntA(a, ARCHIVE_OK, 492 archive_read_set_options(a, "mtree:checkfs")); 493 assertEqualIntA(a, ARCHIVE_OK, 494 archive_read_open_memory(a, archive2, sizeof(archive2))); 495 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 496 assertEqualString(archive_entry_pathname(ae), "./a"); 497#if !defined(_WIN32) || defined(__CYGWIN__) 498 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0640); 499#endif 500 assert(archive_entry_mtime(ae) != 123); 501 assertEqualInt(archive_entry_size(ae), 5); 502 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 503 assertEqualString(archive_entry_pathname(ae), "./b"); 504 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 505 assertEqualInt(archive_entry_mtime(ae), 234); 506 assertEqualInt(archive_entry_size(ae), 6); 507 assertEqualInt(archive_entry_is_encrypted(ae), 0); 508 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 509 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 510 assertEqualString(archive_entry_pathname(ae), "./c"); 511#if !defined(_WIN32) || defined(__CYGWIN__) 512 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0755); 513#endif 514 assert(archive_entry_mtime(ae) != 345); 515 assertEqualInt(archive_entry_size(ae), 7); 516 assertEqualInt(archive_entry_is_encrypted(ae), 0); 517 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 518 519 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 520 assertEqualInt(3, archive_file_count(a)); 521 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 522 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 523} 524 525DEFINE_TEST(test_read_format_mtree_nomagic_v1_form) 526{ 527 const char reffile[] = "test_read_format_mtree_nomagic.mtree"; 528 char buff[16]; 529 struct archive_entry *ae; 530 struct archive *a; 531 FILE *f; 532 533 extract_reference_file(reffile); 534 535 assert((a = archive_read_new()) != NULL); 536 assertEqualIntA(a, ARCHIVE_OK, 537 archive_read_support_filter_all(a)); 538 assertEqualIntA(a, ARCHIVE_OK, 539 archive_read_support_format_all(a)); 540 assertEqualIntA(a, ARCHIVE_OK, 541 archive_read_set_options(a, "mtree:checkfs")); 542 assertEqualIntA(a, ARCHIVE_OK, 543 archive_read_open_filename(a, reffile, 11)); 544 545 /* 546 * Read "file", whose data is available on disk. 547 */ 548 f = fopen("file", "wb"); 549 assert(f != NULL); 550 assertEqualInt(3, fwrite("hi\n", 1, 3, f)); 551 fclose(f); 552 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 553 assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 554 assertEqualString(archive_entry_pathname(ae), "file"); 555 assertEqualInt(archive_entry_uid(ae), 18); 556 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 557 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); 558 assertEqualInt(archive_entry_size(ae), 3); 559 assertEqualInt(3, archive_read_data(a, buff, 3)); 560 assertEqualMem(buff, "hi\n", 3); 561 assertEqualInt(archive_entry_is_encrypted(ae), 0); 562 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 563 564 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 565 assertEqualString(archive_entry_pathname(ae), "dir"); 566 assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); 567 assertEqualInt(archive_entry_is_encrypted(ae), 0); 568 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 569 570 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 571 assertEqualString(archive_entry_pathname(ae), "dir/file with space"); 572 assertEqualInt(archive_entry_is_encrypted(ae), 0); 573 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 574 575 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 576 assertEqualString(archive_entry_pathname(ae), "file with space"); 577 assertEqualInt(archive_entry_is_encrypted(ae), 0); 578 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 579 580 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 581 assertEqualString(archive_entry_pathname(ae), "dir2"); 582 assertEqualInt(archive_entry_is_encrypted(ae), 0); 583 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 584 585 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 586 assertEqualString(archive_entry_pathname(ae), "dir2/dir3a"); 587 assertEqualInt(archive_entry_is_encrypted(ae), 0); 588 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 589 590 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 591 assertEqualString(archive_entry_pathname(ae), "dir2/dir3a/indir3a"); 592 assertEqualInt(archive_entry_is_encrypted(ae), 0); 593 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 594 595 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 596 assertEqualString(archive_entry_pathname(ae), "dir2/fullindir2"); 597 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 598 assertEqualInt(archive_entry_is_encrypted(ae), 0); 599 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 600 601 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 602 assertEqualString(archive_entry_pathname(ae), "dir2/indir2"); 603 assertEqualInt(archive_entry_is_encrypted(ae), 0); 604 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 605 606 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 607 assertEqualString(archive_entry_pathname(ae), "dir2/dir3b"); 608 assertEqualInt(archive_entry_is_encrypted(ae), 0); 609 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 610 611 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 612 assertEqualString(archive_entry_pathname(ae), "dir2/dir3b/indir3b"); 613 assertEqualInt(archive_entry_is_encrypted(ae), 0); 614 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 615 616 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 617 assertEqualString(archive_entry_pathname(ae), "notindir"); 618 assertEqualInt(archive_entry_is_encrypted(ae), 0); 619 assertEqualIntA(a, archive_read_has_encrypted_entries(a), ARCHIVE_READ_FORMAT_ENCRYPTION_UNSUPPORTED); 620 621 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 622 assertEqualInt(12, archive_file_count(a)); 623 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 624 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 625} 626 627/* 628 * Test for a format that NetBSD mtree -C generates. 629 */ 630DEFINE_TEST(test_read_format_mtree_nomagic_v2_form) 631{ 632 const char reffile[] = "test_read_format_mtree_nomagic2.mtree"; 633 char buff[16]; 634 struct archive_entry *ae; 635 struct archive *a; 636 FILE *f; 637 638 extract_reference_file(reffile); 639 640 assert((a = archive_read_new()) != NULL); 641 assertEqualIntA(a, ARCHIVE_OK, 642 archive_read_support_filter_all(a)); 643 assertEqualIntA(a, ARCHIVE_OK, 644 archive_read_support_format_all(a)); 645 assertEqualIntA(a, ARCHIVE_OK, 646 archive_read_set_options(a, "mtree:checkfs")); 647 assertEqualIntA(a, ARCHIVE_OK, 648 archive_read_open_filename(a, reffile, 11)); 649 650 /* 651 * Read "file", whose data is available on disk. 652 */ 653 f = fopen("file", "wb"); 654 assert(f != NULL); 655 assertEqualInt(3, fwrite("hi\n", 1, 3, f)); 656 fclose(f); 657 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 658 assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 659 assertEqualString(archive_entry_pathname(ae), "./file"); 660 assertEqualInt(archive_entry_uid(ae), 18); 661 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 662 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); 663 assertEqualInt(archive_entry_size(ae), 3); 664 assertEqualInt(3, archive_read_data(a, buff, 3)); 665 assertEqualMem(buff, "hi\n", 3); 666 667 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 668 assertEqualString(archive_entry_pathname(ae), "./dir"); 669 assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 670 671 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 672 assertEqualString(archive_entry_pathname(ae), "./dir/file with space"); 673 assertEqualInt(archive_entry_uid(ae), 18); 674 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 675 676 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 677 assertEqualString(archive_entry_pathname(ae), "./file with space"); 678 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 679 680 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 681 assertEqualString(archive_entry_pathname(ae), "./dir2"); 682 assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 683 684 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 685 assertEqualString(archive_entry_pathname(ae), "./dir2/dir3a"); 686 assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 687 688 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 689 assertEqualInt(6, archive_file_count(a)); 690 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 691 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 692} 693 694/* 695 * Test for a format that NetBSD mtree -D generates. 696 */ 697DEFINE_TEST(test_read_format_mtree_nomagic_v2_netbsd_form) 698{ 699 const char reffile[] = "test_read_format_mtree_nomagic3.mtree"; 700 char buff[16]; 701 struct archive_entry *ae; 702 struct archive *a; 703 FILE *f; 704 705 extract_reference_file(reffile); 706 707 assert((a = archive_read_new()) != NULL); 708 assertEqualIntA(a, ARCHIVE_OK, 709 archive_read_support_filter_all(a)); 710 assertEqualIntA(a, ARCHIVE_OK, 711 archive_read_support_format_all(a)); 712 assertEqualIntA(a, ARCHIVE_OK, 713 archive_read_set_options(a, "mtree:checkfs")); 714 assertEqualIntA(a, ARCHIVE_OK, 715 archive_read_open_filename(a, reffile, 11)); 716 717 /* 718 * Read "file", whose data is available on disk. 719 */ 720 f = fopen("file", "wb"); 721 assert(f != NULL); 722 assertEqualInt(3, fwrite("hi\n", 1, 3, f)); 723 fclose(f); 724 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 725 assertEqualInt(archive_format(a), ARCHIVE_FORMAT_MTREE); 726 assertEqualString(archive_entry_pathname(ae), "./file"); 727 assertEqualInt(archive_entry_uid(ae), 18); 728 assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); 729 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0123); 730 assertEqualInt(archive_entry_size(ae), 3); 731 assertEqualInt(3, archive_read_data(a, buff, 3)); 732 assertEqualMem(buff, "hi\n", 3); 733 734 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 735 assertEqualString(archive_entry_pathname(ae), "./dir"); 736 assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 737 738 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 739 assertEqualString(archive_entry_pathname(ae), "./dir/file with space"); 740 assertEqualInt(archive_entry_uid(ae), 18); 741 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 742 743 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 744 assertEqualString(archive_entry_pathname(ae), "./file with space"); 745 assertEqualInt(archive_entry_mode(ae), AE_IFREG | 0644); 746 747 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 748 assertEqualString(archive_entry_pathname(ae), "./dir2"); 749 assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 750 751 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 752 assertEqualString(archive_entry_pathname(ae), "./dir2/dir3a"); 753 assertEqualInt(archive_entry_mode(ae), AE_IFDIR | 0755); 754 755 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 756 assertEqualInt(6, archive_file_count(a)); 757 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 758 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 759} 760 761/* 762 * We should get a warning if the contents file doesn't exist. 763 */ 764DEFINE_TEST(test_read_format_mtree_nonexistent_contents_file) 765{ 766 static char archive[] = 767 "#mtree\n" 768 "a type=file contents=nonexistent_file\n"; 769 struct archive_entry *ae; 770 struct archive *a; 771 772 assert((a = archive_read_new()) != NULL); 773 assertEqualIntA(a, ARCHIVE_OK, 774 archive_read_support_filter_all(a)); 775 assertEqualIntA(a, ARCHIVE_OK, 776 archive_read_support_format_all(a)); 777 assertEqualIntA(a, ARCHIVE_OK, 778 archive_read_set_options(a, "mtree:checkfs")); 779 assertEqualIntA(a, ARCHIVE_OK, 780 archive_read_open_memory(a, archive, sizeof(archive))); 781 assertEqualIntA(a, ARCHIVE_WARN, archive_read_next_header(a, &ae)); 782 assert(strlen(archive_error_string(a)) > 0); 783 assertEqualString(archive_entry_pathname(ae), "a"); 784 assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 785 786 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 787 assertEqualInt(1, archive_file_count(a)); 788 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 789 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 790} 791 792/* 793 * Check mtree file with non-printable ascii characters 794 */ 795DEFINE_TEST(test_read_format_mtree_noprint) 796{ 797 const char reffile[] = "test_read_format_mtree_noprint.mtree"; 798 struct archive_entry *ae; 799 struct archive *a; 800 801 extract_reference_file(reffile); 802 803 assert((a = archive_read_new()) != NULL); 804 assertEqualIntA(a, ARCHIVE_OK, 805 archive_read_support_filter_all(a)); 806 assertEqualIntA(a, ARCHIVE_OK, 807 archive_read_support_format_all(a)); 808 assertEqualIntA(a, ARCHIVE_OK, 809 archive_read_open_filename(a, reffile, 11)); 810 811 assertEqualIntA(a, ARCHIVE_FATAL, archive_read_next_header(a, &ae)); 812 assertEqualString("Can't parse line 3", archive_error_string(a)); 813 814 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 815 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 816} 817 818/* 819 * Check mtree file with tab characters, which are supported but not printable 820 */ 821DEFINE_TEST(test_read_format_mtree_tab) 822{ 823 static char archive[] = 824 "#mtree\n" 825 "\ta\ttype=file\n"; 826 struct archive_entry *ae; 827 struct archive *a; 828 829 assert((a = archive_read_new()) != NULL); 830 assertEqualIntA(a, ARCHIVE_OK, 831 archive_read_support_filter_all(a)); 832 assertEqualIntA(a, ARCHIVE_OK, 833 archive_read_support_format_all(a)); 834 assertEqualIntA(a, ARCHIVE_OK, 835 archive_read_open_memory(a, archive, sizeof(archive))); 836 837 assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); 838 assertEqualString(archive_entry_pathname(ae), "a"); 839 assertEqualInt(archive_entry_filetype(ae), AE_IFREG); 840 841 assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); 842 assertEqualInt(1, archive_file_count(a)); 843 assertEqualInt(ARCHIVE_OK, archive_read_close(a)); 844 assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 845} 846