static void extract(const char *filename, int do_extract, int flags) { struct archive *a; struct archive *ext; struct archive_entry *entry; int r; a = archive_read_new(); ext = archive_write_disk_new(); archive_write_disk_set_options(ext, flags); /* * Note: archive_write_disk_set_standard_lookup() is useful * here, but it requires library routines that can add 500k or * more to a static executable. */ archive_read_support_format_tar(a); /* * On my system, enabling other archive formats adds 20k-30k * each. Enabling gzip decompression adds about 20k. * Enabling bzip2 is more expensive because the libbz2 library * isn't very well factored. */ if (filename != NULL && strcmp(filename, "-") == 0) filename = NULL; if ((r = archive_read_open_file(a, filename, 10240))) fail("archive_read_open_file()", archive_error_string(a), r); for (;;) { r = archive_read_next_header(a, &entry); if (r == ARCHIVE_EOF) break; if (r != ARCHIVE_OK) fail("archive_read_next_header()", archive_error_string(a), 1); if (verbose && do_extract) msg("x "); if (verbose || !do_extract) msg(archive_entry_pathname(entry)); if (do_extract) { r = archive_write_header(ext, entry); if (r != ARCHIVE_OK) warn("archive_write_header()", archive_error_string(ext)); else { copy_data(a, ext); r = archive_write_finish_entry(ext); if (r != ARCHIVE_OK) fail("archive_write_finish_entry()", archive_error_string(ext), 1); } } if (verbose || !do_extract) msg("\n"); } archive_read_close(a); archive_read_finish(a); exit(0); }
/* * Copy from specified archive to current archive. Returns non-zero * for write errors (which force us to terminate the entire archiving * operation). If there are errors reading the input archive, we set * bsdtar->return_value but return zero, so the overall archiving * operation will complete and return non-zero. */ static int append_archive_filename(struct bsdtar *bsdtar, struct archive *a, const char *filename) { struct archive *ina; int rc; if (strcmp(filename, "-") == 0) filename = NULL; /* Library uses NULL for stdio. */ ina = archive_read_new(); archive_read_support_format_all(ina); archive_read_support_compression_all(ina); if (archive_read_open_file(ina, filename, 10240)) { bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(ina)); bsdtar->return_value = 1; return (0); } rc = append_archive(bsdtar, a, ina, NULL); if (archive_errno(ina)) { bsdtar_warnc(bsdtar, 0, "Error reading archive %s: %s", filename, archive_error_string(ina)); bsdtar->return_value = 1; } archive_read_finish(ina); return (rc); }
extern void lparchive_destroy(lparchive_t *handle) { /* FIXME: add error handling */ (void)archive_read_finish(handle->archive); free(handle); }
int main(int argc, const char **argv) { if (argc > 2) { fprintf(stderr, "Usage: %s [file]\n", argv[0]); exit(1); } struct archive *a = archive_read_new(); archive_read_support_compression_all(a); archive_read_support_format_raw(a); int err; if (argc == 2) err = archive_read_open_filename(a, argv[1], BS); else err = archive_read_open_fd(a, 0, BS); if (err != ARCHIVE_OK) { fprintf(stderr, "Broken archive (1)\n"); exit(1); } struct archive_entry *ae; err = archive_read_next_header(a, &ae); if (err != ARCHIVE_OK) { fprintf(stderr, "Broken archive (2)\n"); exit(1); } (void) archive_read_data_into_fd(a, 1); archive_read_finish(a); exit(0); }
extern void lparchive_reset(lparchive_t *handle) { /* FIXME: add error handling */ (void)archive_read_finish(handle->archive); lparchive_init(handle); }
static int append_archive_tarsnap(struct bsdtar *bsdtar, struct archive *a, const char *tapename) { struct archive *ina; void * cookie; int rc; ina = archive_read_new(); archive_read_support_format_tar(ina); archive_read_support_compression_none(ina); cookie = archive_read_open_multitape(ina, bsdtar->machinenum, tapename); if (cookie == NULL) { bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(ina)); bsdtar->return_value = 1; return (0); } rc = append_archive(bsdtar, a, ina, cookie); /* Handle errors which haven't already been reported. */ if (archive_errno(ina)) { bsdtar_warnc(bsdtar, 0, "Error reading archive %s: %s", tapename, archive_error_string(ina)); bsdtar->return_value = 1; } archive_read_finish(ina); return (rc); }
static void test(int pristine) { struct archive* a = archive_read_new(); int known_option_rv = pristine ? ARCHIVE_FAILED : ARCHIVE_OK; if (!pristine) { archive_read_support_filter_all(a); archive_read_support_format_all(a); } /* NULL and "" denote `no option', so they're ok no matter * what, if any, formats are registered */ should(a, ARCHIVE_OK, NULL, NULL, NULL); should(a, ARCHIVE_OK, "", "", ""); /* unknown modules and options */ should(a, ARCHIVE_FAILED, "fubar", "snafu", NULL); should(a, ARCHIVE_FAILED, "fubar", "snafu", "betcha"); /* unknown modules and options */ should(a, ARCHIVE_FAILED, NULL, "snafu", NULL); should(a, ARCHIVE_FAILED, NULL, "snafu", "betcha"); /* ARCHIVE_OK with iso9660 loaded, ARCHIVE_WARN otherwise */ should(a, known_option_rv, "iso9660", "joliet", NULL); should(a, known_option_rv, "iso9660", "joliet", NULL); should(a, known_option_rv, NULL, "joliet", NULL); should(a, known_option_rv, NULL, "joliet", NULL); archive_read_finish(a); }
int extract_archive(const char* filename, const char* to_path) { struct archive* a; struct archive* ext; struct archive_entry* entry; int r; int flags = ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_ACL | ARCHIVE_EXTRACT_FFLAGS; a = archive_read_new(); ext = archive_write_disk_new(); archive_write_disk_set_options(ext, flags); archive_write_disk_set_standard_lookup(ext); archive_read_support_format_all(a); archive_read_support_compression_all(a); if(filename != NULL && strcmp(filename, "-") == 0) { filename = NULL; } if((r = archive_read_open_file(a, filename, 10240))) { printf("archive_read_open_file(): %s\n", archive_error_string(a)); return r; } for(;;) { r = archive_read_next_header(a, &entry); if(r == ARCHIVE_EOF) { break; } if(r != ARCHIVE_OK) { printf("archive_read_next_header(): %s\n", archive_error_string(a)); return 0; } // rewrite pathname const char* path = archive_entry_pathname(entry); char new_path[PATH_MAX + 1]; sprintf(new_path, "%s/%s", to_path, path + (strncmp(path, "rootfs/", 7) == 0 ? 7 : 0)); archive_entry_set_pathname(entry, new_path); r = archive_write_header(ext, entry); if(r != ARCHIVE_OK) { printf("archive_write_header(): %s\n", archive_error_string(ext)); } else { copy_data(a, ext); if(r != ARCHIVE_OK) { printf("archive_write_finish_entry(): %s\n", archive_error_string(ext)); return 0; } } r = archive_write_finish_entry(ext); } archive_read_close(a); archive_read_finish(a); archive_write_close(ext); archive_write_finish(ext); return 1; }
int extract_archive(char *filename) { struct archive *a; struct archive_entry *entry; int r; size_t size; char buff[BUFFER_SIZE]; FILE *fd; a = archive_read_new(); archive_read_support_compression_gzip(a); archive_read_support_format_tar(a); r = archive_read_open_filename(a, filename, 10240); if (r != ARCHIVE_OK) { return 1; } for (;;) { if ((r = archive_read_next_header(a, &entry))) { if (r != ARCHIVE_OK) { if (r == ARCHIVE_EOF) { return 0; }else{ return 1; } } } fd = fopen(archive_entry_pathname(entry),"wb"); if (fd == NULL) { fprintf(stderr, "problem extracting archive: %s: %s\n", filename, strerror(errno)); return 1; } for (;;) { size = archive_read_data(a, buff, BUFFER_SIZE); if (size < 0) { return 1; } if (size == 0) { break; } fwrite(buff, 1, size, fd); } fclose(fd); } r = archive_read_finish(a); if (r != ARCHIVE_OK) { return 4; } return 0; }
void PictureBank::loadArchive(const std::string &filename) { std::cout << "reading image archive: " << filename << std::endl; struct archive *a; struct archive_entry *entry; int rc; a = archive_read_new(); archive_read_support_compression_all(a); archive_read_support_format_all(a); rc = archive_read_open_filename(a, filename.c_str(), 16384); // block size if (rc != ARCHIVE_OK) { THROW("Cannot open archive " << filename); } SDL_Surface *surface; SDL_RWops *rw; const Uint32 bufferSize = 10000000; // allocated buffer std::auto_ptr< Uint8 > buffer( new Uint8[ bufferSize ] ); if( buffer.get() == 0 ) THROW("Memory error, cannot allocate buffer size " << bufferSize); std::string entryname; while( archive_read_next_header(a, &entry) == ARCHIVE_OK ) { // for all entries in archive entryname = archive_entry_pathname(entry); if ((archive_entry_stat(entry)->st_mode & S_IFREG) == 0) { // not a regular file (maybe a directory). skip it. continue; } if (archive_entry_stat(entry)->st_size >= bufferSize) { THROW("Cannot load archive: file is too big " << entryname << " in archive " << filename); } int size = archive_read_data(a, buffer.get(), bufferSize); // read data into buffer rw = SDL_RWFromMem(buffer.get(), size); surface = IMG_Load_RW(rw, 0); SDL_SetAlpha( surface, 0, 0 ); setPicture(entryname, *surface); SDL_FreeRW(rw); } rc = archive_read_finish(a); if (rc != ARCHIVE_OK) { THROW("Error while reading archive " << filename); } }
static int verify_signature_close_cb(struct archive *archive, void *cookie) { struct signature_archive *state = cookie; archive_read_finish(state->archive); free_signature_int(state); return 0; }
retvalue getfilelist(/*@out@*/char **filelist, size_t *size, const char *debfile) { struct ar_archive *ar; retvalue r; bool hadcandidate = false; r = ar_open(&ar, debfile); if (RET_WAS_ERROR(r)) return r; assert (r != RET_NOTHING); do { char *filename; enum compression c; r = ar_nextmember(ar, &filename); if (RET_IS_OK(r)) { if (strncmp(filename, "data.tar", 8) != 0) { free(filename); continue; } hadcandidate = true; for (c = 0 ; c < c_COUNT ; c++) { if (strcmp(filename + 8, uncompression_suffix[c]) == 0) break; } if (c >= c_COUNT) { free(filename); continue; } ar_archivemember_setcompression(ar, c); if (uncompression_supported(c)) { struct archive *tar; tar = archive_read_new(); r = read_data_tar(filelist, size, debfile, ar, tar); // TODO: check how to get an error message here.. archive_read_finish(tar); if (r != RET_NOTHING) { ar_close(ar); free(filename); return r; } } free(filename); } } while (RET_IS_OK(r)); ar_close(ar); if (hadcandidate) fprintf(stderr, "Could not find a suitable data.tar file within '%s'!\n", debfile); else fprintf(stderr, "Could not find a data.tar file within '%s'!\n", debfile); return RET_ERROR_MISSING; }
/* Copy this function for each test file and adjust it accordingly. */ static void test_compat_zip_1(void) { char name[] = "test_compat_zip_1.zip"; struct archive_entry *ae; struct archive *a; int r; assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_zip(a)); extract_reference_file(name); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 10240)); /* Read first entry. */ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualString("META-INF/MANIFEST.MF", archive_entry_pathname(ae)); /* Read second entry. */ r = archive_read_next_header(a, &ae); if (r != ARCHIVE_OK) { if (strcmp(archive_error_string(a), "libarchive compiled without deflate support (no libz)") == 0) { skipping("Skipping ZIP compression check: %s", archive_error_string(a)); goto finish; } } assertEqualIntA(a, ARCHIVE_OK, r); assertEqualString("tmp.class", archive_entry_pathname(ae)); assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE); assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ZIP); assertEqualInt(ARCHIVE_OK, archive_read_close(a)); finish: #if ARCHIVE_VERSION_NUMBER < 2000000 archive_read_finish(a); #else assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); #endif }
static bool taste_tar(io_block_t *ib) { struct archive *ar = archive_read_new(); archive_read_support_compression_none(ar); archive_read_support_format_tar(ar); archive_read_open_memory(ar, ib->output, ib->outsize); struct archive_entry *entry; bool ok = (archive_read_next_header(ar, &entry) == ARCHIVE_OK); archive_read_finish(ar); return ok; }
void load_finish(void **context) { #ifdef WITH_LIBARCHIVE struct archive *archive = *context; if (archive != NULL) archive_read_finish(archive); #endif *context = NULL; }
int packing_finish(struct packing *pack) { archive_entry_free(pack->entry); archive_read_finish(pack->aread); archive_write_close(pack->awrite); archive_write_finish(pack->awrite); return (EPKG_OK); }
static inline int lparchive_reopen(lparchive_t *handle) { /* FIXME: add error handling */ (void)archive_read_finish(handle->archive); handle->archive = archive_read_new(); (void)archive_read_support_compression_all(handle->archive); (void)archive_read_support_format_all(handle->archive); return lparchive_open_fd(handle, handle->fd); }
static int extract_pkg_static(int fd, char *p, int sz) { struct archive *a; struct archive_entry *ae; char *end; int ret, r; ret = -1; a = archive_read_new(); if (a == NULL) { warn("archive_read_new"); return (ret); } archive_read_support_compression_all(a); archive_read_support_format_tar(a); if (lseek(fd, 0, 0) == -1) { warn("lseek"); goto cleanup; } if (archive_read_open_fd(a, fd, 4096) != ARCHIVE_OK) { warnx("archive_read_open_fd: %s", archive_error_string(a)); goto cleanup; } ae = NULL; while ((r = archive_read_next_header(a, &ae)) == ARCHIVE_OK) { end = strrchr(archive_entry_pathname(ae), '/'); if (end == NULL) continue; if (strcmp(end, "/pkg-static") == 0) { r = archive_read_extract(a, ae, ARCHIVE_EXTRACT_OWNER | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_ACL | ARCHIVE_EXTRACT_FFLAGS | ARCHIVE_EXTRACT_XATTR); strlcpy(p, archive_entry_pathname(ae), sz); break; } } if (r == ARCHIVE_OK) ret = 0; else warnx("fail to extract pkg-static"); cleanup: archive_read_finish(a); return (ret); }
/* * Extract all of the archive members of the specified archive * object. If dest is not NULL, extract archive members to that * directory. If dest is not NULL and does not exist as a directory, * create it first. Return ARCHIVE_OK on success, ARCHIVE_* otherwise. */ int unpack_members_and_finish(struct archive *a, char *dest, filterfunc filter, void* userptr) { int restore = 0; char prevcwd[PATH_MAX]; struct archive_entry *e = NULL; if (getcwd(prevcwd, PATH_MAX) == NULL) { logMessage(ERROR, "unable to getcwd() (%s:%d): %m", __func__, __LINE__); return ARCHIVE_FATAL; } else { restore = 1; } if (dest != NULL) { if (unpack_mkpath(dest) != ARCHIVE_OK) { return ARCHIVE_FATAL; } else if (chdir(dest) == -1) { logMessage(ERROR, "unable to chdir %s (%s:%d): %m", dest, __func__, __LINE__); return ARCHIVE_FATAL; } } while (archive_read_next_header(a, &e) == ARCHIVE_OK) { const char *pathname = archive_entry_pathname(e); const struct stat *fstat = archive_entry_stat(e); if (filter && filter(pathname, fstat, userptr)) continue; if (archive_read_extract(a, e, 0) != ARCHIVE_OK) { logMessage(ERROR, "error unpacking %s (%s:%d): %s", pathname, __func__, __LINE__, archive_error_string(a)); return ARCHIVE_FATAL; } } if (restore && chdir(prevcwd) == -1) { logMessage(ERROR, "unable to chdir %s (%s:%d): %m", dest, __func__, __LINE__); return ARCHIVE_FATAL; } if (archive_read_finish(a) != ARCHIVE_OK) { logMessage(ERROR, "error closing archive (%s:%d): %s", __func__, __LINE__, archive_error_string(a)); return ARCHIVE_FATAL; } return ARCHIVE_OK; }
static void verifyEmpty(void) { struct archive_entry *ae; struct archive *a; assert((a = archive_read_new()) != NULL); assertA(0 == archive_read_support_compression_all(a)); assertA(0 == archive_read_support_format_all(a)); assertA(0 == archive_read_open_memory(a, archiveEmpty, 512)); assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_NONE); failure("512 zero bytes should be recognized as a tar archive."); assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR); assert(0 == archive_read_close(a)); #if ARCHIVE_API_VERSION > 1 assert(0 == archive_read_finish(a)); #else archive_read_finish(a); #endif }
void load_examples(const void *data, size_t len, example_list_t *examples) { example_patch_t *patch; struct archive *arch; struct archive_entry *ent; const char *path; FILE *fp; char *buf; size_t size; char block[4096]; ssize_t count; int ret; assert(data != NULL); arch = archive_read_new(); assert(arch != NULL); if (archive_read_support_format_zip(arch)) abort(); if (archive_read_open_memory(arch, (void *) data, len)) abort(); while (!(ret = archive_read_next_header(arch, &ent))) { if (!S_ISREG(archive_entry_filetype(ent))) continue; path = archive_entry_pathname(ent); if (strncmp(path, EXAMPLE_DIR "/", strlen(EXAMPLE_DIR) + 1)) continue; /* archive_entry_size() is not reliable for Zip files */ fp = open_memstream(&buf, &size); if (fp == NULL) abort(); while ((count = archive_read_data(arch, block, sizeof(block))) > 0) if (fwrite(block, 1, count, fp) != (size_t) count) abort(); if (count < 0) { fprintf(stderr, "%s\n", archive_error_string(arch)); abort(); } fclose(fp); patch = malloc(sizeof(*patch)); patch->image = read_rgb_image(buf, size); if (patch->image == NULL) { fprintf(stderr, "Couldn't decode example %s\n", path); abort(); } TAILQ_INSERT_TAIL(examples, patch, link); free(buf); } assert(ret == ARCHIVE_EOF); if (archive_read_finish(arch)) abort(); }
/* * All of the sample files have the same contents; they're just * compressed in different ways. */ static void compat_xz(const char *name) { const char *n[7] = { "f1", "f2", "f3", "d1/f1", "d1/f2", "d1/f3", NULL }; struct archive_entry *ae; struct archive *a; int i, r; assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); r = archive_read_support_compression_xz(a); if (r == ARCHIVE_WARN) { skipping("xz reading not fully supported on this platform"); assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); return; } assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); extract_reference_file(name); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 2)); /* Read entries, match up names with list above. */ for (i = 0; i < 6; ++i) { failure("Could not read file %d (%s) from %s", i, n[i], name); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualString(n[i], archive_entry_pathname(ae)); } /* Verify the end-of-archive. */ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); /* Verify that the format detection worked. */ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_XZ); assertEqualString(archive_compression_name(a), "xz"); assertEqualInt(archive_format(a), ARCHIVE_FORMAT_TAR_USTAR); assertEqualInt(ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); }
int packing_finish(struct packing *pack) { assert(pack != NULL); archive_read_finish(pack->aread); archive_write_close(pack->awrite); archive_write_finish(pack->awrite); free(pack); return (EPKG_OK); }
/** Open an archive for reading and perform the necessary boilerplate. * This takes care of creating the libarchive 'archive' struct, setting up * compression and format options, opening a file descriptor, setting up the * buffer size, and performing a stat on the path once opened. * On error, no file descriptor is opened, and the archive pointer returned * will be set to NULL. * @param handle the context handle * @param path the path of the archive to open * @param buf space for a stat buffer for the given path * @param archive pointer to place the created archive object * @param error error code to set on failure to open archive * @return -1 on failure, >=0 file descriptor on success */ int _alpm_open_archive(alpm_handle_t *handle, const char *path, struct stat *buf, struct archive **archive, alpm_errno_t error) { int fd; size_t bufsize = ALPM_BUFFER_SIZE; errno = 0; if((*archive = archive_read_new()) == NULL) { RET_ERR(handle, ALPM_ERR_LIBARCHIVE, -1); } archive_read_support_compression_all(*archive); archive_read_support_format_all(*archive); _alpm_log(handle, ALPM_LOG_DEBUG, "opening archive %s\n", path); OPEN(fd, path, O_RDONLY); if(fd < 0) { _alpm_log(handle, ALPM_LOG_ERROR, _("could not open file %s: %s\n"), path, strerror(errno)); goto error; } if(fstat(fd, buf) != 0) { _alpm_log(handle, ALPM_LOG_ERROR, _("could not stat file %s: %s\n"), path, strerror(errno)); goto error; } #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE if(buf->st_blksize > ALPM_BUFFER_SIZE) { bufsize = buf->st_blksize; } #endif if(archive_read_open_fd(*archive, fd, bufsize) != ARCHIVE_OK) { _alpm_log(handle, ALPM_LOG_ERROR, _("could not open file %s: %s\n"), path, archive_error_string(*archive)); goto error; } return fd; error: archive_read_finish(*archive); *archive = NULL; if(fd >= 0) { CLOSE(fd); } RET_ERR(handle, error, -1); }
/* Extracts the downloaded archive and removes it upon success. * Assumed to be in destination directory before calling this. * Returns -1 on fatal errors, > 0 on extraction errors, 0 on success. */ int extract_file(const char *filename) { /* Extract the archive */ struct archive *archive; struct archive_entry *entry; int ret; int errors = 0; int extract_flags = ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_TIME; archive = archive_read_new(); if (!archive) { return error(PW_ERR_ARCHIVE_CREATE); } archive_read_support_compression_all(archive); archive_read_support_format_all(archive); ret = archive_read_open_filename(archive, filename, 16384); if (ret != ARCHIVE_OK) { return error(PW_ERR_ARCHIVE_OPEN); } while (archive_read_next_header(archive, &entry) == ARCHIVE_OK) { ret = archive_read_extract(archive, entry, extract_flags); if (ret == ARCHIVE_WARN && archive_errno(archive) != ENOSPC) { pw_fprintf(PW_LOG_WARNING, stderr, "warning given when extracting %s: %s\n", archive_entry_pathname(entry), archive_error_string(archive)); } else if (ret != ARCHIVE_OK) { pw_fprintf(PW_LOG_ERROR, stderr, "Could not extract %s\n", archive_entry_pathname(entry)); ++errors; } if (config->verbose) { printf("X %s\n", archive_entry_pathname(entry)); } } archive_read_finish(archive); /* Everything successful. Remove the file */ unlink(filename); return errors; }
int epic_fclose(struct epic_loadfile *elf) { if ((elf->fp)!=NULL) { return fclose(elf->fp); } #ifdef HAVE_LIBARCHIVE else if ((elf->a)!=NULL) { archive_read_close(elf->a); archive_read_finish(elf->a); return 0; } #endif else { return EOF; } }
static void mode_list(struct cpio *cpio) { struct archive *a; struct archive_entry *entry; unsigned long blocks; int r; a = archive_read_new(); if (a == NULL) cpio_errc(1, 0, "Couldn't allocate archive object"); archive_read_support_compression_all(a); archive_read_support_format_all(a); if (archive_read_open_file(a, cpio->filename, cpio->bytes_per_block)) cpio_errc(1, archive_errno(a), archive_error_string(a)); for (;;) { r = archive_read_next_header(a, &entry); if (r == ARCHIVE_EOF) break; if (r != ARCHIVE_OK) { cpio_errc(1, archive_errno(a), archive_error_string(a)); } if (excluded(cpio, archive_entry_pathname(entry))) continue; if (cpio->verbose) list_item_verbose(cpio, entry); else fprintf(stdout, "%s\n", archive_entry_pathname(entry)); } r = archive_read_close(a); if (r != ARCHIVE_OK) cpio_errc(1, 0, archive_error_string(a)); if (!cpio->quiet) { blocks = (archive_position_uncompressed(a) + 511) / 512; fprintf(stderr, "%lu %s\n", blocks, blocks == 1 ? "block" : "blocks"); } archive_read_finish(a); exit(0); }
size_t LIBARCHIVEgetEntry(char *name, char *contentFile, char **ptr) { struct mydata *mydata; struct archive *a; struct archive_entry *entry; char *buf; size_t size = 0; mydata = (struct mydata*)malloc(sizeof(struct mydata)); a = archive_read_new(); mydata->name = name; archive_read_support_format_all(a); archive_read_support_compression_all(a); if (archive_read_open(a, mydata, myopen, myread, myclose) == ARCHIVE_FATAL) { fprintf(stderr, "failed to open %s\n", mydata->name); free(mydata->name); free(mydata); return 0; } while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { if( 0 == strcmp(archive_entry_pathname(entry), contentFile)) { o_log(DEBUGM, "%s", (char *)archive_compression_name(a)); o_log(DEBUGM, "%s", (char *)archive_format_name(a)); o_log(DEBUGM, "%s", (char *)archive_entry_pathname(entry)); size = archive_entry_size(entry); if(size <= 0) o_log(DEBUGM, "zero size"); if ((buf = (char *)malloc(size+1)) == NULL) o_log(ERROR, "cannot allocate memory"); if ((size_t)archive_read_data(a, buf, size) != size) o_log(DEBUGM, "cannot read data"); buf[size] = '\0'; *ptr = buf; } else archive_read_data_skip(a); } archive_read_close(a); archive_read_finish(a); free(mydata); return size; }
void xbps_repo_close(struct xbps_repo *repo) { assert(repo); if (repo->ar != NULL) archive_read_finish(repo->ar); if (repo->idx != NULL) { xbps_object_release(repo->idx); repo->idx = NULL; } if (repo->idxmeta != NULL) { xbps_object_release(repo->idxmeta); repo->idxmeta = NULL; } if (repo->fd != -1) close(repo->fd); free(repo); }
static void test2(void) { struct archive_entry *ae; struct archive *a; const char *name = "test_read_format_iso_2.iso.Z"; extract_reference_file(name); assert((a = archive_read_new()) != NULL); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_compression_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, name, 512)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualString(".", archive_entry_pathname(ae)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualString("A", archive_entry_pathname(ae)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualString("A/B", archive_entry_pathname(ae)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualString("C", archive_entry_pathname(ae)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); assertEqualString("C/D", archive_entry_pathname(ae)); assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS); assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660); assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); assertEqualInt(ARCHIVE_OK, archive_read_finish(a)); }