diff options
Diffstat (limited to 'libqpol/src/queue.h')
-rw-r--r-- | libqpol/src/queue.h | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/libqpol/src/queue.h b/libqpol/src/queue.h new file mode 100644 index 0000000..bca304b --- /dev/null +++ b/libqpol/src/queue.h @@ -0,0 +1,67 @@ +/** + * @file + * + * This file is a copy of queue.h from NSA's CVS repository. + * + * Author : Stephen Smalley, <sds@epoch.ncsc.mil> + */ + +/* FLASK */ + +/* + * A double-ended queue is a singly linked list of + * elements of arbitrary type that may be accessed + * at either end. + */ + +#ifndef _QUEUE_H_ +#define _QUEUE_H_ + +typedef void *queue_element_t; + +typedef struct queue_node *queue_node_ptr_t; + +typedef struct queue_node +{ + queue_element_t element; + queue_node_ptr_t next; +} queue_node_t; + +typedef struct queue_info +{ + queue_node_ptr_t head; + queue_node_ptr_t tail; +} queue_info_t; + +typedef queue_info_t *queue_t; + +queue_t queue_create(void); +int queue_insert(queue_t, queue_element_t); +int queue_push(queue_t, queue_element_t); +queue_element_t queue_remove(queue_t); +queue_element_t queue_head(queue_t); +void queue_destroy(queue_t); + +/* + Applies the specified function f to each element in the + specified queue. + + In addition to passing the element to f, queue_map + passes the specified void* pointer to f on each invocation. + + If f returns a non-zero status, then queue_map will cease + iterating through the hash table and will propagate the error + return to its caller. + */ +int queue_map(queue_t, int (*f) (queue_element_t, void *), void *); + +/* + Same as queue_map, except that if f returns a non-zero status, + then the element will be removed from the queue and the g + function will be applied to the element. + */ +void queue_map_remove_on_error(queue_t, int (*f) (queue_element_t, void *), void (*g) (queue_element_t, void *), void *); + +#endif + +/* FLASK */ |