Message ID | 1421322172-6939-1-git-send-email-zajec5@gmail.com |
---|---|
State | Superseded |
Headers | show |
On 2015-01-15 12:42, Rafał Miłecki wrote: > Signed-off-by: Rafał Miłecki <zajec5@gmail.com> > --- > usock.c | 30 ++++++++++++++++++++++++++++++ > usock.h | 11 +++++++++++ > 2 files changed, 41 insertions(+) > > diff --git a/usock.c b/usock.c > index 04ed4ee..39909c1 100644 > --- a/usock.c > +++ b/usock.c > @@ -117,3 +117,33 @@ 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) { > + fd_set fds; > + struct timeval tv; > + int res; > + > + FD_ZERO(&fds); > + FD_SET(fd, &fds); > + > + tv.tv_sec = msecs / 1000; > + tv.tv_usec = (msecs % 1000) * 1000; > + > + res = select(fd + 1, NULL, &fds, NULL, &tv); Wouldn't it be better to use poll() here? The fd bitmask crap that select uses is quite ugly. - Felix
diff --git a/usock.c b/usock.c index 04ed4ee..39909c1 100644 --- a/usock.c +++ b/usock.c @@ -117,3 +117,33 @@ 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) { + fd_set fds; + struct timeval tv; + int res; + + FD_ZERO(&fds); + FD_SET(fd, &fds); + + tv.tv_sec = msecs / 1000; + tv.tv_usec = (msecs % 1000) * 1000; + + res = select(fd + 1, NULL, &fds, NULL, &tv); + 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_ */
Signed-off-by: Rafał Miłecki <zajec5@gmail.com> --- usock.c | 30 ++++++++++++++++++++++++++++++ usock.h | 11 +++++++++++ 2 files changed, 41 insertions(+)