X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=tun.c;h=b3c69a2351e0fea272c4fef404c50d585b8159d5;hp=6ecde61794a3e3ea2821f6ebe185003c6ea07b4c;hb=eecff7e35bcb1dbde57c380dc13649c3fc579e92;hpb=32fc582f43a9a3841d2782674e055113729c2814 diff --git a/tun.c b/tun.c index 6ecde61..b3c69a2 100644 --- a/tun.c +++ b/tun.c @@ -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); @@ -440,6 +442,8 @@ static void tun_phase_hook(void *sst, uint32_t newphase) tun_set_route(st,r); } + add_hook(PHASE_CHILDPERSIST,childpersist_closefd_hook,&st->fd); + /* Register for poll() */ register_for_poll(st, tun_beforepoll, tun_afterpoll, st->nl.name); }