int archive_entry_sparse_reset(struct archive_entry * entry) { entry->sparse_p = entry->sparse_head; return archive_entry_sparse_count(entry); }
/* * Sparse test without directory traversals. */ static void verify_sparse_file2(struct archive *a, const char *path, const struct sparse *sparse, int blocks, int preopen) { struct archive_entry *ae; int fd; (void)sparse; /* UNUSED */ assert((ae = archive_entry_new()) != NULL); archive_entry_set_pathname(ae, path); if (preopen) fd = open(path, O_RDONLY | O_BINARY); else fd = -1; assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_entry_from_file(a, ae, fd, NULL)); if (fd >= 0) close(fd); /* Verify the number of holes only, not its offset nor its * length because those alignments are deeply dependence on * its filesystem. */ failure(path); assertEqualInt(blocks, archive_entry_sparse_count(ae)); archive_entry_free(ae); }
/* * Sparse test with directory traversals. */ static void verify_sparse_file(struct archive *a, const char *path, const struct sparse *sparse, int blocks, int expected_data_blocks) { struct archive_entry *ae; const void *buff; size_t bytes_read; int64_t offset; int64_t total; int data_blocks, hole; create_sparse_file(path, sparse); assert((ae = archive_entry_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_disk_open(a, path)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header2(a, ae)); /* Verify the number of holes only, not its offset nor its * length because those alignments are deeply dependence on * its filesystem. */ assertEqualInt(blocks, archive_entry_sparse_count(ae)); total = 0; data_blocks = 0; hole = 0; while (ARCHIVE_OK == archive_read_data_block(a, &buff, &bytes_read, &offset)) { if (offset > total || offset == 0) { if (offset > total) hole = 1; data_blocks++; } total = offset + bytes_read; } assertEqualInt(expected_data_blocks, data_blocks); if (blocks > 1) assert(hole); /* There must be a hole if > 1 blocks were encoded */ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); archive_entry_free(ae); }
static void test_sparse_whole_file_data() { struct archive_entry *ae; int64_t offset; int i; assert((ae = archive_entry_new()) != NULL); archive_entry_set_size(ae, 1024*10); /* * Add sparse block data up to the file size. */ offset = 0; for (i = 0; i < 10; i++) { archive_entry_sparse_add_entry(ae, offset, 1024); offset += 1024; } failure("There should be no sparse"); assertEqualInt(0, archive_entry_sparse_count(ae)); archive_entry_free(ae); }