Signed-off-by: Rafał Miłecki <zaj...@gmail.com> --- V2: Use poll instead of select --- usock.c | 27 +++++++++++++++++++++++++++ usock.h | 11 +++++++++++ 2 files changed, 38 insertions(+)
diff --git a/usock.c b/usock.c index 04ed4ee..5bdd3ff 100644 --- a/usock.c +++ b/usock.c @@ -20,6 +20,7 @@ #include <sys/socket.h> #include <sys/un.h> #include <netdb.h> +#include <poll.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> @@ -117,3 +118,29 @@ int usock(int type, const char *host, const char *service) { usock_set_flags(sock, type); return sock; } + +int usock_wait_ready(int fd, int msecs) { + struct pollfd fds[1]; + int res; + + fds[0].fd = fd; + fds[0].events = POLLOUT; + + res = poll(fds, 1, msecs); + if (res < 0) { + return errno; + } else if (res == 0) { + return -ETIMEDOUT; + } else { + int err = 0; + socklen_t optlen = sizeof(err); + + res = getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &optlen); + if (res) + return errno; + if (err) + return err; + } + + return 0; +} diff --git a/usock.h b/usock.h index 8f30add..c97fc40 100644 --- a/usock.h +++ b/usock.h @@ -32,4 +32,15 @@ int usock(int type, const char *host, const char *service); +/** + * Wait for a socket to become ready. + * + * This may be useful for users of USOCK_NONBLOCK to wait (with a timeout) + * for a socket. + * + * @param fd file descriptor of socket + * @param msecs timeout in microseconds + */ +int usock_wait_ready(int fd, int msecs); + #endif /* USOCK_H_ */ -- 1.8.4.5 _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel