FILE* f = fdopen(fd, "w");
// Write the finished package
- const char* filename = pakfire_packager_finish(packager, f);
- if (!filename) {
+ r = pakfire_packager_finish(packager, f);
+ if (r) {
ERROR(pakfire, "pakfire_packager_finish() failed: %s\n", strerror(errno));
goto ERROR;
}
// Close the file
fclose(f);
+ char* filename = pakfire_packager_filename(packager);
+ if (!filename)
+ goto ERROR;
+
// Move the temporary file to destination
r = renameat(AT_FDCWD, tempfile, dfd, filename);
+ free(filename);
if (r)
goto ERROR;
struct pakfire_packager* pakfire_packager_ref(struct pakfire_packager* packager);
struct pakfire_packager* pakfire_packager_unref(struct pakfire_packager* packager);
-const char* pakfire_packager_finish(struct pakfire_packager* packager, FILE* f);
+char* pakfire_packager_filename(struct pakfire_packager* packager);
+
+int pakfire_packager_finish(struct pakfire_packager* packager, FILE* f);
int pakfire_packager_add(struct pakfire_packager* packager, const char* path);
int nrefs;
time_t time_created;
- char filename[NAME_MAX + 1];
-
PakfirePackage pkg;
PakfireFilelist filelist;
// Store a reference to the package
p->pkg = pakfire_package_ref(pkg);
- // Create filename
- snprintf(p->filename, sizeof(p->filename) - 1,
- "%s.pfm", pakfire_package_get_nevra(p->pkg));
-
// Create a new filelist
int r = pakfire_filelist_create(&p->filelist, p->pakfire);
if (r)
return NULL;
}
+PAKFIRE_EXPORT char* pakfire_packager_filename(struct pakfire_packager* packager) {
+ char* buffer = NULL;
+
+ // Get nevra
+ char* nevra = pakfire_package_get_nevra(packager->pkg);
+ if (!nevra)
+ return NULL;
+
+ int r = asprintf(&buffer, "%s.pfm", nevra);
+ free(nevra);
+
+ if (r < 0) {
+ if (buffer)
+ free(buffer);
+
+ return NULL;
+ }
+
+ return buffer;
+}
+
static int pakfire_packager_copy_data(struct pakfire_packager* packager,
struct archive* a, FILE* f) {
char buffer[BUFFER_SIZE];
It will create a new archive and write the package to the given file descriptor.
*/
-PAKFIRE_EXPORT const char* pakfire_packager_finish(struct pakfire_packager* packager, FILE* f) {
- char* filename = NULL;
+PAKFIRE_EXPORT int pakfire_packager_finish(struct pakfire_packager* packager, FILE* f) {
+ int r = 1;
// Store total instal size
pakfire_package_set_installsize(packager->pkg,
}
// Use the PAX format
- int r = archive_write_set_format_pax(a);
+ r = archive_write_set_format_pax(a);
if (r) {
ERROR(packager->pakfire, "Could not set format to PAX: %s\n",
archive_error_string(a));
if (r)
goto ERROR;
- // Return the filename
- filename = packager->filename;
+ // Success
+ r = 0;
ERROR:
if (a)
archive_free(a);
- return filename;
+ return r;
}
PAKFIRE_EXPORT int pakfire_packager_add(struct pakfire_packager* packager,