aboutsummaryrefslogtreecommitdiff
path: root/acceptor.c
blob: bb4fb88a3a7a2e22e10f23cbf3a98ce61d7be7e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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;
}