X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Flibudev%2Flibudev-list.c;h=f8cd51f3c727481dd40dd67867b7eb7b1db09bd5;hb=dcf557f7b04a3c5202ddbafca06311a12442fd4c;hp=29fbdbd4509e7365875a8ef0f99b12c485b25c53;hpb=0e74bad141d035b7d45f5e46ea4f33217db3c9e8;p=thirdparty%2Fsystemd.git diff --git a/src/libudev/libudev-list.c b/src/libudev/libudev-list.c index 29fbdbd4509..f8cd51f3c72 100644 --- a/src/libudev/libudev-list.c +++ b/src/libudev/libudev-list.c @@ -1,22 +1,4 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -/*** - This file is part of systemd. - - Copyright 2008-2012 Kay Sievers - - systemd is free software; you can redistribute it and/or modify it - under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2.1 of the License, or - (at your option) any later version. - - systemd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with systemd; If not, see . -***/ #include #include @@ -24,7 +6,8 @@ #include #include "alloc-util.h" -#include "libudev-private.h" +#include "libudev-list-internal.h" +#include "memory-util.h" /** * SECTION:libudev-list @@ -33,6 +16,10 @@ * Libudev list operations. */ +struct udev_list_node { + struct udev_list_node *next, *prev; +}; + /** * udev_list_entry: * @@ -44,38 +31,36 @@ struct udev_list_entry { struct udev_list *list; char *name; char *value; - int num; +}; + +struct udev_list { + struct udev_list_node node; + struct udev_list_entry **entries; + unsigned entries_cur; + unsigned entries_max; + bool unique; }; /* the list's head points to itself if empty */ -void udev_list_node_init(struct udev_list_node *list) -{ +static void udev_list_node_init(struct udev_list_node *list) { list->next = list; list->prev = list; } -int udev_list_node_is_empty(struct udev_list_node *list) -{ +static int udev_list_node_is_empty(struct udev_list_node *list) { return list->next == list; } static void udev_list_node_insert_between(struct udev_list_node *new, struct udev_list_node *prev, - struct udev_list_node *next) -{ + struct udev_list_node *next) { next->prev = new; new->next = next; new->prev = prev; prev->next = new; } -void udev_list_node_append(struct udev_list_node *new, struct udev_list_node *list) -{ - udev_list_node_insert_between(new, list->prev, list); -} - -void udev_list_node_remove(struct udev_list_node *entry) -{ +static void udev_list_node_remove(struct udev_list_node *entry) { struct udev_list_node *prev = entry->prev; struct udev_list_node *next = entry->next; @@ -87,43 +72,47 @@ void udev_list_node_remove(struct udev_list_node *entry) } /* return list entry which embeds this node */ -static inline struct udev_list_entry *list_node_to_entry(struct udev_list_node *node) -{ +static struct udev_list_entry *list_node_to_entry(struct udev_list_node *node) { return container_of(node, struct udev_list_entry, node); } -void udev_list_init(struct udev *udev, struct udev_list *list, bool unique) -{ - memzero(list, sizeof(struct udev_list)); - list->udev = udev; - list->unique = unique; +struct udev_list *udev_list_new(bool unique) { + struct udev_list *list; + + list = new(struct udev_list, 1); + if (!list) + return NULL; + + *list = (struct udev_list) { + .unique = unique, + }; + udev_list_node_init(&list->node); + + return list; } /* insert entry into a list as the last element */ -static void udev_list_entry_append(struct udev_list_entry *new, struct udev_list *list) -{ +static void udev_list_entry_append(struct udev_list_entry *new, struct udev_list *list) { /* inserting before the list head make the node the last node in the list */ udev_list_node_insert_between(&new->node, list->node.prev, &list->node); new->list = list; } /* insert entry into a list, before a given existing entry */ -static void udev_list_entry_insert_before(struct udev_list_entry *new, struct udev_list_entry *entry) -{ +static void udev_list_entry_insert_before(struct udev_list_entry *new, struct udev_list_entry *entry) { udev_list_node_insert_between(&new->node, entry->node.prev, &entry->node); new->list = entry->list; } /* binary search in sorted array */ -static int list_search(struct udev_list *list, const char *name) -{ - unsigned int first, last; +static int list_search(struct udev_list *list, const char *name) { + unsigned first, last; first = 0; last = list->entries_cur; while (first < last) { - unsigned int i; + unsigned i; int cmp; i = (first + last)/2; @@ -140,8 +129,7 @@ static int list_search(struct udev_list *list, const char *name) return -(first+1); } -struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char *name, const char *value) -{ +struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char *name, const char *value) { struct udev_list_entry *entry; int i = 0; @@ -152,12 +140,12 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char * entry = list->entries[i]; free(entry->value); - if (value == NULL) { + if (!value) { entry->value = NULL; return entry; } entry->value = strdup(value); - if (entry->value == NULL) + if (!entry->value) return NULL; return entry; } @@ -165,16 +153,16 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char * /* add new name */ entry = new0(struct udev_list_entry, 1); - if (entry == NULL) + if (!entry) return NULL; entry->name = strdup(name); - if (entry->name == NULL) + if (!entry->name) return mfree(entry); - if (value != NULL) { + if (value) { entry->value = strdup(value); - if (entry->value == NULL) { + if (!entry->value) { free(entry->name); return mfree(entry); } @@ -184,13 +172,13 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char * /* allocate or enlarge sorted array if needed */ if (list->entries_cur >= list->entries_max) { struct udev_list_entry **entries; - unsigned int add; + unsigned add; add = list->entries_max; if (add < 1) add = 64; - entries = realloc(list->entries, (list->entries_max + add) * sizeof(struct udev_list_entry *)); - if (entries == NULL) { + entries = reallocarray(list->entries, list->entries_max + add, sizeof(struct udev_list_entry *)); + if (!entries) { free(entry->name); free(entry->value); return mfree(entry); @@ -203,7 +191,7 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char * i = (-i)-1; /* insert into sorted list */ - if ((unsigned int)i < list->entries_cur) + if ((unsigned)i < list->entries_cur) udev_list_entry_insert_before(entry, list->entries[i]); else udev_list_entry_append(entry, list); @@ -213,16 +201,14 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char * (list->entries_cur - i) * sizeof(struct udev_list_entry *)); list->entries[i] = entry; list->entries_cur++; - } else { + } else udev_list_entry_append(entry, list); - } return entry; } -void udev_list_entry_delete(struct udev_list_entry *entry) -{ - if (entry->list->entries != NULL) { +static void udev_list_entry_delete(struct udev_list_entry *entry) { + if (entry->list->entries) { int i; struct udev_list *list = entry->list; @@ -241,10 +227,13 @@ void udev_list_entry_delete(struct udev_list_entry *entry) free(entry); } -void udev_list_cleanup(struct udev_list *list) -{ - struct udev_list_entry *entry_loop; - struct udev_list_entry *entry_tmp; +#define udev_list_entry_foreach_safe(entry, tmp, first) \ + for (entry = first, tmp = udev_list_entry_get_next(entry); \ + entry; \ + entry = tmp, tmp = udev_list_entry_get_next(tmp)) + +void udev_list_cleanup(struct udev_list *list) { + struct udev_list_entry *entry_loop, *entry_tmp; list->entries = mfree(list->entries); list->entries_cur = 0; @@ -253,8 +242,16 @@ void udev_list_cleanup(struct udev_list *list) udev_list_entry_delete(entry_loop); } -struct udev_list_entry *udev_list_get_entry(struct udev_list *list) -{ +struct udev_list *udev_list_free(struct udev_list *list) { + if (!list) + return NULL; + + udev_list_cleanup(list); + + return mfree(list); +} + +struct udev_list_entry *udev_list_get_entry(struct udev_list *list) { if (udev_list_node_is_empty(&list->node)) return NULL; return list_node_to_entry(list->node.next); @@ -268,11 +265,10 @@ struct udev_list_entry *udev_list_get_entry(struct udev_list *list) * * Returns: udev_list_entry, #NULL if no more entries are available. */ -_public_ struct udev_list_entry *udev_list_entry_get_next(struct udev_list_entry *list_entry) -{ +_public_ struct udev_list_entry *udev_list_entry_get_next(struct udev_list_entry *list_entry) { struct udev_list_node *next; - if (list_entry == NULL) + if (!list_entry) return NULL; next = list_entry->node.next; /* empty list or no more entries */ @@ -290,11 +286,10 @@ _public_ struct udev_list_entry *udev_list_entry_get_next(struct udev_list_entry * * Returns: udev_list_entry, #NULL if no matching entry is found. */ -_public_ struct udev_list_entry *udev_list_entry_get_by_name(struct udev_list_entry *list_entry, const char *name) -{ +_public_ struct udev_list_entry *udev_list_entry_get_by_name(struct udev_list_entry *list_entry, const char *name) { int i; - if (list_entry == NULL) + if (!list_entry) return NULL; if (!list_entry->list->unique) @@ -314,9 +309,8 @@ _public_ struct udev_list_entry *udev_list_entry_get_by_name(struct udev_list_en * * Returns: the name string of this entry. */ -_public_ const char *udev_list_entry_get_name(struct udev_list_entry *list_entry) -{ - if (list_entry == NULL) +_public_ const char *udev_list_entry_get_name(struct udev_list_entry *list_entry) { + if (!list_entry) return NULL; return list_entry->name; } @@ -329,23 +323,8 @@ _public_ const char *udev_list_entry_get_name(struct udev_list_entry *list_entry * * Returns: the value string of this entry. */ -_public_ const char *udev_list_entry_get_value(struct udev_list_entry *list_entry) -{ - if (list_entry == NULL) +_public_ const char *udev_list_entry_get_value(struct udev_list_entry *list_entry) { + if (!list_entry) return NULL; return list_entry->value; } - -int udev_list_entry_get_num(struct udev_list_entry *list_entry) -{ - if (list_entry == NULL) - return -EINVAL; - return list_entry->num; -} - -void udev_list_entry_set_num(struct udev_list_entry *list_entry, int num) -{ - if (list_entry == NULL) - return; - list_entry->num = num; -}