X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/4fb0f88d53fc60395a4a87b7a9ca1245ba033ee7..6c5889e68832bfd96fdd1de7e6df4309e7017372:/tun.c diff --git a/tun.c b/tun.c index ffc195c..d5e0e9e 100644 --- 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) { @@ -241,7 +242,7 @@ static bool_t tun_set_route(void *sst, struct netlink_client *routes) break; } } - if (st->route_type==TUN_CONFIG_IOCTL) { + if (fd >= 0) { close(fd); } routes->kup=up; @@ -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,8 +442,10 @@ 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, 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, @@ -452,7 +456,7 @@ static list_t *tun_create(closure_t *self, struct cloc loc, dict_t *context, dict_t *dict; string_t flavour,type; - st=safe_malloc(sizeof(*st),"tun_apply"); + NEW(st); /* First parameter must be a dict */ item=list_elem(args,0);