summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOndrej Zajicek <santiago@crfreenet.org>2010-05-14 15:24:53 +0200
committerOndrej Zajicek <santiago@crfreenet.org>2010-05-14 15:24:53 +0200
commit0267f49fb2e44525aa2777bcb9900c4bb2db41e1 (patch)
tree57dc6bdb468c0a35063a297af7ce04d05f0b47b0
parentee7408c2be2cd514ba6eefc5589e57a6056198dc (diff)
downloadbird-0267f49fb2e44525aa2777bcb9900c4bb2db41e1.tar
bird-0267f49fb2e44525aa2777bcb9900c4bb2db41e1.zip
Do not add community if it is already in clist.
-rw-r--r--nest/a-set.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/nest/a-set.c b/nest/a-set.c
index fad4481..f41b163 100644
--- a/nest/a-set.c
+++ b/nest/a-set.c
@@ -42,21 +42,12 @@ int_set_format(struct adata *set, int way, byte *buf, unsigned int size)
*buf = 0;
}
-struct adata *
-int_set_add(struct linpool *pool, struct adata *list, u32 val)
-{
- int len = list ? list->length : 0;
- struct adata *res = lp_alloc(pool, len + sizeof(struct adata) + 4);
- res->length = len + 4;
- * (u32 *) res->data = val;
- if (list)
- memcpy((char *) res->data + 4, list->data, list->length);
- return res;
-}
-
int
int_set_contains(struct adata *list, u32 val)
{
+ if (!list)
+ return 0;
+
u32 *l = (u32 *) list->data;
unsigned int i;
for (i=0; i<list->length/4; i++)
@@ -66,6 +57,24 @@ int_set_contains(struct adata *list, u32 val)
}
struct adata *
+int_set_add(struct linpool *pool, struct adata *list, u32 val)
+{
+ struct adata *res;
+ int len;
+
+ if (int_set_contains(list, val))
+ return list;
+
+ len = list ? list->length : 0;
+ res = lp_alloc(pool, len + sizeof(struct adata) + 4);
+ res->length = len + 4;
+ * (u32 *) res->data = val;
+ if (list)
+ memcpy((char *) res->data + 4, list->data, list->length);
+ return res;
+}
+
+struct adata *
int_set_del(struct linpool *pool, struct adata *list, u32 val)
{
struct adata *res;