chiark / gitweb /
buffer: Provide buffer_destroy
[secnet.git] / tun.c
diff --git a/tun.c b/tun.c
index 9ef3a9d..2c84ed0 100644 (file)
--- a/tun.c
+++ b/tun.c
@@ -98,7 +98,7 @@ static int tun_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,
                          int *timeout_io)
 {
     struct tun *st=sst;
-    *nfds_io=1;
+    BEFOREPOLL_WANT_FDS(1);
     fds[0].fd=st->fd;
     fds[0].events=POLLIN;
     return 0;
@@ -118,6 +118,7 @@ static void tun_afterpoll(void *sst, struct pollfd *fds, int nfds)
        buffer_init(st->buff,calculate_max_start_pad());
        l=read(st->fd, st->buff->start, buf_remaining_space(st->buff));
        if (l<0) {
+           if (errno==EINTR || iswouldblock(errno)) return;
            fatal_perror("tun_afterpoll: read()");
        }
        if (l==0) {
@@ -353,6 +354,7 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
        our networks. */
 
     setcloexec(st->fd);
+    setnonblock(st->fd);
 
     hostaddr=ipaddr_to_string(st->nl.local_address);
     secnetaddr=ipaddr_to_string(st->nl.secnet_address);
@@ -441,7 +443,7 @@ static void tun_phase_hook(void *sst, uint32_t newphase)
     }
 
     /* Register for poll() */
-    register_for_poll(st, tun_beforepoll, tun_afterpoll, 1, st->nl.name);
+    register_for_poll(st, tun_beforepoll, tun_afterpoll, st->nl.name);
 }
 
 static list_t *tun_create(closure_t *self, struct cloc loc, dict_t *context,