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); } }
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); }
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); }