xref: /aosp_15_r20/external/selinux/libsemanage/src/database.h (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
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