return 0;
}
-static int pakfire_transaction_run_script(pakfire_transaction* transaction,
- pakfire_db* db, const char* type, pakfire_package* pkg, pakfire_archive* archive) {
+static int pakfire_transaction_run_script(pakfire_transaction* transaction, pakfire_db* db,
+ pakfire_jail* jail, const char* type, pakfire_package* pkg, pakfire_archive* archive) {
pakfire_scriptlet* scriptlet = NULL;
+ int r = 0;
// Fetch scriptlet from archive if possible
if (archive)
// Nothing to do if there are no scriptlets
if (!scriptlet)
- return 0;
+ goto ERROR;
// Execute the scriptlet
- pakfire_scriptlet_execute(scriptlet, transaction->root);
+ r = pakfire_scriptlet_execute(scriptlet, jail);
+ if (r < 0) {
+ ERROR(transaction->ctx, "Failed to execute the scriptlet: %s\n", strerror(-r));
+ goto ERROR;
+ }
- pakfire_scriptlet_unref(scriptlet);
+ // Reset any error codes
+ r = 0;
- return 0;
+ERROR:
+ if (scriptlet)
+ pakfire_scriptlet_unref(scriptlet);
+
+ return r;
}
static int pakfire_transaction_extract(pakfire_transaction* transaction,
return 0;
}
-static int pakfire_transaction_run_step(pakfire_transaction* transaction,
- pakfire_db* db, const enum pakfire_actions action, pakfire_package* pkg, pakfire_archive* archive) {
+static int pakfire_transaction_run_step(pakfire_transaction* transaction, pakfire_db* db,
+ pakfire_jail* jail, const enum pakfire_actions action, pakfire_package* pkg, pakfire_archive* archive) {
if (!pkg) {
errno = EINVAL;
return 1;
switch (type) {
case PAKFIRE_STEP_INSTALL:
case PAKFIRE_STEP_REINSTALL:
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"pretransin", pkg, archive);
break;
case PAKFIRE_STEP_UPGRADE:
case PAKFIRE_STEP_DOWNGRADE:
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"pretransup", pkg, archive);
break;
case PAKFIRE_STEP_ERASE:
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"pretransun", pkg, archive);
break;
switch (type) {
case PAKFIRE_STEP_INSTALL:
case PAKFIRE_STEP_REINSTALL:
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"posttransin", pkg, archive);
break;
case PAKFIRE_STEP_UPGRADE:
case PAKFIRE_STEP_DOWNGRADE:
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"posttransup", pkg, archive);
break;
case PAKFIRE_STEP_ERASE:
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"posttransun", pkg, archive);
break;
if (r)
break;
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"prein", pkg, archive);
if (r)
break;
if (r)
break;
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"postin", pkg, archive);
break;
if (r)
break;
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"preup", pkg, archive);
if (r)
break;
if (r)
break;
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"postup", pkg, archive);
break;
case PAKFIRE_STEP_ERASE:
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"preun", pkg, archive);
if (r)
break;
if (r)
break;
- r = pakfire_transaction_run_script(transaction, db,
+ r = pakfire_transaction_run_script(transaction, db, jail,
"postun", pkg, archive);
break;
}
static int pakfire_transaction_run_steps(pakfire_transaction* transaction,
- pakfire_db* db, enum pakfire_actions action) {
+ pakfire_db* db, pakfire_jail* jail, enum pakfire_actions action) {
int r = 0;
// Update status
// Walk through all steps
for (unsigned int i = 0; i < transaction->num; i++) {
- r = pakfire_transaction_run_step(transaction, db, action,
+ r = pakfire_transaction_run_step(transaction, db, jail, action,
transaction->packages[i], transaction->archives[i]);
// End loop if action was unsuccessful
static int pakfire_transaction_perform(pakfire_transaction* transaction) {
pakfire_repo* repo = NULL;
+ pakfire_jail* jail = NULL;
pakfire_db* db;
size_t total_size = 0;
int r;
DEBUG(transaction->ctx, "Running Transaction %p\n", transaction);
+ // Create a new jail to execute any commands
+ r = pakfire_jail_create(&jail, transaction->ctx, transaction->root);
+ if (r < 0)
+ goto ERROR;
+
// Open all archives
r = pakfire_transaction_open_archives(transaction, &total_size);
- if (r)
- return r;
+ if (r < 0)
+ goto ERROR;
// Set the title
r = pakfire_progress_set_title(transaction->progress, "%s", _("Installing Packages..."));
if (r < 0)
- return r;
+ goto ERROR;
// Start the progress...
r = pakfire_progress_start(transaction->progress, total_size);
if (r < 0)
- return r;
+ goto ERROR;
// Open the database
r = pakfire_db_open(&db, transaction->ctx, transaction->root, PAKFIRE_DB_READWRITE);
if (r) {
ERROR(transaction->ctx, "Could not open the database\n");
- return r;
+ goto ERROR;
}
// Verify steps
- r = pakfire_transaction_run_steps(transaction, db, PAKFIRE_ACTION_VERIFY);
+ r = pakfire_transaction_run_steps(transaction, db, jail, PAKFIRE_ACTION_VERIFY);
if (r)
goto ERROR;
goto ERROR;
// Execute all pre transaction actions
- r = pakfire_transaction_run_steps(transaction, db, PAKFIRE_ACTION_PRETRANS);
+ r = pakfire_transaction_run_steps(transaction, db, jail, PAKFIRE_ACTION_PRETRANS);
if (r)
goto ERROR;
- r = pakfire_transaction_run_steps(transaction, db, PAKFIRE_ACTION_EXECUTE);
+ r = pakfire_transaction_run_steps(transaction, db, jail, PAKFIRE_ACTION_EXECUTE);
if (r)
goto ERROR;
// Execute all post transaction actions
- r = pakfire_transaction_run_steps(transaction, db, PAKFIRE_ACTION_POSTTRANS);
+ r = pakfire_transaction_run_steps(transaction, db, jail, PAKFIRE_ACTION_POSTTRANS);
if (r)
goto ERROR;
r = pakfire_db_load(db, repo);
ERROR:
+ if (jail)
+ pakfire_jail_unref(jail);
if (repo)
pakfire_repo_unref(repo);
pakfire_db_unref(db);