summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/server_wait_for_event.c')
-rw-r--r--src/server/server_wait_for_event.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/server/server_wait_for_event.c b/src/server/server_wait_for_event.c
new file mode 100644
index 0000000..b229e6b
--- /dev/null
+++ b/src/server/server_wait_for_event.c
@@ -0,0 +1,53 @@
+#include <sys/select.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "server.h"
+
+int ZoO_server_wait_for_event
+(
+ struct ZoO_server server [const static 1]
+)
+{
+ int ready_fds;
+ const int old_errno = errno;
+
+ /* call to select may alter timeout */
+ memset((void *) &(server->socket.timeout), 0, sizeof(struct timeval));
+
+ server->socket.timeout.tv_sec = ZoO_SERVER_SOCKET_ACCEPT_TIMEOUT_SEC;
+
+ ready_fds = select
+ (
+ (server->socket.file_descriptor + 1),
+ &(server->socket.as_a_set),
+ (fd_set *) NULL,
+ (fd_set *) NULL,
+ &(server->socket.timeout)
+ );
+
+ if (errno == EINTR)
+ {
+ ready_fds = 0;
+ }
+
+ if (ready_fds == -1)
+ {
+ fprintf
+ (
+ stderr,
+ "[F] Unable to wait on server socket: %s.\n",
+ strerror(errno)
+ );
+
+ errno = old_errno;
+
+ return -1;
+ }
+
+ errno = old_errno;
+
+ return ready_fds;
+}