1*2d543d20SAndroid Build Coastguard Worker /* Copyright (C) 2005 Red Hat, Inc. */ 2*2d543d20SAndroid Build Coastguard Worker 3*2d543d20SAndroid Build Coastguard Worker #ifndef _SEMANAGE_DATABASE_H_ 4*2d543d20SAndroid Build Coastguard Worker #define _SEMANAGE_DATABASE_H_ 5*2d543d20SAndroid Build Coastguard Worker 6*2d543d20SAndroid Build Coastguard Worker #ifndef DBASE_RECORD_DEFINED 7*2d543d20SAndroid Build Coastguard Worker typedef void *record_t; 8*2d543d20SAndroid Build Coastguard Worker typedef void *record_key_t; 9*2d543d20SAndroid Build Coastguard Worker #define DBASE_RECORD_DEFINED 10*2d543d20SAndroid Build Coastguard Worker #endif 11*2d543d20SAndroid Build Coastguard Worker 12*2d543d20SAndroid Build Coastguard Worker #ifndef DBASE_DEFINED 13*2d543d20SAndroid Build Coastguard Worker typedef void *dbase_t; 14*2d543d20SAndroid Build Coastguard Worker #define DBASE_DEFINED 15*2d543d20SAndroid Build Coastguard Worker #endif 16*2d543d20SAndroid Build Coastguard Worker 17*2d543d20SAndroid Build Coastguard Worker /* Circular dependency */ 18*2d543d20SAndroid Build Coastguard Worker struct semanage_handle; 19*2d543d20SAndroid Build Coastguard Worker 20*2d543d20SAndroid Build Coastguard Worker /* RECORD interface - method table */ 21*2d543d20SAndroid Build Coastguard Worker typedef struct record_table { 22*2d543d20SAndroid Build Coastguard Worker 23*2d543d20SAndroid Build Coastguard Worker /* Create a record */ 24*2d543d20SAndroid Build Coastguard Worker int (*create) (struct semanage_handle * handle, record_t ** rec); 25*2d543d20SAndroid Build Coastguard Worker 26*2d543d20SAndroid Build Coastguard Worker /* Extract key from record */ 27*2d543d20SAndroid Build Coastguard Worker int (*key_extract) (struct semanage_handle * handle, 28*2d543d20SAndroid Build Coastguard Worker const record_t * rec, record_key_t ** key); 29*2d543d20SAndroid Build Coastguard Worker 30*2d543d20SAndroid Build Coastguard Worker /* Free record key */ 31*2d543d20SAndroid Build Coastguard Worker void (*key_free) (record_key_t * key); 32*2d543d20SAndroid Build Coastguard Worker 33*2d543d20SAndroid Build Coastguard Worker /* Return 0 if the record matches the key, 34*2d543d20SAndroid Build Coastguard Worker * -1 if the key represents a record that should 35*2d543d20SAndroid Build Coastguard Worker * be ordered before this record, and 1 if vice-versa */ 36*2d543d20SAndroid Build Coastguard Worker int (*compare) (const record_t * rec, const record_key_t * key); 37*2d543d20SAndroid Build Coastguard Worker 38*2d543d20SAndroid Build Coastguard Worker /* Return 0 if the record matches record2, 39*2d543d20SAndroid Build Coastguard Worker * -1 if record2 should be ordered before this record, 40*2d543d20SAndroid Build Coastguard Worker * and 1 if vice-versa */ 41*2d543d20SAndroid Build Coastguard Worker int (*compare2) (const record_t * rec, const record_t * rec2); 42*2d543d20SAndroid Build Coastguard Worker 43*2d543d20SAndroid Build Coastguard Worker /* Same as above, but dereferences the pointer first. 44*2d543d20SAndroid Build Coastguard Worker * This function is intenteded to be used as a qsort 45*2d543d20SAndroid Build Coastguard Worker * comparator. */ 46*2d543d20SAndroid Build Coastguard Worker int (*compare2_qsort) (const record_t ** rec, const record_t ** rec2); 47*2d543d20SAndroid Build Coastguard Worker 48*2d543d20SAndroid Build Coastguard Worker /* Deep-copy clone of this record */ 49*2d543d20SAndroid Build Coastguard Worker int (*clone) (struct semanage_handle * handle, 50*2d543d20SAndroid Build Coastguard Worker const record_t * rec, record_t ** new_rec); 51*2d543d20SAndroid Build Coastguard Worker 52*2d543d20SAndroid Build Coastguard Worker /* Deallocate record resources. Must successfully handle NULL. */ 53*2d543d20SAndroid Build Coastguard Worker void (*free) (record_t * rec); 54*2d543d20SAndroid Build Coastguard Worker 55*2d543d20SAndroid Build Coastguard Worker } record_table_t; 56*2d543d20SAndroid Build Coastguard Worker 57*2d543d20SAndroid Build Coastguard Worker /* DBASE interface - method table */ 58*2d543d20SAndroid Build Coastguard Worker typedef struct dbase_table { 59*2d543d20SAndroid Build Coastguard Worker 60*2d543d20SAndroid Build Coastguard Worker /* --------------- Database Functionality ----------- */ 61*2d543d20SAndroid Build Coastguard Worker 62*2d543d20SAndroid Build Coastguard Worker /* Note: In all the functions below, the key is property 63*2d543d20SAndroid Build Coastguard Worker * of the caller, and will not be modified by the database. 64*2d543d20SAndroid Build Coastguard Worker * In add/set/modify, the data is also property of the caller */ 65*2d543d20SAndroid Build Coastguard Worker 66*2d543d20SAndroid Build Coastguard Worker /* Add the specified record to 67*2d543d20SAndroid Build Coastguard Worker * the database. No check for duplicates is performed */ 68*2d543d20SAndroid Build Coastguard Worker int (*add) (struct semanage_handle * handle, 69*2d543d20SAndroid Build Coastguard Worker dbase_t * dbase, 70*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, const record_t * data); 71*2d543d20SAndroid Build Coastguard Worker 72*2d543d20SAndroid Build Coastguard Worker /* Add the specified record to the 73*2d543d20SAndroid Build Coastguard Worker * database if it not present. 74*2d543d20SAndroid Build Coastguard Worker * If it's present, replace it 75*2d543d20SAndroid Build Coastguard Worker */ 76*2d543d20SAndroid Build Coastguard Worker int (*modify) (struct semanage_handle * handle, 77*2d543d20SAndroid Build Coastguard Worker dbase_t * dbase, 78*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, const record_t * data); 79*2d543d20SAndroid Build Coastguard Worker 80*2d543d20SAndroid Build Coastguard Worker /* Modify the specified record in the database 81*2d543d20SAndroid Build Coastguard Worker * if it is present. Fail if it does not yet exist 82*2d543d20SAndroid Build Coastguard Worker */ 83*2d543d20SAndroid Build Coastguard Worker int (*set) (struct semanage_handle * handle, 84*2d543d20SAndroid Build Coastguard Worker dbase_t * dbase, 85*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, const record_t * data); 86*2d543d20SAndroid Build Coastguard Worker 87*2d543d20SAndroid Build Coastguard Worker /* Delete a record */ 88*2d543d20SAndroid Build Coastguard Worker int (*del) (struct semanage_handle * handle, 89*2d543d20SAndroid Build Coastguard Worker dbase_t * dbase, const record_key_t * key); 90*2d543d20SAndroid Build Coastguard Worker 91*2d543d20SAndroid Build Coastguard Worker /* Clear all records, and leave the database in 92*2d543d20SAndroid Build Coastguard Worker * cached, modified state. This function does 93*2d543d20SAndroid Build Coastguard Worker * not require a call to cache() */ 94*2d543d20SAndroid Build Coastguard Worker int (*clear) (struct semanage_handle * handle, dbase_t * dbase); 95*2d543d20SAndroid Build Coastguard Worker 96*2d543d20SAndroid Build Coastguard Worker /* Retrieve a record 97*2d543d20SAndroid Build Coastguard Worker * 98*2d543d20SAndroid Build Coastguard Worker * Note: the resultant record 99*2d543d20SAndroid Build Coastguard Worker * becomes property of the caller, and 100*2d543d20SAndroid Build Coastguard Worker * must be freed accordingly */ 101*2d543d20SAndroid Build Coastguard Worker 102*2d543d20SAndroid Build Coastguard Worker int (*query) (struct semanage_handle * handle, 103*2d543d20SAndroid Build Coastguard Worker dbase_t * dbase, 104*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, record_t ** response); 105*2d543d20SAndroid Build Coastguard Worker 106*2d543d20SAndroid Build Coastguard Worker /* Check if a record exists */ 107*2d543d20SAndroid Build Coastguard Worker int (*exists) (struct semanage_handle * handle, 108*2d543d20SAndroid Build Coastguard Worker dbase_t * dbase, 109*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, int *response); 110*2d543d20SAndroid Build Coastguard Worker 111*2d543d20SAndroid Build Coastguard Worker /* Count the number of records */ 112*2d543d20SAndroid Build Coastguard Worker int (*count) (struct semanage_handle * handle, 113*2d543d20SAndroid Build Coastguard Worker dbase_t * dbase, unsigned int *response); 114*2d543d20SAndroid Build Coastguard Worker 115*2d543d20SAndroid Build Coastguard Worker /* Execute the specified handler over 116*2d543d20SAndroid Build Coastguard Worker * the records of this database. The handler 117*2d543d20SAndroid Build Coastguard Worker * can signal a successful exit by returning 1, 118*2d543d20SAndroid Build Coastguard Worker * an error exit by returning -1, and continue by 119*2d543d20SAndroid Build Coastguard Worker * returning 0 120*2d543d20SAndroid Build Coastguard Worker * 121*2d543d20SAndroid Build Coastguard Worker * Note: The record passed into the iterate handler 122*2d543d20SAndroid Build Coastguard Worker * may or may not persist after the handler invocation, 123*2d543d20SAndroid Build Coastguard Worker * and writing to it has unspecified behavior. It *must* 124*2d543d20SAndroid Build Coastguard Worker * be cloned if modified, or preserved. 125*2d543d20SAndroid Build Coastguard Worker * 126*2d543d20SAndroid Build Coastguard Worker * Note: The iterate handler may not invoke any other 127*2d543d20SAndroid Build Coastguard Worker * semanage read functions outside a transaction. It is only 128*2d543d20SAndroid Build Coastguard Worker * reentrant while in transaction. The iterate handler may 129*2d543d20SAndroid Build Coastguard Worker * not modify the underlying database. 130*2d543d20SAndroid Build Coastguard Worker */ 131*2d543d20SAndroid Build Coastguard Worker int (*iterate) (struct semanage_handle * handle, 132*2d543d20SAndroid Build Coastguard Worker dbase_t * dbase, 133*2d543d20SAndroid Build Coastguard Worker int (*fn) (const record_t * record, 134*2d543d20SAndroid Build Coastguard Worker void *varg), void *fn_arg); 135*2d543d20SAndroid Build Coastguard Worker 136*2d543d20SAndroid Build Coastguard Worker /* Construct a list of all records in this database 137*2d543d20SAndroid Build Coastguard Worker * 138*2d543d20SAndroid Build Coastguard Worker * Note: The list returned becomes property of the caller, 139*2d543d20SAndroid Build Coastguard Worker * and must be freed accordingly. 140*2d543d20SAndroid Build Coastguard Worker */ 141*2d543d20SAndroid Build Coastguard Worker int (*list) (struct semanage_handle * handle, 142*2d543d20SAndroid Build Coastguard Worker dbase_t * dbase, 143*2d543d20SAndroid Build Coastguard Worker record_t *** records, unsigned int *count); 144*2d543d20SAndroid Build Coastguard Worker 145*2d543d20SAndroid Build Coastguard Worker /* ---------- Cache/Transaction Management ---------- */ 146*2d543d20SAndroid Build Coastguard Worker 147*2d543d20SAndroid Build Coastguard Worker /* Cache the database (if supported). 148*2d543d20SAndroid Build Coastguard Worker * This function must be invoked before using 149*2d543d20SAndroid Build Coastguard Worker * any of the database functions above. It may be invoked 150*2d543d20SAndroid Build Coastguard Worker * multiple times, and will update the cache if a commit 151*2d543d20SAndroid Build Coastguard Worker * occurred between invocations */ 152*2d543d20SAndroid Build Coastguard Worker int (*cache) (struct semanage_handle * handle, dbase_t * dbase); 153*2d543d20SAndroid Build Coastguard Worker 154*2d543d20SAndroid Build Coastguard Worker /* Forgets all changes that haven't been written 155*2d543d20SAndroid Build Coastguard Worker * to the database backend */ 156*2d543d20SAndroid Build Coastguard Worker void (*drop_cache) (dbase_t * dbase); 157*2d543d20SAndroid Build Coastguard Worker 158*2d543d20SAndroid Build Coastguard Worker /* Checks if there are any changes not written to the backend */ 159*2d543d20SAndroid Build Coastguard Worker int (*is_modified) (dbase_t * dbase); 160*2d543d20SAndroid Build Coastguard Worker 161*2d543d20SAndroid Build Coastguard Worker /* Writes the database changes to its backend */ 162*2d543d20SAndroid Build Coastguard Worker int (*flush) (struct semanage_handle * handle, dbase_t * dbase); 163*2d543d20SAndroid Build Coastguard Worker 164*2d543d20SAndroid Build Coastguard Worker /* ------------- Polymorphism ----------------------- */ 165*2d543d20SAndroid Build Coastguard Worker 166*2d543d20SAndroid Build Coastguard Worker /* Retrieves the record table for this database, 167*2d543d20SAndroid Build Coastguard Worker * which specifies how to perform basic operations 168*2d543d20SAndroid Build Coastguard Worker * on each record. */ 169*2d543d20SAndroid Build Coastguard Worker record_table_t *(*get_rtable) (dbase_t * dbase); 170*2d543d20SAndroid Build Coastguard Worker 171*2d543d20SAndroid Build Coastguard Worker } dbase_table_t; 172*2d543d20SAndroid Build Coastguard Worker 173*2d543d20SAndroid Build Coastguard Worker typedef struct dbase_config { 174*2d543d20SAndroid Build Coastguard Worker 175*2d543d20SAndroid Build Coastguard Worker /* Database state */ 176*2d543d20SAndroid Build Coastguard Worker dbase_t *dbase; 177*2d543d20SAndroid Build Coastguard Worker 178*2d543d20SAndroid Build Coastguard Worker /* Database methods */ 179*2d543d20SAndroid Build Coastguard Worker dbase_table_t *dtable; 180*2d543d20SAndroid Build Coastguard Worker 181*2d543d20SAndroid Build Coastguard Worker } dbase_config_t; 182*2d543d20SAndroid Build Coastguard Worker 183*2d543d20SAndroid Build Coastguard Worker extern int dbase_add(struct semanage_handle *handle, 184*2d543d20SAndroid Build Coastguard Worker dbase_config_t * dconfig, 185*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, const record_t * data); 186*2d543d20SAndroid Build Coastguard Worker 187*2d543d20SAndroid Build Coastguard Worker extern int dbase_modify(struct semanage_handle *handle, 188*2d543d20SAndroid Build Coastguard Worker dbase_config_t * dconfig, 189*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, const record_t * data); 190*2d543d20SAndroid Build Coastguard Worker 191*2d543d20SAndroid Build Coastguard Worker extern int dbase_set(struct semanage_handle *handle, 192*2d543d20SAndroid Build Coastguard Worker dbase_config_t * dconfig, 193*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, const record_t * data); 194*2d543d20SAndroid Build Coastguard Worker 195*2d543d20SAndroid Build Coastguard Worker extern int dbase_del(struct semanage_handle *handle, 196*2d543d20SAndroid Build Coastguard Worker dbase_config_t * dconfig, const record_key_t * key); 197*2d543d20SAndroid Build Coastguard Worker 198*2d543d20SAndroid Build Coastguard Worker extern int dbase_query(struct semanage_handle *handle, 199*2d543d20SAndroid Build Coastguard Worker dbase_config_t * dconfig, 200*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, record_t ** response); 201*2d543d20SAndroid Build Coastguard Worker 202*2d543d20SAndroid Build Coastguard Worker extern int dbase_exists(struct semanage_handle *handle, 203*2d543d20SAndroid Build Coastguard Worker dbase_config_t * dconfig, 204*2d543d20SAndroid Build Coastguard Worker const record_key_t * key, int *response); 205*2d543d20SAndroid Build Coastguard Worker 206*2d543d20SAndroid Build Coastguard Worker extern int dbase_count(struct semanage_handle *handle, 207*2d543d20SAndroid Build Coastguard Worker dbase_config_t * dconfig, unsigned int *response); 208*2d543d20SAndroid Build Coastguard Worker 209*2d543d20SAndroid Build Coastguard Worker extern int dbase_iterate(struct semanage_handle *handle, 210*2d543d20SAndroid Build Coastguard Worker dbase_config_t * dconfig, 211*2d543d20SAndroid Build Coastguard Worker int (*fn) (const record_t * record, 212*2d543d20SAndroid Build Coastguard Worker void *fn_arg), void *fn_arg); 213*2d543d20SAndroid Build Coastguard Worker 214*2d543d20SAndroid Build Coastguard Worker extern int dbase_list(struct semanage_handle *handle, 215*2d543d20SAndroid Build Coastguard Worker dbase_config_t * dconfig, 216*2d543d20SAndroid Build Coastguard Worker record_t *** records, unsigned int *count); 217*2d543d20SAndroid Build Coastguard Worker 218*2d543d20SAndroid Build Coastguard Worker #endif 219