diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2015-01-15 14:59:18 +0300 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2015-01-15 15:10:49 +0300 |
commit | ad9b5a387df86c3fa1bdf733b913f5bf4b751f21 (patch) | |
tree | 1c5040f3b0ec20909f2660ab87d0ce96d7d405ba /usock.c | |
parent | fecaf2f5f66f8cb5598e55d493e4721554c5dcd5 (diff) |
usock: add helper waiting for socket to be ready
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Diffstat (limited to 'usock.c')
-rw-r--r-- | usock.c | 27 |
1 files changed, 27 insertions, 0 deletions
@@ -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> @@ -130,3 +131,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; +} |