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