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/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
11
usock.h
|
@ -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_ */
|
||||||
|
|
Loading…
Reference in a new issue