aboutsummaryrefslogtreecommitdiff
path: root/src/socket.c
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2017-02-15 21:38:31 +0200
committerOskari Timperi <oskari.timperi@iki.fi>2017-02-15 21:38:31 +0200
commite41108fe4f40113f51e7b873f5165ebaf2b085d1 (patch)
tree76fb4d7f994f32d3fda1cb8903fe2065f7b9fd86 /src/socket.c
parenta2c431ec96f7a6ed7e5c41b7ae93dc086ae541f1 (diff)
downloadmqtt-e41108fe4f40113f51e7b873f5165ebaf2b085d1.tar.gz
mqtt-e41108fe4f40113f51e7b873f5165ebaf2b085d1.zip
Add SocketSelect() to wrap select()
This also makes all the necessary includes for sockets centralized to `sockets.c`.
Diffstat (limited to 'src/socket.c')
-rw-r--r--src/socket.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/socket.c b/src/socket.c
index 0b0a59d..38c968e 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -92,3 +92,52 @@ int SocketSendAll(int sock, const char *buf, size_t *len)
return rv == -1 ? -1 : 0;
}
+
+int SocketSelect(int sock, int *events, int timeout)
+{
+ fd_set rfd, wfd;
+ struct timeval tv;
+ int rv;
+
+ assert(sock != -1);
+ assert(events != NULL);
+ assert(*events != 0);
+
+ FD_ZERO(&rfd);
+ FD_ZERO(&wfd);
+
+ if (*events & EV_READ)
+ {
+ FD_SET(sock, &rfd);
+ }
+
+ if (*events & EV_WRITE)
+ {
+ FD_SET(sock, &wfd);
+ }
+
+ memset(&tv, 0, sizeof(tv));
+ tv.tv_sec = timeout;
+ tv.tv_usec = 0;
+
+ *events = 0;
+
+ rv = select(sock+1, &rfd, &wfd, NULL, &tv);
+
+ if (rv < 0)
+ {
+ return rv;
+ }
+
+ if (FD_ISSET(sock, &wfd))
+ {
+ *events = EV_WRITE;
+ }
+
+ if (FD_ISSET(sock, &rfd))
+ {
+ *events = EV_READ;
+ }
+
+ return rv;
+}