xref: /aosp_15_r20/external/selinux/libselinux/src/hashtab.h (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  * A hash table (hashtab) maintains associations between
8*2d543d20SAndroid Build Coastguard Worker  * key values and datum values.  The type of the key values
9*2d543d20SAndroid Build Coastguard Worker  * and the type of the datum values is arbitrary.  The
10*2d543d20SAndroid Build Coastguard Worker  * functions for hash computation and key comparison are
11*2d543d20SAndroid Build Coastguard Worker  * provided by the creator of the table.
12*2d543d20SAndroid Build Coastguard Worker  */
13*2d543d20SAndroid Build Coastguard Worker 
14*2d543d20SAndroid Build Coastguard Worker #ifndef _SELINUX_HASHTAB_H_
15*2d543d20SAndroid Build Coastguard Worker #define _SELINUX_HASHTAB_H_
16*2d543d20SAndroid Build Coastguard Worker 
17*2d543d20SAndroid Build Coastguard Worker #include <stdint.h>
18*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
19*2d543d20SAndroid Build Coastguard Worker #include <stdio.h>
20*2d543d20SAndroid Build Coastguard Worker 
21*2d543d20SAndroid Build Coastguard Worker typedef char *hashtab_key_t;	/* generic key type */
22*2d543d20SAndroid Build Coastguard Worker typedef const char *const_hashtab_key_t;	/* constant generic key type */
23*2d543d20SAndroid Build Coastguard Worker typedef void *hashtab_datum_t;	/* generic datum type */
24*2d543d20SAndroid Build Coastguard Worker 
25*2d543d20SAndroid Build Coastguard Worker typedef struct hashtab_node *hashtab_ptr_t;
26*2d543d20SAndroid Build Coastguard Worker 
27*2d543d20SAndroid Build Coastguard Worker typedef struct hashtab_node {
28*2d543d20SAndroid Build Coastguard Worker 	hashtab_key_t key;
29*2d543d20SAndroid Build Coastguard Worker 	hashtab_datum_t datum;
30*2d543d20SAndroid Build Coastguard Worker 	hashtab_ptr_t next;
31*2d543d20SAndroid Build Coastguard Worker } hashtab_node_t;
32*2d543d20SAndroid Build Coastguard Worker 
33*2d543d20SAndroid Build Coastguard Worker typedef struct hashtab_val {
34*2d543d20SAndroid Build Coastguard Worker 	hashtab_ptr_t *htable;	/* hash table */
35*2d543d20SAndroid Build Coastguard Worker 	unsigned int size;	/* number of slots in hash table */
36*2d543d20SAndroid Build Coastguard Worker 	uint32_t nel;		/* number of elements in hash table */
37*2d543d20SAndroid Build Coastguard Worker 	unsigned int (*hash_value) (struct hashtab_val * h, const_hashtab_key_t key);	/* hash function */
38*2d543d20SAndroid Build Coastguard Worker 	int (*keycmp) (struct hashtab_val * h, const_hashtab_key_t key1, const_hashtab_key_t key2);	/* key comparison function */
39*2d543d20SAndroid Build Coastguard Worker } hashtab_val_t;
40*2d543d20SAndroid Build Coastguard Worker 
41*2d543d20SAndroid Build Coastguard Worker typedef hashtab_val_t *hashtab_t;
42*2d543d20SAndroid Build Coastguard Worker 
43*2d543d20SAndroid Build Coastguard Worker /* Define status codes for hash table functions */
44*2d543d20SAndroid Build Coastguard Worker #define HASHTAB_SUCCESS     0
45*2d543d20SAndroid Build Coastguard Worker #define HASHTAB_OVERFLOW    -ENOMEM
46*2d543d20SAndroid Build Coastguard Worker #define HASHTAB_PRESENT     -EEXIST
47*2d543d20SAndroid Build Coastguard Worker #define HASHTAB_MISSING     -ENOENT
48*2d543d20SAndroid Build Coastguard Worker 
49*2d543d20SAndroid Build Coastguard Worker /*
50*2d543d20SAndroid Build Coastguard Worker    Creates a new hash table with the specified characteristics.
51*2d543d20SAndroid Build Coastguard Worker 
52*2d543d20SAndroid Build Coastguard Worker    Returns NULL if insufficient space is available or
53*2d543d20SAndroid Build Coastguard Worker    the new hash table otherwise.
54*2d543d20SAndroid Build Coastguard Worker  */
55*2d543d20SAndroid Build Coastguard Worker extern hashtab_t selinux_hashtab_create(unsigned int (*hash_value) (hashtab_t h,
56*2d543d20SAndroid Build Coastguard Worker 							    const_hashtab_key_t
57*2d543d20SAndroid Build Coastguard Worker 							    key),
58*2d543d20SAndroid Build Coastguard Worker 				int (*keycmp) (hashtab_t h,
59*2d543d20SAndroid Build Coastguard Worker 					       const_hashtab_key_t key1,
60*2d543d20SAndroid Build Coastguard Worker 					       const_hashtab_key_t key2),
61*2d543d20SAndroid Build Coastguard Worker 				unsigned int size);
62*2d543d20SAndroid Build Coastguard Worker /*
63*2d543d20SAndroid Build Coastguard Worker    Inserts the specified (key, datum) pair into the specified hash table.
64*2d543d20SAndroid Build Coastguard Worker 
65*2d543d20SAndroid Build Coastguard Worker    Returns HASHTAB_OVERFLOW if insufficient space is available or
66*2d543d20SAndroid Build Coastguard Worker    HASHTAB_PRESENT  if there is already an entry with the same key or
67*2d543d20SAndroid Build Coastguard Worker    HASHTAB_SUCCESS otherwise.
68*2d543d20SAndroid Build Coastguard Worker  */
69*2d543d20SAndroid Build Coastguard Worker extern int selinux_hashtab_insert(hashtab_t h, hashtab_key_t k, hashtab_datum_t d);
70*2d543d20SAndroid Build Coastguard Worker 
71*2d543d20SAndroid Build Coastguard Worker /*
72*2d543d20SAndroid Build Coastguard Worker    Removes the entry with the specified key from the hash table.
73*2d543d20SAndroid Build Coastguard Worker    Applies the specified destroy function to (key,datum,args) for
74*2d543d20SAndroid Build Coastguard Worker    the entry.
75*2d543d20SAndroid Build Coastguard Worker 
76*2d543d20SAndroid Build Coastguard Worker    Returns HASHTAB_MISSING if no entry has the specified key or
77*2d543d20SAndroid Build Coastguard Worker    HASHTAB_SUCCESS otherwise.
78*2d543d20SAndroid Build Coastguard Worker  */
79*2d543d20SAndroid Build Coastguard Worker extern int selinux_hashtab_remove(hashtab_t h, hashtab_key_t k,
80*2d543d20SAndroid Build Coastguard Worker 			  void (*destroy) (hashtab_key_t k,
81*2d543d20SAndroid Build Coastguard Worker 					   hashtab_datum_t d,
82*2d543d20SAndroid Build Coastguard Worker 					   void *args), void *args);
83*2d543d20SAndroid Build Coastguard Worker 
84*2d543d20SAndroid Build Coastguard Worker /*
85*2d543d20SAndroid Build Coastguard Worker    Searches for the entry with the specified key in the hash table.
86*2d543d20SAndroid Build Coastguard Worker 
87*2d543d20SAndroid Build Coastguard Worker    Returns NULL if no entry has the specified key or
88*2d543d20SAndroid Build Coastguard Worker    the datum of the entry otherwise.
89*2d543d20SAndroid Build Coastguard Worker  */
90*2d543d20SAndroid Build Coastguard Worker extern hashtab_datum_t selinux_hashtab_search(hashtab_t h, const_hashtab_key_t k);
91*2d543d20SAndroid Build Coastguard Worker 
92*2d543d20SAndroid Build Coastguard Worker /*
93*2d543d20SAndroid Build Coastguard Worker    Destroys the specified hash table.
94*2d543d20SAndroid Build Coastguard Worker  */
95*2d543d20SAndroid Build Coastguard Worker extern void selinux_hashtab_destroy(hashtab_t h);
96*2d543d20SAndroid Build Coastguard Worker extern void selinux_hashtab_destroy_key(hashtab_t h,
97*2d543d20SAndroid Build Coastguard Worker 			int (*destroy_key) (hashtab_key_t k));
98*2d543d20SAndroid Build Coastguard Worker 
99*2d543d20SAndroid Build Coastguard Worker /*
100*2d543d20SAndroid Build Coastguard Worker    Applies the specified apply function to (key,datum,args)
101*2d543d20SAndroid Build Coastguard Worker    for each entry in the specified hash table.
102*2d543d20SAndroid Build Coastguard Worker 
103*2d543d20SAndroid Build Coastguard Worker    The order in which the function is applied to the entries
104*2d543d20SAndroid Build Coastguard Worker    is dependent upon the internal structure of the hash table.
105*2d543d20SAndroid Build Coastguard Worker 
106*2d543d20SAndroid Build Coastguard Worker    If apply returns a non-zero status, then hashtab_map will cease
107*2d543d20SAndroid Build Coastguard Worker    iterating through the hash table and will propagate the error
108*2d543d20SAndroid Build Coastguard Worker    return to its caller.
109*2d543d20SAndroid Build Coastguard Worker  */
110*2d543d20SAndroid Build Coastguard Worker extern int selinux_hashtab_map(hashtab_t h,
111*2d543d20SAndroid Build Coastguard Worker 		       int (*apply) (hashtab_key_t k,
112*2d543d20SAndroid Build Coastguard Worker 				     hashtab_datum_t d,
113*2d543d20SAndroid Build Coastguard Worker 				     void *args), void *args);
114*2d543d20SAndroid Build Coastguard Worker 
115*2d543d20SAndroid Build Coastguard Worker extern void selinux_hashtab_hash_eval(hashtab_t h, char *tag);
116*2d543d20SAndroid Build Coastguard Worker 
117*2d543d20SAndroid Build Coastguard Worker #endif
118