xref: /aosp_15_r20/external/selinux/checkpolicy/queue.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
1*2d543d20SAndroid Build Coastguard Worker 
2*2d543d20SAndroid Build Coastguard Worker /* Author : Stephen Smalley, <[email protected]> */
3*2d543d20SAndroid Build Coastguard Worker 
4*2d543d20SAndroid Build Coastguard Worker /* FLASK */
5*2d543d20SAndroid Build Coastguard Worker 
6*2d543d20SAndroid Build Coastguard Worker /*
7*2d543d20SAndroid Build Coastguard Worker  * Implementation of the double-ended queue type.
8*2d543d20SAndroid Build Coastguard Worker  */
9*2d543d20SAndroid Build Coastguard Worker 
10*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
11*2d543d20SAndroid Build Coastguard Worker #include "queue.h"
12*2d543d20SAndroid Build Coastguard Worker 
queue_create(void)13*2d543d20SAndroid Build Coastguard Worker queue_t queue_create(void)
14*2d543d20SAndroid Build Coastguard Worker {
15*2d543d20SAndroid Build Coastguard Worker 	queue_t q;
16*2d543d20SAndroid Build Coastguard Worker 
17*2d543d20SAndroid Build Coastguard Worker 	q = (queue_t) malloc(sizeof(struct queue_info));
18*2d543d20SAndroid Build Coastguard Worker 	if (q == NULL)
19*2d543d20SAndroid Build Coastguard Worker 		return NULL;
20*2d543d20SAndroid Build Coastguard Worker 
21*2d543d20SAndroid Build Coastguard Worker 	q->head = q->tail = NULL;
22*2d543d20SAndroid Build Coastguard Worker 
23*2d543d20SAndroid Build Coastguard Worker 	return q;
24*2d543d20SAndroid Build Coastguard Worker }
25*2d543d20SAndroid Build Coastguard Worker 
queue_insert(queue_t q,queue_element_t e)26*2d543d20SAndroid Build Coastguard Worker int queue_insert(queue_t q, queue_element_t e)
27*2d543d20SAndroid Build Coastguard Worker {
28*2d543d20SAndroid Build Coastguard Worker 	queue_node_ptr_t newnode;
29*2d543d20SAndroid Build Coastguard Worker 
30*2d543d20SAndroid Build Coastguard Worker 	if (!q)
31*2d543d20SAndroid Build Coastguard Worker 		return -1;
32*2d543d20SAndroid Build Coastguard Worker 
33*2d543d20SAndroid Build Coastguard Worker 	newnode = (queue_node_ptr_t) malloc(sizeof(struct queue_node));
34*2d543d20SAndroid Build Coastguard Worker 	if (newnode == NULL)
35*2d543d20SAndroid Build Coastguard Worker 		return -1;
36*2d543d20SAndroid Build Coastguard Worker 
37*2d543d20SAndroid Build Coastguard Worker 	newnode->element = e;
38*2d543d20SAndroid Build Coastguard Worker 	newnode->next = NULL;
39*2d543d20SAndroid Build Coastguard Worker 
40*2d543d20SAndroid Build Coastguard Worker 	if (q->head == NULL) {
41*2d543d20SAndroid Build Coastguard Worker 		q->head = q->tail = newnode;
42*2d543d20SAndroid Build Coastguard Worker 	} else {
43*2d543d20SAndroid Build Coastguard Worker 		q->tail->next = newnode;
44*2d543d20SAndroid Build Coastguard Worker 		q->tail = newnode;
45*2d543d20SAndroid Build Coastguard Worker 	}
46*2d543d20SAndroid Build Coastguard Worker 
47*2d543d20SAndroid Build Coastguard Worker 	return 0;
48*2d543d20SAndroid Build Coastguard Worker }
49*2d543d20SAndroid Build Coastguard Worker 
queue_push(queue_t q,queue_element_t e)50*2d543d20SAndroid Build Coastguard Worker int queue_push(queue_t q, queue_element_t e)
51*2d543d20SAndroid Build Coastguard Worker {
52*2d543d20SAndroid Build Coastguard Worker 	queue_node_ptr_t newnode;
53*2d543d20SAndroid Build Coastguard Worker 
54*2d543d20SAndroid Build Coastguard Worker 	if (!q)
55*2d543d20SAndroid Build Coastguard Worker 		return -1;
56*2d543d20SAndroid Build Coastguard Worker 
57*2d543d20SAndroid Build Coastguard Worker 	newnode = (queue_node_ptr_t) malloc(sizeof(struct queue_node));
58*2d543d20SAndroid Build Coastguard Worker 	if (newnode == NULL)
59*2d543d20SAndroid Build Coastguard Worker 		return -1;
60*2d543d20SAndroid Build Coastguard Worker 
61*2d543d20SAndroid Build Coastguard Worker 	newnode->element = e;
62*2d543d20SAndroid Build Coastguard Worker 	newnode->next = NULL;
63*2d543d20SAndroid Build Coastguard Worker 
64*2d543d20SAndroid Build Coastguard Worker 	if (q->head == NULL) {
65*2d543d20SAndroid Build Coastguard Worker 		q->head = q->tail = newnode;
66*2d543d20SAndroid Build Coastguard Worker 	} else {
67*2d543d20SAndroid Build Coastguard Worker 		newnode->next = q->head;
68*2d543d20SAndroid Build Coastguard Worker 		q->head = newnode;
69*2d543d20SAndroid Build Coastguard Worker 	}
70*2d543d20SAndroid Build Coastguard Worker 
71*2d543d20SAndroid Build Coastguard Worker 	return 0;
72*2d543d20SAndroid Build Coastguard Worker }
73*2d543d20SAndroid Build Coastguard Worker 
queue_remove(queue_t q)74*2d543d20SAndroid Build Coastguard Worker queue_element_t queue_remove(queue_t q)
75*2d543d20SAndroid Build Coastguard Worker {
76*2d543d20SAndroid Build Coastguard Worker 	queue_node_ptr_t node;
77*2d543d20SAndroid Build Coastguard Worker 	queue_element_t e;
78*2d543d20SAndroid Build Coastguard Worker 
79*2d543d20SAndroid Build Coastguard Worker 	if (!q)
80*2d543d20SAndroid Build Coastguard Worker 		return NULL;
81*2d543d20SAndroid Build Coastguard Worker 
82*2d543d20SAndroid Build Coastguard Worker 	if (q->head == NULL)
83*2d543d20SAndroid Build Coastguard Worker 		return NULL;
84*2d543d20SAndroid Build Coastguard Worker 
85*2d543d20SAndroid Build Coastguard Worker 	node = q->head;
86*2d543d20SAndroid Build Coastguard Worker 	q->head = q->head->next;
87*2d543d20SAndroid Build Coastguard Worker 	if (q->head == NULL)
88*2d543d20SAndroid Build Coastguard Worker 		q->tail = NULL;
89*2d543d20SAndroid Build Coastguard Worker 
90*2d543d20SAndroid Build Coastguard Worker 	e = node->element;
91*2d543d20SAndroid Build Coastguard Worker 	free(node);
92*2d543d20SAndroid Build Coastguard Worker 
93*2d543d20SAndroid Build Coastguard Worker 	return e;
94*2d543d20SAndroid Build Coastguard Worker }
95*2d543d20SAndroid Build Coastguard Worker 
queue_head(queue_t q)96*2d543d20SAndroid Build Coastguard Worker queue_element_t queue_head(queue_t q)
97*2d543d20SAndroid Build Coastguard Worker {
98*2d543d20SAndroid Build Coastguard Worker 	if (!q)
99*2d543d20SAndroid Build Coastguard Worker 		return NULL;
100*2d543d20SAndroid Build Coastguard Worker 
101*2d543d20SAndroid Build Coastguard Worker 	if (q->head == NULL)
102*2d543d20SAndroid Build Coastguard Worker 		return NULL;
103*2d543d20SAndroid Build Coastguard Worker 
104*2d543d20SAndroid Build Coastguard Worker 	return q->head->element;
105*2d543d20SAndroid Build Coastguard Worker }
106*2d543d20SAndroid Build Coastguard Worker 
queue_destroy(queue_t q)107*2d543d20SAndroid Build Coastguard Worker void queue_destroy(queue_t q)
108*2d543d20SAndroid Build Coastguard Worker {
109*2d543d20SAndroid Build Coastguard Worker 	queue_node_ptr_t p, temp;
110*2d543d20SAndroid Build Coastguard Worker 
111*2d543d20SAndroid Build Coastguard Worker 	if (!q)
112*2d543d20SAndroid Build Coastguard Worker 		return;
113*2d543d20SAndroid Build Coastguard Worker 
114*2d543d20SAndroid Build Coastguard Worker 	p = q->head;
115*2d543d20SAndroid Build Coastguard Worker 	while (p != NULL) {
116*2d543d20SAndroid Build Coastguard Worker 		free(p->element);
117*2d543d20SAndroid Build Coastguard Worker 		temp = p;
118*2d543d20SAndroid Build Coastguard Worker 		p = p->next;
119*2d543d20SAndroid Build Coastguard Worker 		free(temp);
120*2d543d20SAndroid Build Coastguard Worker 	}
121*2d543d20SAndroid Build Coastguard Worker 
122*2d543d20SAndroid Build Coastguard Worker 	free(q);
123*2d543d20SAndroid Build Coastguard Worker }
124*2d543d20SAndroid Build Coastguard Worker 
queue_map(queue_t q,int (* f)(queue_element_t,void *),void * vp)125*2d543d20SAndroid Build Coastguard Worker int queue_map(queue_t q, int (*f) (queue_element_t, void *), void *vp)
126*2d543d20SAndroid Build Coastguard Worker {
127*2d543d20SAndroid Build Coastguard Worker 	queue_node_ptr_t p;
128*2d543d20SAndroid Build Coastguard Worker 	int ret;
129*2d543d20SAndroid Build Coastguard Worker 
130*2d543d20SAndroid Build Coastguard Worker 	if (!q)
131*2d543d20SAndroid Build Coastguard Worker 		return 0;
132*2d543d20SAndroid Build Coastguard Worker 
133*2d543d20SAndroid Build Coastguard Worker 	p = q->head;
134*2d543d20SAndroid Build Coastguard Worker 	while (p != NULL) {
135*2d543d20SAndroid Build Coastguard Worker 		ret = f(p->element, vp);
136*2d543d20SAndroid Build Coastguard Worker 		if (ret)
137*2d543d20SAndroid Build Coastguard Worker 			return ret;
138*2d543d20SAndroid Build Coastguard Worker 		p = p->next;
139*2d543d20SAndroid Build Coastguard Worker 	}
140*2d543d20SAndroid Build Coastguard Worker 	return 0;
141*2d543d20SAndroid Build Coastguard Worker }
142*2d543d20SAndroid Build Coastguard Worker 
queue_map_remove_on_error(queue_t q,int (* f)(queue_element_t,void *),void (* g)(queue_element_t,void *),void * vp)143*2d543d20SAndroid Build Coastguard Worker void queue_map_remove_on_error(queue_t q,
144*2d543d20SAndroid Build Coastguard Worker 			       int (*f) (queue_element_t, void *),
145*2d543d20SAndroid Build Coastguard Worker 			       void (*g) (queue_element_t, void *), void *vp)
146*2d543d20SAndroid Build Coastguard Worker {
147*2d543d20SAndroid Build Coastguard Worker 	queue_node_ptr_t p, last, temp;
148*2d543d20SAndroid Build Coastguard Worker 	int ret;
149*2d543d20SAndroid Build Coastguard Worker 
150*2d543d20SAndroid Build Coastguard Worker 	if (!q)
151*2d543d20SAndroid Build Coastguard Worker 		return;
152*2d543d20SAndroid Build Coastguard Worker 
153*2d543d20SAndroid Build Coastguard Worker 	last = NULL;
154*2d543d20SAndroid Build Coastguard Worker 	p = q->head;
155*2d543d20SAndroid Build Coastguard Worker 	while (p != NULL) {
156*2d543d20SAndroid Build Coastguard Worker 		ret = f(p->element, vp);
157*2d543d20SAndroid Build Coastguard Worker 		if (ret) {
158*2d543d20SAndroid Build Coastguard Worker 			if (last) {
159*2d543d20SAndroid Build Coastguard Worker 				last->next = p->next;
160*2d543d20SAndroid Build Coastguard Worker 				if (last->next == NULL)
161*2d543d20SAndroid Build Coastguard Worker 					q->tail = last;
162*2d543d20SAndroid Build Coastguard Worker 			} else {
163*2d543d20SAndroid Build Coastguard Worker 				q->head = p->next;
164*2d543d20SAndroid Build Coastguard Worker 				if (q->head == NULL)
165*2d543d20SAndroid Build Coastguard Worker 					q->tail = NULL;
166*2d543d20SAndroid Build Coastguard Worker 			}
167*2d543d20SAndroid Build Coastguard Worker 
168*2d543d20SAndroid Build Coastguard Worker 			temp = p;
169*2d543d20SAndroid Build Coastguard Worker 			p = p->next;
170*2d543d20SAndroid Build Coastguard Worker 			g(temp->element, vp);
171*2d543d20SAndroid Build Coastguard Worker 			free(temp);
172*2d543d20SAndroid Build Coastguard Worker 		} else {
173*2d543d20SAndroid Build Coastguard Worker 			last = p;
174*2d543d20SAndroid Build Coastguard Worker 			p = p->next;
175*2d543d20SAndroid Build Coastguard Worker 		}
176*2d543d20SAndroid Build Coastguard Worker 	}
177*2d543d20SAndroid Build Coastguard Worker 
178*2d543d20SAndroid Build Coastguard Worker 	return;
179*2d543d20SAndroid Build Coastguard Worker }
180*2d543d20SAndroid Build Coastguard Worker 
181*2d543d20SAndroid Build Coastguard Worker /* FLASK */
182