PAKFIRE_EXTRACT_DRY_RUN|PAKFIRE_EXTRACT_NO_PROGRESS);
}
-struct pakfire_filelist* pakfire_archive_get_filelist(struct pakfire_archive* archive) {
- if (!archive->filelist) {
- int r = pakfire_archive_load_filelist(archive);
- if (r)
- return NULL;
- }
+int pakfire_archive_get_filelist(struct pakfire_archive* self, struct pakfire_filelist** filelist) {
+ int r;
- if (!archive->filelist)
- return NULL;
+ // Load the filelist if we don't have one, yet
+ if (!self->filelist) {
+ r = pakfire_archive_load_filelist(self);
+ if (r < 0)
+ return r;
+ }
- return pakfire_filelist_ref(archive->filelist);
+ *filelist = pakfire_filelist_ref(self->filelist);
+ return 0;
}
int pakfire_archive_verify(struct pakfire_archive* archive, int* status) {
unsigned int pakfire_archive_get_format(struct pakfire_archive* archive);
-struct pakfire_filelist* pakfire_archive_get_filelist(struct pakfire_archive* archive);
+int pakfire_archive_get_filelist(struct pakfire_archive* self, struct pakfire_filelist** filelist);
int pakfire_archive_verify(struct pakfire_archive* archive, int* status);
}
static int pakfire_db_add_files(struct pakfire_db* db, unsigned long id, struct pakfire_archive* archive) {
+ struct pakfire_filelist* filelist = NULL;
sqlite3_stmt* stmt = NULL;
- int r = 1;
+ int r;
// Get the filelist from the archive
- struct pakfire_filelist* filelist = pakfire_archive_get_filelist(archive);
- if (!filelist) {
- ERROR(db->ctx, "Could not fetch filelist from archive\n");
- return 1;
+ r = pakfire_archive_get_filelist(archive, &filelist);
+ if (r < 0) {
+ ERROR(db->ctx, "Could not fetch filelist from archive: %s\n", strerror(-r));
+ return r;
}
// Nothing to do if the list is empty
r = 0;
END:
+ if (filelist)
+ pakfire_filelist_unref(filelist);
if (stmt)
sqlite3_finalize(stmt);
- pakfire_filelist_unref(filelist);
return r;
}
static int pakfire_transaction_extract(struct pakfire_transaction* transaction,
struct pakfire_package* pkg, struct pakfire_archive* archive) {
+ struct pakfire_filelist* filelist = NULL;
+ int r;
+
const char* nevra = pakfire_package_get_string(pkg, PAKFIRE_PKG_NEVRA);
// Update status
pakfire_transaction_status(transaction, _("Installing %s..."), nevra);
// Extract payload
- int r = pakfire_archive_extract(archive, NULL, 0);
+ r = pakfire_archive_extract(archive, NULL, 0);
if (r) {
ERROR(transaction->ctx, "Could not extract package %s: %m\n",
nevra);
}
// Is it necessary to call ldconfig?
- struct pakfire_filelist* filelist = pakfire_archive_get_filelist(archive);
- if (filelist) {
- int need_ldconfig = pakfire_filelist_contains(filelist, "*/lib*.so.?");
+ r = pakfire_archive_get_filelist(archive, &filelist);
+ if (r < 0)
+ return r;
- // Update the runtime linker cache
- if (need_ldconfig)
- pakfire_jail_ldconfig(transaction->pakfire);
+ // Update the runtime linker cache
+ if (pakfire_filelist_contains(filelist, "*/lib*.so.?"))
+ pakfire_jail_ldconfig(transaction->pakfire);
+ if (filelist)
pakfire_filelist_unref(filelist);
- }
- return r;
+ return 0;
}
static int pakfire_transaction_erase(struct pakfire_transaction* transaction,
static PyObject* Archive_get_filelist(ArchiveObject* self) {
struct pakfire_filelist* filelist = NULL;
+ int r;
Py_BEGIN_ALLOW_THREADS
// Fetch the filelist
- filelist = pakfire_archive_get_filelist(self->archive);
- if (!filelist) {
+ r = pakfire_archive_get_filelist(self->archive, &filelist);
+ if (r < 0) {
Py_BLOCK_THREADS
+
+ errno = -r;
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
Py_END_ALLOW_THREADS
// Convert to filelist
- PyObject* _filelist = PyList_FromFileList(filelist);
+ PyObject* result = PyList_FromFileList(filelist);
// Cleanup
pakfire_filelist_unref(filelist);
- return _filelist;
+ return result;
}
static struct PyMethodDef Archive_methods[] = {
ASSERT_SUCCESS(pakfire_archive_open(&archive, t->pakfire, TEST_SRC_PATH TEST_PKG1_PATH));
// Fetch the filelist
- ASSERT(list = pakfire_archive_get_filelist(archive));
+ ASSERT_SUCCESS(pakfire_archive_get_filelist(archive, &list));
// This packages has 7 files
ASSERT(pakfire_filelist_length(list) == 7);
ASSERT(installed_size == 0);
// Fetch the filelist
- filelist = pakfire_archive_get_filelist(archive);
- ASSERT(filelist);
+ ASSERT_SUCCESS(pakfire_archive_get_filelist(archive, &filelist));
// There must be exactly one file in this package
ASSERT(pakfire_filelist_length(filelist) == 1);