return pakfire_parser_get(archive->parser, key);
}
-static int archive_copy_data(struct archive* in, struct archive* out) {
+static int archive_copy_data(Pakfire pakfire, struct archive* in, struct archive* out) {
int r;
const void* buff;
if (r == ARCHIVE_EOF)
break;
- if (r != ARCHIVE_OK)
+ if (r != ARCHIVE_OK) {
+ ERROR(pakfire, "Could not read data from archive: %s\n",
+ archive_error_string(in));
+
return r;
+ }
r = archive_write_data_block(out, buff, size, offset);
- if (r != ARCHIVE_OK)
+ if (r != ARCHIVE_OK) {
+ ERROR(pakfire, "Could not write data to disk: %s\n",
+ archive_error_string(out));
+
return r;
+ }
}
return 0;
// Reached the end of the archive.
if (r == ARCHIVE_EOF) {
- r = 0;
+ r = ARCHIVE_OK;
break;
}
DEBUG(pakfire, "Extracting %s (%zu bytes)\n", pathname, size);
pakfire_free(pathname);
+ // Create file
r = archive_write_header(ext, entry);
- if (r != ARCHIVE_OK)
- goto out;
+ if (r != ARCHIVE_OK) {
+ ERROR(pakfire, "Could not extract file %s: %s\n",
+ pathname, archive_error_string(ext));
+ break;
+ }
+ // Copy payload
if (size > 0) {
- r = archive_copy_data(a, ext);
-
+ r = archive_copy_data(pakfire, a, ext);
if (r != ARCHIVE_OK)
- goto out;
+ break;
}
+ // Commit to disk
r = archive_write_finish_entry(ext);
+ if (r != ARCHIVE_OK)
+ break;
}
-out:
archive_write_close(ext);
archive_write_free(ext);