chiark / gitweb /
svc: Peer management services.
[tripe] / server / peer.c
index 7f4d09405a44db7713cef5aa80b9e615f9bdb595..4bb2c82c6b0f80b07da5f42ab928d7d61532270d 100644 (file)
@@ -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: