2 * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
7 #if !defined(lint) && !defined(__CODECENTER__)
8 static char *rcsid = "$Header$";
13 #include "policy_db.h"
18 #define OPENLOCK(db, mode) \
23 else if (db->magic != OSA_ADB_POLICY_DB_MAGIC) \
24 return OSA_ADB_DBINIT; \
25 else if ((olret = osa_adb_open_and_lock(db, mode)) != OSA_ADB_OK) \
29 #define CLOSELOCK(db) \
32 if ((cl_ret = osa_adb_close_and_unlock(db)) != OSA_ADB_OK) \
38 * Function: osa_adb_create_policy
40 * Purpose: create a policy entry in the policy db.
43 * entry (input) pointer to the entry to be added
44 * <return value> OSA_ADB_OK on success, else error code.
47 * entry have a valid name.
50 * creates the entry in the db
57 osa_adb_create_policy(osa_adb_policy_t db, osa_policy_ent_t entry)
64 OPENLOCK(db, KRB5_DB_LOCKMODE_EXCLUSIVE);
66 if(entry->name == NULL) {
70 dbkey.data = entry->name;
71 dbkey.size = (strlen(entry->name) + 1);
73 switch(db->db->get(db->db, &dbkey, &dbdata, 0)) {
83 xdralloc_create(&xdrs, XDR_ENCODE);
84 if(!xdr_osa_policy_ent_rec(&xdrs, entry)) {
86 ret = OSA_ADB_XDR_FAILURE;
89 dbdata.data = xdralloc_getdata(&xdrs);
90 dbdata.size = xdr_getpos(&xdrs);
91 switch(db->db->put(db->db, &dbkey, &dbdata, R_NOOVERWRITE)) {
93 if((db->db->sync(db->db, 0)) == -1)
94 ret = OSA_ADB_FAILURE;
101 ret = OSA_ADB_FAILURE;
112 * Function: osa_adb_destroy_policy
114 * Purpose: destroy a policy entry
117 * db (input) database handle
118 * name (input) name of policy
119 * <return value> OSA_ADB_OK on success, or error code.
123 * name being non-null.
125 * deletes policy from db.
132 osa_adb_destroy_policy(osa_adb_policy_t db, char *name)
137 OPENLOCK(db, KRB5_DB_LOCKMODE_EXCLUSIVE);
144 dbkey.size = (strlen(name) + 1);
146 status = db->db->del(db->db, &dbkey, 0);
152 if ((db->db->sync(db->db, 0)) == -1) {
153 ret = OSA_ADB_FAILURE;
159 ret = OSA_ADB_FAILURE;
169 * Function: osa_adb_get_policy
171 * Purpose: retrieve policy
174 * db (input) db handle
175 * name (input) name of policy
176 * entry (output) policy entry
177 * cnt (inout) Number of entries
178 * <return value> 0 on success, error code on failure.
185 osa_adb_get_policy(osa_adb_policy_t db, char *name,
186 osa_policy_ent_t *entry, int *cnt)
194 OPENLOCK(db, KRB5_DB_LOCKMODE_SHARED);
203 dbkey.size = (strlen(dbkey.data) + 1);
206 switch((db->db->get(db->db, &dbkey, &dbdata, 0))) {
214 ret = OSA_ADB_FAILURE;
217 if (!(*(entry) = (osa_policy_ent_t)malloc(sizeof(osa_policy_ent_rec)))) {
221 if (!(aligned_data = (char *) malloc(dbdata.size))) {
225 memcpy(aligned_data, dbdata.data, dbdata.size);
226 memset(*entry, 0, sizeof(osa_policy_ent_rec));
227 xdrmem_create(&xdrs, aligned_data, dbdata.size, XDR_DECODE);
228 if (!xdr_osa_policy_ent_rec(&xdrs, *entry))
229 ret = OSA_ADB_FAILURE;
230 else ret = OSA_ADB_OK;
240 * Function: osa_adb_put_policy
242 * Purpose: update a policy in the dababase
245 * db (input) db handle
246 * entry (input) policy entry
247 * <return value> 0 on success error code on failure.
260 osa_adb_put_policy(osa_adb_policy_t db, osa_policy_ent_t entry)
268 OPENLOCK(db, KRB5_DB_LOCKMODE_EXCLUSIVE);
270 if(entry->name == NULL) {
274 dbkey.data = entry->name;
275 dbkey.size = (strlen(entry->name) + 1);
276 switch(db->db->get(db->db, &dbkey, &tmpdb, 0)) {
283 ret = OSA_ADB_FAILURE;
286 xdralloc_create(&xdrs, XDR_ENCODE);
287 if(!xdr_osa_policy_ent_rec(&xdrs, entry)) {
289 ret = OSA_ADB_XDR_FAILURE;
292 dbdata.data = xdralloc_getdata(&xdrs);
293 dbdata.size = xdr_getpos(&xdrs);
294 switch(db->db->put(db->db, &dbkey, &dbdata, 0)) {
296 if((db->db->sync(db->db, 0)) == -1)
297 ret = OSA_ADB_FAILURE;
301 ret = OSA_ADB_FAILURE;
312 * Function: osa_adb_iter_policy
314 * Purpose: iterate over the policy database.
317 * db (input) db handle
318 * func (input) fucntion pointer to call
319 * data opaque data type
320 * <return value> 0 on success error code on failure
327 osa_adb_iter_policy(osa_adb_policy_t db, osa_adb_iter_policy_func func,
334 osa_policy_ent_t entry;
337 OPENLOCK(db, KRB5_DB_LOCKMODE_EXCLUSIVE); /* hmmm */
339 if((ret = db->db->seq(db->db, &dbkey, &dbdata, R_FIRST)) == -1) {
345 if (!(entry = (osa_policy_ent_t) malloc(sizeof(osa_policy_ent_rec)))) {
350 if(!(aligned_data = (char *) malloc(dbdata.size))) {
354 memcpy(aligned_data, dbdata.data, dbdata.size);
356 memset(entry, 0, sizeof(osa_policy_ent_rec));
357 xdrmem_create(&xdrs, aligned_data, dbdata.size, XDR_DECODE);
358 if(!xdr_osa_policy_ent_rec(&xdrs, entry)) {
361 ret = OSA_ADB_FAILURE;
364 (*func)(data, entry);
367 osa_free_policy_ent(entry);
368 ret = db->db->seq(db->db, &dbkey, &dbdata, R_NEXT);
372 else ret = OSA_ADB_OK;
380 osa_free_policy_ent(osa_policy_ent_t val)
384 xdrmem_create(&xdrs, NULL, 0, XDR_FREE);
386 xdr_osa_policy_ent_rec(&xdrs, val);