chiark / gitweb /
Disassociate public key tags from peer names.
[tripe] / server / peer.c
index 7f4d09405a44db7713cef5aa80b9e615f9bdb595..456efd7789da91677516d75c0c1d18578477cd58 100644 (file)
@@ -724,6 +724,8 @@ static void p_setkatimer(peer *p)
 peer *p_create(peerspec *spec)
 {
   peer *p = CREATE(peer);
 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);
   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);
   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);
   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;
     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))
   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,
   a_notify("ADD",
           "?PEER", p,
           "%s", p->ifname,
@@ -756,13 +766,16 @@ peer *p_create(peerspec *spec)
   }
   return (p);
 
   }
   return (p);
 
-tidy_3:
+tidy_4:
   if (spec->t_ka)
     sel_rmtimer(&p->tka);
   xfree(p->ifname);
   p->t->ops->destroy(p->t);
   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_2:
   am_remove(&byaddr, p->byaddr);
+  if (p->spec.tag) xfree(p->spec.tag);
 tidy_1:
   sym_remove(&byname, p->byname);
 tidy_0:
 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); }
 
 
 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
 /* --- @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);
   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);
   p->t->ops->destroy(p->t);
   if (p->spec.t_ka)
     sel_rmtimer(&p->tka);