X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/tripe/blobdiff_plain/a50f9a0eaed03dfe85ff3d7a4c24da20ac705dae..48b845698dcf3ec4b9f8b9f1848a157f0245d7cc:/server/peer.c diff --git a/server/peer.c b/server/peer.c index 7f4d0940..456efd77 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); @@ -735,16 +737,24 @@ peer *p_create(peerspec *spec) T( trace(T_PEER, "peer: creating new peer `%s'", spec->name); ) p->spec = *spec; p->spec.name = (/*unconst*/ char *)SYM_NAME(p->byname); + if (spec->tag) + p->spec.tag = xstrdup(spec->tag); p->ks = 0; p->pings = 0; 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,13 +766,16 @@ 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); + if (p->spec.tag) xfree(p->spec.tag); tidy_1: sym_remove(&byname, p->byname); tidy_0: @@ -779,6 +792,16 @@ tidy_0: const char *p_name(peer *p) { return (p->spec.name); } +/* --- @p_tag@ --- * + * + * Arguments: @peer *p@ = pointer to a peer block + * + * Returns: A pointer to the peer's public key tag. + */ + +const char *p_tag(peer *p) + { return (p->spec.tag ? p->spec.tag : p->spec.name); } + /* --- @p_spec@ --- * * * Arguments: @peer *p@ = pointer to a peer block @@ -843,6 +866,8 @@ void p_destroy(peer *p) kx_free(&p->kx); if (p->ifname) xfree(p->ifname); + if (p->spec.tag) + xfree(p->spec.tag); p->t->ops->destroy(p->t); if (p->spec.t_ka) sel_rmtimer(&p->tka);