X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Flibudev%2Flibudev-list.c;h=f8cd51f3c727481dd40dd67867b7eb7b1db09bd5;hb=dcf557f7b04a3c5202ddbafca06311a12442fd4c;hp=273732618781beaca5566863af98ef4d1c389795;hpb=9a43fc6a2ad9e88719c4496fbeebf18cfb65cbb2;p=thirdparty%2Fsystemd.git diff --git a/src/libudev/libudev-list.c b/src/libudev/libudev-list.c index 27373261878..f8cd51f3c72 100644 --- a/src/libudev/libudev-list.c +++ b/src/libudev/libudev-list.c @@ -7,7 +7,7 @@ #include "alloc-util.h" #include "libudev-list-internal.h" -#include "util.h" +#include "memory-util.h" /** * SECTION:libudev-list @@ -16,6 +16,10 @@ * Libudev list operations. */ +struct udev_list_node { + struct udev_list_node *next, *prev; +}; + /** * udev_list_entry: * @@ -27,7 +31,14 @@ 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 */ @@ -65,10 +76,20 @@ 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_list *list, bool unique) { - memzero(list, sizeof(struct udev_list)); - 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 */ @@ -212,8 +233,7 @@ static void udev_list_entry_delete(struct udev_list_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; - struct udev_list_entry *entry_tmp; + struct udev_list_entry *entry_loop, *entry_tmp; list->entries = mfree(list->entries); list->entries_cur = 0; @@ -222,6 +242,15 @@ void udev_list_cleanup(struct udev_list *list) { udev_list_entry_delete(entry_loop); } +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;