diff options
Diffstat (limited to 'acceptor.c')
-rw-r--r-- | acceptor.c | 51 |
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; +} |