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