diff --git a/src/libsystemd/sd-bus/bus-socket.c b/src/libsystemd/sd-bus/bus-socket.c index c94befef73..253f41c636 100644 --- a/src/libsystemd/sd-bus/bus-socket.c +++ b/src/libsystemd/sd-bus/bus-socket.c @@ -1308,8 +1308,11 @@ int bus_socket_process_opening(sd_bus *b) { assert(b->state == BUS_OPENING); events = fd_wait_for_event(b->output_fd, POLLOUT, 0); - if (events < 0) + if (events < 0) { + if (ERRNO_IS_TRANSIENT(events)) + return 0; return events; + } if (!(events & (POLLOUT|POLLERR|POLLHUP))) return 0; diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index ba5ef7de00..c75276f4ba 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -2465,8 +2465,11 @@ _public_ int sd_bus_call( left = UINT64_MAX; r = bus_poll(bus, true, left); - if (r < 0) + if (r < 0) { + if (ERRNO_IS_TRANSIENT(r)) + continue; goto fail; + } if (r == 0) { r = -ETIMEDOUT; goto fail; @@ -3321,6 +3324,7 @@ static int bus_poll(sd_bus *bus, bool need_more, uint64_t timeout_usec) { } _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) { + int r; assert_return(bus, -EINVAL); assert_return(bus = bus_resolve(bus), -ENOPKG); @@ -3335,7 +3339,11 @@ _public_ int sd_bus_wait(sd_bus *bus, uint64_t timeout_usec) { if (bus->rqueue_size > 0) return 0; - return bus_poll(bus, false, timeout_usec); + r = bus_poll(bus, false, timeout_usec); + if (r < 0 && ERRNO_IS_TRANSIENT(r)) + return 1; /* treat EINTR as success, but let's exit, so that the caller will call back into us soon. */ + + return r; } _public_ int sd_bus_flush(sd_bus *bus) { @@ -3377,8 +3385,12 @@ _public_ int sd_bus_flush(sd_bus *bus) { return 0; r = bus_poll(bus, false, UINT64_MAX); - if (r < 0) + if (r < 0) { + if (ERRNO_IS_TRANSIENT(r)) + continue; + return r; + } } }