#include <pakfire/archive.h>
#include <pakfire/constants.h>
+#include <pakfire/file.h>
+#include <pakfire/filelist.h>
#include <pakfire/logging.h>
#include <pakfire/package.h>
#include <pakfire/packager.h>
int nrefs;
PakfirePackage pkg;
+ PakfireFilelist filelist;
struct archive* payload;
FILE* fpayload;
if (packager->fpayload)
fclose(packager->fpayload);
+ pakfire_filelist_unref(packager->filelist);
pakfire_package_unref(packager->pkg);
pakfire_unref(packager->pakfire);
}
// Store a reference to the package
p->pkg = pakfire_package_ref(pkg);
+ // Create a new filelist
+ int r = pakfire_filelist_create(&p->filelist);
+ if (r)
+ goto ERROR;
+
// Start payload
- int r = pakfire_packager_create_payload(p, 1);
- if (r) {
- pakfire_packager_free(p);
- return r;
- }
+ r = pakfire_packager_create_payload(p, 1);
+ if (r)
+ goto ERROR;
*packager = p;
return 0;
+
+ERROR:
+ pakfire_packager_free(p);
+
+ return r;
}
PAKFIRE_EXPORT struct pakfire_packager* pakfire_packager_ref(
return 0;
}
+static int pakfire_packager_write_filelist(struct pakfire_packager* packager,
+ struct archive* a) {
+ char* buffer = NULL;
+ int r = 1;
+
+ for (unsigned int i = 0; i < pakfire_filelist_size(packager->filelist); i++) {
+ PakfireFile file = pakfire_filelist_get(packager->filelist, i);
+
+ char type = '-';
+
+ if (pakfire_file_is_dir(file))
+ type = 'd';
+
+ if (pakfire_file_is_symlink(file))
+ type = 'l';
+
+ if (pakfire_file_is_char(file))
+ type = 'c';
+
+ const char* chksum = pakfire_file_get_chksum(file);
+
+ asprintf(&buffer,
+ "%s%c %-10zu %-10s %-10s %-6d %-12ld %s %s %s\n",
+ (buffer) ? buffer : "",
+ type,
+ pakfire_file_get_size(file),
+ pakfire_file_get_user(file),
+ pakfire_file_get_group(file),
+ pakfire_file_get_mode(file),
+ pakfire_file_get_time(file),
+ (chksum) ? chksum : "-",
+ "-", // XXX capabilities
+ pakfire_file_get_name(file)
+ );
+
+ pakfire_file_unref(file);
+ }
+
+ // Create a new file entry
+ struct archive_entry* entry = archive_entry_new();
+ if (!entry)
+ goto ERROR;
+
+ // Set filename
+ archive_entry_set_pathname(entry, PAKFIRE_ARCHIVE_FN_FILELIST);
+
+ // This is a regular file
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_perm(entry, 0644);
+
+ // Set length
+ archive_entry_set_size(entry, strlen(buffer));
+
+ // This is the end of the header
+ r = archive_write_header(a, entry);
+ if (r) {
+ ERROR(packager->pakfire, "Error writing header: %s\n", archive_error_string(a));
+ goto ERROR;
+ }
+
+ // Write content
+ r = archive_write_data(a, buffer, strlen(buffer));
+ if (r < 0) {
+ ERROR(packager->pakfire, "Error writing data: %s\n", archive_error_string(a));
+ goto ERROR;
+ }
+
+ // Success
+ r = 0;
+
+ERROR:
+ if (buffer)
+ free(buffer);
+
+ return r;
+}
+
static int pakfire_packager_write_payload(struct pakfire_packager* packager,
struct archive* a) {
struct stat st;
if (r)
goto ERROR;
+ // Write the filelist
+ r = pakfire_packager_write_filelist(packager, a);
+ if (r)
+ goto ERROR;
+
// Write the payload
r = pakfire_packager_write_payload(packager, a);
if (r)
return r;
}
+ // Create a file
+ PakfireFile file;
+ r = pakfire_file_create(&file);
+ if (r)
+ return r;
+
// Create a new file entry
struct archive_entry* entry = archive_entry_new();
if (!entry)
// Set path in archive
archive_entry_set_pathname(entry, path);
+ pakfire_file_set_name(file, path);
// Copy all attributes from stat()
archive_entry_copy_stat(entry, &st);
+ pakfire_file_copy_stat(file, &st);
// Write the header
r = archive_write_header(packager->payload, entry);
goto ERROR;
}
+ // Append the file to the filelist
+ pakfire_filelist_append(packager->filelist, file);
+
// Successful
r = 0;
ERROR:
+ pakfire_file_unref(file);
+
if (entry)
archive_entry_free(entry);