diff options
Diffstat (limited to 'crypto/heimdal/lib/hdb/ndbm.c')
| -rw-r--r-- | crypto/heimdal/lib/hdb/ndbm.c | 316 | 
1 files changed, 0 insertions, 316 deletions
| diff --git a/crypto/heimdal/lib/hdb/ndbm.c b/crypto/heimdal/lib/hdb/ndbm.c deleted file mode 100644 index 79ca978e74bb5..0000000000000 --- a/crypto/heimdal/lib/hdb/ndbm.c +++ /dev/null @@ -1,316 +0,0 @@ -/* - * Copyright (c) 1997, 1998, 1999 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden).  - * All rights reserved.  - * - * Redistribution and use in source and binary forms, with or without  - * modification, are permitted provided that the following conditions  - * are met:  - * - * 1. Redistributions of source code must retain the above copyright  - *    notice, this list of conditions and the following disclaimer.  - * - * 2. Redistributions in binary form must reproduce the above copyright  - *    notice, this list of conditions and the following disclaimer in the  - *    documentation and/or other materials provided with the distribution.  - * - * 3. Neither the name of the Institute nor the names of its contributors  - *    may be used to endorse or promote products derived from this software  - *    without specific prior written permission.  - * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE  - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE  - * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE  - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL  - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS  - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)  - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT  - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY  - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  - * SUCH DAMAGE.  - */ - -#include "hdb_locl.h" - -RCSID("$Id: ndbm.c,v 1.26 1999/12/02 17:05:05 joda Exp $"); - -#ifdef HAVE_NDBM_H - -struct ndbm_db { -    DBM *db; -    int lock_fd; -}; - -static krb5_error_code -NDBM_destroy(krb5_context context, HDB *db) -{ -    krb5_error_code ret; - -    ret = hdb_clear_master_key (context, db); -    free(db->name); -    free(db); -    return 0; -} - -static krb5_error_code -NDBM_lock(krb5_context context, HDB *db, int operation) -{ -    struct ndbm_db *d = db->db; -    return hdb_lock(d->lock_fd, operation); -} - -static krb5_error_code -NDBM_unlock(krb5_context context, HDB *db) -{ -    struct ndbm_db *d = db->db; -    return hdb_unlock(d->lock_fd); -} - -static krb5_error_code -NDBM_seq(krb5_context context, HDB *db,  -	 unsigned flags, hdb_entry *entry, int first) - -{ -    struct ndbm_db *d = (struct ndbm_db *)db->db; -    datum key, value; -    krb5_data key_data, data; -    krb5_error_code ret; - -    if(first) -	key = dbm_firstkey(d->db); -    else -	key = dbm_nextkey(d->db); -    if(key.dptr == NULL) -	return HDB_ERR_NOENTRY; -    key_data.data = key.dptr; -    key_data.length = key.dsize; -    ret = db->lock(context, db, HDB_RLOCK); -    if(ret) return ret; -    value = dbm_fetch(d->db, key); -    db->unlock(context, db); -    data.data = value.dptr; -    data.length = value.dsize; -    if(hdb_value2entry(context, &data, entry)) -	return NDBM_seq(context, db, flags, entry, 0); -    if (db->master_key_set && (flags & HDB_F_DECRYPT)) -	hdb_unseal_keys (db, entry); -    if (entry->principal == NULL) { -	entry->principal = malloc (sizeof(*entry->principal)); -	hdb_key2principal (context, &key_data, entry->principal); -    } -    return 0; -} - - -static krb5_error_code -NDBM_firstkey(krb5_context context, HDB *db, unsigned flags, hdb_entry *entry) -{ -    return NDBM_seq(context, db, flags, entry, 1); -} - - -static krb5_error_code -NDBM_nextkey(krb5_context context, HDB *db, unsigned flags, hdb_entry *entry) -{ -    return NDBM_seq(context, db, flags, entry, 0); -} - -static krb5_error_code -NDBM_rename(krb5_context context, HDB *db, const char *new_name) -{ -    /* XXX this function will break */ -    struct ndbm_db *d = db->db; - -    int ret; -    char *old_dir, *old_pag, *new_dir, *new_pag; -    char *new_lock; -    int lock_fd; - -    /* lock old and new databases */ -    ret = db->lock(context, db, HDB_WLOCK); -    if(ret) return ret; -    asprintf(&new_lock, "%s.lock", new_name); -    lock_fd = open(new_lock, O_RDWR | O_CREAT, 0600); -    free(new_lock); -    if(lock_fd < 0) { -	ret = errno; -	db->unlock(context, db); -	return ret; -    } -    ret = hdb_lock(lock_fd, HDB_WLOCK); -    if(ret) { -	db->unlock(context, db); -	close(lock_fd); -	return ret; -    } - -    asprintf(&old_dir, "%s.dir", db->name); -    asprintf(&old_pag, "%s.pag", db->name); -    asprintf(&new_dir, "%s.dir", new_name); -    asprintf(&new_pag, "%s.pag", new_name); - -    ret = rename(old_dir, new_dir) || rename(old_pag, new_pag); -    free(old_dir); -    free(old_pag); -    free(new_dir); -    free(new_pag); -    hdb_unlock(lock_fd); -    db->unlock(context, db); - -    if(ret) { -	close(lock_fd); -	return errno; -    } - -    close(d->lock_fd); -    d->lock_fd = lock_fd; -     -    free(db->name); -    db->name = strdup(new_name); -    return 0; -} - -static krb5_error_code -NDBM__get(krb5_context context, HDB *db, krb5_data key, krb5_data *reply) -{ -    struct ndbm_db *d = (struct ndbm_db *)db->db; -    datum k, v; -    int code; - -    k.dptr  = key.data; -    k.dsize = key.length; -    code = db->lock(context, db, HDB_RLOCK); -    if(code) -	return code; -    v = dbm_fetch(d->db, k); -    db->unlock(context, db); -    if(v.dptr == NULL) -	return HDB_ERR_NOENTRY; - -    krb5_data_copy(reply, v.dptr, v.dsize); -    return 0; -} - -static krb5_error_code -NDBM__put(krb5_context context, HDB *db, int replace,  -	krb5_data key, krb5_data value) -{ -    struct ndbm_db *d = (struct ndbm_db *)db->db; -    datum k, v; -    int code; - -    k.dptr  = key.data; -    k.dsize = key.length; -    v.dptr  = value.data; -    v.dsize = value.length; - -    code = db->lock(context, db, HDB_WLOCK); -    if(code) -	return code; -    code = dbm_store(d->db, k, v, replace ? DBM_REPLACE : DBM_INSERT); -    db->unlock(context, db); -    if(code == 1) -	return HDB_ERR_EXISTS; -    if (code < 0) -	return code; -    return 0; -} - -static krb5_error_code -NDBM__del(krb5_context context, HDB *db, krb5_data key) -{ -    struct ndbm_db *d = (struct ndbm_db *)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->db, k); -    db->unlock(context, db); -    if(code < 0) -	return errno; -    return 0; -} - -static krb5_error_code -NDBM_open(krb5_context context, HDB *db, int flags, mode_t mode) -{ -    krb5_error_code ret; -    struct ndbm_db *d = malloc(sizeof(*d)); -    char *lock_file; - -    if(d == NULL) -	return ENOMEM; -    asprintf(&lock_file, "%s.lock", (char*)db->name); -    if(lock_file == NULL) { -	free(d); -	return ENOMEM; -    } -    d->db = dbm_open((char*)db->name, flags, mode); -    if(d->db == NULL){ -	free(d); -	free(lock_file); -	return errno; -    } -    d->lock_fd = open(lock_file, O_RDWR | O_CREAT, 0600); -    free(lock_file); -    if(d->lock_fd < 0){ -	dbm_close(d->db); -	free(d); -	return errno; -    } -    db->db = d; -    if((flags & O_ACCMODE) == O_RDONLY) -	ret = hdb_check_db_format(context, db); -    else -	ret = hdb_init_db(context, db); -    if(ret == HDB_ERR_NOENTRY) -	return 0; -    return ret; -} - -static krb5_error_code -NDBM_close(krb5_context context, HDB *db) -{ -    struct ndbm_db *d = db->db; -    dbm_close(d->db); -    close(d->lock_fd); -    free(d); -    return 0; -} - -krb5_error_code -hdb_ndbm_create(krb5_context context, HDB **db,  -		const char *filename) -{ -    *db = malloc(sizeof(**db)); -    if (*db == NULL) -	return ENOMEM; - -    (*db)->db = NULL; -    (*db)->name = strdup(filename); -    (*db)->master_key_set = 0; -    (*db)->openp = 0; -    (*db)->open = NDBM_open; -    (*db)->close = NDBM_close; -    (*db)->fetch = _hdb_fetch; -    (*db)->store = _hdb_store; -    (*db)->remove = _hdb_remove; -    (*db)->firstkey = NDBM_firstkey; -    (*db)->nextkey= NDBM_nextkey; -    (*db)->lock = NDBM_lock; -    (*db)->unlock = NDBM_unlock; -    (*db)->rename = NDBM_rename; -    (*db)->_get = NDBM__get; -    (*db)->_put = NDBM__put; -    (*db)->_del = NDBM__del; -    (*db)->destroy = NDBM_destroy; -    return 0; -} - - -#endif | 
