diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2022-07-14 18:28:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2022-07-16 15:12:07 +0000 |
commit | 589986012c4b3ab68e299a2eadca18f90080113b (patch) | |
tree | f29a53b04a1950cdddae69344bccb3f0146fa728 /ccan/ccan/list/list.c | |
parent | Releasing debian version 1.16-4. (diff) | |
download | nvme-cli-589986012c4b3ab68e299a2eadca18f90080113b.tar.xz nvme-cli-589986012c4b3ab68e299a2eadca18f90080113b.zip |
Merging upstream version 2.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'ccan/ccan/list/list.c')
-rw-r--r-- | ccan/ccan/list/list.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/ccan/ccan/list/list.c b/ccan/ccan/list/list.c new file mode 100644 index 0000000..2717fa3 --- /dev/null +++ b/ccan/ccan/list/list.c @@ -0,0 +1,43 @@ +/* Licensed under BSD-MIT - see LICENSE file for details */ +#include <stdio.h> +#include <stdlib.h> +#include "list.h" + +static void *corrupt(const char *abortstr, + const struct list_node *head, + const struct list_node *node, + unsigned int count) +{ + if (abortstr) { + fprintf(stderr, + "%s: prev corrupt in node %p (%u) of %p\n", + abortstr, node, count, head); + abort(); + } + return NULL; +} + +struct list_node *list_check_node(const struct list_node *node, + const char *abortstr) +{ + const struct list_node *p, *n; + int count = 0; + + for (p = node, n = node->next; n != node; p = n, n = n->next) { + count++; + if (n->prev != p) + return corrupt(abortstr, node, n, count); + } + /* Check prev on head node. */ + if (node->prev != p) + return corrupt(abortstr, node, node, 0); + + return (struct list_node *)node; +} + +struct list_head *list_check(const struct list_head *h, const char *abortstr) +{ + if (!list_check_node(&h->n, abortstr)) + return NULL; + return (struct list_head *)h; +} |