// Payload
struct archive* payload;
FILE* fpayload;
- struct archive* mtree;
- FILE* fmtree;
size_t installsize;
unsigned int files;
unsigned int num_scriptlets;
};
-static int pakfire_packager_create_mtree(struct pakfire* pakfire, struct archive** mtree,
- FILE** f, const char** fields) {
- char path[] = PAKFIRE_TMP_DIR "/pakfire-mtree.XXXXXX";
- int r;
-
- // Create an mtree
- *mtree = archive_write_new();
- if (!*mtree) {
- ERROR(pakfire, "archive_write_new() failed\n");
- goto ERROR;
- }
-
- // Use mtree format
- r = archive_write_set_format_mtree(*mtree);
- if (r) {
- ERROR(pakfire, "Could not set format to mtree: %s\n",
- archive_error_string(*mtree));
- goto ERROR;
- }
-
- // Always compress using Zstd
- r = archive_write_add_filter_zstd(*mtree);
- if (r) {
- ERROR(pakfire, "Could not enable Zstandard compression: %s\n",
- archive_error_string(*mtree));
- goto ERROR;
- }
-
- // Enable mtree fields
- if (fields) {
- for (const char** field = fields; *field; field++) {
- r = archive_write_set_options(*mtree, *field);
- if (r) {
- ERROR(pakfire, "Could not set mtree options %s: %s\n",
- *field, archive_error_string(*mtree));
- goto ERROR;
- }
- }
- }
-
- // Create a new temporary file
- *f = pakfire_mktemp(path);
- if (!*f)
- goto ERROR;
-
- // Unlink the file straight away
- unlink(path);
-
- // Write mtree to file
- r = archive_write_open_FILE(*mtree, *f);
- if (r)
- goto ERROR;
-
- return 0;
-
-ERROR:
- if (*mtree) {
- archive_write_free(*mtree);
- *mtree = NULL;
- }
-
- if (*f) {
- fclose(*f);
- *f = NULL;
- }
-
- return 1;
-}
-
static int pakfire_packager_create_payload(struct pakfire_packager* p) {
char path[] = PAKFIRE_TMP_DIR "/pakfire-payload.XXXXXX";
if (r)
return r;
- static const char* mtree_fields[] = {
- // Disable the default
- "!all",
-
- // Enable standard file fields
- "device",
- "gname",
- "link",
- "mode",
- "nlink",
- "size",
- "time",
- "type",
- "uname",
-
- // Enable cryptographic checksums
- "sha512",
- "sha256",
-
- NULL,
- };
-
- // Create an mtree
- r = pakfire_packager_create_mtree(p->pakfire, &p->mtree, &p->fmtree, mtree_fields);
- if (r) {
- ERROR(p->pakfire, "Could not create mtree\n");
- return r;
- }
-
// Add a requirement for the cryptographic algorithms we are using
pakfire_package_add_requires(p->pkg, "pakfire(Digest-SHA512)");
pakfire_package_add_requires(p->pkg, "pakfire(Digest-SHA256)");
if (packager->fpayload)
fclose(packager->fpayload);
- // mtree
- if (packager->mtree)
- archive_write_free(packager->mtree);
-
- if (packager->fmtree)
- fclose(packager->fmtree);
-
if (packager->reader)
archive_read_free(packager->reader);
}
static int pakfire_packager_write_file_from_buffer(struct pakfire_packager* packager,
- struct archive* a, struct archive* mtree, const char* filename, mode_t mode, const char* buffer) {
+ struct archive* a, const char* filename, mode_t mode, const char* buffer) {
size_t size = strlen(buffer);
// Create a new file
goto ERROR;
}
- // Add this file to the mtree
- if (mtree) {
- r = archive_write_header(mtree, entry);
- if (r) {
- ERROR(packager->pakfire, "Error adding file to mtree: %s\n",
- archive_error_string(mtree));
- goto ERROR;
- }
-
- // Write content
- r = archive_write_data(mtree, buffer, strlen(buffer));
- if (r < 0) {
- ERROR(packager->pakfire, "Error writing data: %s\n", archive_error_string(mtree));
- goto ERROR;
- }
- }
-
// Success
r = 0;
DEBUG(packager->pakfire, "Writing package format\n");
- int r = pakfire_packager_write_file_from_buffer(packager, a, NULL,
+ int r = pakfire_packager_write_file_from_buffer(packager, a,
"pakfire-format", 0444, buffer);
if (r)
return r;
}
static int pakfire_packager_write_metadata(struct pakfire_packager* packager,
- struct archive* a, struct archive* mtree) {
+ struct archive* a) {
// Make metadata
char* buffer = pakfire_packager_make_metadata(packager);
if (!buffer)
DEBUG(packager->pakfire, "Generated package metadata:\n%s\n", buffer);
// Write buffer
- int r = pakfire_packager_write_file_from_buffer(packager, a, mtree,
+ int r = pakfire_packager_write_file_from_buffer(packager, a,
"PKGINFO", 0444, buffer);
free(buffer);
}
static int pakfire_packager_write_archive(struct pakfire_packager* packager,
- struct archive* a, struct archive* mtree, const char* filename,
+ struct archive* a, const char* filename,
struct archive** payload, FILE* f) {
struct stat st;
goto ERROR;
}
- // Add this file to the mtree
- if (mtree) {
- r = archive_write_header(mtree, entry);
- if (r) {
- ERROR(packager->pakfire, "Error adding file to mtree: %s\n",
- archive_error_string(mtree));
- goto ERROR;
- }
-
- r = pakfire_archive_copy_data_from_file(packager->pakfire, mtree, f);
- if (r) {
- ERROR(packager->pakfire, "Error copying data to mtree: %s\n",
- archive_error_string(mtree));
- goto ERROR;
- }
- }
-
// Success
r = 0;
}
static int pakfire_packager_write_scriptlet(struct pakfire_packager* packager,
- struct archive* a, struct archive* mtree, struct pakfire_scriptlet* scriptlet) {
+ struct archive* a, struct pakfire_scriptlet* scriptlet) {
char filename[PATH_MAX];
size_t size;
int r;
const char* data = pakfire_scriptlet_get_data(scriptlet, &size);
// Write file
- return pakfire_packager_write_file_from_buffer(packager, a, mtree, filename, 0544, data);
+ return pakfire_packager_write_file_from_buffer(packager, a, filename, 0544, data);
}
/*
It will create a new archive and write the package to the given file descriptor.
*/
int pakfire_packager_finish(struct pakfire_packager* packager, FILE* f) {
- struct archive* mtree = NULL;
- FILE* fmtree = NULL;
int r = 1;
// Add requires feature markers
goto ERROR;
}
- static const char* mtree_fields[] = {
- // Disable everything
- "!all",
-
- // File type is mandatory
- "type",
-
- // Include the file size
- "size",
-
- // Add the checksums
- "sha512",
- "sha256",
-
- NULL,
- };
-
- // Create an mtree for the checksums
- r = pakfire_packager_create_mtree(packager->pakfire, &mtree, &fmtree, mtree_fields);
- if (r) {
- ERROR(packager->pakfire, "Could not create mtree\n");
- goto ERROR;
- }
-
// Start with the format file
r = pakfire_packager_write_format(packager, a);
if (r) {
}
// Write the metadata
- r = pakfire_packager_write_metadata(packager, a, mtree);
+ r = pakfire_packager_write_metadata(packager, a);
if (r) {
ERROR(packager->pakfire, "Could not add metadata file to archive: %s\n",
archive_error_string(a));
goto ERROR;
}
- // Write the filelist in mtree format
+ // Write the payload
if (packager->files) {
- r = pakfire_packager_write_archive(packager, a, mtree, "FILELIST",
- &packager->mtree, packager->fmtree);
- if (r) {
- ERROR(packager->pakfire, "Could not add filelist to archive: %s\n",
- archive_error_string(a));
- goto ERROR;
- }
-
- // Write the payload
- r = pakfire_packager_write_archive(packager, a, mtree, "DATA",
+ r = pakfire_packager_write_archive(packager, a, "DATA",
&packager->payload, packager->fpayload);
if (r) {
ERROR(packager->pakfire, "Could not add payload to archive: %s\n",
// Write scriptlets
for (unsigned int i = 0; i < packager->num_scriptlets; i++) {
- r = pakfire_packager_write_scriptlet(packager, a, mtree, packager->scriptlets[i]);
+ r = pakfire_packager_write_scriptlet(packager, a, packager->scriptlets[i]);
if (r) {
ERROR(packager->pakfire, "Could not add scriptlet to the archive: %m\n");
goto ERROR;
}
}
- // Finish checksums
- r = archive_write_finish_entry(mtree);
- if (r) {
- ERROR(packager->pakfire, "Could not finish mtree: %s\n",
- archive_error_string(mtree));
- goto ERROR;
- }
-
- // Write checksums
- r = pakfire_packager_write_archive(packager, a, NULL, "CHKSUMS", &mtree, fmtree);
- if (r) {
- ERROR(packager->pakfire, "Could not add checksums to archive: %s\n",
- archive_error_string(a));
- goto ERROR;
- }
-
// Success
r = 0;
ERROR:
if (a)
archive_write_free(a);
- if (mtree)
- archive_write_free(mtree);
- if (fmtree)
- fclose(fmtree);
return r;
}
goto ERROR;
}
- // Write to mtree
- r = archive_write_header(packager->mtree, entry);
- if (r) {
- ERROR(packager->pakfire, "Adding file to mtree failed: %s\n",
- archive_error_string(packager->mtree));
- goto ERROR;
- }
-
// Copy the data of regular files
if (archive_entry_filetype(entry) == AE_IFREG) {
// Copy the payload into the archive
r = pakfire_archive_copy_data_from_file(packager->pakfire, packager->payload, f);
if (r)
goto ERROR;
-
- // Copy the payload into the mtree for hashing
- r = pakfire_archive_copy_data_from_file(packager->pakfire, packager->mtree, f);
- if (r)
- goto ERROR;
}
// Increment installsize