113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Copyright (C) 2005 Red Hat, Inc. */ 213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#ifndef _SEMANAGE_DATABASE_H_ 413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define _SEMANAGE_DATABASE_H_ 513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#ifndef DBASE_RECORD_DEFINED 713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef void *record_t; 813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef void *record_key_t; 913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define DBASE_RECORD_DEFINED 1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#endif 1113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#ifndef DBASE_DEFINED 1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef void *dbase_t; 1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define DBASE_DEFINED 1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#endif 1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Circular dependency */ 1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestruct semanage_handle; 1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* RECORD interface - method table */ 2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef struct record_table { 2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Create a record */ 2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*create) (struct semanage_handle * handle, record_t ** rec); 2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Extract key from record */ 2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*key_extract) (struct semanage_handle * handle, 2813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_t * rec, record_key_t ** key); 2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Free record key */ 3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle void (*key_free) (record_key_t * key); 3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Return 0 if the record matches the key, 3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * -1 if the key represents a record that should 3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * be ordered before this record, and 1 if vice-versa */ 3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*compare) (const record_t * rec, const record_key_t * key); 3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Return 0 if the record matches record2, 3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * -1 if record2 should be ordered before this record, 4013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * and 1 if vice-versa */ 4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*compare2) (const record_t * rec, const record_t * rec2); 4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Same as above, but dereferences the pointer first. 4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * This function is intenteded to be used as a qsort 4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * comparator. */ 4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*compare2_qsort) (const record_t ** rec, const record_t ** rec2); 4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 4813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Deep-copy clone of this record */ 4913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*clone) (struct semanage_handle * handle, 5013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_t * rec, record_t ** new_rec); 5113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 5213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Deallocate record resources. Must sucessfully handle NULL. */ 5313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle void (*free) (record_t * rec); 5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 5513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} record_table_t; 5613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 5713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* DBASE interface - method table */ 5813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef struct dbase_table { 5913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* --------------- Database Functionality ----------- */ 6113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Note: In all the functions below, the key is property 6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * of the caller, and will not be modified by the database. 6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * In add/set/modify, the data is also property of the caller */ 6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Add the specified record to 6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * the database. No check for duplicates is performed */ 6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*add) (struct semanage_handle * handle, 6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t * dbase, 7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, const record_t * data); 7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Add the specified record to the 7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * database if it not present. 7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * If it's present, replace it 7513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 7613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*modify) (struct semanage_handle * handle, 7713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t * dbase, 7813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, const record_t * data); 7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Modify the specified record in the database 8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * if it is present. Fail if it does not yet exist 8213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*set) (struct semanage_handle * handle, 8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t * dbase, 8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, const record_t * data); 8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Delete a record */ 8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*del) (struct semanage_handle * handle, 8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t * dbase, const record_key_t * key); 9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 9113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Clear all records, and leave the database in 9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * cached, modified state. This function does 9313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * not require a call to cache() */ 9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*clear) (struct semanage_handle * handle, dbase_t * dbase); 9513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 9613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Retrieve a record 9713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 9813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Note: the resultant record 9913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * becomes property of the caller, and 10013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * must be freed accordingly */ 10113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 10213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*query) (struct semanage_handle * handle, 10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t * dbase, 10413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, record_t ** response); 10513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Check if a record exists */ 10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*exists) (struct semanage_handle * handle, 10813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t * dbase, 10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, int *response); 11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Count the number of records */ 11213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*count) (struct semanage_handle * handle, 11313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t * dbase, unsigned int *response); 11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 11513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Execute the specified handler over 11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * the records of this database. The handler 11713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * can signal a successful exit by returning 1, 11813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * an error exit by returning -1, and continue by 11913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * returning 0 12013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 12113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Note: The record passed into the iterate handler 12213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * may or may not persist after the handler invocation, 12313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * and writing to it has unspecified behavior. It *must* 12413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * be cloned if modified, or preserved. 12513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 12613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Note: The iterate handler may not invoke any other 12713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * semanage read functions outside a transaction. It is only 12813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * reentrant while in transaction. The iterate handler may 12913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * not modify the underlying database. 13013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 13113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*iterate) (struct semanage_handle * handle, 13213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t * dbase, 13313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*fn) (const record_t * record, 13413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle void *varg), void *fn_arg); 13513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 13613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Construct a list of all records in this database 13713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * 13813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * Note: The list returned becomes property of the caller, 13913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * and must be freed accordingly. 14013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle */ 14113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*list) (struct semanage_handle * handle, 14213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t * dbase, 14313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle record_t *** records, unsigned int *count); 14413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 14513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* ---------- Cache/Transaction Management ---------- */ 14613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 14713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Cache the database (if supported). 14813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * This function must be invoked before using 14913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * any of the database functions above. It may be invoked 15013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * multiple times, and will update the cache if a commit 15113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * occured between invocations */ 15213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*cache) (struct semanage_handle * handle, dbase_t * dbase); 15313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 15413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Forgets all changes that haven't been written 15513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * to the database backend */ 15613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle void (*drop_cache) (dbase_t * dbase); 15713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 15813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Checks if there are any changes not written to the backend */ 15913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*is_modified) (dbase_t * dbase); 16013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 16113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Writes the database changes to its backend */ 16213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*flush) (struct semanage_handle * handle, dbase_t * dbase); 16313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 16413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* ------------- Polymorphism ----------------------- */ 16513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 16613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Retrieves the record table for this database, 16713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * which specifies how to perform basic operations 16813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle * on each record. */ 16913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle record_table_t *(*get_rtable) (dbase_t * dbase); 17013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 17113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} dbase_table_t; 17213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 17313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef struct dbase_config { 17413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 17513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Database state */ 17613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_t *dbase; 17713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 17813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle /* Database methods */ 17913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_table_t *dtable; 18013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 18113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle} dbase_config_t; 18213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 18313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_add(struct semanage_handle *handle, 18413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_config_t * dconfig, 18513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, const record_t * data); 18613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 18713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_modify(struct semanage_handle *handle, 18813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_config_t * dconfig, 18913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, const record_t * data); 19013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 19113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_set(struct semanage_handle *handle, 19213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_config_t * dconfig, 19313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, const record_t * data); 19413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 19513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_del(struct semanage_handle *handle, 19613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_config_t * dconfig, const record_key_t * key); 19713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 19813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_query(struct semanage_handle *handle, 19913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_config_t * dconfig, 20013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, record_t ** response); 20113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 20213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_exists(struct semanage_handle *handle, 20313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_config_t * dconfig, 20413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle const record_key_t * key, int *response); 20513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 20613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_count(struct semanage_handle *handle, 20713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_config_t * dconfig, unsigned int *response); 20813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 20913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_iterate(struct semanage_handle *handle, 21013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_config_t * dconfig, 21113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle int (*fn) (const record_t * record, 21213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle void *fn_arg), void *fn_arg); 21313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 21413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleextern int dbase_list(struct semanage_handle *handle, 21513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle dbase_config_t * dconfig, 21613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle record_t *** records, unsigned int *count); 21713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle 21813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#endif 219