예제 #1
0
파일: ircd.c 프로젝트: prurigro/meshchat
static void
do_accept(uv_stream_t* server, int status) {
    CHECK(status);
    GETDATA(ircd_t, ircd, server);

    struct irc_session *new_session = (struct irc_session *)malloc(sizeof(struct irc_session));
    uv_tcp_init(uv_default_loop(),&new_session->handle);
    new_session->handle.data = new_session;

    new_session->buffer = NULL;
    new_session->ircd = ircd;
    new_session->mode = INITIALIZING;

    if (uv_accept((uv_stream_t*)&ircd->handle, (uv_stream_t*)&new_session->handle) < 0) {
        free(new_session);
        perror("accept");
    } else {
        struct sockaddr_storage addr;
        int addrlen = sizeof(addr);
        uv_tcp_getpeername(&new_session->handle,(struct sockaddr*)&addr,&addrlen);

        printf("accepted connection from %s\n", sprint_addrport((struct sockaddr *)&addr));

        new_session->inbuf_used = 0;
        new_session->next = ircd->session_list;
        if (!inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&addr)->sin6_addr, new_session->ip, INET6_ADDRSTRLEN)) {
            perror("inet_ntop");
        }
        ircd->session_list = new_session;

        uv_read_start((uv_stream_t*)&new_session->handle,alloc_buffer,on_read);
    }
}
예제 #2
0
파일: ircd.c 프로젝트: prurigro/meshchat
void
ircd_start(ircd_t *ircd) {
    struct addrinfo hints;
    struct addrinfo *result;

    memset(&hints, 0, sizeof(hints));
    hints.ai_flags = AI_PASSIVE;
    hints.ai_family = AF_INET6;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = 0;
    // rest 0

    int status = getaddrinfo(NULL, "6999", &hints, &result);
    if (status) {
        printf("getaddrinfo: ");
        puts(gai_strerror(status));
        return;
    }

    if (uv_tcp_bind(&ircd->handle, result->ai_addr, 0) < 0) {
        perror("bind");
        freeaddrinfo(result);
        return;
    }

    if (uv_listen((uv_stream_t*)&ircd->handle, IRCD_BACKLOG, do_accept) > 0) {
        perror("listen");
        return;
    }

    printf("ircd listening on %s\n", sprint_addrport(result->ai_addr));

    freeaddrinfo(result);
}
예제 #3
0
void cjdnsadmin_start(cjdnsadmin_t *adm) {
    struct addrinfo hints;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;
    hints.ai_flags = AI_ADDRCONFIG;
    struct addrinfo* res = 0;
    printf("Connecting to %s:%s\n",adm->host,adm->port);
    int err = getaddrinfo(adm->host, adm->port, &hints, &res);
    if (err != 0) {
        fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(err));
        return;
    }

    uv_udp_init(uv_default_loop(),&adm->handle);
    adm->handle.data = adm;

    uv_connect_t* request = malloc(sizeof(uv_connect_t));
    request->data = res;

    printf("connected to cjdns admin at %s\n", sprint_addrport(res->ai_addr));

    adm->theaddr = (struct sockaddr*) malloc(res->ai_addrlen);
    memcpy(adm->theaddr, res->ai_addr, res->ai_addrlen);

    freeaddrinfo(res);
    uv_udp_recv_start(&adm->handle,alloc_buffer,on_read);
}