X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Flib%2Flibudev-list.c;h=e681e23e84c1506f62fcfcc070510c3683410e8d;hb=86b5778857522087e74182f26f0e565adea0c699;hp=00e3b7c37d6ac0a278a65a4c1ee8dbe51f2e4f19;hpb=bc8184ede9cff156709fe053e3e02ef309cb2920;p=elogind.git diff --git a/udev/lib/libudev-list.c b/udev/lib/libudev-list.c index 00e3b7c37..e681e23e8 100644 --- a/udev/lib/libudev-list.c +++ b/udev/lib/libudev-list.c @@ -29,27 +29,28 @@ struct udev_list_entry { struct udev *udev; - struct list_node node; - struct list_node *list; + struct udev_list_node node; + struct udev_list_node *list; char *name; char *value; + int flag; }; /* list head point to itself if empty */ -void list_init(struct list_node *list) +void udev_list_init(struct udev_list_node *list) { list->next = list; list->prev = list; } -static int list_is_empty(struct list_node *list) +int udev_list_is_empty(struct udev_list_node *list) { return list->next == list; } -static void list_node_insert_between(struct list_node *new, - struct list_node *prev, - struct list_node *next) +static void udev_list_node_insert_between(struct udev_list_node *new, + struct udev_list_node *prev, + struct udev_list_node *next) { next->prev = new; new->next = next; @@ -57,10 +58,15 @@ static void list_node_insert_between(struct list_node *new, prev->next = new; } -static void list_node_remove(struct list_node *entry) +void udev_list_node_append(struct udev_list_node *new, struct udev_list_node *list) { - struct list_node *prev = entry->prev; - struct list_node *next = entry->next; + udev_list_node_insert_between(new, list->prev, list); +} + +void udev_list_node_remove(struct udev_list_node *entry) +{ + struct udev_list_node *prev = entry->prev; + struct udev_list_node *next = entry->next; next->prev = prev; prev->next = next; @@ -70,7 +76,7 @@ static void list_node_remove(struct list_node *entry) } /* return list entry which embeds this node */ -static struct udev_list_entry *list_node_to_entry(struct list_node *node) +static struct udev_list_entry *list_node_to_entry(struct udev_list_node *node) { char *list; @@ -80,50 +86,47 @@ static struct udev_list_entry *list_node_to_entry(struct list_node *node) } /* insert entry into a list as the last element */ -static void list_entry_append(struct udev_list_entry *new, struct list_node *list) +static void list_entry_append(struct udev_list_entry *new, struct udev_list_node *list) { /* inserting before the list head make the node the last node in the list */ - list_node_insert_between(&new->node, list->prev, list); + udev_list_node_insert_between(&new->node, list->prev, list); new->list = list; } /* insert entry into a list, before a given existing entry */ static void list_entry_insert_before(struct udev_list_entry *new, struct udev_list_entry *entry) { - list_node_insert_between(&new->node, entry->node.prev, &entry->node); + udev_list_node_insert_between(&new->node, entry->node.prev, &entry->node); new->list = entry->list; } -void list_entry_remove(struct udev_list_entry *entry) -{ - list_node_remove(&entry->node); - entry->list = NULL; -} - -struct udev_list_entry *list_entry_add(struct udev *udev, struct list_node *list, - const char *name, const char *value, - int unique, int sort) +struct udev_list_entry *udev_list_entry_add(struct udev *udev, struct udev_list_node *list, + const char *name, const char *value, + int unique, int sort) { struct udev_list_entry *entry_loop = NULL; struct udev_list_entry *entry_new; if (unique) - udev_list_entry_foreach(entry_loop, list_get_entry(list)) { + udev_list_entry_foreach(entry_loop, udev_list_get_entry(list)) { if (strcmp(entry_loop->name, name) == 0) { - info(udev, "'%s' is already in the list\n", name); - if (value != NULL) { - free(entry_loop->value); - entry_loop->value = strdup(value); - if (entry_loop->value == NULL) - return NULL; - info(udev, "'%s' value replaced with '%s'\n", name, value); + dbg(udev, "'%s' is already in the list\n", name); + free(entry_loop->value); + if (value == NULL) { + entry_loop->value = NULL; + dbg(udev, "'%s' value unset\n", name); + return entry_loop; } + entry_loop->value = strdup(value); + if (entry_loop->value == NULL) + return NULL; + dbg(udev, "'%s' value replaced with '%s'\n", name, value); return entry_loop; } } if (sort) - udev_list_entry_foreach(entry_loop, list_get_entry(list)) { + udev_list_entry_foreach(entry_loop, udev_list_get_entry(list)) { if (strcmp(entry_loop->name, name) > 0) break; } @@ -150,38 +153,50 @@ struct udev_list_entry *list_entry_add(struct udev *udev, struct list_node *list list_entry_insert_before(entry_new, entry_loop); else list_entry_append(entry_new, list); + dbg(udev, "'%s=%s' added\n", entry_new->name, entry_new->value); return entry_new; } -void list_entry_move_to_end(struct udev_list_entry *list_entry) +void udev_list_entry_remove(struct udev_list_entry *entry) { - list_node_remove(&list_entry->node); - list_node_insert_between(&list_entry->node, list_entry->list->prev, list_entry->list); + udev_list_node_remove(&entry->node); + free(entry->name); + free(entry->value); + free(entry); } -void list_cleanup(struct udev *udev, struct list_node *list) +void udev_list_cleanup_entries(struct udev *udev, struct udev_list_node *list) { struct udev_list_entry *entry_loop; struct udev_list_entry *entry_tmp; - list_entry_foreach_safe(entry_loop, entry_tmp, list_get_entry(list)) { - list_entry_remove(entry_loop); - free(entry_loop->name); - free(entry_loop->value); - free(entry_loop); - } + udev_list_entry_foreach_safe(entry_loop, entry_tmp, udev_list_get_entry(list)) + udev_list_entry_remove(entry_loop); +} + +void udev_list_entry_move_to_end(struct udev_list_entry *list_entry) +{ + udev_list_node_remove(&list_entry->node); + udev_list_node_insert_between(&list_entry->node, list_entry->list->prev, list_entry->list); } -struct udev_list_entry *list_get_entry(struct list_node *list) +void udev_list_entry_move_before(struct udev_list_entry *list_entry, struct udev_list_entry *entry) { - if (list_is_empty(list)) + udev_list_node_remove(&list_entry->node); + udev_list_node_insert_between(&list_entry->node, entry->node.prev, &entry->node); + list_entry->list = entry->list; +} + +struct udev_list_entry *udev_list_get_entry(struct udev_list_node *list) +{ + if (udev_list_is_empty(list)) return NULL; return list_node_to_entry(list->next); } struct udev_list_entry *udev_list_entry_get_next(struct udev_list_entry *list_entry) { - struct list_node *next; + struct udev_list_node *next; if (list_entry == NULL) return NULL; @@ -196,9 +211,12 @@ struct udev_list_entry *udev_list_entry_get_by_name(struct udev_list_entry *list { struct udev_list_entry *entry; - udev_list_entry_foreach(entry, list_entry) - if (strcmp(udev_list_entry_get_name(entry), name) == 0) + udev_list_entry_foreach(entry, list_entry) { + if (strcmp(udev_list_entry_get_name(entry), name) == 0) { + dbg(entry->udev, "found '%s=%s'\n", entry->name, entry->value); return entry; + } + } return NULL; } @@ -215,3 +233,17 @@ const char *udev_list_entry_get_value(struct udev_list_entry *list_entry) return NULL; return list_entry->value; } + +extern int udev_list_entry_get_flag(struct udev_list_entry *list_entry) +{ + if (list_entry == NULL) + return -EINVAL; + return list_entry->flag; +} + +extern void udev_list_entry_set_flag(struct udev_list_entry *list_entry, int flag) +{ + if (list_entry == NULL) + return; + list_entry->flag = flag; +}