X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Ftransaction.c;h=36e31c45c9949dc5a5a82b981ff31490242c24cb;hp=27efef7cc68124d38990efeb941d9b7b466c42c8;hb=d2fe46b514ef3f6e0c0eb16b2d853c6dd6fa1808;hpb=31a7eb86f18b0466681d6fbe80c148f96c551c80 diff --git a/src/core/transaction.c b/src/core/transaction.c index 27efef7cc..36e31c45c 100644 --- a/src/core/transaction.c +++ b/src/core/transaction.c @@ -22,9 +22,10 @@ #include #include -#include "transaction.h" #include "bus-errors.h" -#include "dbus-common.h" +#include "bus-util.h" +#include "bus-error.h" +#include "transaction.h" static void transaction_unlink_job(Transaction *tr, Job *j, bool delete_dependencies); @@ -231,7 +232,7 @@ static int delete_one_unmergeable_job(Transaction *tr, Job *j) { return -EINVAL; } -static int transaction_merge_jobs(Transaction *tr, DBusError *e) { +static int transaction_merge_jobs(Transaction *tr, sd_bus_error *e) { Job *j; Iterator i; int r; @@ -261,8 +262,9 @@ static int transaction_merge_jobs(Transaction *tr, DBusError *e) { return -EAGAIN; /* We couldn't merge anything. Failure */ - dbus_set_error(e, BUS_ERROR_TRANSACTION_JOBS_CONFLICTING, "Transaction contains conflicting jobs '%s' and '%s' for %s. Probably contradicting requirement dependencies configured.", - job_type_to_string(t), job_type_to_string(k->type), k->unit->id); + sd_bus_error_setf( + e, BUS_ERROR_TRANSACTION_JOBS_CONFLICTING, "Transaction contains conflicting jobs '%s' and '%s' for %s. Probably contradicting requirement dependencies configured.", + job_type_to_string(t), job_type_to_string(k->type), k->unit->id); return r; } } @@ -334,7 +336,7 @@ _pure_ static bool unit_matters_to_anchor(Unit *u, Job *j) { return false; } -static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsigned generation, DBusError *e) { +static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsigned generation, sd_bus_error *e) { Iterator i; Unit *u; int r; @@ -344,7 +346,7 @@ static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsi assert(!j->transaction_prev); /* Does a recursive sweep through the ordering graph, looking - * for a cycle. If we find cycle we try to break it. */ + * for a cycle. If we find a cycle we try to break it. */ /* Have we seen this before? */ if (j->generation == generation) { @@ -371,7 +373,7 @@ static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsi /* logging for j not k here here to provide consistent narrative */ log_info_unit(j->unit->id, - "Walked on cycle path to %s/%s", + "Found dependency on %s/%s", k->unit->id, job_type_to_string(k->type)); if (!delete && @@ -405,8 +407,8 @@ static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsi log_error("Unable to break cycle"); - dbus_set_error(e, BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC, - "Transaction order is cyclic. See system logs for details."); + sd_bus_error_setf(e, BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC, + "Transaction order is cyclic. See system logs for details."); return -ENOEXEC; } @@ -445,7 +447,7 @@ static int transaction_verify_order_one(Transaction *tr, Job *j, Job *from, unsi return 0; } -static int transaction_verify_order(Transaction *tr, unsigned *generation, DBusError *e) { +static int transaction_verify_order(Transaction *tr, unsigned *generation, sd_bus_error *e) { Job *j; int r; Iterator i; @@ -490,7 +492,7 @@ rescan: } } -static int transaction_is_destructive(Transaction *tr, JobMode mode, DBusError *e) { +static int transaction_is_destructive(Transaction *tr, JobMode mode, sd_bus_error *e) { Iterator i; Job *j; @@ -508,7 +510,7 @@ static int transaction_is_destructive(Transaction *tr, JobMode mode, DBusError * if (j->unit->job && (mode == JOB_FAIL || j->unit->job->irreversible) && !job_type_is_superset(j->type, j->unit->job->type)) { - dbus_set_error(e, BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE, "Transaction is destructive."); + sd_bus_error_setf(e, BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE, "Transaction is destructive."); return -EEXIST; } } @@ -576,7 +578,7 @@ static int transaction_apply(Transaction *tr, Manager *m, JobMode mode) { /* Moves the transaction jobs to the set of active jobs */ - if (mode == JOB_ISOLATE) { + if (mode == JOB_ISOLATE || mode == JOB_FLUSH) { /* When isolating first kill all installed jobs which * aren't part of the new transaction */ @@ -635,7 +637,7 @@ rollback: return r; } -int transaction_activate(Transaction *tr, Manager *m, JobMode mode, DBusError *e) { +int transaction_activate(Transaction *tr, Manager *m, JobMode mode, sd_bus_error *e) { Iterator i; Job *j; int r; @@ -677,7 +679,7 @@ int transaction_activate(Transaction *tr, Manager *m, JobMode mode, DBusError *e break; if (r != -EAGAIN) { - log_warning("Requested transaction contains an unfixable cyclic ordering dependency: %s", bus_error(e, r)); + log_warning("Requested transaction contains an unfixable cyclic ordering dependency: %s", bus_error_message(e, r)); return r; } @@ -694,7 +696,7 @@ int transaction_activate(Transaction *tr, Manager *m, JobMode mode, DBusError *e break; if (r != -EAGAIN) { - log_warning("Requested transaction contains unmergeable jobs: %s", bus_error(e, r)); + log_warning("Requested transaction contains unmergeable jobs: %s", bus_error_message(e, r)); return r; } @@ -713,7 +715,7 @@ int transaction_activate(Transaction *tr, Manager *m, JobMode mode, DBusError *e /* Ninth step: check whether we can actually apply this */ r = transaction_is_destructive(tr, mode, e); if (r < 0) { - log_notice("Requested transaction contradicts existing jobs: %s", bus_error(e, r)); + log_notice("Requested transaction contradicts existing jobs: %s", bus_error_message(e, r)); return r; } @@ -775,10 +777,10 @@ static Job* transaction_add_one_job(Transaction *tr, JobType type, Unit *unit, b j->override = override; j->irreversible = tr->irreversible; - LIST_PREPEND(Job, transaction, f, j); + LIST_PREPEND(transaction, f, j); if (hashmap_replace(tr->jobs, unit, f) < 0) { - LIST_REMOVE(Job, transaction, f, j); + LIST_REMOVE(transaction, f, j); job_free(j); return NULL; } @@ -835,7 +837,7 @@ int transaction_add_job_and_dependencies( bool conflicts, bool ignore_requirements, bool ignore_order, - DBusError *e) { + sd_bus_error *e) { Job *ret; Iterator i; Unit *dep; @@ -856,12 +858,12 @@ int transaction_add_job_and_dependencies( unit->load_state != UNIT_ERROR && unit->load_state != UNIT_NOT_FOUND && unit->load_state != UNIT_MASKED) { - dbus_set_error(e, BUS_ERROR_LOAD_FAILED, "Unit %s is not loaded properly.", unit->id); + sd_bus_error_setf(e, BUS_ERROR_LOAD_FAILED, "Unit %s is not loaded properly.", unit->id); return -EINVAL; } - if (type != JOB_STOP && (unit->load_state == UNIT_ERROR || unit->load_state == UNIT_NOT_FOUND)) { - dbus_set_error(e, BUS_ERROR_LOAD_FAILED, + if (type != JOB_STOP && unit->load_state == UNIT_ERROR) { + sd_bus_error_setf(e, BUS_ERROR_LOAD_FAILED, "Unit %s failed to load: %s. " "See system logs and 'systemctl status %s' for details.", unit->id, @@ -870,13 +872,21 @@ int transaction_add_job_and_dependencies( return -EINVAL; } + if (type != JOB_STOP && unit->load_state == UNIT_NOT_FOUND) { + sd_bus_error_setf(e, BUS_ERROR_LOAD_FAILED, + "Unit %s failed to load: %s.", + unit->id, + strerror(-unit->load_error)); + return -EINVAL; + } + if (type != JOB_STOP && unit->load_state == UNIT_MASKED) { - dbus_set_error(e, BUS_ERROR_MASKED, "Unit %s is masked.", unit->id); + sd_bus_error_setf(e, BUS_ERROR_UNIT_MASKED, "Unit %s is masked.", unit->id); return -EADDRNOTAVAIL; } if (!unit_job_is_applicable(unit, type)) { - dbus_set_error(e, BUS_ERROR_JOB_TYPE_NOT_APPLICABLE, "Job type %s is not applicable for unit %s.", job_type_to_string(type), unit->id); + sd_bus_error_setf(e, BUS_ERROR_JOB_TYPE_NOT_APPLICABLE, "Job type %s is not applicable for unit %s.", job_type_to_string(type), unit->id); return -EBADR; } @@ -908,10 +918,10 @@ int transaction_add_job_and_dependencies( if (r < 0) { log_warning_unit(dep->id, "Cannot add dependency job for unit %s, ignoring: %s", - dep->id, bus_error(e, r)); + dep->id, bus_error_message(e, r)); if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -927,7 +937,7 @@ int transaction_add_job_and_dependencies( goto fail; if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -938,7 +948,7 @@ int transaction_add_job_and_dependencies( goto fail; if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -947,10 +957,10 @@ int transaction_add_job_and_dependencies( if (r < 0) { log_full_unit(r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_WARNING, dep->id, "Cannot add dependency job for unit %s, ignoring: %s", - dep->id, bus_error(e, r)); + dep->id, bus_error_message(e, r)); if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -959,10 +969,10 @@ int transaction_add_job_and_dependencies( if (r < 0) { log_full_unit(r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_WARNING, dep->id, "Cannot add dependency job for unit %s, ignoring: %s", - dep->id, bus_error(e, r)); + dep->id, bus_error_message(e, r)); if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -973,7 +983,7 @@ int transaction_add_job_and_dependencies( goto fail; if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -982,10 +992,10 @@ int transaction_add_job_and_dependencies( if (r < 0) { log_full_unit(r == -EADDRNOTAVAIL ? LOG_DEBUG : LOG_WARNING, dep->id, "Cannot add dependency job for unit %s, ignoring: %s", - dep->id, bus_error(e, r)); + dep->id, bus_error_message(e, r)); if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -996,7 +1006,7 @@ int transaction_add_job_and_dependencies( goto fail; if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -1005,10 +1015,10 @@ int transaction_add_job_and_dependencies( if (r < 0) { log_warning_unit(dep->id, "Cannot add dependency job for unit %s, ignoring: %s", - dep->id, bus_error(e, r)); + dep->id, bus_error_message(e, r)); if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -1023,7 +1033,7 @@ int transaction_add_job_and_dependencies( goto fail; if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -1034,7 +1044,7 @@ int transaction_add_job_and_dependencies( goto fail; if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -1045,7 +1055,7 @@ int transaction_add_job_and_dependencies( goto fail; if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } @@ -1058,10 +1068,10 @@ int transaction_add_job_and_dependencies( if (r < 0) { log_warning_unit(dep->id, "Cannot add dependency reload job for unit %s, ignoring: %s", - dep->id, bus_error(e, r)); + dep->id, bus_error_message(e, r)); if (e) - dbus_error_free(e); + sd_bus_error_free(e); } } }