diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2017-02-15 21:38:31 +0200 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2017-02-15 21:38:31 +0200 |
| commit | e41108fe4f40113f51e7b873f5165ebaf2b085d1 (patch) | |
| tree | 76fb4d7f994f32d3fda1cb8903fe2065f7b9fd86 /src/socket.c | |
| parent | a2c431ec96f7a6ed7e5c41b7ae93dc086ae541f1 (diff) | |
| download | mqtt-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.c | 49 |
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; +} |
