From: Yu Watanabe Date: Tue, 2 Mar 2021 18:55:22 +0000 (+0900) Subject: io-util: introduce ppoll_usec() helper function X-Git-Tag: v248-rc3~65^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c4febde9d0f2faf13aff3a5285c8fdff22073dc6;p=thirdparty%2Fsystemd.git io-util: introduce ppoll_usec() helper function --- diff --git a/src/basic/io-util.c b/src/basic/io-util.c index 8ea350dcc39..f0a66da9bfc 100644 --- a/src/basic/io-util.c +++ b/src/basic/io-util.c @@ -2,7 +2,6 @@ #include #include -#include #include #include @@ -159,24 +158,42 @@ int pipe_eof(int fd) { return !!(r & POLLHUP); } -int fd_wait_for_event(int fd, int event, usec_t t) { - - struct pollfd pollfd = { - .fd = fd, - .events = event, - }; - +int ppoll_usec(struct pollfd *fds, size_t nfds, usec_t timeout) { struct timespec ts; int r; - r = ppoll(&pollfd, 1, t == USEC_INFINITY ? NULL : timespec_store(&ts, t), NULL); + assert(fds || nfds == 0); + + if (nfds == 0) + return 0; + + r = ppoll(fds, nfds, timeout == USEC_INFINITY ? NULL : timespec_store(&ts, timeout), NULL); if (r < 0) return -errno; if (r == 0) return 0; - if (pollfd.revents & POLLNVAL) - return -EBADF; + for (size_t i = 0, n = r; i < nfds && n > 0; i++) { + if (fds[i].revents == 0) + continue; + if (fds[i].revents & POLLNVAL) + return -EBADF; + n--; + } + + return r; +} + +int fd_wait_for_event(int fd, int event, usec_t timeout) { + struct pollfd pollfd = { + .fd = fd, + .events = event, + }; + int r; + + r = ppoll_usec(&pollfd, 1, timeout); + if (r <= 0) + return r; return pollfd.revents; } diff --git a/src/basic/io-util.h b/src/basic/io-util.h index d817714b050..0cd26d4c2c1 100644 --- a/src/basic/io-util.h +++ b/src/basic/io-util.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once +#include #include #include #include @@ -18,6 +19,7 @@ int loop_write(int fd, const void *buf, size_t nbytes, bool do_poll); int pipe_eof(int fd); +int ppoll_usec(struct pollfd *fds, size_t nfds, usec_t timeout); int fd_wait_for_event(int fd, int event, usec_t timeout); ssize_t sparse_write(int fd, const void *p, size_t sz, size_t run_length);