X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/a50f9a0eaed03dfe85ff3d7a4c24da20ac705dae..a62f8e8a94bf56194539f7140a1215bc74309b36:/server/peer.c diff --git a/server/peer.c b/server/peer.c index 7f4d0940..4bb2c82c 100644 --- a/server/peer.c +++ b/server/peer.c @@ -724,6 +724,8 @@ static void p_setkatimer(peer *p) peer *p_create(peerspec *spec) { peer *p = CREATE(peer); + const tunnel_ops *tops = spec->tops; + int fd; unsigned f; p->byname = sym_find(&byname, spec->name, -1, sizeof(peer_byname), &f); @@ -740,11 +742,17 @@ peer *p_create(peerspec *spec) p->ifname = 0; memset(&p->st, 0, sizeof(stats)); p->st.t_start = time(0); - if ((p->t = spec->tops->create(p, &p->ifname)) == 0) + if (!(tops->flags & TUNF_PRIVOPEN)) + fd = -1; + else if ((fd = ps_tunfd(tops, &p->ifname)) < 0) goto tidy_2; + if ((p->t = tops->create(p, fd, &p->ifname)) == 0) + goto tidy_3; + T( trace(T_TUNNEL, "peer: attached interface %s to peer `%s'", + p->ifname, p_name(p)); ) p_setkatimer(p); if (kx_init(&p->kx, p, &p->ks, p->spec.kxf)) - goto tidy_3; + goto tidy_4; a_notify("ADD", "?PEER", p, "%s", p->ifname, @@ -756,11 +764,13 @@ peer *p_create(peerspec *spec) } return (p); -tidy_3: +tidy_4: if (spec->t_ka) sel_rmtimer(&p->tka); xfree(p->ifname); p->t->ops->destroy(p->t); +tidy_3: + if (fd >= 0) close(fd); tidy_2: am_remove(&byaddr, p->byaddr); tidy_1: