usock: add helper waiting for socket to be ready
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
This commit is contained in:
parent
fecaf2f5f6
commit
ad9b5a387d
2 changed files with 38 additions and 0 deletions
27
usock.c
27
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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
11
usock.h
11
usock.h
|
@ -33,4 +33,15 @@
|
|||
const char *usock_port(int port);
|
||||
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_ */
|
||||
|
|
Loading…
Reference in a new issue