X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=secnet.git;a=blobdiff_plain;f=tun.c;h=d5e0e9e985e31eb615e0bcf5655d7c37f2116aab;hp=102a24cabed62169b11a0f17cdc7f191fdb2e70f;hb=656df7e2c9b688150ebe991d79a64ac096bb5f8e;hpb=ee697dd98d0f9aca6b9df7ffb32d3a15b4e33d6d diff --git a/tun.c b/tun.c index 102a24c..d5e0e9e 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,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);