usock: add helper waiting for socket to be ready

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
This commit is contained in:
Rafał Miłecki 2015-01-15 12:59:18 +01:00 committed by Felix Fietkau
parent fecaf2f5f6
commit ad9b5a387d
2 changed files with 38 additions and 0 deletions

27
usock.c
View file

@ -20,6 +20,7 @@
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/un.h> #include <sys/un.h>
#include <netdb.h> #include <netdb.h>
#include <poll.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
@ -130,3 +131,29 @@ int usock(int type, const char *host, const char *service) {
usock_set_flags(sock, type); usock_set_flags(sock, type);
return sock; 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
View file

@ -33,4 +33,15 @@
const char *usock_port(int port); const char *usock_port(int port);
int usock(int type, const char *host, const char *service); 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_ */ #endif /* USOCK_H_ */