summaryrefslogtreecommitdiffstats
path: root/src/basic
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2022-11-22 15:23:34 +0100
committerLennart Poettering <lennart@poettering.net>2022-11-22 15:23:34 +0100
commitffbcc8d423671ad2fe827e4823a8032dc1f0a8b3 (patch)
tree68f253a67217665ca62cc7ab38fcbdf033710ca4 /src/basic
parentutmp-wtmp: handle EINTR gracefully when waiting to write to tty (diff)
downloadsystemd-ffbcc8d423671ad2fe827e4823a8032dc1f0a8b3.tar.xz
systemd-ffbcc8d423671ad2fe827e4823a8032dc1f0a8b3.zip
io-util: document EINTR situation a bit
Diffstat (limited to 'src/basic')
-rw-r--r--src/basic/io-util.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/basic/io-util.c b/src/basic/io-util.c
index cdad939aa6..f642beca3a 100644
--- a/src/basic/io-util.c
+++ b/src/basic/io-util.c
@@ -161,6 +161,21 @@ int ppoll_usec(struct pollfd *fds, size_t nfds, usec_t timeout) {
assert(fds || nfds == 0);
+ /* This is a wrapper around ppoll() that does primarily two things:
+ *
+ * ✅ Takes a usec_t instead of a struct timespec
+ *
+ * ✅ Guarantees that if an invalid fd is specified we return EBADF (i.e. converts POLLNVAL to
+ * EBADF). This is done because EBADF is a programming error usually, and hence should bubble up
+ * as error, and not be eaten up as non-error POLLNVAL event.
+ *
+ * ⚠️ ⚠️ ⚠️ Note that this function does not add any special handling for EINTR. Don't forget
+ * poll()/ppoll() will return with EINTR on any received signal always, there is no automatic
+ * restarting via SA_RESTART available. Thus, typically you want to handle EINTR not as an error,
+ * but just as reason to restart things, under the assumption you use a more appropriate mechanism
+ * to handle signals, such as signalfd() or signal handlers. ⚠️ ⚠️ ⚠️
+ */
+
if (nfds == 0)
return 0;
@@ -188,6 +203,9 @@ int fd_wait_for_event(int fd, int event, usec_t timeout) {
};
int r;
+ /* ⚠️ ⚠️ ⚠️ Keep in mind you almost certainly want to handle -EINTR gracefully in the caller, see
+ * ppoll_usec() above! ⚠️ ⚠️ ⚠️ */
+
r = ppoll_usec(&pollfd, 1, timeout);
if (r <= 0)
return r;