systemctl: return error codes for failed jobs
This commit is contained in:
parent
6ec1117a74
commit
5e37489593
|
@ -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. */
|
||||||
|
|
Loading…
Reference in New Issue