diff --git a/src/shared/queue.c b/src/shared/queue.c
index 27a030b..bfc8da0 100644
--- a/src/shared/queue.c
+++ b/src/shared/queue.c
function(entry->data, user_data);
}
+void *queue_find(struct queue *queue, queue_match_func_t function,
+ void *user_data)
+{
+ struct queue_entry *entry;
+
+ if (!queue || !function)
+ return NULL;
+
+ for (entry = queue->head; entry; entry = entry->next)
+ if (function(entry->data, user_data))
+ return entry->data;
+
+ return NULL;
+}
+
void *queue_remove_if(struct queue *queue, queue_match_func_t function,
void *user_data)
{
diff --git a/src/shared/queue.h b/src/shared/queue.h
index 66b7564..151e60c 100644
--- a/src/shared/queue.h
+++ b/src/shared/queue.h
typedef bool (*queue_match_func_t)(const void *a, const void *b);
+void *queue_find(struct queue *queue, queue_match_func_t function,
+ void *user_data);
+
void *queue_remove_if(struct queue *queue, queue_match_func_t function,
void *user_data);
bool queue_remove_all(struct queue *queue, queue_destroy_func_t destroy);