diff --git a/include/wicked/address.h b/include/wicked/address.h index c83c02b0d..2c274d2d8 100644 --- a/include/wicked/address.h +++ b/include/wicked/address.h @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -164,12 +165,14 @@ extern unsigned int ni_address_preferred_lft(const ni_address_t *, const struct extern ni_bool_t ni_address_lft_is_valid(const ni_address_t *, const struct timeval *); extern ni_bool_t ni_address_lft_is_preferred(const ni_address_t *, const struct timeval *); -extern void ni_address_list_append(ni_address_t **, ni_address_t *); -extern void ni_address_list_destroy(ni_address_t **); +extern ni_declare_slist_append(ni_address); +extern ni_declare_slist_remove(ni_address); +extern ni_declare_slist_delete(ni_address); +extern ni_declare_slist_destroy(ni_address); +extern ni_declare_slist_copy(ni_address); +extern ni_declare_slist_count(ni_address); extern void ni_address_list_dedup(ni_address_t **); -extern void ni_address_list_copy(ni_address_t **, const ni_address_t *); extern ni_address_t * ni_address_list_find(ni_address_t *, const ni_sockaddr_t *); -extern unsigned int ni_address_list_count(ni_address_t *list); extern void ni_address_array_init(ni_address_array_t *); extern void ni_address_array_destroy(ni_address_array_t *); diff --git a/include/wicked/util.h b/include/wicked/util.h index 1bbcf9d0e..b78311d4b 100644 --- a/include/wicked/util.h +++ b/include/wicked/util.h @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -197,8 +198,8 @@ extern ni_bool_t ni_var_array_set_boolean(ni_var_array_t *, const char *, int); extern void ni_var_array_sort(ni_var_array_t *, ni_var_compare_fn_t); extern void ni_var_array_sort_by_name(ni_var_array_t *); -extern void ni_var_array_list_append(ni_var_array_t **, ni_var_array_t *); -extern void ni_var_array_list_destroy(ni_var_array_t **); +extern ni_declare_slist_append(ni_var_array); +extern ni_declare_slist_destroy(ni_var_array); extern void ni_stringbuf_set(ni_stringbuf_t *, const char *); extern void ni_stringbuf_init(ni_stringbuf_t *); diff --git a/src/addrconf.c b/src/addrconf.c index 49a76b7b5..5251c7417 100644 --- a/src/addrconf.c +++ b/src/addrconf.c @@ -110,7 +110,7 @@ ni_addrconf_lease_clone_dhcp6(struct ni_addrconf_lease_dhcp6 *clone, const struc ni_string_dup(&clone->status->message, orig->status->message); } - ni_dhcp6_ia_list_copy(&clone->ia_list, orig->ia_list, FALSE); + ni_dhcp6_ia_list_copy(&clone->ia_list, orig->ia_list); ni_string_dup(&clone->boot_url, orig->boot_url); ni_string_array_copy(&clone->boot_params, &orig->boot_params); diff --git a/src/address.c b/src/address.c index 27d484753..dbc43ba53 100644 --- a/src/address.c +++ b/src/address.c @@ -31,6 +31,7 @@ #include #include "refcount_priv.h" +#include "slist_priv.h" #include "util_priv.h" #include @@ -430,13 +431,12 @@ ni_address_lft_is_preferred(const ni_address_t *ap, const struct timeval *curren /* * ni_address list functions */ -void -ni_address_list_append(ni_address_t **list, ni_address_t *ap) -{ - while (*list) - list = &(*list)->next; - *list = ap; -} +extern ni_define_slist_append(ni_address); +extern ni_define_slist_remove(ni_address); +extern ni_define_slist_delete(ni_address); +extern ni_define_slist_destroy(ni_address); +extern ni_define_slist_copy(ni_address); +extern ni_define_slist_count(ni_address); void ni_address_list_dedup(ni_address_t **list) @@ -461,67 +461,18 @@ ni_address_list_dedup(ni_address_t **list) } } -void -ni_address_list_copy(ni_address_t **dst, const ni_address_t *src) -{ - const ni_address_t *ap; - - if (!dst) - return; - - for (ap = src; ap != NULL; ap = ap->next) - ni_address_list_append(dst, ni_address_clone(ap)); -} - -unsigned int -ni_address_list_count(ni_address_t *list) -{ - unsigned int count = 0; - const ni_address_t *ap; - - for (ap = list; ap != NULL; ap = ap->next) - count++; - return count; -} - ni_address_t * ni_address_list_find(ni_address_t *list, const ni_sockaddr_t *addr) { ni_address_t *ap; - for (ap = list; ap != NULL; ap = ap->next) { + ni_slist_foreach(list, ap) { if (ni_sockaddr_equal(&ap->local_addr, addr)) return ap; } return NULL; } -ni_bool_t -__ni_address_list_remove(ni_address_t **list, ni_address_t *ap) -{ - ni_address_t **pos, *cur; - - for (pos = list; (cur = *pos) != NULL; pos = &cur->next) { - if (cur == ap) { - *pos = cur->next; - ni_address_free(cur); - return TRUE; - } - } - return FALSE; -} - -void -ni_address_list_destroy(ni_address_t **list) -{ - ni_address_t *ap; - - while ((ap = *list) != NULL) { - *list = ap->next; - ni_address_free(ap); - } -} - void ni_address_array_init(ni_address_array_t *array) { diff --git a/src/auto6.c b/src/auto6.c index 34e1f3b6f..cc99caf1e 100644 --- a/src/auto6.c +++ b/src/auto6.c @@ -402,12 +402,14 @@ ni_auto6_lease_address_update(ni_netdev_t *dev, ni_addrconf_lease_t *lease, cons if ((la = ni_address_list_find(lease->addrs, &ap->local_addr))) { if (ap->owner != NI_ADDRCONF_NONE && ap->owner != NI_ADDRCONF_AUTOCONF) { + unsigned int plen = la->prefixlen; + changed = TRUE; - __ni_address_list_remove(&lease->addrs, la); + ni_address_list_delete(&lease->addrs, la); ni_debug_verbose(NI_LOG_DEBUG, NI_TRACE_IPV6|NI_TRACE_AUTOIP, "%s: removed address %s/%u in %s:%s lease (owner %s)", dev->name, - ni_sockaddr_print(&la->local_addr), la->prefixlen, + ni_sockaddr_print(&ap->local_addr), plen, ni_addrfamily_type_to_name(lease->family), ni_addrconf_type_to_name(lease->type), ni_addrconf_type_to_name(ap->owner)); @@ -573,12 +575,14 @@ ni_auto6_on_address_event(ni_netdev_t *dev, ni_event_t event, const ni_address_t case NI_EVENT_ADDRESS_DELETE: if ((la = ni_address_list_find(lease->addrs, &ap->local_addr))) { + unsigned int plen = la->prefixlen; + changed = TRUE; - __ni_address_list_remove(&lease->addrs, la); + ni_address_list_delete(&lease->addrs, la); ni_debug_verbose(NI_LOG_DEBUG, NI_TRACE_IPV6|NI_TRACE_AUTOIP, "%s: deleted address %s/%u in %s:%s lease (owner %s)", dev->name, - ni_sockaddr_print(&la->local_addr), la->prefixlen, + ni_sockaddr_print(&ap->local_addr), plen, ni_addrfamily_type_to_name(lease->family), ni_addrconf_type_to_name(lease->type), ni_addrconf_type_to_name(ap->owner)); diff --git a/src/dhcp6/device.c b/src/dhcp6/device.c index 9c6c242c4..bb82addfd 100644 --- a/src/dhcp6/device.c +++ b/src/dhcp6/device.c @@ -1123,7 +1123,7 @@ ni_dhcp6_acquire(ni_dhcp6_device_t *dev, const ni_dhcp6_request_t *req, char **e if (!ph->plen) continue; - padr = ni_dhcp6_ia_addr_clone(ph, FALSE); + padr = ni_dhcp6_ia_addr_clone(ph); ni_dhcp6_ia_addr_list_append(&ia->addrs, padr); break; /* one pd hint per ia only */ } diff --git a/src/dhcp6/options.c b/src/dhcp6/options.c index 79a95bff0..de77f1620 100644 --- a/src/dhcp6/options.c +++ b/src/dhcp6/options.c @@ -1,7 +1,7 @@ /* * DHCP6 option utilities used in addrconf / lease and supplicant * - * Copyright (C) 2010-2013 SUSE LINUX Products GmbH, Nuernberg, Germany. + * Copyright (C) 2010-2023 SUSE LLC * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,26 +13,26 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; if not, see or write - * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . * * Authors: - * Olaf Kirch - * Marius Tomaschewski + * Marius Tomaschewski */ #ifdef HAVE_CONFIG_H #include "config.h" #endif -#include -#include #include #include + #include "dhcp6/options.h" +#include "slist_priv.h" #include "util_priv.h" +#include +#include + /* * status */ @@ -158,25 +158,24 @@ ni_dhcp6_ia_pd_excl_free(ni_dhcp6_ia_pd_excl_t **excl) } ni_dhcp6_ia_addr_t * -ni_dhcp6_ia_addr_clone(const ni_dhcp6_ia_addr_t *iadr, ni_bool_t clean) +ni_dhcp6_ia_addr_clone(const ni_dhcp6_ia_addr_t *iadr) { ni_dhcp6_ia_addr_t *nadr; if (!iadr || !(nadr = ni_dhcp6_ia_addr_new(iadr->type, iadr->addr, iadr->plen))) return NULL; - if (iadr->excl && !(nadr->excl = ni_dhcp6_ia_pd_excl_new(iadr->excl->addr, iadr->excl->plen))) + if (iadr->excl && + !(nadr->excl = ni_dhcp6_ia_pd_excl_new(iadr->excl->addr, iadr->excl->plen))) + goto failure; + + nadr->flags = iadr->flags; + nadr->valid_lft = iadr->valid_lft; + nadr->preferred_lft = iadr->preferred_lft; + nadr->status.code = iadr->status.code; + if (!ni_string_dup(&nadr->status.message, iadr->status.message)) goto failure; - if (!clean) { - nadr->flags = iadr->flags; - nadr->valid_lft = iadr->valid_lft; - nadr->preferred_lft = iadr->preferred_lft; - nadr->status.code = iadr->status.code; - nadr->status.message = xstrdup(iadr->status.message); - if (iadr->status.message && !nadr->status.message) - goto failure; - } return nadr; failure: @@ -244,89 +243,12 @@ ni_dhcp6_ia_addr_preferred_lft(const ni_dhcp6_ia_addr_t *iadr, const struct time /* * ia address list */ -ni_bool_t -ni_dhcp6_ia_addr_list_append(ni_dhcp6_ia_addr_t **list, ni_dhcp6_ia_addr_t *iadr) -{ - if (list && iadr) { - while (*list) - list = &(*list)->next; - *list = iadr; - return TRUE; - } - return FALSE; -} - -ni_bool_t -ni_dhcp6_ia_addr_list_remove(ni_dhcp6_ia_addr_t **list, ni_dhcp6_ia_addr_t *iadr) -{ - ni_dhcp6_ia_addr_t **pos, *cur; - - if (list && iadr) { - for (pos = list; (cur = *pos); pos = &cur->next) { - if (iadr == cur) { - *pos = cur->next; - cur->next = NULL; - return TRUE; - } - } - } - return FALSE; -} - -ni_bool_t -ni_dhcp6_ia_addr_list_delete(ni_dhcp6_ia_addr_t **list, ni_dhcp6_ia_addr_t *iadr) -{ - if (ni_dhcp6_ia_addr_list_remove(list, iadr)) { - ni_dhcp6_ia_addr_free(iadr); - return TRUE; - } - return FALSE; -} - -ni_bool_t -ni_dhcp6_ia_addr_list_copy(ni_dhcp6_ia_addr_t **dst, const ni_dhcp6_ia_addr_t *src, ni_bool_t clean) -{ - const ni_dhcp6_ia_addr_t *iadr; - ni_dhcp6_ia_addr_t *nadr; - - ni_dhcp6_ia_addr_list_destroy(dst); - for (iadr = src; iadr; iadr = iadr->next) { - nadr = ni_dhcp6_ia_addr_clone(iadr, clean); - - if (!ni_dhcp6_ia_addr_list_append(dst, nadr)) - goto failure; - } - return TRUE; - -failure: - ni_dhcp6_ia_addr_list_destroy(dst); - return FALSE; -} - -size_t -ni_dhcp6_ia_addr_list_count(const ni_dhcp6_ia_addr_t *list) -{ - const ni_dhcp6_ia_addr_t *iadr; - size_t count = 0; - - for (iadr = list; iadr; iadr = iadr->next) - count++; - - return count; -} - -void -ni_dhcp6_ia_addr_list_destroy(ni_dhcp6_ia_addr_t **list) -{ - ni_dhcp6_ia_addr_t *iadr; - - if (list) { - while ((iadr = *list)) { - *list = iadr->next; - ni_dhcp6_ia_addr_free(iadr); - } - } -} +extern ni_define_slist_append(ni_dhcp6_ia_addr); +extern ni_define_slist_remove(ni_dhcp6_ia_addr); +extern ni_define_slist_delete(ni_dhcp6_ia_addr); +extern ni_define_slist_destroy(ni_dhcp6_ia_addr); +extern ni_define_slist_copy(ni_dhcp6_ia_addr); +extern ni_define_slist_count(ni_dhcp6_ia_addr); ni_dhcp6_ia_addr_t * ni_dhcp6_ia_addr_list_find(ni_dhcp6_ia_addr_t *head, const ni_dhcp6_ia_addr_t *adr, @@ -337,7 +259,7 @@ ni_dhcp6_ia_addr_list_find(ni_dhcp6_ia_addr_t *head, const ni_dhcp6_ia_addr_t *a if (!adr || !match) return NULL; - for (cur = head; cur; cur = cur->next) { + ni_slist_foreach(head, cur) { if (match(cur, adr)) return cur; } @@ -378,25 +300,22 @@ ni_dhcp6_ia_pd_new(unsigned int iaid) } ni_dhcp6_ia_t * -ni_dhcp6_ia_clone(const ni_dhcp6_ia_t *ia, ni_bool_t clean) +ni_dhcp6_ia_clone(const ni_dhcp6_ia_t *ia) { ni_dhcp6_ia_t *nia; if (!ia || !(nia = ni_dhcp6_ia_new(ia->type, ia->iaid))) return NULL; - if (!clean) { - nia->flags = ia->flags; - nia->rebind_time = ia->rebind_time; - nia->renewal_time = ia->renewal_time; - nia->acquired = ia->acquired; - nia->status.code = ia->status.code; - nia->status.message = xstrdup(ia->status.message); - if (ia->status.message && !nia->status.message) - goto failure; - } + nia->flags = ia->flags; + nia->rebind_time = ia->rebind_time; + nia->renewal_time = ia->renewal_time; + nia->acquired = ia->acquired; + nia->status.code = ia->status.code; + if (!ni_string_dup(&nia->status.message, ia->status.message)) + goto failure; - if (!ni_dhcp6_ia_addr_list_copy(&nia->addrs, ia->addrs, clean)) + if (!ni_dhcp6_ia_addr_list_copy(&nia->addrs, ia->addrs)) goto failure; return nia; @@ -435,90 +354,12 @@ ni_dhcp6_ia_type_pd(const ni_dhcp6_ia_t *ia) /* * ia list */ -ni_bool_t -ni_dhcp6_ia_list_append(ni_dhcp6_ia_t **list, ni_dhcp6_ia_t *ia) -{ - if (list && ia) { - while (*list) - list = &(*list)->next; - *list = ia; - return TRUE; - } - return FALSE; -} - -ni_bool_t -ni_dhcp6_ia_list_remove(ni_dhcp6_ia_t **list, ni_dhcp6_ia_t *ia) -{ - ni_dhcp6_ia_t **pos, *cur; - - if (list && ia) { - for (pos = list; (cur = *pos); pos = &cur->next) { - if (ia == cur) { - *pos = cur->next; - cur->next = NULL; - return TRUE; - } - } - } - return FALSE; -} - -ni_bool_t -ni_dhcp6_ia_list_delete(ni_dhcp6_ia_t **list, ni_dhcp6_ia_t *ia) -{ - if (ni_dhcp6_ia_list_remove(list, ia)) { - ni_dhcp6_ia_free(ia); - return TRUE; - } - return FALSE; -} - -ni_bool_t -ni_dhcp6_ia_list_copy(ni_dhcp6_ia_t **dst, const ni_dhcp6_ia_t *src, ni_bool_t clean) -{ - const ni_dhcp6_ia_t *ia; - ni_dhcp6_ia_t *nia; - - ni_dhcp6_ia_list_destroy(dst); - for (ia = src; ia; ia = ia->next) { - if (!(nia = ni_dhcp6_ia_clone(ia, clean))) - goto failure; - - if (!ni_dhcp6_ia_list_append(dst, nia)) - goto failure; - } - return TRUE; - -failure: - ni_dhcp6_ia_list_destroy(dst); - return FALSE; -} - -size_t -ni_dhcp6_ia_list_count(const ni_dhcp6_ia_t *list) -{ - const ni_dhcp6_ia_t *ia; - size_t count = 0; - - for (ia = list; ia; ia = ia->next) - count++; - - return count; -} - -void -ni_dhcp6_ia_list_destroy(ni_dhcp6_ia_t **list) -{ - ni_dhcp6_ia_t *ia; - - if (list) { - while ((ia = *list) != NULL) { - *list = ia->next; - ni_dhcp6_ia_free(ia); - } - } -} +extern ni_define_slist_append(ni_dhcp6_ia); +extern ni_define_slist_remove(ni_dhcp6_ia); +extern ni_define_slist_delete(ni_dhcp6_ia); +extern ni_define_slist_destroy(ni_dhcp6_ia); +extern ni_define_slist_copy(ni_dhcp6_ia); +extern ni_define_slist_count(ni_dhcp6_ia); ni_dhcp6_ia_t * ni_dhcp6_ia_list_find(ni_dhcp6_ia_t *head, const ni_dhcp6_ia_t *ia, @@ -529,7 +370,7 @@ ni_dhcp6_ia_list_find(ni_dhcp6_ia_t *head, const ni_dhcp6_ia_t *ia, if (!ia || !match) return NULL; - for (cur = head; cur; cur = cur->next) { + ni_slist_foreach(head, cur) { if (match(cur, ia)) return cur; } diff --git a/src/dhcp6/options.h b/src/dhcp6/options.h index ec104d492..359ed89d7 100644 --- a/src/dhcp6/options.h +++ b/src/dhcp6/options.h @@ -1,7 +1,7 @@ /* * DHCP6 option utilities used in addrconf / lease and supplicant * - * Copyright (C) 2010-2013 SUSE LINUX Products GmbH, Nuernberg, Germany. + * Copyright (C) 2010-2023 SUSE LLC * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -13,19 +13,17 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along - * with this program; if not, see or write - * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA. + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . * * Authors: - * Olaf Kirch - * Marius Tomaschewski + * Marius Tomaschewski */ -#ifndef __WICKED_DHCP6_OPTIONS_H__ -#define __WICKED_DHCP6_OPTIONS_H__ +#ifndef NI_WICKED_DHCP6_OPTIONS_H +#define NI_WICKED_DHCP6_OPTIONS_H #include +#include #include @@ -195,7 +193,7 @@ extern ni_dhcp6_ia_addr_t * ni_dhcp6_ia_address_new(const struct in6_addr, unsig extern ni_dhcp6_ia_addr_t * ni_dhcp6_ia_addr_new(unsigned int, const struct in6_addr, unsigned int); -extern ni_dhcp6_ia_addr_t * ni_dhcp6_ia_addr_clone(const ni_dhcp6_ia_addr_t *, ni_bool_t); +extern ni_dhcp6_ia_addr_t * ni_dhcp6_ia_addr_clone(const ni_dhcp6_ia_addr_t *); extern void ni_dhcp6_ia_addr_free(ni_dhcp6_ia_addr_t *); extern ni_bool_t ni_dhcp6_ia_addr_equal_address(const ni_dhcp6_ia_addr_t *, @@ -211,48 +209,40 @@ extern unsigned int ni_dhcp6_ia_addr_valid_lft(const ni_dhcp6_ia_addr_t *, extern unsigned int ni_dhcp6_ia_addr_preferred_lft(const ni_dhcp6_ia_addr_t *, const struct timeval *, const struct timeval *); -extern ni_bool_t ni_dhcp6_ia_addr_list_append(ni_dhcp6_ia_addr_t **, - ni_dhcp6_ia_addr_t *); -extern ni_bool_t ni_dhcp6_ia_addr_list_remove(ni_dhcp6_ia_addr_t **, - ni_dhcp6_ia_addr_t *); -extern ni_bool_t ni_dhcp6_ia_addr_list_delete(ni_dhcp6_ia_addr_t **, - ni_dhcp6_ia_addr_t *); -extern ni_bool_t ni_dhcp6_ia_addr_list_copy(ni_dhcp6_ia_addr_t **, - const ni_dhcp6_ia_addr_t *, ni_bool_t); -extern size_t ni_dhcp6_ia_addr_list_count(const ni_dhcp6_ia_addr_t *); -extern void ni_dhcp6_ia_addr_list_destroy(ni_dhcp6_ia_addr_t **); +extern ni_declare_slist_append(ni_dhcp6_ia_addr); +extern ni_declare_slist_remove(ni_dhcp6_ia_addr); +extern ni_declare_slist_delete(ni_dhcp6_ia_addr); +extern ni_declare_slist_destroy(ni_dhcp6_ia_addr); +extern ni_declare_slist_copy(ni_dhcp6_ia_addr); +extern ni_declare_slist_count(ni_dhcp6_ia_addr); typedef ni_bool_t ni_dhcp6_ia_addr_match_fn_t(const ni_dhcp6_ia_addr_t *, - const ni_dhcp6_ia_addr_t *); + const ni_dhcp6_ia_addr_t *); extern ni_dhcp6_ia_addr_t * ni_dhcp6_ia_addr_list_find(ni_dhcp6_ia_addr_t *, - const ni_dhcp6_ia_addr_t *, - ni_dhcp6_ia_addr_match_fn_t *); + const ni_dhcp6_ia_addr_t *, + ni_dhcp6_ia_addr_match_fn_t *); extern ni_dhcp6_ia_t * ni_dhcp6_ia_new(unsigned int, unsigned int); extern ni_dhcp6_ia_t * ni_dhcp6_ia_na_new(unsigned int iaid); extern ni_dhcp6_ia_t * ni_dhcp6_ia_ta_new(unsigned int iaid); extern ni_dhcp6_ia_t * ni_dhcp6_ia_pd_new(unsigned int iaid); -extern ni_dhcp6_ia_t * ni_dhcp6_ia_clone(const ni_dhcp6_ia_t *, ni_bool_t); +extern ni_dhcp6_ia_t * ni_dhcp6_ia_clone(const ni_dhcp6_ia_t *); extern void ni_dhcp6_ia_free(ni_dhcp6_ia_t *); extern ni_bool_t ni_dhcp6_ia_type_na(const ni_dhcp6_ia_t *); extern ni_bool_t ni_dhcp6_ia_type_ta(const ni_dhcp6_ia_t *); extern ni_bool_t ni_dhcp6_ia_type_pd(const ni_dhcp6_ia_t *); -extern ni_bool_t ni_dhcp6_ia_list_append(ni_dhcp6_ia_t **, - ni_dhcp6_ia_t *); -extern ni_bool_t ni_dhcp6_ia_list_remove(ni_dhcp6_ia_t **, - ni_dhcp6_ia_t *); -extern ni_bool_t ni_dhcp6_ia_list_delete(ni_dhcp6_ia_t **, - ni_dhcp6_ia_t *); -extern ni_bool_t ni_dhcp6_ia_list_copy(ni_dhcp6_ia_t **, - const ni_dhcp6_ia_t *, ni_bool_t); -extern size_t ni_dhcp6_ia_list_count(const ni_dhcp6_ia_t *); -extern void ni_dhcp6_ia_list_destroy(ni_dhcp6_ia_t **); +extern ni_declare_slist_append(ni_dhcp6_ia); +extern ni_declare_slist_remove(ni_dhcp6_ia); +extern ni_declare_slist_delete(ni_dhcp6_ia); +extern ni_declare_slist_destroy(ni_dhcp6_ia); +extern ni_declare_slist_copy(ni_dhcp6_ia); +extern ni_declare_slist_count(ni_dhcp6_ia); typedef ni_bool_t ni_dhcp6_ia_match_fn_t(const ni_dhcp6_ia_t *, - const ni_dhcp6_ia_t *); + const ni_dhcp6_ia_t *); extern ni_dhcp6_ia_t * ni_dhcp6_ia_list_find(ni_dhcp6_ia_t *, - const ni_dhcp6_ia_t *, - ni_dhcp6_ia_match_fn_t *); + const ni_dhcp6_ia_t *, + ni_dhcp6_ia_match_fn_t *); -#endif /* __WICKED_DHCP6_OPTIONS_H__ */ +#endif /* NI_WICKED_DHCP6_OPTIONS_H */ diff --git a/src/extension.c b/src/extension.c index b2ffd6de5..f6e494746 100644 --- a/src/extension.c +++ b/src/extension.c @@ -13,6 +13,7 @@ #include "appconfig.h" #include "extension.h" #include "process.h" +#include "slist_priv.h" #include "util_priv.h" #include @@ -21,53 +22,6 @@ #include #include -/* - * basic list operation macro helper function bodies - */ -#define ni_slist_tail(tail) \ - while (tail && tail->next) { \ - tail = tail->next; \ - } - -#define ni_slist_insert(list, head, tail) \ - if (list && head) { \ - tail->next = *list; \ - *list = head; \ - return TRUE; \ - } - -#define ni_slist_append(list, item) \ - if (list && item) { \ - while (*list) \ - list = &(*list)->next; \ - *list = item; \ - return TRUE; \ - } - -#define ni_slist_remove(list, item, pos, cur) \ - if (list && item) { \ - for (pos = list; (cur = *pos); pos = &cur->next) { \ - if (item == cur) { \ - *pos = cur->next; \ - cur->next = NULL; \ - return TRUE; \ - } \ - } \ - } - -#define ni_slist_destroy(list, item, free_fn) \ - if (list) { \ - while ((item = *list)) { \ - *list = item->next; \ - free_fn(item); \ - } \ - } - -#define ni_slist_find_member(head, item, member, cmp_fn) \ - for (item = head; item; item = item->next) { \ - if (cmp_fn(item->member, member)) \ - return item; \ - } /* * C Binding / builtin action @@ -130,73 +84,25 @@ ni_c_binding_get_address(const ni_c_binding_t *binding) return addr; } -ni_bool_t -ni_c_binding_list_insert(ni_c_binding_t **list, ni_c_binding_t *item) -{ - ni_c_binding_t *tail = item; - - ni_slist_tail(tail); - ni_slist_insert(list, item, tail); - return FALSE; -} - -ni_bool_t -ni_c_binding_list_append(ni_c_binding_t **list, ni_c_binding_t *item) -{ - ni_slist_append(list, item); - return FALSE; -} - -ni_bool_t -ni_c_binding_list_remove(ni_c_binding_t **list, ni_c_binding_t *item) -{ - ni_c_binding_t **pos, *cur; - - ni_slist_remove(list, item, pos, cur); - return FALSE; -} - -ni_bool_t -ni_c_binding_list_replace(ni_c_binding_t **list, ni_c_binding_t *oitem, - ni_c_binding_t *nitem) -{ - ni_c_binding_t **pos, *cur, *tail = nitem; - - if (!list || !oitem || !nitem) - return FALSE; - - while (tail && tail->next) - tail = tail->next; - - for (pos = list; (cur = *pos); pos = &cur->next) { - if (oitem == cur) { - tail->next = cur->next; - cur->next = NULL; - *pos = nitem; - return TRUE; - } - } - return FALSE; -} - -void -ni_c_binding_list_destroy(ni_c_binding_t **list) -{ - ni_c_binding_t *item; - - ni_slist_destroy(list, item, ni_c_binding_free); -} +extern ni_define_slist_insert(ni_c_binding); +extern ni_define_slist_append(ni_c_binding); +extern ni_define_slist_remove(ni_c_binding); +extern ni_define_slist_replace(ni_c_binding); +extern ni_define_slist_destroy(ni_c_binding); ni_c_binding_t * ni_c_binding_list_find(ni_c_binding_t *head, const char *name) { ni_c_binding_t *item; - ni_slist_find_member(head, item, name, ni_string_eq); + ni_slist_foreach(head, item) { + if (ni_string_eq(item->name, name)) + return item; + } + return NULL; } - /* * Script action */ @@ -229,69 +135,22 @@ ni_script_action_free(ni_script_action_t *script) } } -ni_bool_t -ni_script_action_list_insert(ni_script_action_t **list, ni_script_action_t *item) -{ - ni_script_action_t *tail = item; - - ni_slist_tail(tail); - ni_slist_insert(list, item, tail); - return FALSE; -} - -ni_bool_t -ni_script_action_list_append(ni_script_action_t **list, ni_script_action_t *item) -{ - ni_slist_append(list, item); - return FALSE; -} - -ni_bool_t -ni_script_action_list_remove(ni_script_action_t **list, ni_script_action_t *item) -{ - ni_script_action_t **pos, *cur; - - ni_slist_remove(list, item, pos, cur); - return FALSE; -} - -ni_bool_t -ni_script_action_list_replace(ni_script_action_t **list, ni_script_action_t *oitem, - ni_script_action_t *nitem) -{ - ni_script_action_t **pos, *cur, *tail = nitem; - - if (!list || !oitem || !nitem) - return FALSE; - - while (tail && tail->next) - tail = tail->next; - - for (pos = list; (cur = *pos); pos = &cur->next) { - if (oitem == cur) { - tail->next = cur->next; - cur->next = NULL; - *pos = nitem; - return TRUE; - } - } - return FALSE; -} - -void -ni_script_action_list_destroy(ni_script_action_t **list) -{ - ni_script_action_t *item; - - ni_slist_destroy(list, item, ni_script_action_free); -} +extern ni_define_slist_insert(ni_script_action); +extern ni_define_slist_append(ni_script_action); +extern ni_define_slist_remove(ni_script_action); +extern ni_define_slist_replace(ni_script_action); +extern ni_define_slist_destroy(ni_script_action); ni_script_action_t * ni_script_action_list_find(ni_script_action_t *head, const char *name) { ni_script_action_t *item; - ni_slist_find_member(head, item, name, ni_string_eq); + ni_slist_foreach(head, item) { + if (ni_string_eq(item->name, name)) + return item; + } + return NULL; } @@ -331,69 +190,22 @@ ni_extension_free(ni_extension_t *ex) } } -ni_bool_t -ni_extension_list_insert(ni_extension_t **list, ni_extension_t *item) -{ - ni_extension_t *tail = item; - - ni_slist_tail(tail); - ni_slist_insert(list, item, tail); - return FALSE; -} - -ni_bool_t -ni_extension_list_append(ni_extension_t **list, ni_extension_t *item) -{ - ni_slist_append(list, item); - return FALSE; -} - -ni_bool_t -ni_extension_list_remove(ni_extension_t **list, ni_extension_t *item) -{ - ni_extension_t **pos, *cur; - - ni_slist_remove(list, item, pos, cur); - return FALSE; -} - -ni_bool_t -ni_extension_list_replace(ni_extension_t **list, ni_extension_t *oitem, - ni_extension_t *nitem) -{ - ni_extension_t **pos, *cur, *tail = nitem; - - if (!list || !oitem || !nitem) - return FALSE; - - while (tail && tail->next) - tail = tail->next; - - for (pos = list; (cur = *pos); pos = &cur->next) { - if (oitem == cur) { - tail->next = cur->next; - cur->next = NULL; - *pos = nitem; - return TRUE; - } - } - return FALSE; -} - -void -ni_extension_list_destroy(ni_extension_t **list) -{ - ni_extension_t *item; - - ni_slist_destroy(list, item, ni_extension_free); -} +extern ni_define_slist_insert(ni_extension); +extern ni_define_slist_append(ni_extension); +extern ni_define_slist_remove(ni_extension); +extern ni_define_slist_replace(ni_extension); +extern ni_define_slist_destroy(ni_extension); ni_extension_t * -ni_extension_list_find(ni_extension_t *head, const char *interface) +ni_extension_list_find(ni_extension_t *head, const char *name) { ni_extension_t *item; - ni_slist_find_member(head, item, interface, ni_string_eq); + ni_slist_foreach(head, item) { + if (ni_string_eq(item->name, name)) + return item; + } + return NULL; } diff --git a/src/extension.h b/src/extension.h index bf8d4615e..1e8b5d2a2 100644 --- a/src/extension.h +++ b/src/extension.h @@ -25,42 +25,37 @@ #define NI_WICKED_EXTENSIONS_H #include +#include extern ni_c_binding_t * ni_c_binding_new(const char *, const char *, const char *); extern void ni_c_binding_free(ni_c_binding_t *); extern void * ni_c_binding_get_address(const ni_c_binding_t *); -extern ni_bool_t ni_c_binding_list_insert(ni_c_binding_t **, ni_c_binding_t *); -extern ni_bool_t ni_c_binding_list_append(ni_c_binding_t **, ni_c_binding_t *); -extern ni_bool_t ni_c_binding_list_remove(ni_c_binding_t **, ni_c_binding_t *); -extern ni_bool_t ni_c_binding_list_replace(ni_c_binding_t **, ni_c_binding_t *, - ni_c_binding_t *); -extern void ni_c_binding_list_destroy(ni_c_binding_t **); +extern ni_declare_slist_insert(ni_c_binding); +extern ni_declare_slist_append(ni_c_binding); +extern ni_declare_slist_remove(ni_c_binding); +extern ni_declare_slist_replace(ni_c_binding); +extern ni_declare_slist_destroy(ni_c_binding); extern ni_c_binding_t * ni_c_binding_list_find(ni_c_binding_t *, const char *); extern ni_script_action_t * ni_script_action_new(const char *, const char *); extern void ni_script_action_free(ni_script_action_t *); -extern ni_bool_t ni_script_action_list_insert(ni_script_action_t **, - ni_script_action_t *); -extern ni_bool_t ni_script_action_list_append(ni_script_action_t **, - ni_script_action_t *); -extern ni_bool_t ni_script_action_list_remove(ni_script_action_t **, - ni_script_action_t *); -extern ni_bool_t ni_script_action_list_replace(ni_script_action_t **, - ni_script_action_t *, ni_script_action_t *); -extern void ni_script_action_list_destroy(ni_script_action_t **); +extern ni_declare_slist_insert(ni_script_action); +extern ni_declare_slist_append(ni_script_action); +extern ni_declare_slist_remove(ni_script_action); +extern ni_declare_slist_replace(ni_script_action); +extern ni_declare_slist_destroy(ni_script_action); extern ni_script_action_t * ni_script_action_list_find(ni_script_action_t *, const char *); extern ni_extension_t * ni_extension_new(const char *); extern void ni_extension_free(ni_extension_t *); -extern ni_bool_t ni_extension_list_insert(ni_extension_t **, ni_extension_t *); -extern ni_bool_t ni_extension_list_append(ni_extension_t **, ni_extension_t *); -extern ni_bool_t ni_extension_list_remove(ni_extension_t **, ni_extension_t *); -extern ni_bool_t ni_extension_list_replace(ni_extension_t **, ni_extension_t *, - ni_extension_t *); -extern void ni_extension_list_destroy(ni_extension_t **); +extern ni_declare_slist_insert(ni_extension); +extern ni_declare_slist_append(ni_extension); +extern ni_declare_slist_remove(ni_extension); +extern ni_declare_slist_replace(ni_extension); +extern ni_declare_slist_destroy(ni_extension); extern ni_extension_t * ni_extension_list_find(ni_extension_t *, const char *); extern ni_shellcmd_t * ni_extension_find_script(ni_extension_t *, const char *); diff --git a/src/ifevent.c b/src/ifevent.c index 4645b7f63..c3dec8225 100644 --- a/src/ifevent.c +++ b/src/ifevent.c @@ -520,7 +520,7 @@ __ni_rtevent_deladdr(ni_netconfig_t *nc, const struct sockaddr_nl *nladdr, struc /* Remove the address when we track it */ if ((ap = ni_address_list_find(dev->addrs, &tmp.local_addr)) != NULL) - __ni_address_list_remove(&dev->addrs, ap); + ni_address_list_delete(&dev->addrs, ap); /* Tentative IPv6 addresses are not exposed via NEWADDR events, * but in manuall address lookup / dump only. diff --git a/src/netinfo_priv.h b/src/netinfo_priv.h index 63608e7cc..572e2cd87 100644 --- a/src/netinfo_priv.h +++ b/src/netinfo_priv.h @@ -79,8 +79,6 @@ extern int __ni_ipv6_devconf_process_flags(ni_netdev_t *, int32_t *, unsigned i extern void __ni_routes_clear(ni_netconfig_t *); -extern ni_bool_t __ni_address_list_remove(ni_address_t **, ni_address_t *); - extern int __ni_system_refresh_all(ni_netconfig_t *nc, ni_netdev_t **del_list); extern int __ni_system_refresh_interfaces(ni_netconfig_t *nc); extern int __ni_system_refresh_interface(ni_netconfig_t *, ni_netdev_t *); diff --git a/src/util.c b/src/util.c index afcc87829..56faa8a55 100644 --- a/src/util.c +++ b/src/util.c @@ -26,6 +26,7 @@ #include #include /* only for CONFIG_WICKED_STATEDIR */ #include /* for NI_IFWORKER_INFINITE_TIMEOUT */ +#include "slist_priv.h" #include "util_priv.h" #define NI_STRING_ARRAY_CHUNK 16 @@ -1054,28 +1055,11 @@ ni_var_array_sort_by_name(ni_var_array_t *nva) ni_var_array_sort(nva, ni_var_name_cmp); } -void -ni_var_array_list_append(ni_var_array_t **list, ni_var_array_t *nva) -{ - if (list && nva) { - while (*list) - list = &(*list)->next; - *list = nva; - } -} - -void -ni_var_array_list_destroy(ni_var_array_t **list) -{ - ni_var_array_t *nva; - - if (list) { - while ((nva = *list)) { - *list = nva->next; - ni_var_array_free(nva); - } - } -} +/* + * var_array list + */ +extern ni_define_slist_append(ni_var_array); +extern ni_define_slist_destroy(ni_var_array); /*