systemctl: return error codes for failed jobs

This commit is contained in:
Lennart Poettering 2010-07-01 03:44:09 +02:00
parent 6ec1117a74
commit 5e37489593
1 changed files with 23 additions and 5 deletions

View File

@ -530,13 +530,18 @@ finish:
return r; return r;
} }
typedef struct WaitData {
Set *set;
bool failed;
} WaitData;
static DBusHandlerResult wait_filter(DBusConnection *connection, DBusMessage *message, void *data) { static DBusHandlerResult wait_filter(DBusConnection *connection, DBusMessage *message, void *data) {
DBusError error; DBusError error;
Set *s = data; WaitData *d = data;
assert(connection); assert(connection);
assert(message); assert(message);
assert(s); assert(d);
dbus_error_init(&error); dbus_error_init(&error);
@ -552,17 +557,22 @@ static DBusHandlerResult wait_filter(DBusConnection *connection, DBusMessage *me
} else if (dbus_message_is_signal(message, "org.freedesktop.systemd1.Manager", "JobRemoved")) { } else if (dbus_message_is_signal(message, "org.freedesktop.systemd1.Manager", "JobRemoved")) {
uint32_t id; uint32_t id;
const char *path; const char *path;
dbus_bool_t success = true;
if (!dbus_message_get_args(message, &error, if (!dbus_message_get_args(message, &error,
DBUS_TYPE_UINT32, &id, DBUS_TYPE_UINT32, &id,
DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_BOOLEAN, &success,
DBUS_TYPE_INVALID)) DBUS_TYPE_INVALID))
log_error("Failed to parse message: %s", error.message); log_error("Failed to parse message: %s", error.message);
else { else {
char *p; char *p;
if ((p = set_remove(s, (char*) path))) if ((p = set_remove(d->set, (char*) path)))
free(p); free(p);
if (!success)
d->failed = true;
} }
} }
@ -627,11 +637,16 @@ finish:
static int wait_for_jobs(DBusConnection *bus, Set *s) { static int wait_for_jobs(DBusConnection *bus, Set *s) {
int r; int r;
WaitData d;
assert(bus); assert(bus);
assert(s); assert(s);
if (!dbus_connection_add_filter(bus, wait_filter, s, NULL)) { zero(d);
d.set = s;
d.failed = false;
if (!dbus_connection_add_filter(bus, wait_filter, &d, NULL)) {
log_error("Failed to add filter."); log_error("Failed to add filter.");
r = -ENOMEM; r = -ENOMEM;
goto finish; goto finish;
@ -641,7 +656,10 @@ static int wait_for_jobs(DBusConnection *bus, Set *s) {
dbus_connection_read_write_dispatch(bus, -1)) dbus_connection_read_write_dispatch(bus, -1))
; ;
r = 0; if (!arg_quiet && d.failed)
log_error("Job failed, see logs for details.");
r = d.failed ? -EIO : 0;
finish: finish:
/* This is slightly dirty, since we don't undo the filter registration. */ /* This is slightly dirty, since we don't undo the filter registration. */