1/*
2 * Dropbear - a SSH2 server
3 *
4 * Copyright (c) 2002,2003 Matt Johnston
5 * All rights reserved.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE. */
24
25#include "includes.h"
26#include "dbutil.h"
27#include "queue.h"
28
29void initqueue(struct Queue* queue) {
30
31	queue->head = NULL;
32	queue->tail = NULL;
33	queue->count = 0;
34}
35
36int isempty(struct Queue* queue) {
37
38	return (queue->head == NULL);
39}
40
41void* dequeue(struct Queue* queue) {
42
43	void* ret;
44	struct Link* oldhead;
45	dropbear_assert(!isempty(queue));
46
47	ret = queue->head->item;
48	oldhead = queue->head;
49
50	if (oldhead->link != NULL) {
51		queue->head = oldhead->link;
52	} else {
53		queue->head = NULL;
54		queue->tail = NULL;
55		TRACE(("empty queue dequeing"))
56	}
57
58	m_free(oldhead);
59	queue->count--;
60	return ret;
61}
62
63void *examine(struct Queue* queue) {
64
65	dropbear_assert(!isempty(queue));
66	return queue->head->item;
67}
68
69void enqueue(struct Queue* queue, void* item) {
70
71	struct Link* newlink;
72
73	TRACE(("enter enqueue"))
74	newlink = (struct Link*)m_malloc(sizeof(struct Link));
75
76	newlink->item = item;
77	newlink->link = NULL;
78
79	if (queue->tail != NULL) {
80		queue->tail->link = newlink;
81	}
82	queue->tail = newlink;
83
84	if (queue->head == NULL) {
85		queue->head = newlink;
86	}
87	queue->count++;
88	TRACE(("leave enqueue"))
89}
90