From 5865e61fd29cd6eaa719ad722bce7318491c12b4 Mon Sep 17 00:00:00 2001 From: angt Date: Sun, 15 Nov 2015 18:23:29 +0100 Subject: [PATCH] Use select() in the main loop (macos is full of sh!t) --- src/main.c | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/main.c b/src/main.c index 9389eea..0d1cea3 100644 --- a/src/main.c +++ b/src/main.c @@ -741,11 +741,6 @@ int main (int argc, char **argv) default: break; } - struct pollfd fds[] = { - { .fd = tun.fd, .events = POLLIN }, - { .fd = sock.fd, .events = POLLIN }, - }; - struct { uint8_t buf[2048]; size_t size; @@ -754,9 +749,17 @@ int main (int argc, char **argv) tunr.size = 0; tunw.size = 0; + fd_set rfds, wfds; + + FD_ZERO(&rfds); + FD_ZERO(&wfds); + while (running) { - if (poll(fds, COUNT(fds), -1)==-1 && errno!=EINTR) { - perror("poll"); + FD_SET(tun.fd, &rfds); + FD_SET(sock.fd, &rfds); + + if (select(2, &rfds, &wfds, NULL, NULL)==-1 && errno!=EINTR) { + perror("select"); return 1; } @@ -773,12 +776,12 @@ int main (int argc, char **argv) buffer_shift(&sock.write.buf); - if (fds[0].revents & POLLIN) { + if (FD_ISSET(tun.fd, &rfds)) { while (1) { if (buffer_write_size(&sock.write.buf)0) sock.write.buf.read += sock.write.ret; @@ -823,8 +826,8 @@ int main (int argc, char **argv) buffer_shift(&sock.read.buf); - if (fds[1].revents & POLLIN) { - sock.read.ret = fd_read(fds[1].fd, sock.read.buf.write, buffer_write_size(&sock.read.buf)); + if (FD_ISSET(sock.fd, &rfds)) { + sock.read.ret = fd_read(sock.fd, sock.read.buf.write, buffer_write_size(&sock.read.buf)); if (!sock.read.ret) goto restart; @@ -833,8 +836,8 @@ int main (int argc, char **argv) sock.read.buf.write += sock.read.ret; } - if (fds[0].revents & POLLOUT) - fds[0].events = POLLIN; + if (FD_ISSET(tun.fd, &wfds)) + FD_CLR(tun.fd, &wfds); while (1) { if (!tunw.size) { @@ -855,13 +858,13 @@ int main (int argc, char **argv) tunw.size = ip_size; } if (tunw.size) { - ssize_t r = fd_write(fds[0].fd, tunw.buf, tunw.size); + ssize_t r = fd_write(tun.fd, tunw.buf, tunw.size); if (!r) return 2; if (r==-1) - fds[0].events = POLLIN|POLLOUT; + FD_SET(tun.fd, &wfds); if (r<0) break;