-int main_loop(srs_t *srs, const char *domain, int port_enc, int port_dec)
-{
- if (start_listener(port_enc, false) < 0)
- return EXIT_FAILURE;
- if (start_listener(port_dec, true) < 0)
- return EXIT_FAILURE;
-
- while (!sigint) {
- struct epoll_event evts[1024];
- int n;
-
- n = epoll_select(evts, countof(evts), -1);
- if (n < 0) {
- if (errno != EAGAIN && errno != EINTR) {
- UNIXERR("epoll_wait");
- return EXIT_FAILURE;
- }
- continue;
- }
-
- while (--n >= 0) {
- srsd_t *srsd = evts[n].data.ptr;
-
- if (srsd->listener) {
- start_client(srsd);
- continue;
- }
-
- if (evts[n].events & EPOLLIN) {
- if (process_srs(srs, domain, srsd) < 0) {
- srsd_delete(&srsd);
- continue;
- }
- if (srsd->obuf.len) {
- epoll_register(srsd->fd, EPOLLIN | EPOLLOUT, srsd);
- }
- }
-
- if ((evts[n].events & EPOLLOUT) && srsd->obuf.len) {
- if (buffer_write(&srsd->obuf, srsd->fd) < 0) {
- srsd_delete(&srsd);
- continue;
- }
- if (!srsd->obuf.len) {
- epoll_modify(srsd->fd, EPOLLIN, srsd);
- }
- }
- }
- }
-
- return EXIT_SUCCESS;
-}
-