#include <pakfire/private.h>
#include <pakfire/util.h>
+#define BLOCKSIZE 1024 * 1024 // 1MB
+
+typedef struct archive_checksum {
+ char* filename;
+ char* checksum;
+ archive_checksum_algo_t algo;
+} archive_checksum_t;
+
+struct _PakfireArchive {
+ Pakfire pakfire;
+ char* path;
+
+ // metadata
+ int format;
+
+ PakfireFile filelist;
+ archive_checksum_t** checksums;
+
+ // Signatures
+ PakfireArchiveSignature* signatures;
+ int signatures_loaded;
+
+ int nrefs;
+};
+
+struct _PakfireArchiveSignature {
+ PakfireKey key;
+ char* sigdata;
+ int nrefs;
+};
+
+struct payload_archive_data {
+ struct archive* archive;
+ char buffer[BLOCKSIZE];
+};
+
static void configure_archive(struct archive* a) {
archive_read_support_filter_all(a);
archive_read_support_format_all(a);
*a = archive_read_new();
configure_archive(*a);
- if (archive_read_open_filename(*a, archive->path, PAKFIRE_ARCHIVE_BLOCKSIZE) == ARCHIVE_OK) {
+ if (archive_read_open_filename(*a, archive->path, BLOCKSIZE) == ARCHIVE_OK) {
return 0;
}
*data_size = 0;
for (;;) {
- *data = pakfire_realloc(*data, *data_size + PAKFIRE_ARCHIVE_BLOCKSIZE);
-
- ssize_t size = archive_read_data(a, *data + *data_size,
- PAKFIRE_ARCHIVE_BLOCKSIZE);
+ *data = pakfire_realloc(*data, *data_size + BLOCKSIZE);
+ ssize_t size = archive_read_data(a, *data + *data_size, BLOCKSIZE);
if (size == 0)
break;
static int pakfire_archive_parse_entry_format(PakfireArchive archive,
struct archive* a, struct archive_entry* e) {
- char format[PAKFIRE_ARCHIVE_FORMAT_SIZE + 1];
- format[PAKFIRE_ARCHIVE_FORMAT_SIZE] = '\0';
+ char format[10];
+ format[sizeof(*format)] = '\0';
- archive_read_data(a, &format, PAKFIRE_ARCHIVE_FORMAT_SIZE);
+ archive_read_data(a, &format, sizeof(*format));
archive->format = atoi(format);
DEBUG("Archive at %p format is %d\n", archive, archive->format);
#ifndef PAKFIRE_ARCHIVE_H
#define PAKFIRE_ARCHIVE_H
-#include <archive.h>
+#include <stddef.h>
#include <pakfire/types.h>
PAKFIRE_ARCHIVE_VERIFY_ERROR,
} pakfire_archive_verify_status_t;
+typedef enum pakfire_archive_flags {
+ PAKFIRE_ARCHIVE_USE_PAYLOAD = 1 << 0,
+} pakfire_archive_flags_t;
+
PakfireArchive pakfire_archive_create(Pakfire pakfire);
PakfireArchive pakfire_archive_ref(PakfireArchive archive);
void pakfire_archive_unref(PakfireArchive archive);
void pakfire_archive_signature_unref(PakfireArchiveSignature signature);
const char* pakfire_archive_signature_get_data(PakfireArchiveSignature signature);
-enum pakfire_archive_flags {
- PAKFIRE_ARCHIVE_USE_PAYLOAD = 1 << 0,
-};
-
#define PAKFIRE_ARCHIVE_FN_CHECKSUMS "chksums"
#define PAKFIRE_ARCHIVE_FN_FILELIST "filelist"
#define PAKFIRE_ARCHIVE_FN_FORMAT "pakfire-format"
#ifdef PAKFIRE_PRIVATE
-#define PAKFIRE_ARCHIVE_BLOCKSIZE 10240
-#define PAKFIRE_ARCHIVE_FORMAT_SIZE 5
-
typedef enum archive_checksum_algo {
PAKFIRE_CHECKSUM_UNKNOWN = 0,
PAKFIRE_CHECKSUM_SHA512,
} archive_checksum_algo_t;
-typedef struct archive_checksum {
- char* filename;
- char* checksum;
- archive_checksum_algo_t algo;
-} archive_checksum_t;
-
-struct _PakfireArchive {
- Pakfire pakfire;
- char* path;
-
- // metadata
- int format;
-
- PakfireFile filelist;
- archive_checksum_t** checksums;
-
- // Signatures
- PakfireArchiveSignature* signatures;
- int signatures_loaded;
-
- int nrefs;
-};
-
-struct _PakfireArchiveSignature {
- PakfireKey key;
- char* sigdata;
- int nrefs;
-};
-
-struct payload_archive_data {
- struct archive* archive;
- char buffer[PAKFIRE_ARCHIVE_BLOCKSIZE];
-};
-
#endif
#endif /* PAKFIRE_ARCHIVE_H */