server/peer.c, server/admin.c: Introduce `p_destroyall'.
[tripe] / server / peer.c
index 246d84e..5855f2e 100644 (file)
@@ -876,9 +876,6 @@ void p_bind(struct addrinfo *ailist)
       exit(EXIT_FAILURE);
     }
     fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC);
-    sel_initfile(&sel, &udpsock[i].sf, fd, SEL_READ, p_read, 0);
-    sel_addfile(&udpsock[i].sf);
-    T( trace(T_PEER, "peer: created %s socket", aftab[i].name); )
     if (port)
       udpsock[i].port = port;
     else {
@@ -890,6 +887,9 @@ void p_bind(struct addrinfo *ailist)
       }
       udpsock[i].port = lastport = getport(&a);
     }
+    T( trace(T_PEER, "peer: created %s socket", aftab[i].name); )
+    sel_initfile(&sel, &udpsock[i].sf, fd, SEL_READ, p_read, 0);
+    sel_addfile(&udpsock[i].sf);
   }
 
 }
@@ -992,6 +992,7 @@ peer *p_create(peerspec *spec)
   T( trace(T_TUNNEL, "peer: attached interface %s to peer `%s'",
           p->ifname, p_name(p)); )
   p_setkatimer(p);
+  iv_addreason();
   if (kx_setup(&p->kx, p, &p->ks, p->spec.f & PSF_KXMASK))
     goto tidy_4;
   a_notify("ADD",
@@ -1010,6 +1011,7 @@ tidy_4:
   if (spec->t_ka) sel_rmtimer(&p->tka);
   xfree(p->ifname);
   p->t->ops->destroy(p->t);
+  iv_rmreason();
 tidy_3:
   if (fd >= 0) close(fd);
 tidy_2:
@@ -1141,9 +1143,21 @@ void p_destroy(peer *p, int bye)
   }
   sym_remove(&byname, p->byname);
   am_remove(&byaddr, p->byaddr);
+  iv_rmreason();
   DESTROY(p);
 }
 
+/* --- @p_destroyall@ --- *
+ *
+ * Arguments:  ---
+ *
+ * Returns:    ---
+ *
+ * Use:                Destroys all of the peers, saying goodbye.
+ */
+
+void p_destroyall(void) { FOREACH_PEER(p, { p_destroy(p, 1); }); }
+
 /* --- @p_mkiter@ --- *
  *
  * Arguments:  @peer_iter *i@ = pointer to an iterator