aboutsummaryrefslogtreecommitdiff
path: root/acceptor.c
diff options
context:
space:
mode:
Diffstat (limited to 'acceptor.c')
-rw-r--r--acceptor.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/acceptor.c b/acceptor.c
new file mode 100644
index 0000000..bb4fb88
--- /dev/null
+++ b/acceptor.c
@@ -0,0 +1,51 @@
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "acceptor.h"
+#include "util.h"
+#include "connection.h"
+
+int connAcceptorAccept(struct connAcceptor *ca)
+{
+ struct tsocket *conn_sock = tsocketAccept(ca->sock);
+ if (conn_sock == NULL) {
+ perror("socket accept");
+ return 0;
+ }
+
+ if (setblocking(conn_sock->fd, false) == -1) {
+ perror("setblocking");
+ tsocketDelete(conn_sock);
+ return 0;
+ }
+
+ struct connection *conn = connectionNew(conn_sock);
+ struct event *conn_ev = connectionNewEvent(conn);
+
+ if (eventLoopAdd(ca->el, conn_ev, EPOLLIN | EPOLLET) == -1) {
+ perror("eventloop add fd: conn_sock");
+ return 0;
+ }
+
+ printf("New client fd %d, ip: %s, port: %d\n",
+ conn_sock->fd, conn_sock->addr, conn_sock->port);
+
+ return 0;
+}
+
+void connAcceptorDel(struct connAcceptor *ca)
+{
+ tsocketDelete(ca->sock);
+ free(ca);
+}
+
+struct event *connAcceptorNewEvent(struct tsocket *sock, struct eventLoop *el)
+{
+ struct connAcceptor *ca = malloc(sizeof(*ca));
+ ca->sock = sock;
+ ca->el = el;
+
+ struct event *ev = eventNew(ca, sock->fd, connAcceptorAccept, connectionDel);
+ return ev;
+}