#include <pakfire/scriptlet.h>
#include <pakfire/util.h>
-#define BLOCKSIZE 1024 * 1024 // 1MB
-
struct pakfire_archive_chksum {
STAILQ_ENTRY(pakfire_archive_chksum) nodes;
struct payload_archive_data {
struct archive* archive;
- char buffer[BLOCKSIZE];
+ char buffer[1024 * 1024];
};
static void configure_archive(struct archive* a) {
return 0;
}
-static int archive_read(struct archive* a, void** data, size_t* data_size) {
+static int archive_read_to_buffer(Pakfire pakfire, struct archive* a,
+ struct archive_entry* entry, char** data, size_t* data_size) {
*data = NULL;
*data_size = 0;
- for (;;) {
- *data = realloc(*data, *data_size + BLOCKSIZE);
-
- ssize_t size = archive_read_data(a, *data + *data_size, BLOCKSIZE);
- if (size == 0)
- break;
-
- if (size < 0) {
- free(*data);
- *data = NULL;
+ size_t required_size = archive_entry_size(entry);
+ if (!required_size)
+ return 0;
- return 1;
- }
+ // Allocate a block of the required size
+ *data = malloc(required_size);
+ if (!*data)
+ return ENOMEM;
- *data_size += size;
+ ssize_t bytes_read = archive_read_data(a, *data, required_size);
+ if (bytes_read < 0) {
+ ERROR(pakfire, "Could not read from archive: %s\n", archive_error_string(a));
+ free(*data);
+ return 1;
}
+ *data_size = bytes_read;
+
return 0;
}
static int pakfire_archive_parse_entry_format(PakfireArchive archive,
struct archive* a, struct archive_entry* e) {
char format[10];
- format[sizeof(*format)] = '\0';
+ size_t size = sizeof(format);
- archive_read_data(a, &format, sizeof(*format));
+ archive_read_to_buffer(archive->pakfire, a, e, (char**)&format, &size);
archive->format = atoi(format);
DEBUG(archive->pakfire, "Archive at %p format is %d\n",
static int pakfire_archive_parse_entry_metadata(PakfireArchive archive,
struct archive* a, struct archive_entry* e) {
- void* data;
+ char* data;
size_t data_size;
- int r = archive_read(a, &data, &data_size);
+ int r = archive_read_to_buffer(archive->pakfire, a, e, &data, &data_size);
if (r)
return r;
// Parse metadata file
- r = pakfire_parser_parse_data(archive->parser, (const char*)data, data_size, NULL);
+ r = pakfire_parser_parse_data(archive->parser, data, data_size, NULL);
free(data);
return r;
char* data;
size_t data_size;
- int r = archive_read(a, (void**)&data, &data_size);
+ int r = archive_read_to_buffer(archive->pakfire, a, e, &data, &data_size);
if (r) {
return 1;
}
char* data;
size_t data_size;
- int r = archive_read(a, (void**)&data, &data_size);
+ int r = archive_read_to_buffer(archive->pakfire, a, e, &data, &data_size);
if (r)
return 1;
// Set the type
scriptlet->type = pakfire_scriptlet_type_from_filename(filename);
- int r = archive_read(a, &scriptlet->data, &scriptlet->size);
+ int r = archive_read_to_buffer(archive->pakfire, a, e, &scriptlet->data, &scriptlet->size);
if (r)
return r;
}
PAKFIRE_EXPORT int pakfire_archive_read(PakfireArchive archive, const char* filename,
- void** data, size_t* data_size, int flags) {
+ char** data, size_t* data_size, int flags) {
struct archive* a;
struct archive* pa = NULL;
struct archive_entry* entry;
goto out;
}
- r = archive_read(use_payload ? pa : a, data, data_size);
+ r = archive_read_to_buffer(archive->pakfire, use_payload ? pa : a, entry,
+ data, data_size);
out:
if (pa)
char* data;
size_t data_size;
- int r = archive_read(a, (void**)&data, &data_size);
+ int r = archive_read_to_buffer(archive->pakfire, a, e, &data, &data_size);
if (r)
return 1;