static void common_on_server_close (evcom_server *s) { printf("server on_close\n"); assert(s == &server); assert(s->errorno == 0); got_server_close = 1; evcom_server_detach(s); }
/* Retruns evcom_stream if a connection could be accepted. * The returned stream is not yet attached to the event loop. * Otherwise NULL */ static evcom_stream* accept_connection (evcom_server *server) { struct sockaddr address; /* connector's address information */ socklen_t addr_len = sizeof(address); int fd = accept(server->fd, &address, &addr_len); if (fd < 0) { switch (errno) { case EMFILE: case ENFILE: too_many_connections = 1; server->flags |= EVCOM_TOO_MANY_CONN; evcom_server_detach(server); return NULL; case EINTR: case EAGAIN: return NULL; default: evcom_perror("accept()", errno); return NULL; } assert(0 && "no reach"); } evcom_stream *stream = NULL; if (server->on_connection) { stream = server->on_connection(server, &address); } if (stream == NULL) { close(fd); return NULL; } if (set_nonblock(fd) != 0) { evcom_perror("set_nonblock()", errno); return NULL; } stream->server = server; evcom_stream_assign_fds(stream, fd, fd); return stream; }