Path: blob/main/crypto/krb5/src/plugins/kdb/db2/adb_policy.c
34914 views
/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */1/*2* Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved3*4* $Header$5*/67#include "k5-int.h"89#include <sys/file.h>10#include "policy_db.h"1112#define OPENLOCK(db, mode) \13{ \14int olret; \15if (db == NULL) \16return EINVAL; \17else if (db->magic != OSA_ADB_POLICY_DB_MAGIC) \18return OSA_ADB_DBINIT; \19else if ((olret = osa_adb_open_and_lock(db, mode)) != OSA_ADB_OK) \20return olret; \21}2223#define CLOSELOCK(db) \24{ \25int cl_ret; \26if ((cl_ret = osa_adb_close_and_unlock(db)) != OSA_ADB_OK) \27return cl_ret; \28}293031/*32* Function: osa_adb_create_policy33*34* Purpose: create a policy entry in the policy db.35*36* Arguments:37* entry (input) pointer to the entry to be added38* <return value> OSA_ADB_OK on success, else error code.39*40* Requires:41* entry have a valid name.42*43* Effects:44* creates the entry in the db45*46* Modifies:47* the policy db.48*49*/50krb5_error_code51osa_adb_create_policy(osa_adb_policy_t db, osa_policy_ent_t entry)52{53DBT dbkey;54DBT dbdata;55XDR xdrs;56int ret;5758OPENLOCK(db, KRB5_DB_LOCKMODE_EXCLUSIVE);5960if(entry->name == NULL) {61ret = EINVAL;62goto error;63}64dbkey.data = entry->name;65dbkey.size = (strlen(entry->name) + 1);6667switch(db->db->get(db->db, &dbkey, &dbdata, 0)) {68case 0:69ret = OSA_ADB_DUP;70goto error;71case 1:72break;73default:74ret = errno;75goto error;76}77xdralloc_create(&xdrs, XDR_ENCODE);78if(!xdr_osa_policy_ent_rec(&xdrs, entry)) {79xdr_destroy(&xdrs);80ret = OSA_ADB_XDR_FAILURE;81goto error;82}83dbdata.data = xdralloc_getdata(&xdrs);84dbdata.size = xdr_getpos(&xdrs);85switch(db->db->put(db->db, &dbkey, &dbdata, R_NOOVERWRITE)) {86case 0:87if((db->db->sync(db->db, 0)) == -1)88ret = OSA_ADB_FAILURE;89ret = OSA_ADB_OK;90break;91case 1:92ret = OSA_ADB_DUP;93break;94default:95ret = OSA_ADB_FAILURE;96break;97}98xdr_destroy(&xdrs);99100error:101CLOSELOCK(db);102return ret;103}104105/*106* Function: osa_adb_destroy_policy107*108* Purpose: destroy a policy entry109*110* Arguments:111* db (input) database handle112* name (input) name of policy113* <return value> OSA_ADB_OK on success, or error code.114*115* Requires:116* db being valid.117* name being non-null.118* Effects:119* deletes policy from db.120*121* Modifies:122* policy db.123*124*/125krb5_error_code126osa_adb_destroy_policy(osa_adb_policy_t db, char *name)127{128DBT dbkey;129int status, ret;130131OPENLOCK(db, KRB5_DB_LOCKMODE_EXCLUSIVE);132133if(name == NULL) {134ret = EINVAL;135goto error;136}137dbkey.data = name;138dbkey.size = (strlen(name) + 1);139140status = db->db->del(db->db, &dbkey, 0);141switch(status) {142case 1:143ret = OSA_ADB_NOENT;144goto error;145case 0:146if ((db->db->sync(db->db, 0)) == -1) {147ret = OSA_ADB_FAILURE;148goto error;149}150ret = OSA_ADB_OK;151break;152default:153ret = OSA_ADB_FAILURE;154goto error;155}156157error:158CLOSELOCK(db);159return ret;160}161162/*163* Function: osa_adb_get_policy164*165* Purpose: retrieve policy166*167* Arguments:168* db (input) db handle169* name (input) name of policy170* entry (output) policy entry171* cnt (inout) Number of entries172* <return value> 0 on success, error code on failure.173*174* Requires:175* Effects:176* Modifies:177*/178krb5_error_code179osa_adb_get_policy(osa_adb_policy_t db, char *name,180osa_policy_ent_t *entry_ptr)181{182DBT dbkey;183DBT dbdata;184XDR xdrs;185int ret;186char *aligned_data = NULL;187osa_policy_ent_t entry = NULL;188189*entry_ptr = NULL;190OPENLOCK(db, KRB5_DB_LOCKMODE_SHARED);191192if(name == NULL) {193ret = EINVAL;194goto error;195}196dbkey.data = name;197dbkey.size = (strlen(dbkey.data) + 1);198dbdata.data = NULL;199dbdata.size = 0;200switch((db->db->get(db->db, &dbkey, &dbdata, 0))) {201case 1:202ret = KRB5_KDB_NOENTRY;203goto error;204case 0:205break;206default:207ret = OSA_ADB_FAILURE;208goto error;209}210entry = k5alloc(sizeof(*entry), &ret);211if (entry == NULL)212goto error;213aligned_data = k5memdup(dbdata.data, dbdata.size, &ret);214if (aligned_data == NULL)215goto error;216xdrmem_create(&xdrs, aligned_data, dbdata.size, XDR_DECODE);217if (!xdr_osa_policy_ent_rec(&xdrs, entry)) {218ret = OSA_ADB_FAILURE;219goto error;220}221ret = OSA_ADB_OK;222xdr_destroy(&xdrs);223*entry_ptr = entry;224entry = NULL;225226error:227free(aligned_data);228free(entry);229CLOSELOCK(db);230return ret;231}232233/*234* Function: osa_adb_put_policy235*236* Purpose: update a policy in the dababase237*238* Arguments:239* db (input) db handle240* entry (input) policy entry241* <return value> 0 on success error code on failure.242*243* Requires:244* [requires]245*246* Effects:247* [effects]248*249* Modifies:250* [modifies]251*252*/253krb5_error_code254osa_adb_put_policy(osa_adb_policy_t db, osa_policy_ent_t entry)255{256DBT dbkey;257DBT dbdata;258DBT tmpdb;259XDR xdrs;260int ret;261262OPENLOCK(db, KRB5_DB_LOCKMODE_EXCLUSIVE);263264if(entry->name == NULL) {265ret = EINVAL;266goto error;267}268dbkey.data = entry->name;269dbkey.size = (strlen(entry->name) + 1);270switch(db->db->get(db->db, &dbkey, &tmpdb, 0)) {271case 0:272break;273case 1:274ret = OSA_ADB_NOENT;275goto error;276default:277ret = OSA_ADB_FAILURE;278goto error;279}280xdralloc_create(&xdrs, XDR_ENCODE);281if(!xdr_osa_policy_ent_rec(&xdrs, entry)) {282xdr_destroy(&xdrs);283ret = OSA_ADB_XDR_FAILURE;284goto error;285}286dbdata.data = xdralloc_getdata(&xdrs);287dbdata.size = xdr_getpos(&xdrs);288switch(db->db->put(db->db, &dbkey, &dbdata, 0)) {289case 0:290if((db->db->sync(db->db, 0)) == -1)291ret = OSA_ADB_FAILURE;292ret = OSA_ADB_OK;293break;294default:295ret = OSA_ADB_FAILURE;296break;297}298xdr_destroy(&xdrs);299300error:301CLOSELOCK(db);302return ret;303}304305/*306* Function: osa_adb_iter_policy307*308* Purpose: iterate over the policy database.309*310* Arguments:311* db (input) db handle312* func (input) function pointer to call313* data opaque data type314* <return value> 0 on success error code on failure315*316* Requires:317* Effects:318* Modifies:319*/320krb5_error_code321osa_adb_iter_policy(osa_adb_policy_t db, osa_adb_iter_policy_func func,322void *data)323{324DBT dbkey,325dbdata;326XDR xdrs;327int ret;328osa_policy_ent_t entry;329char *aligned_data;330331OPENLOCK(db, KRB5_DB_LOCKMODE_EXCLUSIVE); /* hmmm */332333if((ret = db->db->seq(db->db, &dbkey, &dbdata, R_FIRST)) == -1) {334ret = errno;335goto error;336}337338while (ret == 0) {339entry = k5alloc(sizeof(osa_policy_ent_rec), &ret);340if (entry == NULL)341goto error;342343aligned_data = k5memdup(dbdata.data, dbdata.size, &ret);344if (aligned_data == NULL) {345free(entry);346goto error;347}348349xdrmem_create(&xdrs, aligned_data, dbdata.size, XDR_DECODE);350if(!xdr_osa_policy_ent_rec(&xdrs, entry)) {351xdr_destroy(&xdrs);352free(aligned_data);353osa_free_policy_ent(entry);354ret = OSA_ADB_FAILURE;355goto error;356}357(*func)(data, entry);358xdr_destroy(&xdrs);359free(aligned_data);360osa_free_policy_ent(entry);361ret = db->db->seq(db->db, &dbkey, &dbdata, R_NEXT);362}363if(ret == -1)364ret = errno;365else ret = OSA_ADB_OK;366367error:368CLOSELOCK(db);369return ret;370}371372void373osa_free_policy_ent(osa_policy_ent_t val)374{375XDR xdrs;376377xdrmem_create(&xdrs, NULL, 0, XDR_FREE);378379xdr_osa_policy_ent_rec(&xdrs, val);380381free(val);382}383384385