Use select() in the main loop (macos is full of sh!t)
This commit is contained in:
41
src/main.c
41
src/main.c
@@ -741,11 +741,6 @@ int main (int argc, char **argv)
|
|||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pollfd fds[] = {
|
|
||||||
{ .fd = tun.fd, .events = POLLIN },
|
|
||||||
{ .fd = sock.fd, .events = POLLIN },
|
|
||||||
};
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
uint8_t buf[2048];
|
uint8_t buf[2048];
|
||||||
size_t size;
|
size_t size;
|
||||||
@@ -754,9 +749,17 @@ int main (int argc, char **argv)
|
|||||||
tunr.size = 0;
|
tunr.size = 0;
|
||||||
tunw.size = 0;
|
tunw.size = 0;
|
||||||
|
|
||||||
|
fd_set rfds, wfds;
|
||||||
|
|
||||||
|
FD_ZERO(&rfds);
|
||||||
|
FD_ZERO(&wfds);
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
if (poll(fds, COUNT(fds), -1)==-1 && errno!=EINTR) {
|
FD_SET(tun.fd, &rfds);
|
||||||
perror("poll");
|
FD_SET(sock.fd, &rfds);
|
||||||
|
|
||||||
|
if (select(2, &rfds, &wfds, NULL, NULL)==-1 && errno!=EINTR) {
|
||||||
|
perror("select");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -773,12 +776,12 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
buffer_shift(&sock.write.buf);
|
buffer_shift(&sock.write.buf);
|
||||||
|
|
||||||
if (fds[0].revents & POLLIN) {
|
if (FD_ISSET(tun.fd, &rfds)) {
|
||||||
while (1) {
|
while (1) {
|
||||||
if (buffer_write_size(&sock.write.buf)<sizeof(tunr.buf)+16)
|
if (buffer_write_size(&sock.write.buf)<sizeof(tunr.buf)+16)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
ssize_t r = fd_read(fds[0].fd, tunr.buf, sizeof(tunr.buf));
|
ssize_t r = fd_read(tun.fd, tunr.buf, sizeof(tunr.buf));
|
||||||
|
|
||||||
if (!r)
|
if (!r)
|
||||||
return 2;
|
return 2;
|
||||||
@@ -805,17 +808,17 @@ int main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fds[1].revents & POLLOUT)
|
if (FD_ISSET(sock.fd, &wfds))
|
||||||
fds[1].events = POLLIN;
|
FD_CLR(sock.fd, &wfds);
|
||||||
|
|
||||||
if (buffer_read_size(&sock.write.buf)) {
|
if (buffer_read_size(&sock.write.buf)) {
|
||||||
sock.write.ret = fd_write(fds[1].fd, sock.write.buf.read, buffer_read_size(&sock.write.buf));
|
sock.write.ret = fd_write(sock.fd, sock.write.buf.read, buffer_read_size(&sock.write.buf));
|
||||||
|
|
||||||
if (!sock.write.ret)
|
if (!sock.write.ret)
|
||||||
goto restart;
|
goto restart;
|
||||||
|
|
||||||
if (sock.write.ret==-1)
|
if (sock.write.ret==-1)
|
||||||
fds[1].events = POLLIN|POLLOUT;
|
FD_SET(sock.fd, &wfds);
|
||||||
|
|
||||||
if (sock.write.ret>0)
|
if (sock.write.ret>0)
|
||||||
sock.write.buf.read += sock.write.ret;
|
sock.write.buf.read += sock.write.ret;
|
||||||
@@ -823,8 +826,8 @@ int main (int argc, char **argv)
|
|||||||
|
|
||||||
buffer_shift(&sock.read.buf);
|
buffer_shift(&sock.read.buf);
|
||||||
|
|
||||||
if (fds[1].revents & POLLIN) {
|
if (FD_ISSET(sock.fd, &rfds)) {
|
||||||
sock.read.ret = fd_read(fds[1].fd, sock.read.buf.write, buffer_write_size(&sock.read.buf));
|
sock.read.ret = fd_read(sock.fd, sock.read.buf.write, buffer_write_size(&sock.read.buf));
|
||||||
|
|
||||||
if (!sock.read.ret)
|
if (!sock.read.ret)
|
||||||
goto restart;
|
goto restart;
|
||||||
@@ -833,8 +836,8 @@ int main (int argc, char **argv)
|
|||||||
sock.read.buf.write += sock.read.ret;
|
sock.read.buf.write += sock.read.ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fds[0].revents & POLLOUT)
|
if (FD_ISSET(tun.fd, &wfds))
|
||||||
fds[0].events = POLLIN;
|
FD_CLR(tun.fd, &wfds);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (!tunw.size) {
|
if (!tunw.size) {
|
||||||
@@ -855,13 +858,13 @@ int main (int argc, char **argv)
|
|||||||
tunw.size = ip_size;
|
tunw.size = ip_size;
|
||||||
}
|
}
|
||||||
if (tunw.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)
|
if (!r)
|
||||||
return 2;
|
return 2;
|
||||||
|
|
||||||
if (r==-1)
|
if (r==-1)
|
||||||
fds[0].events = POLLIN|POLLOUT;
|
FD_SET(tun.fd, &wfds);
|
||||||
|
|
||||||
if (r<0)
|
if (r<0)
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user