"Unable to request name, failing connection: %s",
sd_bus_message_get_error(m)->message);
- bus_enter_closing(sd_bus_message_get_bus(m));
+ bus_enter_closing(sd_bus_message_get_bus(m), -sd_bus_message_get_errno(m));
return 1;
}
case BUS_NAME_EXISTS:
log_debug("Requested service name already owned, failing connection.");
- bus_enter_closing(sd_bus_message_get_bus(m));
+ bus_enter_closing(sd_bus_message_get_bus(m), -EEXIST);
return 1;
}
log_debug("Unexpected response from RequestName(), failing connection.");
- bus_enter_closing(sd_bus_message_get_bus(m));
+ bus_enter_closing(sd_bus_message_get_bus(m), -EPROTO);
return 1;
}
"Unable to release name, failing connection: %s",
sd_bus_message_get_error(m)->message);
- bus_enter_closing(sd_bus_message_get_bus(m));
+ bus_enter_closing(sd_bus_message_get_bus(m), -sd_bus_message_get_errno(m));
return 1;
}
}
log_debug("Unexpected response from ReleaseName(), failing connection.");
- bus_enter_closing(sd_bus_message_get_bus(m));
+ bus_enter_closing(sd_bus_message_get_bus(m), -EPROTO);
return 1;
}
.input_fd = -EBADF,
.output_fd = -EBADF,
.inotify_fd = -EBADF,
+ .exit_code = EXIT_FAILURE,
.message_version = 1,
.creds_mask = SD_BUS_CREDS_WELL_KNOWN_NAMES|SD_BUS_CREDS_UNIQUE_NAME,
.accept_fd = true,
return sd_bus_close_unref(bus);
}
-void bus_enter_closing(sd_bus *bus) {
+void bus_enter_closing(sd_bus *bus, int exit_code) {
assert(bus);
if (!IN_SET(bus->state, BUS_WATCH_BIND, BUS_OPENING, BUS_AUTHENTICATING, BUS_HELLO, BUS_RUNNING))
return;
bus_set_state(bus, BUS_CLOSING);
+ bus->exit_code = exit_code;
}
/* Define manually so we can add the PID check */
r = bus_write_message(bus, m, &idx);
if (ERRNO_IS_NEG_DISCONNECT(r)) {
- bus_enter_closing(bus);
+ bus_enter_closing(bus, r);
return -ECONNRESET;
- } else if (r < 0)
+ }
+ if (r < 0)
return r;
if (idx < BUS_MESSAGE_SIZE(m)) {
r = bus_read_message(bus);
if (r < 0) {
if (ERRNO_IS_DISCONNECT(r)) {
- bus_enter_closing(bus);
+ bus_enter_closing(bus, r);
r = -ECONNRESET;
}
r = dispatch_wqueue(bus);
if (r < 0) {
if (ERRNO_IS_DISCONNECT(r)) {
- bus_enter_closing(bus);
+ bus_enter_closing(bus, r);
r = -ECONNRESET;
}
event = bus->event;
if (event)
- return sd_event_exit(event, EXIT_FAILURE);
+ return sd_event_exit(event, bus->exit_code);
exit(EXIT_FAILURE);
assert_not_reached();
}
static int process_closing_reply_callback(sd_bus *bus, BusReplyCallback *c) {
- _cleanup_(sd_bus_error_free) sd_bus_error error_buffer = SD_BUS_ERROR_NULL;
+ _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL, error_buffer = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *m = NULL;
sd_bus_slot *slot;
int r;
assert(bus);
assert(c);
- r = bus_message_new_synthetic_error(
- bus,
- c->cookie,
- &SD_BUS_ERROR_MAKE_CONST(SD_BUS_ERROR_NO_REPLY, "Connection terminated"),
- &m);
+ (void) sd_bus_error_set_errnof(
+ &error,
+ bus->exit_code < 0 ? bus->exit_code : -ETIMEDOUT,
+ "Connection terminated");
+
+ r = bus_message_new_synthetic_error(bus, c->cookie, &error, &m);
if (r < 0)
return r;
}
if (ERRNO_IS_NEG_DISCONNECT(r)) {
- bus_enter_closing(bus);
+ bus_enter_closing(bus, r);
r = 1;
} else if (r < 0)
return r;
for (;;) {
r = dispatch_wqueue(bus);
if (ERRNO_IS_NEG_DISCONNECT(r)) {
- bus_enter_closing(bus);
+ bus_enter_closing(bus, r);
return -ECONNRESET;
} else if (r < 0)
return r;
sd_bus_slot *match_slot = ASSERT_PTR(userdata);
bool failed = false;
- int r;
+ int r = 0;
assert(m);
sd_bus_slot_ref(match_slot);
if (sd_bus_message_is_method_error(m, NULL)) {
- log_debug_errno(sd_bus_message_get_errno(m),
- "Unable to add match %s, failing connection: %s",
- match_slot->match_callback.match_string,
- sd_bus_message_get_error(m)->message);
+ r = log_debug_errno(sd_bus_message_get_errno(m),
+ "Unable to add match %s, failing connection: %s",
+ match_slot->match_callback.match_string,
+ sd_bus_message_get_error(m)->message);
failed = true;
} else
bus->current_userdata = userdata;
} else {
if (failed) /* Generic failure handling: destroy the connection */
- bus_enter_closing(sd_bus_message_get_bus(m));
+ bus_enter_closing(sd_bus_message_get_bus(m), r);
r = 1;
}
r = sd_bus_process(bus, NULL);
if (r < 0) {
log_debug_errno(r, "Processing of bus failed, closing down: %m");
- bus_enter_closing(bus);
+ bus_enter_closing(bus, r);
}
return 1;
r = sd_bus_process(bus, NULL);
if (r < 0) {
log_debug_errno(r, "Processing of bus failed, closing down: %m");
- bus_enter_closing(bus);
+ bus_enter_closing(bus, r);
}
return 1;
fail:
log_debug_errno(r, "Preparing of bus events failed, closing down: %m");
- bus_enter_closing(bus);
+ bus_enter_closing(bus, r);
return 1;
}