static void bb_acceptor_bind(struct bb_acceptor *acceptor) { int server = socket(acceptor->addr.in.sa_family, SOCK_STREAM, 0); if (server < 0) { bb_error_exit("socket()"); } int on = 1; if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int))) { bb_error_exit("setsockopt()"); } if (setsockopt(server, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(int))) { bb_error_exit("setsockopt()"); } if (bind(server, &acceptor->addr.in, sizeof(union bb_addr))) { bb_error_exit("unable to bind to address: bind()"); } if (listen(server, 100) < 0) { bb_error_exit("unable to put socket in listen mode: listen()"); } if (bb_nonblock(server)) { fprintf(stderr,"unable to put socket in non-blocking mode\n"); exit(1); } ev_io_init(&acceptor->acceptor, accept_callback, server, EV_READ); ev_io_start(blastbeat.loop, &acceptor->acceptor); struct bb_virtualhost *vhost = acceptor->vhosts; while(vhost) { vhost->pinger.vhost = vhost; ev_timer_init(&vhost->pinger.pinger, pinger_cb, blastbeat.ping_freq, blastbeat.ping_freq); ev_timer_start(blastbeat.loop, &vhost->pinger.pinger); vhost = vhost->next; } }
static void accept_callback(struct ev_loop *loop, struct ev_io *w, int revents) { struct bb_acceptor *acceptor = (struct bb_acceptor *) w; struct sockaddr_in sin; socklen_t sin_len = sizeof(sin); int client = accept(w->fd, (struct sockaddr *)&sin, &sin_len); if (client < 0) { perror("accept()"); return; } if (bb_nonblock(client)) { close(client); return; } struct bb_connection *bbc = malloc(sizeof(struct bb_connection)); if (!bbc) { perror("malloc()"); close(client); return; } memset(bbc, 0, sizeof(struct bb_connection)); bbc->fd = client; bbc->acceptor = acceptor; // ssl context ? if (bbc->acceptor->ctx) { bbc->ssl = SSL_new(acceptor->ctx); SSL_set_ex_data(bbc->ssl, blastbeat.ssl_index, bbc); SSL_set_fd(bbc->ssl, bbc->fd); SSL_set_accept_state(bbc->ssl); } ev_io_init(&bbc->reader.reader, read_callback, client, EV_READ); bbc->reader.connection = bbc; ev_io_init(&bbc->writer.writer, bb_wq_callback, client, EV_WRITE); bbc->writer.connection = bbc; ev_io_start(loop, &bbc->reader.reader); }