3 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
5 * Openvision retains the copyright to derivative works of
6 * this source code. Do *NOT* create a derivative of this
7 * source code before consulting with your legal department.
8 * Do *NOT* integrate *ANY* of this source code into another
9 * product before consulting with your legal department.
11 * For further information, read the top-level Openvision
12 * copyright which is contained in the top-level MIT Kerberos
15 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
21 * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved
26 #if !defined(lint) && !defined(__CODECENTER__)
27 static char *rcsid
= "$Header$";
32 #include "policy_db.h"
37 extern caddr_t
xdralloc_getdata(XDR
*xdrs
);
38 extern void xdralloc_create(XDR
*xdrs
, enum xdr_op op
);
40 #define OPENLOCK(db, mode) \
45 else if (db->magic != OSA_ADB_POLICY_DB_MAGIC) \
46 return OSA_ADB_DBINIT; \
47 else if ((olret = osa_adb_open_and_lock(db, mode)) != OSA_ADB_OK) \
51 #define CLOSELOCK(db) \
54 if ((cl_ret = osa_adb_close_and_unlock(db)) != OSA_ADB_OK) \
60 * Function: osa_adb_create_policy
62 * Purpose: create a policy entry in the policy db.
65 * entry (input) pointer to the entry to be added
66 * <return value> OSA_ADB_OK on success, else error code.
69 * entry have a valid name.
72 * creates the entry in the db
79 osa_adb_create_policy(osa_adb_policy_t db
, osa_policy_ent_t entry
)
86 OPENLOCK(db
, KRB5_DB_LOCKMODE_EXCLUSIVE
);
88 if(entry
->name
== NULL
) {
92 dbkey
.data
= entry
->name
;
93 dbkey
.size
= (strlen(entry
->name
) + 1);
95 switch(db
->db
->get(db
->db
, &dbkey
, &dbdata
, 0)) {
105 xdralloc_create(&xdrs
, XDR_ENCODE
);
106 if(!xdr_osa_policy_ent_rec(&xdrs
, entry
)) {
108 ret
= OSA_ADB_XDR_FAILURE
;
111 dbdata
.data
= xdralloc_getdata(&xdrs
);
112 dbdata
.size
= xdr_getpos(&xdrs
);
113 switch(db
->db
->put(db
->db
, &dbkey
, &dbdata
, R_NOOVERWRITE
)) {
115 if((db
->db
->sync(db
->db
, 0)) == -1)
116 ret
= OSA_ADB_FAILURE
;
123 ret
= OSA_ADB_FAILURE
;
134 * Function: osa_adb_destroy_policy
136 * Purpose: destroy a policy entry
139 * db (input) database handle
140 * name (input) name of policy
141 * <return value> OSA_ADB_OK on success, or error code.
145 * name being non-null.
147 * deletes policy from db.
154 osa_adb_destroy_policy(osa_adb_policy_t db
, char *name
)
159 OPENLOCK(db
, KRB5_DB_LOCKMODE_EXCLUSIVE
);
166 dbkey
.size
= (strlen(name
) + 1);
168 status
= db
->db
->del(db
->db
, &dbkey
, 0);
174 if ((db
->db
->sync(db
->db
, 0)) == -1) {
175 ret
= OSA_ADB_FAILURE
;
181 ret
= OSA_ADB_FAILURE
;
191 * Function: osa_adb_get_policy
193 * Purpose: retrieve policy
196 * db (input) db handle
197 * name (input) name of policy
198 * entry (output) policy entry
199 * cnt (inout) Number of entries
200 * <return value> 0 on success, error code on failure.
207 osa_adb_get_policy(osa_adb_policy_t db
, char *name
,
208 osa_policy_ent_t
*entry
, int *cnt
)
216 OPENLOCK(db
, KRB5_DB_LOCKMODE_SHARED
);
225 dbkey
.size
= (strlen(dbkey
.data
) + 1);
228 switch((db
->db
->get(db
->db
, &dbkey
, &dbdata
, 0))) {
236 ret
= OSA_ADB_FAILURE
;
239 if (!(*(entry
) = (osa_policy_ent_t
)malloc(sizeof(osa_policy_ent_rec
)))) {
243 if (!(aligned_data
= (char *) malloc(dbdata
.size
))) {
247 memcpy(aligned_data
, dbdata
.data
, dbdata
.size
);
248 memset(*entry
, 0, sizeof(osa_policy_ent_rec
));
249 xdrmem_create(&xdrs
, aligned_data
, dbdata
.size
, XDR_DECODE
);
250 if (!xdr_osa_policy_ent_rec(&xdrs
, *entry
))
251 ret
= OSA_ADB_FAILURE
;
252 else ret
= OSA_ADB_OK
;
262 * Function: osa_adb_put_policy
264 * Purpose: update a policy in the dababase
267 * db (input) db handle
268 * entry (input) policy entry
269 * <return value> 0 on success error code on failure.
282 osa_adb_put_policy(osa_adb_policy_t db
, osa_policy_ent_t entry
)
290 OPENLOCK(db
, KRB5_DB_LOCKMODE_EXCLUSIVE
);
292 if(entry
->name
== NULL
) {
296 dbkey
.data
= entry
->name
;
297 dbkey
.size
= (strlen(entry
->name
) + 1);
298 switch(db
->db
->get(db
->db
, &dbkey
, &tmpdb
, 0)) {
305 ret
= OSA_ADB_FAILURE
;
308 xdralloc_create(&xdrs
, XDR_ENCODE
);
309 if(!xdr_osa_policy_ent_rec(&xdrs
, entry
)) {
311 ret
= OSA_ADB_XDR_FAILURE
;
314 dbdata
.data
= xdralloc_getdata(&xdrs
);
315 dbdata
.size
= xdr_getpos(&xdrs
);
316 switch(db
->db
->put(db
->db
, &dbkey
, &dbdata
, 0)) {
318 if((db
->db
->sync(db
->db
, 0)) == -1)
319 ret
= OSA_ADB_FAILURE
;
323 ret
= OSA_ADB_FAILURE
;
334 * Function: osa_adb_iter_policy
336 * Purpose: iterate over the policy database.
339 * db (input) db handle
340 * func (input) fucntion pointer to call
341 * data opaque data type
342 * <return value> 0 on success error code on failure
349 osa_adb_iter_policy(osa_adb_policy_t db
, osa_adb_iter_policy_func func
,
356 osa_policy_ent_t entry
;
359 OPENLOCK(db
, KRB5_DB_LOCKMODE_EXCLUSIVE
); /* hmmm */
361 if((ret
= db
->db
->seq(db
->db
, &dbkey
, &dbdata
, R_FIRST
)) == -1) {
367 if (!(entry
= (osa_policy_ent_t
) malloc(sizeof(osa_policy_ent_rec
)))) {
372 if(!(aligned_data
= (char *) malloc(dbdata
.size
))) {
376 memcpy(aligned_data
, dbdata
.data
, dbdata
.size
);
378 memset(entry
, 0, sizeof(osa_policy_ent_rec
));
379 xdrmem_create(&xdrs
, aligned_data
, dbdata
.size
, XDR_DECODE
);
380 if(!xdr_osa_policy_ent_rec(&xdrs
, entry
)) {
383 ret
= OSA_ADB_FAILURE
;
386 (*func
)(data
, entry
);
389 osa_free_policy_ent(entry
);
390 ret
= db
->db
->seq(db
->db
, &dbkey
, &dbdata
, R_NEXT
);
394 else ret
= OSA_ADB_OK
;
402 osa_free_policy_ent(osa_policy_ent_t val
)
406 xdrmem_create(&xdrs
, NULL
, 0, XDR_FREE
);
408 xdr_osa_policy_ent_rec(&xdrs
, val
);