Пример #1
0
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;
        }

}
Пример #2
0
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);
}