Assorted changes from work at BBN.  Most are minor, and several are in
support of more significant changes not in this commit.  The last item
in the ChangeLog below may be needed for p2mp to work correctly.

2004-08-31  David Wiggins  <dwiggins@bbn.com>

	* hash.c (hash_iterate): Save next pointer before calling
	procedure, so that iteration works even if the called procedure
	deletes the hash backet.

	* linklist.h (listtail): new macro, not yet used.

2004-08-31  David Wiggins  <dwiggins@bbn.com>

	* ospf_spf.c (ospf_spf_calculate): Many more comments and debug
	  print statements.  New function ospf_vertex_dump used in debugging.

2004-08-31  David Wiggins  <dwiggins@bbn.com>

	* ospf_spf.h (struct vertex): Comments for flags and structure members.

2004-08-31  David Wiggins  <dwiggins@bbn.com>

	* ospf_route.c: When finding an alternate route, log cost as well.

2004-08-31  David Wiggins  <dwiggins@bbn.com>

	* ospf_interface.c (ospf_lookup_if_params): Initialize af in
	struct prefix allocated on stack.

2004-08-31  David Wiggins  <dwiggins@bbn.com>

	* ospf_packet.c (ospf_ls_ack_send_delayed): In p2mp mode, send
	acks to AllSPFRouters, rather than All-DR.
diff --git a/lib/ChangeLog b/lib/ChangeLog
index ea965ea..c72fa28 100644
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,11 @@
+2004-08-31  David Wiggins  <dwiggins@bbn.com>
+
+	* hash.c (hash_iterate): Save next pointer before calling
+	procedure, so that iteration works even if the called procedure
+	deletes the hash backet.
+
+	* linklist.h (listtail): new macro, not yet used.
+
 2004-08-27 Hasso Tepper <hasso at quagga.net>
 
 	* command.c: Install "terminal length" commands only if vty is used.
diff --git a/lib/hash.c b/lib/hash.c
index 4097507..e89171b 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -142,10 +142,17 @@
 {
   int i;
   struct hash_backet *hb;
+  struct hash_backet *hbnext;
 
   for (i = 0; i < hash->size; i++)
-    for (hb = hash->index[i]; hb; hb = hb->next)
-      (*func) (hb, arg);
+    for (hb = hash->index[i]; hb; hb = hbnext)
+      {
+	/* get pointer to next hash backet here, in case (*func)
+	 * decides to delete hb by calling hash_release
+	 */
+	hbnext = hb->next;
+	(*func) (hb, arg);
+      }
 }
 
 /* Clean up hash.  */
diff --git a/lib/linklist.h b/lib/linklist.h
index 331135f..303b0bc 100644
--- a/lib/linklist.h
+++ b/lib/linklist.h
@@ -48,6 +48,7 @@
 
 #define nextnode(X) ((X) = (X)->next)
 #define listhead(X) ((X)->head)
+#define listtail(X) ((X)->tail)
 #define listcount(X) ((X)->count)
 #define list_isempty(X) ((X)->head == NULL && (X)->tail == NULL)
 #define getdata(X) ((X)->data)