diff --git a/lib/hdb/db.c b/lib/hdb/db.c index d8fc8d8f1..4098066ba 100644 --- a/lib/hdb/db.c +++ b/lib/hdb/db.c @@ -93,17 +93,6 @@ DB_op(krb5_context context, HDB *db, hdb_entry *entry, int op) db->unlock(context, db); /* XXX check value */ break; case 1: - hdb_entry2value(context, entry, &data); - value.data = data.data; - value.size = data.length; - code = db->lock(context, db, HDB_WLOCK); - if(code) - return code; - code = d->put(d, &key, &value, 0); - db->unlock(context, db); /* XXX check value */ - krb5_data_free(&data); - break; - case 2: code = db->lock(context, db, HDB_WLOCK); if(code) return code; @@ -117,7 +106,10 @@ DB_op(krb5_context context, HDB *db, hdb_entry *entry, int op) if(code < 0) return errno; if(code == 1) - return HDB_ERR_NOENTRY; + if(op == 2) + return HDB_ERR_EXISTS; + else + return HDB_ERR_NOENTRY; if(op == 0){ data.data = value.data; data.length = value.size; @@ -126,24 +118,6 @@ DB_op(krb5_context context, HDB *db, hdb_entry *entry, int op) return 0; } -static krb5_error_code -DB_fetch(krb5_context context, HDB *db, hdb_entry *entry) -{ - return DB_op(context, db, entry, 0); -} - -static krb5_error_code -DB_store(krb5_context context, HDB *db, hdb_entry *entry) -{ - return DB_op(context, db, entry, 1); -} - -static krb5_error_code -DB_delete(krb5_context context, HDB *db, hdb_entry *entry) -{ - return DB_op(context, db, entry, 2); -} - static krb5_error_code DB_seq(krb5_context context, HDB *db, hdb_entry *entry, int flag) { @@ -256,6 +230,26 @@ DB__put(krb5_context context, HDB *db, int replace, return 0; } +static krb5_error_code +DB__del(krb5_context context, HDB *db, krb5_data key) +{ + DB *d = (DB*)db->db; + DBT k; + krb5_error_code code; + k.data = key.data; + k.size = key.length; + code = db->lock(context, db, HDB_WLOCK); + if(code) + return code; + code = d->del(d, &k, 0); + db->unlock(context, db); + if(code == 1) + return HDB_ERR_NOENTRY; + if(code < 0) + return errno; + return 0; +} + krb5_error_code hdb_db_open(krb5_context context, HDB **db, const char *filename, int flags, mode_t mode) @@ -271,9 +265,9 @@ hdb_db_open(krb5_context context, HDB **db, (*db)->db = d; (*db)->name = strdup(filename); (*db)->close = DB_close; - (*db)->fetch = DB_fetch; - (*db)->store = DB_store; - (*db)->delete = DB_delete; + (*db)->fetch = _hdb_fetch; + (*db)->store = _hdb_store; + (*db)->delete = _hdb_delete; (*db)->firstkey = DB_firstkey; (*db)->nextkey= DB_nextkey; (*db)->lock = DB_lock; @@ -281,6 +275,7 @@ hdb_db_open(krb5_context context, HDB **db, (*db)->rename = DB_rename; (*db)->_get = DB__get; (*db)->_put = DB__put; + (*db)->_del = DB__del; return 0; } diff --git a/lib/hdb/ndbm.c b/lib/hdb/ndbm.c index 43accdc8b..e220733c8 100644 --- a/lib/hdb/ndbm.c +++ b/lib/hdb/ndbm.c @@ -72,85 +72,6 @@ NDBM_unlock(krb5_context context, HDB *db) return 0; } -static krb5_error_code -NDBM_fetch(krb5_context context, HDB *db, hdb_entry *entry) -{ - DBM *d = (DBM*)db->db; - datum key, value; - krb5_data data; - krb5_error_code ret; - - hdb_principal2key(context, entry->principal, &data); -#if 0 - krb5_free_principal (context, entry->principal); -#endif - - key.dptr = data.data; - key.dsize = data.length; - ret = db->lock(context, db, HDB_RLOCK); - if(ret) return ret; - value = dbm_fetch(d, key); - db->unlock(context, db); - krb5_data_free(&data); - if(value.dptr == NULL) - return HDB_ERR_NOENTRY; - - data.data = value.dptr; - data.length = value.dsize; - - hdb_value2entry(context, &data, entry); - /* krb5_data_free(&data); */ - return 0; -} - -static krb5_error_code -NDBM_store(krb5_context context, HDB *db, hdb_entry *entry) -{ - DBM *d = (DBM*)db->db; - krb5_data data; - krb5_error_code ret; - int code; - datum key, value; - hdb_principal2key(context, entry->principal, &data); - key.dptr = data.data; - key.dsize = data.length; - hdb_entry2value(context, entry, &data); - value.dptr = data.data; - value.dsize = data.length; - ret = db->lock(context, db, HDB_WLOCK); - if(ret) return ret; - code = dbm_store(d, key, value, DBM_REPLACE); - db->unlock(context, db); - free(key.dptr); - free(value.dptr); - if(code < 0) - return errno; - return 0; -} - -static krb5_error_code -NDBM_delete(krb5_context context, HDB *db, hdb_entry *entry) -{ - DBM *d = (DBM*)db->db; - datum key; - krb5_data data; - int code; - krb5_error_code ret; - - hdb_principal2key(context, entry->principal, &data); - - key.dptr = data.data; - key.dsize = data.length; - ret = db->lock(context, db, HDB_WLOCK); - if(ret) return ret; - code = dbm_delete(d, key); - db->unlock(context, db); - krb5_data_free(&data); - if(code < 0) - return errno; - return 0; -} - static krb5_error_code NDBM_seq(krb5_context context, HDB *db, hdb_entry *entry, int first) @@ -269,6 +190,26 @@ NDBM__put(krb5_context context, HDB *db, int replace, return 0; } +static krb5_error_code +NDBM__del(krb5_context context, HDB *db, krb5_data key) +{ + DBM *d = (DBM*)db->db; + datum k; + int code; + krb5_error_code ret; + + k.dptr = key.data; + k.dsize = key.length; + ret = db->lock(context, db, HDB_WLOCK); + if(ret) return ret; + code = dbm_delete(d, k); + db->unlock(context, db); + if(code < 0) + return errno; + return 0; +} + + krb5_error_code hdb_ndbm_open(krb5_context context, HDB **db, const char *filename, int flags, mode_t mode) @@ -281,9 +222,9 @@ hdb_ndbm_open(krb5_context context, HDB **db, (*db)->db = d; (*db)->name = strdup(filename); (*db)->close = NDBM_close; - (*db)->fetch = NDBM_fetch; - (*db)->store = NDBM_store; - (*db)->delete = NDBM_delete; + (*db)->fetch = _hdb_fetch; + (*db)->store = _hdb_store; + (*db)->delete = _hdb_delete; (*db)->firstkey = NDBM_firstkey; (*db)->nextkey= NDBM_nextkey; (*db)->lock = NDBM_lock; @@ -291,6 +232,7 @@ hdb_ndbm_open(krb5_context context, HDB **db, (*db)->rename = NDBM_rename; (*db)->_get = NDBM__get; (*db)->_put = NDBM__put; + (*db)->_del = NDBM__del; return 0; }