admin: New command SETIFNAME to change an interface's recorded name.
[tripe] / server / peer.c
index 50dec93..c919892 100644 (file)
@@ -554,7 +554,20 @@ 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)
+  { if (p->ifname) xfree(p->ifname); p->ifname = xstrdup(name); }
 
 /* --- @p_addr@ --- *
  *
@@ -684,6 +697,7 @@ 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)
@@ -691,13 +705,14 @@ peer *p_create(peerspec *spec)
   p_setkatimer(p);
   if (kx_init(&p->kx, p, &p->ks))
     goto tidy_1;
+  p_setifname(p, spec->tops->ifname(p->t));
   p->next = peers;
   if (peers)
     peers->prev = p;
   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);
@@ -768,6 +783,8 @@ 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);