chiark / gitweb /
server: Fix some bad warning messages.
[tripe] / server / peer.c
index 50dec936a612aaf3795f990d2dab14f1a83c3224..1e5d0766af274f023053ceae1084861f8520ddee 100644 (file)
@@ -247,7 +247,7 @@ found:
          buf_init(&bb, buf_t, sizeof(buf_t));
          if (ksl_decrypt(&p->ks, ch, &b, &bb)) {
            p->st.n_reject++;
-           a_warn("PEER", "?PEER", "decrypt-failed", A_END);
+           a_warn("PEER", "?PEER", p, "decrypt-failed", A_END);
            return;
          }
          if (BOK(&bb)) {
@@ -554,7 +554,25 @@ stats *p_stats(peer *p) { return (&p->st); }
  * Returns:    A pointer to the peer's interface name.
  */
 
-const char *p_ifname(peer *p) { return (p->t->ops->ifname(p->t)); }
+const char *p_ifname(peer *p) { return (p->ifname); }
+
+/* --- @p_setifname@ --- *
+ *
+ * Arguments:  @peer *p@ = pointer to a peer block
+ *             @const char *name@ = pointer to the new name
+ *
+ * Returns:    ---
+ *
+ * Use:                Changes the name held for a peer's interface.
+ */
+
+void p_setifname(peer *p, const char *name)
+{
+  xfree(p->ifname);
+  p->ifname = xstrdup(name);
+  if (p->spec.tops->setifname)
+    p->spec.tops->setifname(p->t, name);
+}
 
 /* --- @p_addr@ --- *
  *
@@ -684,9 +702,10 @@ peer *p_create(peerspec *spec)
   p->ks = 0;
   p->prev = 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)) == 0)
+  if ((p->t = spec->tops->create(p, &p->ifname)) == 0)
     goto tidy_0;
   p_setkatimer(p);
   if (kx_init(&p->kx, p, &p->ks))
@@ -697,7 +716,7 @@ peer *p_create(peerspec *spec)
   peers = p;
   a_notify("ADD",
            "?PEER", p,
-           "%s", p->t->ops->ifname(p->t),
+           "%s", p->ifname,
            "?ADDR", &p->spec.sa,
            A_END);
   a_notify("KXSTART", "?PEER", p, A_END);
@@ -707,6 +726,7 @@ peer *p_create(peerspec *spec)
 tidy_1:
   if (spec->t_ka)
     sel_rmtimer(&p->tka);
+  xfree(p->ifname);
   p->t->ops->destroy(p->t);
 tidy_0:
   xfree(p->spec.name);
@@ -768,10 +788,11 @@ void p_destroy(peer *p)
   a_notify("KILL", "%s", p->spec.name, A_END);
   ksl_free(&p->ks);
   kx_free(&p->kx);
+  if (p->ifname)
+    xfree(p->ifname);
   p->t->ops->destroy(p->t);
   if (p->spec.t_ka)
     sel_rmtimer(&p->tka);
-  xfree(p->spec.name);
   for (pg = p->pings; pg; pg = ppg) {
     ppg = pg->next;
     p_pingdone(pg, PING_PEERDIED);