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)) {
* 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@ --- *
*
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))
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);
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);
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);