diff --git a/src/ipaddr.c b/src/ipaddr.c index a7cad04..875594c 100644 --- a/src/ipaddr.c +++ b/src/ipaddr.c @@ -48,7 +48,6 @@ f2b_addrlist_append(f2b_ipaddr_t *list, f2b_ipaddr_t *ipaddr) { f2b_ipaddr_t * f2b_addrlist_lookup(f2b_ipaddr_t *list, const char *addr) { - assert(addr != NULL); if (list == NULL) @@ -64,22 +63,36 @@ f2b_addrlist_lookup(f2b_ipaddr_t *list, const char *addr) { f2b_ipaddr_t * f2b_addrlist_remove(f2b_ipaddr_t *list, const char *addr) { - f2b_ipaddr_t *a = NULL; + f2b_ipaddr_t *a = NULL, *prev = NULL; assert(addr != NULL); - if (list == NULL) - return NULL; - - if (strncmp(list->text, addr, sizeof(list->text)) == 0) { - a = list->next; - f2b_ipaddr_destroy(list); - return a; + for (a = list; a != NULL; a = a->next) { + if (strncmp(a->text, addr, sizeof(a->text)) == 0) { + if (prev == NULL) { + /* first elem in list */ + list = a->next; + } else { + /* somewhere in list */ + prev->next = a->next; + } + f2b_ipaddr_destroy(a); + return list; + } + prev = a; } - for (a = list; a->next != NULL; a = a->next) { - assert(0); /* TODO */ + return list; +} + +f2b_ipaddr_t * +f2b_addrlist_destroy(f2b_ipaddr_t *list) { + f2b_ipaddr_t *next = NULL; + + for (; list != NULL; list = next) { + next = list->next; + f2b_ipaddr_destroy(list); } - return list; + return NULL; } diff --git a/src/ipaddr.h b/src/ipaddr.h index 4bf3a70..aff7a61 100644 --- a/src/ipaddr.h +++ b/src/ipaddr.h @@ -22,5 +22,6 @@ void f2b_ipaddr_destroy(f2b_ipaddr_t *ipaddr); f2b_ipaddr_t * f2b_addrlist_append(f2b_ipaddr_t *list, f2b_ipaddr_t *ipaddr); f2b_ipaddr_t * f2b_addrlist_lookup(f2b_ipaddr_t *list, const char *addr); f2b_ipaddr_t * f2b_addrlist_remove(f2b_ipaddr_t *list, const char *addr); +f2b_ipaddr_t * f2b_addrlist_destroy(f2b_ipaddr_t *list); #endif /* F2B_IPADDR_H_ */