Exit only on EBADF for select()

This commit is contained in:
Adrien Gallouët
2016-12-20 11:44:42 +00:00
parent deba26a7cb
commit 91efdfe4e8
2 changed files with 11 additions and 4 deletions

View File

@@ -29,6 +29,12 @@
#define _const_ __attribute__ ((const)) #define _const_ __attribute__ ((const))
#define _align_(...) __attribute__ ((aligned(__VA_ARGS__))) #define _align_(...) __attribute__ ((aligned(__VA_ARGS__)))
#undef MAX
#define MAX(x,y) ({ __typeof__(x) X=(x); __typeof__(y) Y=(y); X > Y ? X : Y; })
#undef MIN
#define MIN(x,y) ({ __typeof__(x) X=(x); __typeof__(y) Y=(y); X < Y ? X : Y; })
int gt_print (const char *, ...) _printf_(1,2); int gt_print (const char *, ...) _printf_(1,2);
void gt_log (const char *, ...) _printf_(1,2); void gt_log (const char *, ...) _printf_(1,2);
void gt_fatal (const char *, ...) _printf_(1,2) _noreturn_; void gt_fatal (const char *, ...) _printf_(1,2) _noreturn_;

View File

@@ -243,8 +243,6 @@ main(int argc, char **argv)
return 1; return 1;
} }
fd_set_nonblock(tun_fd);
int chacha = option_is_set(opts, "chacha20"); int chacha = option_is_set(opts, "chacha20");
struct mud *mud = mud_create(bind_port, v4, v6, !chacha, mtu); struct mud *mud = mud_create(bind_port, v4, v6, !chacha, mtu);
@@ -301,6 +299,7 @@ main(int argc, char **argv)
int mud_fd = mud_get_fd(mud); int mud_fd = mud_get_fd(mud);
fd_set_nonblock(tun_fd);
fd_set_nonblock(mud_fd); fd_set_nonblock(mud_fd);
gt_log("running...\n"); gt_log("running...\n");
@@ -310,6 +309,8 @@ main(int argc, char **argv)
unsigned char buf[8 * 1024]; unsigned char buf[8 * 1024];
int last_fd = 1 + MAX(tun_fd, MAX(mud_fd, icmp_fd));
while (!gt.quit) { while (!gt.quit) {
FD_SET(tun_fd, &rfds); FD_SET(tun_fd, &rfds);
FD_SET(mud_fd, &rfds); FD_SET(mud_fd, &rfds);
@@ -317,8 +318,8 @@ main(int argc, char **argv)
if (icmp_fd != -1) if (icmp_fd != -1)
FD_SET(icmp_fd, &rfds); FD_SET(icmp_fd, &rfds);
if (select(mud_fd + 1, &rfds, NULL, NULL, NULL) == -1) { if (select(last_fd, &rfds, NULL, NULL, NULL) == -1) {
if (errno == EINTR) if (errno != EBADF)
continue; continue;
perror("select"); perror("select");
return 1; return 1;