chiark / gitweb /
NEW etc.: Use NEW in all obvious places
[secnet.git] / tun.c
diff --git a/tun.c b/tun.c
index 6ecde61794a3e3ea2821f6ebe185003c6ea07b4c..d5e0e9e985e31eb615e0bcf5655d7c37f2116aab 100644 (file)
--- 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);
 }
@@ -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);