summaryrefslogtreecommitdiff
path: root/src/libsystemd
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2022-11-22 13:00:48 +0100
committerLennart Poettering <lennart@poettering.net>2022-11-22 13:08:41 +0100
commit69858785335afffc51bc03127beb53332c0fb983 (patch)
treea3a7f92e04c6794c656f6adee669fe2f7527d74d /src/libsystemd
parent6976bf5cd614761eb4bd57d39e24f7eca1d6b863 (diff)
downloadsystemd-69858785335afffc51bc03127beb53332c0fb983.tar.gz
sd-netlink: handle EINTR from poll() gracefully, as success
Diffstat (limited to 'src/libsystemd')
-rw-r--r--src/libsystemd/sd-netlink/sd-netlink.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/libsystemd/sd-netlink/sd-netlink.c b/src/libsystemd/sd-netlink/sd-netlink.c
index feb751a848..b99abae640 100644
--- a/src/libsystemd/sd-netlink/sd-netlink.c
+++ b/src/libsystemd/sd-netlink/sd-netlink.c
@@ -464,13 +464,18 @@ static int netlink_poll(sd_netlink *nl, bool need_more, usec_t timeout_usec) {
}
int sd_netlink_wait(sd_netlink *nl, uint64_t timeout_usec) {
+ int r;
+
assert_return(nl, -EINVAL);
assert_return(!netlink_pid_changed(nl), -ECHILD);
if (nl->rqueue_size > 0)
return 0;
- return netlink_poll(nl, false, timeout_usec);
+ r = netlink_poll(nl, false, timeout_usec);
+ if (r < 0 && ERRNO_IS_TRANSIENT(r)) /* Convert EINTR to "something happened" and give user a chance to run some code before calling back into us */
+ return 1;
+ return r;
}
static int timeout_compare(const void *a, const void *b) {