X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd-bus%2Fbus-util.c;h=f96c293984b014220f7d25cc63b721c63e069189;hp=30ee67e85050ab63d96f31653b9b6272e6db6fbc;hb=37224a5ff522a366b353e8a01e2c2eee1e5416e5;hpb=6203e07a83214a55bb1f88508fcda2005c601dea diff --git a/src/libsystemd-bus/bus-util.c b/src/libsystemd-bus/bus-util.c index 30ee67e85..f96c29398 100644 --- a/src/libsystemd-bus/bus-util.c +++ b/src/libsystemd-bus/bus-util.c @@ -87,7 +87,13 @@ int bus_async_unregister_and_exit(sd_event *e, sd_bus *bus, const char *name) { return 0; } -int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t timeout) { +int bus_event_loop_with_idle( + sd_event *e, + sd_bus *bus, + const char *name, + usec_t timeout, + check_idle_t check_idle, + void *userdata) { bool exiting = false; int r, code; @@ -96,14 +102,20 @@ int bus_event_loop_with_idle(sd_event *e, sd_bus *bus, const char *name, usec_t assert(name); for (;;) { + bool idle; + r = sd_event_get_state(e); if (r < 0) return r; - if (r == SD_EVENT_FINISHED) break; - r = sd_event_run(e, exiting ? (uint64_t) -1 : timeout); + if (check_idle) + idle = check_idle(userdata); + else + idle = true; + + r = sd_event_run(e, exiting || !idle ? (uint64_t) -1 : timeout); if (r < 0) return r; @@ -212,8 +224,12 @@ int bus_verify_polkit( } r = sd_bus_message_enter_container(reply, 'r', "bba{ss}"); - if (r >= 0) - r = sd_bus_message_read(reply, "bb", &authorized, &challenge); + if (r < 0) + return r; + + r = sd_bus_message_read(reply, "bb", &authorized, &challenge); + if (r < 0) + return r; if (authorized) return 1; @@ -328,7 +344,7 @@ int bus_verify_polkit_async( if (sd_bus_error_has_name(e, SD_BUS_ERROR_SERVICE_UNKNOWN)) return -EACCES; - return sd_bus_error_get_errno(e); + return -sd_bus_error_get_errno(e); } r = sd_bus_message_enter_container(q->reply, 'r', "bba{ss}"); @@ -997,6 +1013,8 @@ int bus_map_all_properties(sd_bus *bus, r = prop->set(bus, member, m, &error, v); else r = map_basic(bus, member, m, &error, v); + if (r < 0) + return r; r = sd_bus_message_exit_container(m); if (r < 0)