#include <errno.h>
#include <stdlib.h>
+// libsolv
#include <solv/selection.h>
#include <solv/transaction.h>
#include <solv/solverdebug.h>
-// Enable legacy logging
-#define PAKFIRE_LEGACY_LOGGING
-
#include <pakfire/archive.h>
#include <pakfire/ctx.h>
#include <pakfire/db.h>
return PAKFIRE_STEP_DOWNGRADED;
default:
- ERROR(transaction->pakfire, "Unhandled step type 0x%x. Ignoring.\n",
- (unsigned int)type);
+ CTX_ERROR(transaction->ctx,
+ "Unhandled step type 0x%x. Ignoring.\n", (unsigned int)type);
+
return PAKFIRE_STEP_UNKNOWN;
}
}
}
}
-static void pakfire_transaction_free(struct pakfire_transaction* transaction) {
- pakfire_transaction_free_archives_and_packages(transaction);
-
- if (transaction->userinstalled) {
- for (char** userinstalled = transaction->userinstalled; *userinstalled; userinstalled++)
- free(*userinstalled);
- free(transaction->userinstalled);
- }
-
- if (transaction->transaction)
- transaction_free(transaction->transaction);
- if (transaction->solver)
- solver_free(transaction->solver);
- if (transaction->pakfire)
- pakfire_unref(transaction->pakfire);
- if (transaction->ctx)
- pakfire_ctx_unref(transaction->ctx);
- free(transaction);
-}
-
static int pakfire_transaction_import_transaction(struct pakfire_transaction* transaction) {
int r;
// Clone the transaction to keep a copy of it
transaction->transaction = solver_create_transaction(transaction->solver);
if (!transaction->transaction) {
- ERROR(transaction->pakfire, "Could not create transaction from solver: %m\n");
+ CTX_ERROR(transaction->ctx, "Could not create transaction from solver: %m\n");
return 1;
}
transaction->userinstalled = calloc(userinstalled.count + 1, sizeof(*transaction->userinstalled));
if (!transaction->userinstalled) {
- ERROR(transaction->pakfire, "Could not allocate userinstalled: %m\n");
+ CTX_ERROR(transaction->ctx, "Could not allocate userinstalled: %m\n");
r = -errno;
goto ERROR;
}
// Allocate a new solver
transaction->solver = solver_create(pool);
if (!transaction->solver) {
- ERROR(transaction->pakfire, "Could not allocate solver: %m\n");
+ CTX_ERROR(transaction->ctx, "Could not allocate solver: %m\n");
return -errno;
}
goto ERROR;
// Return the transaction
- *transaction = t;
+ *transaction = pakfire_transaction_ref(t);
return 0;
ERROR:
- pakfire_transaction_free(t);
+ if (t)
+ pakfire_transaction_unref(t);
+
return r;
}
+static void pakfire_transaction_free(struct pakfire_transaction* transaction) {
+ pakfire_transaction_free_archives_and_packages(transaction);
+
+ if (transaction->userinstalled) {
+ for (char** userinstalled = transaction->userinstalled; *userinstalled; userinstalled++)
+ free(*userinstalled);
+ free(transaction->userinstalled);
+ }
+
+ if (transaction->transaction)
+ transaction_free(transaction->transaction);
+ if (transaction->solver)
+ solver_free(transaction->solver);
+ if (transaction->pakfire)
+ pakfire_unref(transaction->pakfire);
+ if (transaction->ctx)
+ pakfire_ctx_unref(transaction->ctx);
+ free(transaction);
+}
+
PAKFIRE_EXPORT struct pakfire_transaction* pakfire_transaction_ref(
struct pakfire_transaction* transaction) {
transaction->nrefs++;
const char* selection = pool_selection2str(pool, &transaction->jobs, 0);
if (selection)
- DEBUG(transaction->pakfire, "Solving: %s\n", selection);
+ CTX_DEBUG(transaction->ctx, "Solving: %s\n", selection);
RETRY:
// Save time when we starting solving
// Save time when we finished solving
solving_end = clock();
- DEBUG(transaction->pakfire, "Solved request in %.4fms\n",
+ CTX_DEBUG(transaction->ctx, "Solved request in %.4fms\n",
(double)(solving_end - solving_start) * 1000 / CLOCKS_PER_SEC);
switch (r) {
p = pakfire_transaction_get_problem_string(transaction, flags);
if (p) {
- DEBUG(transaction->pakfire,
+ CTX_DEBUG(transaction->ctx,
"Could not solve request: %s\n%s\n", selection, p);
// Return the problems
queue_push2(&jobs, SOLVER_SOLVABLE_PROVIDES, id);
}
- DEBUG(transaction->pakfire, "Found %d match(es) for '%s'\n", jobs.count / 2, what);
+ CTX_DEBUG(transaction->ctx, "Found %d match(es) for '%s'\n", jobs.count / 2, what);
// Set action and global flags
for (int i = 0; i < jobs.count; i += 2) {
}
if (s)
- DEBUG(transaction->pakfire, "%s", s);
+ CTX_DEBUG(transaction->ctx, "%s", s);
ERROR:
queue_free(&classes);
// Nothing to do if this step does not have an archive
if (!archive) {
- DEBUG(transaction->pakfire, "Package %s requires no archive\n", nevra);
+ CTX_DEBUG(transaction->ctx, "Package %s requires no archive\n", nevra);
return 0;
}
// Fetch digest from package
const unsigned char* expected_digest = pakfire_package_get_digest(pkg, &digest_type, &length);
if (!expected_digest) {
- DEBUG(transaction->pakfire, "Package %s has no digest\n", nevra);
+ CTX_DEBUG(transaction->ctx, "Package %s has no digest\n", nevra);
return 0;
}
// Extract payload
int r = pakfire_archive_extract(archive, NULL, 0);
if (r) {
- ERROR(transaction->pakfire, "Could not extract package %s: %m\n",
+ CTX_ERROR(transaction->ctx, "Could not extract package %s: %m\n",
nevra);
return r;
}
const char* nevra = pakfire_package_get_string(pkg, PAKFIRE_PKG_NEVRA);
const enum pakfire_steps type = pakfire_transaction_get_step_type(transaction, pkg);
- DEBUG(transaction->pakfire, "Running %s (%s) for %s\n",
+ CTX_DEBUG(transaction->ctx, "Running %s (%s) for %s\n",
pakfire_action_type_string(action), pakfire_step_type_string(type), nevra);
int r = 0;
}
if (r)
- ERROR(transaction->pakfire, "Step %s (%u) for %s has failed: %m\n",
+ CTX_ERROR(transaction->ctx, "Step %s (%u) for %s has failed: %m\n",
pakfire_action_type_string(action), type, nevra);
return r;
// End loop if action was unsuccessful
if (r) {
- DEBUG(transaction->pakfire, "Step %u failed: %m\n", i);
+ CTX_DEBUG(transaction->ctx, "Step %u failed: %m\n", i);
break;
}
}
return 0;
}
-static int pakfire_usrmove_symlink(struct pakfire* pakfire,
+static int pakfire_usrmove_symlink(struct pakfire_ctx* ctx, struct pakfire* pakfire,
const char* src, const char* dst) {
char link[PATH_MAX];
char path[PATH_MAX];
// Create the symlink
r = symlink(dst, link);
if (r) {
- DEBUG(pakfire, "Could not create symlink %s to %s: %m\n", dst, link);
+ CTX_DEBUG(ctx, "Could not create symlink %s to %s: %m\n", dst, link);
return r;
}
- DEBUG(pakfire, "Created symlink %s --> %s\n", link, dst);
+ CTX_DEBUG(ctx, "Created symlink %s --> %s\n", link, dst);
return 0;
}
that /bin, /sbin, /lib and /lib64 are symlinks to their
corresponding path in /usr.
*/
-static int pakfire_usrmove(struct pakfire* pakfire) {
+static int pakfire_usrmove(struct pakfire_ctx* ctx, struct pakfire* pakfire) {
int r;
- r = pakfire_usrmove_symlink(pakfire, "/bin", "usr/bin");
+ r = pakfire_usrmove_symlink(ctx, pakfire, "/bin", "usr/bin");
if (r)
return r;
- r = pakfire_usrmove_symlink(pakfire, "/sbin", "usr/sbin");
+ r = pakfire_usrmove_symlink(ctx, pakfire, "/sbin", "usr/sbin");
if (r)
return r;
- r = pakfire_usrmove_symlink(pakfire, "/lib", "usr/lib");
+ r = pakfire_usrmove_symlink(ctx, pakfire, "/lib", "usr/lib");
if (r)
return r;
- r = pakfire_usrmove_symlink(pakfire, "/lib64", "usr/lib64");
+ r = pakfire_usrmove_symlink(ctx, pakfire, "/lib64", "usr/lib64");
if (r)
return r;
struct pakfire_db* db;
int r;
- DEBUG(transaction->pakfire, "Running Transaction %p\n", transaction);
+ CTX_DEBUG(transaction->ctx, "Running Transaction %p\n", transaction);
// Open all archives
r = pakfire_transaction_open_archives(transaction);
// Open the database
r = pakfire_db_open(&db, transaction->pakfire, PAKFIRE_DB_READWRITE);
if (r) {
- ERROR(transaction->pakfire, "Could not open the database\n");
+ CTX_ERROR(transaction->ctx, "Could not open the database\n");
return r;
}
goto ERROR;
// Make sure /usr-move is working
- r = pakfire_usrmove(transaction->pakfire);
+ r = pakfire_usrmove(transaction->ctx, transaction->pakfire);
if (r)
goto ERROR;
if (r)
goto ERROR;
- DEBUG(transaction->pakfire, "The transaction has finished successfully\n");
+ CTX_DEBUG(transaction->ctx, "The transaction has finished successfully\n");
// Reload database for next transaction
// Initialize the HTTP client
r = pakfire_httpclient_create(&httpclient, transaction->ctx, NULL);
if (r) {
- ERROR(transaction->pakfire, "Could not initialize HTTP client: %m\n");
+ CTX_ERROR(transaction->ctx, "Could not initialize HTTP client: %m\n");
return 1;
}
if (r) {
const char* nevra = pakfire_package_get_string(pkg, PAKFIRE_PKG_NEVRA);
- ERROR(transaction->pakfire, "Could not add download to queue: %s: %m\n", nevra);
+ CTX_ERROR(transaction->ctx, "Could not add download to queue: %s: %m\n", nevra);
goto ERROR;
}
}
// Skip running an empty transaction
if (!transaction->num) {
- DEBUG(transaction->pakfire, "Empty transaction. Skipping...\n");
+ CTX_DEBUG(transaction->ctx, "Empty transaction. Skipping...\n");
return 0;
}
// Check if we should continue
r = pakfire_ctx_confirm(transaction->ctx, transaction->pakfire, dump, _("Is this okay?"));
if (r) {
- ERROR(transaction->pakfire, "Transaction aborted upon user request\n");
+ CTX_ERROR(transaction->ctx, "Transaction aborted upon user request\n");
goto ERROR;
}
const char* files[transaction->num + 1];
unsigned int num = 0;
- DEBUG(transaction->pakfire, "Writing transaction to %s...\n", path);
+ CTX_DEBUG(transaction->ctx, "Writing transaction to %s...\n", path);
// Open all archives
r = pakfire_transaction_open_archives(transaction);