aboutsummaryrefslogtreecommitdiff
path: root/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server.c')
-rw-r--r--src/server.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/src/server.c b/src/server.c
index 61664c5..6c0a7a2 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1,5 +1,7 @@
#include <stdlib.h>
+#include <unistd.h>
#include <string.h>
+#include <sys/epoll.h>
#include <assert.h>
#include "server.h"
@@ -19,7 +21,7 @@ server_init_ctx(server_ctx *ctx, init_cb init_fn)
return ctx;
}
-int server_validate_ctx(server_ctx *ctx)
+int server_validate_ctx(const server_ctx *ctx)
{
assert(ctx);
assert(ctx->server_cbs.on_connect && ctx->server_cbs.on_disconnect
@@ -29,10 +31,46 @@ int server_validate_ctx(server_ctx *ctx)
return 0;
}
-int server_mainloop(server_ctx *ctx)
+int server_setup_epoll(const server_ctx *ctx[], size_t siz)
{
+ int s;
+ int fd = epoll_create1(0); /* flags == 0 -> obsolete size arg is dropped */
+ struct epoll_event ev;
+
+ assert(ctx);
+ assert(siz > 0 && siz < POTD_MAXFD);
+ if (fd < 0)
+ return -1;
+
+ for (int i = 0; i < siz; ++i) {
+ memset(&ev, 0, sizeof(ev));
+ ev.data.fd = ctx[i]->sock.fd;
+ ev.events = EPOLLIN | EPOLLET;
+
+ s = epoll_ctl(fd, EPOLL_CTL_ADD, ctx[i]->sock.fd, &ev);
+ if (s) {
+ close(fd);
+ return -1;
+ }
+ }
+
+ return fd;
+}
+
+int server_mainloop_epoll(int epoll_fd, const server_ctx *ctx[], size_t siz)
+{
+ struct epoll_event *events = calloc(POTD_MAXEVENTS, sizeof(*events));
+
+ assert(events);
+ assert(ctx);
+ assert(siz > 0 && siz < POTD_MAXFD);
+
while (1) {
- sleep(1);
+ int n;
+
+ n = epoll_wait(epoll_fd, events, POTD_MAXEVENTS, -1);
}
+
+ free(events);
return 0;
}