X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-bus%2Fsd-bus.c;h=bc4376fb510533478871854717157729fa04c76c;hb=75a0da952f603006d6b3535ecaf8ebe2bded30e7;hp=83233fd7e676219d44cf55fa0a649b2bc4a394ef;hpb=630a4d9ea7298fb4a494662cbb4871069143ff56;p=elogind.git diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 83233fd7e..bc4376fb5 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -142,6 +142,7 @@ static void bus_free(sd_bus *b) { hashmap_free_free(b->reply_callbacks); prioq_free(b->reply_callbacks_prioq); + assert(b->match_callbacks.type == BUS_MATCH_ROOT); bus_match_free(&b->match_callbacks); hashmap_free_free(b->vtable_methods); @@ -349,8 +350,6 @@ static int hello_callback(sd_bus *bus, sd_bus_message *reply, void *userdata, sd assert(reply); r = sd_bus_message_get_errno(reply); - if (r < 0) - return r; if (r > 0) return -r; @@ -1756,7 +1755,7 @@ _public_ int sd_bus_call_async( if (!BUS_IS_OPEN(bus->state)) return -ENOTCONN; - r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func); + r = hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops); if (r < 0) return r; @@ -2107,7 +2106,7 @@ static int process_timeout(sd_bus *bus) { r = c->callback(bus, m, slot->userdata, &error_buffer); bus->current_userdata = NULL; bus->current_handler = NULL; - bus->current_slot = sd_bus_slot_unref(slot); + bus->current_slot = NULL; bus->current_message = NULL; if (slot->floating) { @@ -2115,6 +2114,8 @@ static int process_timeout(sd_bus *bus) { sd_bus_slot_unref(slot); } + sd_bus_slot_unref(slot); + return bus_maybe_reply_error(m, r, &error_buffer); } @@ -2203,13 +2204,15 @@ static int process_reply(sd_bus *bus, sd_bus_message *m) { r = c->callback(bus, m, slot->userdata, &error_buffer); bus->current_userdata = NULL; bus->current_handler = NULL; - bus->current_slot = sd_bus_slot_unref(slot); + bus->current_slot = NULL; if (slot->floating) { bus_slot_disconnect(slot); sd_bus_slot_unref(slot); } + sd_bus_slot_unref(slot); + return bus_maybe_reply_error(m, r, &error_buffer); } @@ -2529,7 +2532,7 @@ static int process_closing(sd_bus *bus, sd_bus_message **ret) { r = c->callback(bus, m, slot->userdata, &error_buffer); bus->current_userdata = NULL; bus->current_handler = NULL; - bus->current_slot = sd_bus_slot_unref(slot); + bus->current_slot = NULL; bus->current_message = NULL; if (slot->floating) { @@ -2537,6 +2540,8 @@ static int process_closing(sd_bus *bus, sd_bus_message **ret) { sd_bus_slot_unref(slot); } + sd_bus_slot_unref(slot); + return bus_maybe_reply_error(m, r, &error_buffer); } @@ -3007,6 +3012,10 @@ static int attach_io_events(sd_bus *bus) { return r; r = sd_event_source_set_priority(bus->input_io_event_source, bus->event_priority); + if (r < 0) + return r; + + r = sd_event_source_set_name(bus->input_io_event_source, "bus-input"); } else r = sd_event_source_set_io_fd(bus->input_io_event_source, bus->input_fd); @@ -3022,6 +3031,10 @@ static int attach_io_events(sd_bus *bus) { return r; r = sd_event_source_set_priority(bus->output_io_event_source, bus->event_priority); + if (r < 0) + return r; + + r = sd_event_source_set_name(bus->input_io_event_source, "bus-output"); } else r = sd_event_source_set_io_fd(bus->output_io_event_source, bus->output_fd); @@ -3074,10 +3087,18 @@ _public_ int sd_bus_attach_event(sd_bus *bus, sd_event *event, int priority) { if (r < 0) goto fail; + r = sd_event_source_set_name(bus->time_event_source, "bus-time"); + if (r < 0) + goto fail; + r = sd_event_add_exit(bus->event, &bus->quit_event_source, quit_callback, bus); if (r < 0) goto fail; + r = sd_event_source_set_name(bus->quit_event_source, "bus-exit"); + if (r < 0) + goto fail; + r = attach_io_events(bus); if (r < 0) goto fail; @@ -3317,8 +3338,10 @@ _public_ int sd_bus_get_peer_creds(sd_bus *bus, uint64_t mask, sd_bus_creds **re } r = bus_creds_add_more(c, mask, pid, 0); - if (r < 0) + if (r < 0) { + sd_bus_creds_unref(c); return r; + } *ret = c; return 0; @@ -3358,3 +3381,21 @@ _public_ int sd_bus_get_name(sd_bus *bus, const char **name) { *name = bus->connection_name; return 0; } + +int bus_get_root_path(sd_bus *bus) { + int r; + + if (bus->cgroup_root) + return 0; + + r = cg_get_root_path(&bus->cgroup_root); + if (r == -ENOENT) { + bus->cgroup_root = strdup("/"); + if (!bus->cgroup_root) + return -ENOMEM; + + r = 0; + } + + return r; +}