static void test_append(void) { struct zip_t *zip = zip_open(ZIPNAME, ZIP_DEFAULT_COMPRESSION_LEVEL, 'a'); assert(zip != NULL); assert(0 == zip_entry_open(zip, "test\\test-2.txt")); assert(0 == strcmp(zip_entry_name(zip), "test/test-2.txt")); assert(total_entries == zip_entry_index(zip)); assert(0 == zip_entry_write(zip, TESTDATA2, strlen(TESTDATA2))); assert(strlen(TESTDATA2) == zip_entry_size(zip)); assert(CRC32DATA2 == zip_entry_crc32(zip)); ++total_entries; assert(0 == zip_entry_close(zip)); assert(0 == zip_entry_open(zip, "test\\empty/")); assert(0 == strcmp(zip_entry_name(zip), "test/empty/")); assert(0 == zip_entry_size(zip)); assert(0 == zip_entry_crc32(zip)); assert(total_entries == zip_entry_index(zip)); ++total_entries; assert(0 == zip_entry_close(zip)); assert(0 == zip_entry_open(zip, "empty/")); assert(0 == strcmp(zip_entry_name(zip), "empty/")); assert(0 == zip_entry_size(zip)); assert(0 == zip_entry_crc32(zip)); assert(total_entries == zip_entry_index(zip)); ++total_entries; assert(0 == zip_entry_close(zip)); zip_close(zip); }
static void test_entry_name(void) { struct zip_t *zip = zip_open(ZIPNAME, 0, 'r'); assert(zip != NULL); assert(zip_entry_name(zip) == NULL); assert(0 == zip_entry_open(zip, "test\\test-1.txt")); assert(NULL != zip_entry_name(zip)); assert(0 == strcmp(zip_entry_name(zip), "test/test-1.txt")); assert(strlen(TESTDATA1) == zip_entry_size(zip)); assert(CRC32DATA1 == zip_entry_crc32(zip)); assert(0 == zip_entry_index(zip)); assert(0 == zip_entry_close(zip)); assert(0 == zip_entry_open(zip, "test/test-2.txt")); assert(NULL != zip_entry_name(zip)); assert(0 == strcmp(zip_entry_name(zip), "test/test-2.txt")); assert(strlen(TESTDATA2) == zip_entry_size(zip)); assert(CRC32DATA2 == zip_entry_crc32(zip)); assert(1 == zip_entry_index(zip)); assert(0 == zip_entry_close(zip)); zip_close(zip); }
static int unzip_to_file(ZipArchiveHandle zip, char* entry_name) { FILE* fp = tmpfile(); if (fp == NULL) { fprintf(stderr, "failed to create temporary file for '%s': %s\n", entry_name, strerror(errno)); return -1; } ZipEntryName zip_entry_name(entry_name); ZipEntry zip_entry; if (FindEntry(zip, zip_entry_name, &zip_entry) != 0) { fprintf(stderr, "archive does not contain '%s'\n", entry_name); return -1; } int fd = fileno(fp); int error = ExtractEntryToFile(zip, &zip_entry, fd); if (error != 0) { fprintf(stderr, "failed to extract '%s': %s\n", entry_name, ErrorCodeString(error)); return -1; } lseek(fd, 0, SEEK_SET); return fd; }
static void* unzip_file(ZipArchiveHandle zip, const char* entry_name, unsigned* sz) { ZipEntryName zip_entry_name(entry_name); ZipEntry zip_entry; if (FindEntry(zip, zip_entry_name, &zip_entry) != 0) { fprintf(stderr, "archive does not contain '%s'\n", entry_name); return 0; } *sz = zip_entry.uncompressed_length; uint8_t* data = reinterpret_cast<uint8_t*>(malloc(zip_entry.uncompressed_length)); if (data == NULL) { fprintf(stderr, "failed to allocate %u bytes for '%s'\n", *sz, entry_name); return 0; } int error = ExtractToMemory(zip, &zip_entry, data, zip_entry.uncompressed_length); if (error != 0) { fprintf(stderr, "failed to extract '%s': %s\n", entry_name, ErrorCodeString(error)); free(data); return 0; } return data; }
static void test_list_entries(void) { struct zip_t *zip = zip_open(ZIPNAME, 0, 'r'); assert(zip != NULL); int i = 0, n = zip_total_entries(zip); for (; i < n; ++i) { assert(0 == zip_entry_openbyindex(zip, i)); fprintf(stdout, "[%d]: %s", i, zip_entry_name(zip)); if (zip_entry_isdir(zip)) { fprintf(stdout, " (DIR)"); } fprintf(stdout, "\n"); assert(0 == zip_entry_close(zip)); } zip_close(zip); }
static void test_read(void) { char *buf = NULL; ssize_t bufsize; size_t buftmp; struct zip_t *zip = zip_open(ZIPNAME, 0, 'r'); assert(zip != NULL); assert(0 == zip_entry_open(zip, "test\\test-1.txt")); assert(strlen(TESTDATA1) == zip_entry_size(zip)); assert(CRC32DATA1 == zip_entry_crc32(zip)); bufsize = zip_entry_read(zip, (void **)&buf, &buftmp); assert(bufsize == strlen(TESTDATA1)); assert((size_t)bufsize == buftmp); assert(0 == strncmp(buf, TESTDATA1, bufsize)); assert(0 == zip_entry_close(zip)); free(buf); buf = NULL; bufsize = 0; assert(0 == zip_entry_open(zip, "test/test-2.txt")); assert(strlen(TESTDATA2) == zip_entry_size(zip)); assert(CRC32DATA2 == zip_entry_crc32(zip)); bufsize = zip_entry_read(zip, (void **)&buf, NULL); assert((size_t)bufsize == strlen(TESTDATA2)); assert(0 == strncmp(buf, TESTDATA2, (size_t)bufsize)); assert(0 == zip_entry_close(zip)); free(buf); buf = NULL; bufsize = 0; assert(0 == zip_entry_open(zip, "test\\empty/")); assert(0 == strcmp(zip_entry_name(zip), "test/empty/")); assert(0 == zip_entry_size(zip)); assert(0 == zip_entry_crc32(zip)); assert(0 == zip_entry_close(zip)); buftmp = strlen(TESTDATA2); buf = calloc(buftmp, sizeof(char)); assert(0 == zip_entry_open(zip, "test/test-2.txt")); bufsize = zip_entry_noallocread(zip, (void *)buf, buftmp); assert(buftmp == (size_t)bufsize); assert(0 == strncmp(buf, TESTDATA2, buftmp)); assert(0 == zip_entry_close(zip)); free(buf); buf = NULL; bufsize = 0; buftmp = strlen(TESTDATA1); buf = calloc(buftmp, sizeof(char)); assert(0 == zip_entry_open(zip, "test/test-1.txt")); bufsize = zip_entry_noallocread(zip, (void *)buf, buftmp); assert(buftmp == (size_t)bufsize); assert(0 == strncmp(buf, TESTDATA1, buftmp)); assert(0 == zip_entry_close(zip)); free(buf); buf = NULL; bufsize = 0; zip_close(zip); }