2003-06-09 Paul Jakma <paul@dishone.st>

        * bgp_clist.c (community_list_delete): honour deny statements
diff --git a/bgpd/bgp_clist.c b/bgpd/bgp_clist.c
index 3cf1d2e..a2c1210 100644
--- a/bgpd/bgp_clist.c
+++ b/bgpd/bgp_clist.c
@@ -524,25 +524,36 @@
 
   for (entry = list->head; entry; entry = entry->next)
     {
-      if (entry->any && entry->direct == COMMUNITY_PERMIT)
+      if (entry->any)
         {
-          /* This is a tricky part.  Currently only
-             route_set_community_delete() uses this function.  In the
-             function com->size is zero, it free the community
-             structure.  */
-          com->size = 0;
+          if (entry->direct == COMMUNITY_PERMIT) 
+            {
+              /* This is a tricky part.  Currently only
+               * route_set_community_delete() uses this function.  In the
+               * function com->size is zero, it free the community
+               * structure.  
+               */
+              com->size = 0;
+            }
           return com;
         }
 
-      if (entry->style == COMMUNITY_LIST_STANDARD)
+      if ((entry->style == COMMUNITY_LIST_STANDARD) 
+          && (community_include (entry->u.com, COMMUNITY_INTERNET)
+              || community_match (com, entry->u.com) ))
         {
-          if (entry->direct == COMMUNITY_PERMIT)
-            community_delete (com, entry->u.com);
+              if (entry->direct == COMMUNITY_PERMIT)
+                community_delete (com, entry->u.com);
+              else
+                break;
         }
-      else if (entry->style == COMMUNITY_LIST_EXPANDED)
+      else if ((entry->style == COMMUNITY_LIST_EXPANDED)
+               && community_regexp_match (com, entry->reg))
         {
           if (entry->direct == COMMUNITY_PERMIT)
             community_regexp_delete (com, entry->reg);
+          else
+            break;
         }
     }
   return com;